在野牛的if-else声明

问题描述 投票:1回答:2

我正试图在野牛中做if-then声明。问题是,我正在制定一个解决方案,每个人都说这是有效的,但它没有:(我的代码是:

声明:matchedstmt | unmatchedstmt ; matchedstmt:if'('expression')'matchedstmt else matchedstmt

| otherstmt                 
;

unmatchedstmt:if'('expression')'语句

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

otherstmt:expressionstmt

| compoundstmt  

| iterationstmt     

| returnstmt    
;

...

其中“if”和“else”是%令牌

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

我也试过%nonassoc和%left

我能做什么??

if-statement bison shift-reduce
2个回答
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可能看起来很多工作,有时也是如此。但除了帮助人们回答您的问题之外,它还可以帮助您回答自己的问题,因为它可以帮助您专注于问题。所以这是一个非常有用的练习。


0
投票

使用%nonassoc解决此问题的最佳方法。

%nonassoc THEN

%nonassoc ELSE

%%


statement:              TIF TLPAREN expression TRPAREN TTHEN statement %prec THEN

                        | TIF TLPAREN expression TRPAREN TTHEN statement TELSE statement


%%
© www.soinside.com 2019 - 2024. All rights reserved.