J'utilise l'outil JavaCUP pour produire un analyseur pour ma langue. J'essaie d'écrire une grammaire qui correspond à des instructions if_else imbriquées et multiples.Parsing shift-reduce conflict
fichier d'entrée
// matches
if()
if()
else
if()
else
else
// no match -> modifying grammar leads to shift/reduce conflict
if()
else
Grammaire
expr ::= if_then_else_statement;
if_then_else_statement ::= IF LPAREN RPAREN if_then_else_statement ELSE if_then_else_statement
| ;
Cette grammaire correspond à des déclarations if_else imbriquées. Cependant, il ne reconnaît que la première instruction if_else imbriquée de mon fichier d'entrée.
J'ai modifié ma grammaire afin de faire correspondre plusieurs déclarations comme ceci:
expr ::= expr if_then_else_statement;
| ;
if_then_else_statement ::= IF LPAREN RPAREN if_then_else_statement ELSE if_then_else_statement
| ;
Le résultat a été un changement/réduire les conflits causés par la règle vide (je suppose). Comment puis-je le modifier pour prendre en charge les instructions imbriquées et multiples if_else sans utiliser la priorité?
Avez-vous une règle qui correspond à plusieurs instructions? – rici
Oui, après l'avoir modifié, expr pourrait être réduit à expr if_then_else_statement qui pourrait être réduit à expr if_then_else_statement if_then_else_statement et finalement à if_then_else_statement if_then_else_statement. Mais cela ne fonctionne qu'en théorie – pirox22