簡體   English   中英

語法沖突YACC / Bison

[英]Conflict in grammar YACC/Bison

我有一個YACC語法,用於解析C語言中的表達式。以下是其中的一些片段:

Expr: Expr COMMA Expr 
     | Assignment


Assignment: IDENTIFIER
            | Assignment COMMA Assignment

Function Call: IDENTIFIER PARENOPEN Expr PARENOPEN

我基本上希望能夠解析形式為a(p,q,r)的函數調用,並檢查傳遞的參數的數量和類型是否與函數定義中指定的參數和類型相匹配,從而將它們減小為Expr標識符本身的級別。

最終發生的是將p,q,r簡化為Assignment而不是Expr COMMA Expr 這是有問題的,因為我需要運行一些只能使用Expr COMMA Expr才能運行的語義規則。 同樣,也無法刪除規則“ Assignment COMMA Assignment因為它對於某些縮減至關重要。 在這種情況下,我有什么方法可以硬編碼到YACC中?

問題在於所寫的語法是模棱兩可的。 如您Expr COMMA Expr ,當解析輸入p,q ,可以將其解析為Expr COMMA Expr ,其中每個ExprAssignment減少(從IDENTIFIER減少),也可以解析為Assignment COMMA Assignment ,然后減少到單個Expr

你要哪個? 如果您總是想要一個,請刪除一個您永遠不需要的,因為它永遠不會出現。 如果您有時想要一個,而有時又想要另一個,則需要說出在任何給定情況下如何知道 如果它基於上下文,那么您需要以不同的方式重構語法,以便可以通過使ExprAssignment完全獨立來區分上下文。

此外,您還有左與右遞歸歧義。 當您擁有p,q,r ,是否要將其解析為(Expr , Expr) , ExprExpr , (Expr , Expr) 同樣,您需要確定在什么條件下需要哪個並進行適當設置。

暫無
暫無

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

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