我正试图在野牛中做if-then声明。问题是我正在制定一个解决方案,每个人都说这是有效的,但它没有:(我的代码是:
声明:matchedstmt
| unmatchedstmt
;
matchedstmt:if'('expression')'matchedstmt else matchedstmt
| otherstmt
;
unmatchedstmt:if'('expression')'statement
| if '('expression ')' matchedstmt else unmatchedstmt
;
otherstmt:expressionstmt
| compoundstmt
| iterationstmt
| returnstmt
;
...
“if”& “else”是%token
!!在终端,它说我有一个班次/减少。
我也试过%nonassoc和%left
我该怎么办?
答案 0 :(得分:0)
以下内容可由野牛处理,不存在任何冲突:
statement : matchedstmt
| unmatchedstmt
;
matchedstmt : if '(' expression ')' matchedstmt else matchedstmt
| otherstmt
;
unmatchedstmt : if '(' expression ')' statement
| if '('expression ')' matchedstmt else unmatchedstmt
;
otherstmt : expressionstmt
| compoundstmt
| iterationstmt
| returnstmt
;
因为您使用标准机制来消除if ... else
语句的歧义,所以这并不令人惊讶。
据推测,shift-reduce冲突在你的语法中的其他地方,可能涉及与这个片段的交互。我建议您一次添加一个语句类型,直到找到导致冲突的规则。遗憾的是,LR语法并不构成:两个完全无冲突的片段很可能在语法结合时产生冲突。
总的来说,如果您遵循How to ask中的指南,您会发现您将在StackOverflow上获得更好的答案。特别是,您应该首先尝试找到显示您正在遇到的问题的最小程序,然后将所有这些放入您的问题中。这就是我们所说的MCVE: Minimal, Complete, and Verifiable example,其优势在于有人试图回答您的问题,可以准确地看到您在做什么。
您的代码中无法编译或执行的摘录不 MCVE。创建MCVE可能看起来很多工作,有时也是如此。但除了帮助人们回答您的问题之外,它还有助于您回答您自己的问题,因为它可以帮助您专注于问题。所以这是一个非常有用的练习。
答案 1 :(得分:0)
使用%nonassoc
解决此问题的最佳方法。
%nonassoc THEN
%nonassoc ELSE
%%
statement: TIF TLPAREN expression TRPAREN TTHEN statement %prec THEN
| TIF TLPAREN expression TRPAREN TTHEN statement TELSE statement
%%