簡體   English   中英

yacc中的左值語法減少不正確

[英]lvalue grammar in yacc reduces incorrectly

我正在嘗試使用YACC解析多維數組。 這是我的左值定義:

    lvalue: ID { EM_debug("got lvalue identifier " + to_String($1));
            $$.My_VAR = A_SimpleVar($$.pos, $1);
            $$.size = 0;
            $$.name = $1;
        }
    | lvalue L_SQUARE_BRACKET exp R_SQUARE_BRACKET { EM_debug("got lvalue[exp]");
            $$.My_VAR = A_SubscriptVar($$.pos, $1.My_VAR, $3.My_AST);
            $$.size = $3.My_AST;
            $$.name = $1.name;
        }
    ;

對於(簡化的)輸入ia[2]它打印got lvalue identifier ia並在遇到左括號時給出解析錯誤。 我不明白為什么這不起作用。 它應該在前瞻和左移中看到左括號。 它不應該像這樣立即減少。 我怎樣才能阻止它移動?

不要將YACC用於lval與rval區分。 因為lval也幾乎總是rval,它會在語法中創建減少/減少沖突,這使得它不確定。

使用語義分析階段檢查lval正確性,而不是將其合並到YACC語法中。

但是作為參考,GNU Bison通過減少文件中首先定義的規則來處理減少/減少沖突。 這可能會幫助您暫時解決問題。

相反,減少是完全正確的。 為了申請

lvalue: lvalue L_SQUARE_BRACKET exp R_SQUARE_BRACKET

對輸入

ia[2]

在轉移[ (假設L_SQUARE_BRACKET[ ,見下文))之前,解析器需要將ia變為lvalue 它通過使用規則lvalue: ID來實現這一點,因此我們可以期望該規則在[被移位之前]運行。

所以這不是問題,問題中沒有足夠的信息來提供更好的診斷。 然而,為了它的價值,一些注意事項:

1)就個人而言,我發現在野牛規則中使用文字字符更不容易出錯且更容易閱讀:

lvalue: lvalue '[' exp ']'

當然需要與返回文字字符的flex規則匹配:

"["|"]"  { return *yytext; }

(或者,使用可能不太可讀的語法: [][]可以擴展到更長的單個字符標記列表,例如[][(){}<>=+*/-] :只記住]必須先來,然后-最后一個角色類)。

掃描儀和解析器之間完全不匹配會導致[沒有使用正確的令牌類型發送; 你當然需要消除調試的可能性。

2)野牛是否告訴你任何沖突(包括輪班減少沖突)? 需要追蹤和消除這些中的每一個。

3)你怎么知道的,當正在生成語法錯誤[被視為? 例如,您是否啟用了flex調試跟蹤(非常方便調試)和/或bison調試跟蹤(我認為這比在您的操作中散布打印語句更有用,但是YMMV)?

暫無
暫無

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

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