2016-04-13 4 views
0

J'ai trouvé des exemples similaires à ma question mais je n'arrive pas à l'appliquer à mon exemple.Lex et yacc comment résoudre shift/réduire dangling else

Quelqu'un pourrait m'aider à me diriger dans la bonne direction?

Voici le message d'erreur de y.output:

state 97 
ifstatement : IF LPAREN conditionalexpr RPAREN statement . (23) 
ifstatement : IF LPAREN conditionalexpr RPAREN statement . ELSE statement (24) 

ELSE shift 102 
IF reduce 23 
INT reduce 23 
OUTPUT reduce 23 
WHILE reduce 23 
IDENTIFIER reduce 23 
INT_LITERAL_TOK reduce 23 
LPAREN reduce 23 
LBRACE reduce 23 
RBRACE reduce 23 
SEMICOLON reduce 23 
DBL_PLUS reduce 23 
DBL_MINUS reduce 23 
MINUS reduce 23 

Voilà ma grammaire: déclaration: bloc | emptystatement | ifstatement | whilestatement | statementexpression SEMICOLON | SORTIE LPAREN addexprlist RPAREN SEMICOLON ;

addexprlist: 
addexpr | 
addexprlist COMMA addexpr 
; 

emptystatement: 
SEMICOLON 
; 

ifstatement: 
IF LPAREN conditionalexpr RPAREN statement | 
IF LPAREN conditionalexpr RPAREN statement ELSE statement 
; 

Répondre

0

Ceci n'a pas besoin d'être résolu. Les conflits S/R sont des avertissements, et l'action par défaut (shift) est la valeur par défaut précisément à cause de ce cas.

Vous pouvez utiliser l'instruction suivante pour faire face à l'avertissement:

%expect 1 /* or whatever */ 
+0

Il n'y a donc aucune solution pour se débarrasser de cet avertissement? – momonkey

+0

Eh bien, d'une certaine manière. * Réponse mise à jour. * – DigitalRoss

+0

Merci pour cela, mais j'espère modifier la grammaire pour corriger l'ambiguïté sans faire taire l'avertissement si possible. – momonkey

0

J'ai fini par modifier la grammaire à ceci:

ifstatement: 
matched | 
unmatched 
; 

matched: 
IF LPAREN conditionalexpr RPAREN matched ELSE matched 
; 

unmatched: 
IF LPAREN conditionalexpr RPAREN matched | 
IF LPAREN conditionalexpr RPAREN unmatched | 
IF LPAREN conditionalexpr RPAREN matched ELSE unmatched 
; 

Je crois qu'il devrait encore fonctionner correctement et a fixé le Maj/réduire l'erreur :)