如果是野牛的话



我正在尝试在野牛中进行IF-then语句。问题在于,我正在为一个每个人都说正在工作的解决方案,但事实并非如此:(我的代码是:

语句:匹配
|不比拟的
;匹配:如果'('expression')'匹配匹配其他匹配的

| otherstmt                 
;

unmatchedstmt:如果'('expression')'语句

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

otherstmt:expressionstmt

| compoundstmt  
| iterationstmt     
| returnstmt    
;

...

其中"如果"&" else"是百分比

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

我还尝试了%nonassoc和%左

我该怎么办?

可以通过野牛处理以下任何形式的冲突:

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语句。

大概,换档冲突在您的语法中的其他地方,可能涉及与该片段的互动。我建议您一次添加更多语句类型,直到找到导致冲突的规则为止。不幸的是,LR语法不能很好地构成:两个完全无冲突的片段在语法中结合时会产生冲突。


总的来说,如果您遵循如何询问的准则,您会发现您将在Stackoverflow上获得更好的答案。特别是,您应该首先尝试找到表现出您正在阐明的问题的最小程序,然后将所有这些程序都放入您的问题中。这就是我们所说的MCVE:最小,完整和可验证的示例,它的优势是有人试图回答您的问题可以准确地看到您在做什么。

从您的代码中提取的摘录无法编译或执行的是不是mcve。创建MCVE似乎是很多工作,有时就是这样。但是,除了帮助人们回答您的问题外,它还有助于您回答自己的问题,因为它可以帮助您专注于问题。因此,这是一个非常有用的练习。

使用%nonassoc

解决此问题的最佳方法
%nonassoc THEN
%nonassoc ELSE
%%

statement:              TIF TLPAREN expression TRPAREN TTHEN statement %prec THEN
                        | TIF TLPAREN expression TRPAREN TTHEN statement TELSE statement

%%

相关内容

  • 没有找到相关文章

最新更新