2013-04-15 113 views
0

我有一個YACC語法爲C.解析表達式這些都是它的一些片段:衝突語法YACC /野牛

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硬編碼到這種情況下需要做什麼?

回答

1

問題是,寫入的文法是不明確的。正如您已經注意到的那樣,在解析輸入p,q時,它可以被解析爲Expr COMMA Expr,其中每個ExprAssignment減少(從IDENTIFIER減少),或者它可以被解析爲Assignment COMMA Assignment,然後減少爲單個Expr

你想要什麼?如果你總是想要一個或另一個,只需刪除你永遠不想要的那個,因爲它永遠不會出現。如果你有時需要一個,有時需要另一個,你需要說在任何特定情況下,你如何知道哪一個是。如果它基於上下文,那麼您需要對語法進行不同的重構,以便區分上下文,可能通過使ExprAssignment完全獨立。

此外,你有站立左 - 右遞歸模糊。當你有p,q,r你想要它解析爲(Expr , Expr) , ExprExpr , (Expr , Expr)?同樣,你需要在什麼條件下決定你想要什麼,並適當地設置。

+0

非常感謝您回覆克里斯。我完全同意你提出的觀點,但問題是我無法執行你在現階段提出的任何建議。那麼,我想再問一次,在YACC有沒有一些後門,我可以明確說明,當看到所述字符序列時,必須執行某些規則? – user2283013