[英]Simplifying grammar via operator precedence
我正在嘗試解析 C。 我一直在咨詢一些自由上下文 C 語法,我觀察到它們通常使用“鏈式”生產規則 model 表達式,例如 [here][1] 對 Z20F35E630DAF44DBFAC4C3F6
<logical-or-expression> ::= <logical-and-expression>
| <logical-or-expression> || <logical-and-expression>
<logical-and-expression> ::= <inclusive-or-expression>
| <logical-and-expression> && <inclusive-or-expression>
我說表達式是鏈式的,因為它們遵循以下結構:
expression with operator(N) ::= expression with operator(N+1)
| (expression with operator(N)) operator(N) (expression with operator(N+1))
其中 N 是運算符的優先級。 我知道目標是消除語言的歧義,並以純粹的句法方式引入優先級和關聯規則。
在具有運算符優先級支持的實際解析器中,這樣的 model 表達式是否有任何理由? 我最初的想法是將它們簡單地實現為:
constant_expression ::= expression1 binary_op expression2
其中 binary_op 是任何二元運算,然后通過設置所有運算符的優先級來消除歧義。 例如:
logical_expr ::= simple_expr | logical_expr && logical_expr | logical_expr || logical_expr
然后將 && 運算符的優先級設置為高於 ||。 我認為這種策略會給出一個更簡單的語法,因為它會消除每個優先級的不同規則的必要性,但我不願意使用它,因為我看到的所有實現都使用前一種策略,即使在解析器有優先支持。
許多 LR 風格的解析器可以使用語法本身外部的某種機制來處理運算符優先規則,部分原因是它允許您跳過這種“分層”方法來編寫 CFG。 如果您有一個支持此功能的解析器生成器,則可以編寫一個模棱兩可的語法,然后添加這些外部規則以獲得正確的優先級和關聯性。
請注意 - CFG 和 BNF 規則的解析器通常對編寫規則的順序不敏感,因此僅列出從最高優先級到最低優先級的運算符是不夠的。 (另一方面,PEG 解析器確實代表有序選擇)。 此外,由於大多數解析器生成器的工作方式(具有與每個生產相關聯的要執行的代碼,並使用生產中的終端來確定運算符優先級),通常更容易擁有單獨的規則,每個二元運算符一個,而不是擁有“Expr Operator Expr”形式的一條規則。 但除此之外,基本方法是合理的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.