J'ai la grammaire suivante:Pourquoi ANTLR ne "sur-réduit" pas cette expression?
expr : factor op ;
op
: '+' factor op
| // Blank rule for left-recursion elimination
;
factor
: NUM
| '(' expr ')'
;
NUM : ('0'..'9')+ ;
I Alimentation 2 + 3
, en utilisant expr
comme la règle de départ. L'arborescence d'analyse résultante de ANTLR est correcte; Cependant, je pense que je ne comprends pas les méthodes de changement-réduction qu'il utilise.
Je me attends à ce qui suit pour se produire:
Step # | Parse Stack | Lookahead | Unscanned | Action
1 | | NUM | + 3 | Shift
2 | NUM | + | 3 | Reduce by factor -> NUM
3 | factor | + | 3 | Shift a 'null'?
4 | factor null | + | 3 | Reduce by op -> null
5 | factor op | + | 3 | Reduce by expr -> factor op
6 | expr | + | 3 | Shift
7 | expr + | NUM | | Shift
8 | expr + NUM | | | Reduce by factor -> NUM
9 | expr + factor | | | ERROR (no production)
J'ai attendu une erreur de se produire à l'étape 3 wherin l'analyseur serait shift
un null
sur la pile comme condition préalable à reduce
le facteur ing " jusqu'à "expr
.
Est-ce que ANTLR ne décale que null
quand c'est strictement "requis" parce que le résultat reduce
satisfera la grammaire?
Isn descente récursive une méthode d'analyse descendante? Je pensais que ANT ** LR ** produit des parsers LR bottom-up? –
(ma confusion est que, quand je lis des articles sur ** LR ** je suis dirigé vers des méthodes ascendantes comme shift-reduce wheras quand je lis sur la descente récursive je suis dirigé vers des méthodes d'analyse descendante) –
Ok , Je suis un idiot complet qui a besoin de lire la référence ANTLR. Il produit un analyseur LL! –