J'essaie d'apprendre les bases de la Lemon parser generator, mais j'ai bloqué rapidement.Résoudre des conflits d'analyse dans une minuscule grammaire Lemon
Voici une petite grammaire:
%right PLUS_PLUS.
%left DOT.
program ::= expr.
member_expr ::= expr DOT IDENTIFIER.
lhs_expr ::= member_expr.
expr ::= lhs_expr.
expr ::= PLUS_PLUS lhs_expr.
Il provoque 1 conflit analyse syntaxique:
State 3:
(3) expr ::= lhs_expr *
(4) expr ::= PLUS_PLUS lhs_expr *
DOT reduce 3 expr ::= lhs_expr
DOT reduce 4 ** Parsing conflict **
{default} reduce 4 expr ::= PLUS_PLUS lhs_expr
considérant que, si je réécris la dernière règle comme suit:
expr ::= PLUS_PLUS expr DOT IDENTIFIER.
Ensuite, il provoque pas de conflits. Mais je ne pense pas que ce soit la bonne voie à suivre.
Je serais reconnaissant si quelqu'un pouvait expliquer ce qui est la bonne façon, et pourquoi.
Je vous suggère de penser à cela sans les noms supplémentaires pour les choses. Partout où vous avez 'lhs_expr', vous pouvez simplement écrire' expr DOT IDENTIFIER' pour voir clairement ce qui est vraiment demandé. Si tout est en termes de 'expr ', vous pouvez voir le conflit plus clairement. –
En d'autres termes, 'lhs_expr' peut être autre chose que' expr DOT IDENTIFIER'. Cette grammaire particulière ne contient pas d'autres règles, parce que je voulais que ce soit très minime, mais cela peut aussi être par exemple. 'IDENTIFIER', ou' expr LBRACKET expr RBRACKET', etc. Et je veux écrire la règle 'PLUS_PLUS lhs_expr' juste une fois, et couvrir toutes les expressions possibles du côté gauche étant pré-incrémentées. –