簡體   English   中英

在野牛的if-else聲明

[英]if-else statement in bison

我正試圖在野牛中做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

我能做什么??

以下內容可由野牛處理,不存在任何沖突:

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:最小,完整和可驗證的例子 ,其優點是有人試圖回答你的問題可以准確地看到你在做什么。

您的代碼中無法編譯或執行的摘錄不是 MCVE。 創建MCVE可能看起來很多工作,有時也是如此。 但除了幫助人們回答您的問題之外,它還可以幫助回答自己的問題,因為它可以幫助您專注於問題。 所以這是一個非常有用的練習。

使用%nonassoc解決此問題的最佳方法。

%nonassoc THEN

%nonassoc ELSE

%%


statement:              TIF TLPAREN expression TRPAREN TTHEN statement %prec THEN

                        | TIF TLPAREN expression TRPAREN TTHEN statement TELSE statement


%%

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM