2010-07-02 17 views
4

J'utilise CUP pour créer un analyseur dont j'ai besoin pour ma thèse. J'ai un changement/réduire les conflits dans ma grammaire. Je cette règle de production:Comment résoudre un changement/réduire les conflits?

command ::= IDENTIFIER | IDENTIFIER LPAREN parlist RPAREN; 

et j'ai cet avertissement:

Warning : *** Shift/Reduce conflict found in state #3 
between command ::= IDENTIFIER (*) 
and  command ::= IDENTIFIER (*) LPAREN parlist RPAREN 
under symbol LPAREN 

Maintenant, en fait je voulais à passer, donc je suis assez ok avec elle, mais mon professeur m'a dit de trouver un moyen de résoudre le conflit. Je suis aveugle. J'ai toujours lu sur le conflit d'if/else mais pour moi cela ne semble pas être le cas. Pouvez-vous m'aider?

P.S .: IDENTIFIER, LPAREN "(" et RPAREN ")" ne sont pas terminal, parlist et commande.

Répondre

6

Votre problème n'est pas dans les règles du tout. Bien que Michael Mrozek réponde à la bonne approche pour résoudre le «problème d'équilibre», il ne comprend pas le problème.

Si vous regardez le message d'erreur, vous voyez que le conflit de décalage/réduction est présent lorsque lexique LPAREN. Je suis certain que les règles ne créeront pas de conflit à elles seules. Je ne vois pas votre grammaire, donc je ne peux pas vous aider. Mais votre conflit est probablement quand un command est suivi par une règle différente qui commence par LPAREN.

Examinez toutes les autres règles qui peuvent éventuellement être après command et commencez par LPAREN. Vous devrez ensuite consolider les règles. Il y a de très fortes chances que votre grammaire soit erronée pour une entrée spécifique.

+0

Oui, vous êtes rigth. Le problème était dans la ligne au-dessus de celui-ci. J'ai résolu ce problème il y a 4 jours. J'ai oublié de mettre à jour la question. – dierre

4

Vous avez deux productions:

command ::= IDENTIFIER 
command ::= IDENTIFIER LPAREN parlist RPAREN; 

Il est un changement/réduire les conflits lorsque les jetons d'entrée sont IDENTIFIER LPAREN, parce que:

  • LPAREN pourrait être le début d'une nouvelle production, vous avez pas énumérés, auquel cas l'analyseur doit réduire le IDENTIFIER déjà sur la pile en command, et avoir command LPAREN restant
  • Ils pourrait être le début de la deuxième production, donc il devrait déplacer le LPAREN sur la pile à côté de IDENTIFIER et continuez à lire, en essayant de trouver un parlist.

Vous pouvez y remédier en faisant quelque chose comme ceci:

command ::= IDENTIFIER command2 
command2 ::= LPAREN parlist RPAREN |; 
+0

Merci, mais j'ai le même décalage/réduire les conflits, même avec cette solution. Je n'ai pas d'erreurs de syntaxe, donc je suis assez sûr que CUP n'utilise pas de "symbole vide" bizarre, mais je le vérifie. – dierre

1

Essayez de définir une priorité:

precedence left  LPAREN, RPARENT; 

Il force CUP de décider du conflit, en prenant le match gauche.