Cette grammaire est récursive:
Expression ::= AdditionExpression
AdditionExpression ::=
MultiplicationExpression
| AdditionExpression '+' MultiplicationExpression
| AdditionExpression '-' MultiplicationExpression
MultiplicationExpression ::=
Term
| MultiplicationExpression '*' Term
| MultiplicationExpression '/' Term
Term ::=
Number
| '(' AdditionExpression ')'
Number ::=
[+-]?[0-9]+(\.[0-9]+)?
Donc, en théorie, la descente récursive ne fonctionnera pas. Mais en exploitant les propriétés de la grammaire selon lesquelles chaque règle récursive gauche correspond à un niveau de priorité spécifique et que l'anticipation d'un seul jeton suffit pour choisir la production correcte, les règles récursives gauches peuvent être analysées individuellement avec des boucles while.
Par exemple, pour analyser le non-terminal AdditionExpression, ce pseudocode suffit:
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
}
Quel est le nom correct pour ce type d'analyseur? Cet article informatif ne s'y réfère que comme la «solution classique»: https://www.engr.mun.ca/~theo/Misc/exp_parsing.htm
Il doit y avoir un nom propre pour ce type d'analyseur.