Exercício 07.56

Desenvolva uma Gramática Livre do Contexto (GLC) que reconheça expressões matemáticas na notação pós-fixada (notação polonesa inversa), considerando os operadores aritméticos de adição, subtração, multiplicação e divisão sobre operandos numéricos inteiros e reais, como por exemplo:

1 2 +
1 2.5 * 3 +
1 3 / -6 *
10 -20.0 30.5 * +

Resposta com recursividade à esquerda

G = ({EXPRESSAO, OPERADOR, OPERANDO, REAL, INTEIRO, SINAL, NUMERO, DIGITO},
     {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -, +, *, /, .}, P, EXPRESSAO)
P = {< EXPRESSAO >  ->  < OPERANDO > < OPERANDO > < OPERADOR >
     < OPERADOR >   ->  +
                    |   -
                    |   *
                    |   /
     < OPERANDO >   ->  < EXPRESSAO >
                    |   < REAL >
     < REAL >       ->  < SINAL > . < NUMERO >
                    |   < INTEIRO > . < NUMERO > 
                    |   < INTEIRO >
     < INTEIRO >    ->  < SINAL > < NUMERO >
     < SINAL >      ->  +
                    |   -
                    |   ε
     < NUMERO >     ->  < NUMERO > < DIGITO >
                    |   < DIGITO >
     < DIGITO >     ->  0
                    |   1
                    |   2
                    |   3
                    |   4
                    |   5
                    |   6
                    |   7
                    |   8
                    |   9  }

Resposta com recursividade à direita

G = ({EXPRESSAO, OPERADOR, OPERANDO, REAL, INTEIRO, SINAL, NUMERO, DIGITO},
     {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -, +, *, /, .}, P, EXPRESSAO)
P = {< EXPRESSAO >  ->  < OPERANDO > < OPERANDO > < OPERADOR >
     < OPERADOR >   ->  +
                    |   -
                    |   *
                    |   /
     < OPERANDO >   ->  < EXPRESSAO >
                    |   < REAL >
     < REAL >       ->  < SINAL > . < NUMERO >
                    |   < INTEIRO > . < NUMERO > 
                    |   < INTEIRO >
     < INTEIRO >    ->  < SINAL > < NUMERO >
     < SINAL >      ->  +
                    |   -
                    |   ε
     < NUMERO >     ->  < DIGITO > < NUMERO >
                    |   < DIGITO >
     < DIGITO >     ->  0
                    |   1
                    |   2
                    |   3
                    |   4
                    |   5
                    |   6
                    |   7
                    |   8
                    |   9  }

Recomendamos

Duolingo Vida de Programador Copy