Questa grammatica è ricorsiva:
Expression ::= AdditionExpression
AdditionExpression ::=
MultiplicationExpression
| AdditionExpression '+' MultiplicationExpression
| AdditionExpression '-' MultiplicationExpression
MultiplicationExpression ::=
Term
| MultiplicationExpression '*' Term
| MultiplicationExpression '/' Term
Term ::=
Number
| '(' AdditionExpression ')'
Number ::=
[+-]?[0-9]+(\.[0-9]+)?
Quindi, in teoria, la discesa ricorsiva non funzionerà. Ma sfruttando le proprietà della grammatica secondo cui ciascuna regola ricorsiva a sinistra corrisponde a un livello di precedenza specifico e che lo sguardo di un singolo token è sufficiente per scegliere la produzione corretta, le regole ricorsive a sinistra possono essere analizzate individualmente con mentre loop.
Ad esempio, per analizzare il terminale non AdditionExpression, questo pseudocodice è sufficiente:
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 è il nome corretto per questo tipo di parser? Questo articolo informativo si riferisce solo ad esso come alla "soluzione classica": https://www.engr.mun.ca/~theo/Misc/exp_parsing.htm
Ci deve essere un nome proprio per questo tipo di parser.