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.