2009-06-25 61 views
4

使用Flex和Bison,我有一個支持邏輯「和」,「或」和「非」操作的布爾查詢語言的語法規範,以及使用「()」的嵌套子表達式。 」。Flex和Bison的關聯難度

一切都很好,直到我注意到,像這我想解析爲「A和B或C和d」查詢「(A & B)|(C & d)」實際上是被解釋爲「A & (B |(C & D))「。我幾乎肯定這是一個關聯性問題,但似乎無法在任何地方找到正確的解釋或例子 - 或者我錯過了一些重要的東西。

從boolpars.y相關信息:

%token TOKEN 
%token OPEN_PAREN CLOSE_PAREN 
%right NOT 
%left AND 
%left OR 

%% 

query:  expression       { ... } 
      ; 

expression: expression AND expression   { ... } 
      | expression OR expression   { ... } 
      | NOT expression     { ... } 
      | OPEN_PAREN expression CLOSE_PAREN { ... } 
      | TOKEN        { ... } 
      ; 

任何人都可以找到漏洞?我看不出爲什麼Bison沒有給予「或」適當的優先權。

+0

這可能是因爲Bison生成LALR(1)解析器(1是關鍵字),並且不能夠看起來足夠遠來解釋更復雜的未加括號的查詢?例如,查詢「(A和B)或(C和D)」DOES按預期進行解析。但是當你失去()的時候,事情就會南下。有沒有選擇讓Bison生成LALR(n)解析器? – 2009-06-26 13:22:54

回答

4

從野牛文檔:

運算符優先級是由 聲明的排序行確定; 聲明的行號碼越高(頁面上較低或 屏幕),優先級越高。

所以在你的情況下,OR在屏幕上較低並具有較高的優先級。 順序從 更改爲

%left OR 
%left AND 

(我還沒有測試,但它)

+0

這就是奇怪的部分 - 我試過了,輸出結果是一樣的。 (儘管發現了這個特定的句子) – 2009-06-25 22:42:41

+0

根據克里斯的問題,它會被劃分爲相同的優先順序,而不是無序的。因此他的「A&(B |(C&D))」評論。 – 2009-07-02 08:22:49

1

爲什麼不分裂的製作,在這個片段中一個C-ISH語言

logical_AND_expression: 
    inclusive_OR_expression 
    | logical_AND_expression ANDAND inclusive_OR_expression 
      {$$ = N2(__logand__, $1, $3);} 
    ; 

logical_OR_expression: 
    logical_AND_expression 
    | logical_OR_expression OROR logical_AND_expression 
      {$$ = N2(__logor__, $1, $3);} 
    ; 
1

我已經對自己的執行進行了測試,並且從我的測試中,marcin's answer是正確的。如果我定義的優先級爲:

%left OR 
%left AND 

然後表達式A & B | C & d將減少到((A & B)|(C & d))

如果我定義的優先級爲:

%left AND 
%left OR 

然後表達式A & B | C & d將減少到((A &(B | C))& d)

一個區分的表達應該是:

true & true | true & false 

前者優先級定義將呈現此爲真,而後者將呈現爲假。我已經測試了這兩種情況,並按照解釋的方式工作

仔細檢查您的測試以確保。還要注意,這是定義優先級的頭部分中定義的剩餘百分比,%右等等的順序,而不是您自己定義規則的順序。如果它仍然不能工作,也許它是你的代碼中的一些其他區域,它可能會搞亂它,或者你的野牛版本不同(我只是在黑暗中拍攝)。