2

我正在尝试在野牛中执行 if-then 语句。问题是我正在研究一个每个人都说有效的解决方案,但它没有:(我的代码是:

声明:matchedstmt
| 无与伦比的
;matchstmt : if '(' 表达式 ')' 匹配stmt 否则匹配stmt

| otherstmt                 
;

unmatchedstmt : if '(' 表达式 ')' 语句

| if '('expression ')' matchedstmt else unmatchedstmt   
;

otherstmt : 表达式

| compoundstmt  

| iterationstmt     

| returnstmt    
;

...

其中“if”和“else”是%token

!!在终端它说我有一个班次/减少。

我也试过 %nonassoc 和 %left

我能做些什么??

4

2 回答 2

0

bison 可以处理以下内容,而不会出现任何类型的冲突:

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 文法不能很好地组合:当两个完全无冲突的片段组合成一个文法时,它们很可能会产生冲突。


总的来说,如果您遵循如何提问中的指南,您会发现在 StackOverflow 上会得到更好的答案。特别是,您应该首先尝试找到显示您遇到的问题的最小程序,然后将所有这些都放入您的问题中。这就是我们所说的MCVE: Minimal, Complete, and Verifiable example,它的优点是试图回答您问题的人可以准确地看到您在做什么。

无法编译或执行的代码提取不是MCVE。创建 MCVE 似乎需要做很多工作,但有时确实如此。但除了帮助人们回答你的问题之外,它还可以帮助回答自己的问题,因为它可以帮助你专注于问题。所以这是一个非常有用的练习。

于 2017-03-13T05:46:42.920 回答
0

使用%nonassoc.

%nonassoc THEN

%nonassoc ELSE

%%


statement:              TIF TLPAREN expression TRPAREN TTHEN statement %prec THEN

                        | TIF TLPAREN expression TRPAREN TTHEN statement TELSE statement


%%
于 2017-12-28T08:28:14.630 回答