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