Lex и yacc, как решить сдвиг/уменьшение зависания else

Я нашел похожие примеры на мой вопрос, но я не могу применить его к своему примеру.

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

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

Вот моя грамматика: оператор: блок | пустой оператор | оператор | покаоператор | операторвыражение ТОЧКА С ЗАПЯТОЙ | ВЫВОД LPAREN addexprlist RPAREN ТОЧКА С ЗАПЯТОЙ ;

addexprlist:
addexpr |
addexprlist COMMA addexpr
;

emptystatement:
SEMICOLON
;

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

person momonkey    schedule 13.04.2016    source источник


Ответы (2)


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

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

%expect 1 /* or whatever */
person DigitalRoss    schedule 13.04.2016
comment
Так что нет решения, чтобы избавиться от этого предупреждения? - person momonkey; 13.04.2016
comment
Спасибо за это, но я надеюсь изменить грамматику, чтобы исправить двусмысленность, не отключая предупреждение, если это возможно. - person momonkey; 13.04.2016
comment
Я просто пока не знаю, как изменить грамматику для этого:/ - person momonkey; 13.04.2016

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

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
;

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

person momonkey    schedule 13.04.2016