A especificação sintática é feita de produções. As produções para uma gramática para expressões númericas da forma especificada ficam da seguinte forma:
<E> ::= <E>
"+" <T>
| <E>
"-" <T>
| <T>;
<T> ::= <T>
"*" <F>
| <T>
"/" <F>
| <F>;
<F> ::= "("
<E> ")" |
NUMERO;
Podem ser utilizados na gramática qualquer token já declarado como símbolo terminal. Os símbolos não-terminais precisam ser previamente declarados em sua área específica.
Esta gramática possui recursões à esquerda e não está fatorada. Não é possível processá-la com um analisador preditivo sem que antes a gramática seja transformada. Neste exemplo será feito um analisador SLR, portanto a gramática já está pronta.
Inserindo as ações semânticas na gramática ela fica assim:
<E> ::= <E>
"+" <T> #2
| <E>
"-" <T> #3
| <T>;
<T> ::= <T>
"*" <F> #4
| <T>
"/" <F> #5
| <F>;
<F> ::= "("
<E> ")" |
NUMERO #1;
As ações são distribuidas já pensando-se na análise semântica. A ação 1 acontece após um NUMERO ser encontrado. Sua implementação irá calcular o valor numérico do token NUMERO e empilhá-lo.
As demais ações irão desempilhar dois valores, efetuar uma operação sobre eles e empilhar o resultado.