Desenvolva uma Gramática Livre do Contexto (GLC) sobre o alfabeto Σ = {a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, -, *, /, (, ), >, <, =, !, .}, que reconheça as seguintes instruções na linguagem de programação LISP:
(defun multiply (number)
(* 7 number)
)
(defun averagenum (n1 n2 n3 n4)
(/ ( + n1 n2 n3 n4) 4)
)
(defun discriminant (a b c)
(- (* b b) (* 4 a c))
)
(defun factorial (number)
(if (= number 1)
1
(* number (factorial (- number 1)))
)
)
Resposta com recursividade à esquerda
G = ({programa, função, parâmetro, operação, se, expressão, condição, fator, termo, operando, logico,
aritmético, nome, real, inteiro, sinal, numero, letra, digito}, {a, b, c, d, e, f, g, h, i,
j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, -, *, /,
(, ), >, <, =, !, .}, P, programa)
P = {< programa > ::= ( defun < função > < operação > )
< função > ::= < nome > ( < parâmetro > )
< parâmetro > ::= < parâmetro > < nome > | ε
< operação > ::= < se > | < termo >
< se > ::= ( se < condição > < operação > < operação > )
< condição > ::= ( < logico > < termo > < fator > )
< termo > ::= < operando > | < expressão > | < função >
< expressão > ::= ( < aritmético > < termo > < fator > )
< fator > ::= < fator > < termo > | < termo >
< operando > ::= < nome > | < real >
< logico > ::= = | != | > | >= | < | <=
< aritmético > ::= + | - | * | /
< nome > ::= < nome > < digito > | < nome > < letra > | < letra >
< real > ::= < inteiro > . < numero > | < inteiro >
< inteiro > ::= < sinal > < numero >
< sinal > ::= ε | + | -
< numero > ::= < numero > < digito > | < digito >
< letra > ::= a | b | c | d | e | f | g | h | i | j | k | l | m
| n | o | p | q | r | s | t | u | v | w | x | y | z
< digito > ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 }