Lex和yacc如何解决转移/减少悬空的问题

时间:2016-04-13 17:11:04

标签: grammar yacc lex reduce 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 |     if语句|     while声明|     statementexression SEMICOLON |     输出LPAREN addexprlist RPAREN SEMICOLON     ;

addexprlist:
addexpr |
addexprlist COMMA addexpr
;

emptystatement:
SEMICOLON
;

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

2 个答案:

答案 0 :(得分:0)

这不需要解决。 S / R冲突是警告,默认操作(shift)是默认情况,因为这种情况。

您可以使用以下语句来处理警告:

compareTo()

答案 1 :(得分: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
;

我相信它应该仍能正常工作并修复了shift / reduce错误:)