簡體   English   中英

如何從語法中刪除間接左遞歸

[英]How to remove indirect left-recursion from grammar

我有一些相互左遞歸的ANTLR代碼:

expr: int_liter
| bool_liter
| char_liter
| str_liter
| pair_liter
| ident
| array_elem
| unary_oper expr
| expr binary_oper expr
| OPEN_PARENTHESES expr CLOSE_PARENTHESES
;

array_elem:  expr  OPEN_BRACKET expr CLOSE_BRACKET ;

有想法該怎么解決這個嗎?

ANTLR 4只能處理直接左遞歸,但是您的語法包含來自規則exprarray_elemexpr間接左遞歸。 解決您特定語法中此問題的最簡單方法是將array_elem規則內聯到expr規則中,並使用帶標簽的外部替代項為expr每個替代項分配有意義的名稱。

expr
  : int_liter                                # someLabel
  | bool_liter                               # someLabel               
  | char_liter                               # someLabel
  | str_liter                                # someLabel
  | pair_liter                               # someLabel
  | ident                                    # someLabel
  | expr OPEN_BRACKET expr CLOSE_BRACKET     # array_elem
  | unary_oper expr                          # someLabel
  | expr binary_oper expr                    # someLabel
  | OPEN_PARENTHESES expr CLOSE_PARENTHESES  # someLabel
  ;

請注意以下有關使用標記的外部替代項的約束:

  1. 沒有兩個外部替代方案可以共享標簽,並且標簽不能與任何規則名稱匹配。 標簽在整個語法中必須是唯一的。
  2. 如果標記了規則的一個外部替代項(例如, array_elem替代項),則必須標記該規則的所有外部替代項。

暫無
暫無

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

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