2016-04-13 6 views
0

Я нашел похожие примеры по моему вопросу, но я не могу применить его к моему примеру.Лекс и yacc как решить shift/уменьшить болтаться еще

Может ли кто-нибудь помочь указать мне в правильном направлении?

Вот сообщение об ошибке 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 

Вот моя грамматика: заявление: блок | emptystatement | ifstatement | автономное | выражение выражения SEMICOLON | OUTPUT LPAREN addexprlist RPAREN SEMICOLON ;

addexprlist: 
addexpr | 
addexprlist COMMA addexpr 
; 

emptystatement: 
SEMICOLON 
; 

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

ответ

0

Этого не нужно решать. Конфликты S/R являются предупреждениями, и по умолчанию именно по этому случаю используется значение по умолчанию (shift).

Вы можете использовать следующую инструкцию, чтобы иметь дело с предупреждением:

%expect 1 /* or whatever */ 
+0

Итак, нет решения, чтобы избавиться от этого предупреждения? – momonkey

+0

Ну, в некотором смысле. * Ответ обновлен. * – DigitalRoss

+0

Спасибо за это, но я надеюсь изменить грамматику, чтобы исправить двусмысленность, не заставляя замолчать предупреждение, если это возможно. – momonkey

0

Я в конечном итоге изменения грамматики к этому:

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 
; 

Я считаю, что должно работать правильно и констатировала сдвиг/уменьшение ошибки