Essa gramática é deixada recursiva:
Expression ::= AdditionExpression
AdditionExpression ::=
MultiplicationExpression
| AdditionExpression '+' MultiplicationExpression
| AdditionExpression '-' MultiplicationExpression
MultiplicationExpression ::=
Term
| MultiplicationExpression '*' Term
| MultiplicationExpression '/' Term
Term ::=
Number
| '(' AdditionExpression ')'
Number ::=
[+-]?[0-9]+(\.[0-9]+)?
Portanto, em teoria, a descida recursiva não funcionará. Mas, explorando as propriedades da gramática em que cada regra recursiva à esquerda corresponde a um nível de precedência específico, e que a aparência de um único token é suficiente para escolher a produção correta, as regras recursivas à esquerda podem ser analisadas individualmente com loops while.
Por exemplo, para analisar o AdditionExpression não terminal, esse pseudocódigo é suficiente:
function parse_addition_expression() {
num = parse_multiplication_expression()
while (has_token()) {
get_token()
if (current_token == PLUS)
num += parse_multiplication_expression()
else if (current_token == MINUS)
num -= parse_multiplication_expression()
else {
unget_token()
return num
}
}
return num
}
Qual é o nome correto para esse tipo de analisador? Este artigo informativo refere-se apenas a ele como "Solução clássica": https://www.engr.mun.ca/~theo/Misc/exp_parsing.htm
Deve haver um nome adequado para esse tipo de analisador.