Lex和yacc如何解决移位/减少悬空等问题



我发现了与我的问题类似的例子,但我似乎无法将其应用于我的例子。

有人能帮我指明正确的方向吗?

这是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
;

我相信它仍然可以正常工作,并且已经修复了移位/减少错误:)

最新更新