我发现了与我的问题类似的例子,但我似乎无法将其应用于我的例子。
有人能帮我指明正确的方向吗?
这是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
以下是我的语法:声明:块|空陈述|if语句|whilestatement |语句表达式SEMICOLON|输出LPAREN addexprlist RPAREN分号;
addexprlist:
addexpr |
addexprlist COMMA addexpr
;
emptystatement:
SEMICOLON
;
ifstatement:
IF LPAREN conditionalexpr RPAREN statement |
IF LPAREN conditionalexpr RPAREN statement ELSE statement
;
这不需要解决。S/R冲突是警告,而默认操作(移位)正是因为这种情况才是默认操作。
您可以使用以下语句来处理警告:
%expect 1 /* or whatever */
我最终将语法修改为:
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
;
我相信它仍然可以正常工作,并且已经修复了移位/减少错误:)