2017-07-19 78 views
2

有沒有辦法告訴ANTLR4內嵌解析器規則?ANTLR4中是否存在解析器等價的'fragment'標記?

有這樣的功能似乎是合理的。讀完這本關於ANTLR的書後(「The Definitive ANTLR 4 Reference」)我還沒有找到這樣的可能性,但自從這本書發佈以來4年 可能已經引入了變化,所以我想最好是在這裏問。

考慮以下片語法:

file: (item | class_decl)*; 
class_decl: 'class' class_name '{' type_decl* data_decl* code_decl* '}'; 
type_decl: 'typedef' ('bool'|'int'|'real') type_name; 
const_decl: 'const' type_name const_name; 
var_decl: 'var' type_name var_name; 
... 
fragment item: type_decl | data_decl | code_decl; 
fragment data_decl: const_decl | var_decl; 
fragment code_decl: function_decl | procedure_decl; 
fragment class_name: ID; 
fragment type_name: ID; 
fragment const_name: ID; 
fragment var_name: ID; 

規則標記爲片段是有爲了清楚/文件和可重用性,但是從圖語法一點上是F.E.真的是var_decl,它是fileclass_decl的實際直接元素,我希望它反映在由解析器創建的上下文內容中。爲itemdata_decl等創建的所有中間環境都是多餘的,不必要地佔用空間並使其成爲訪問者與語法的組織結構而不是其實際含義相綁定。

概括起來 - 我期望ANTLR把上面的語法爲以下前代解析器:

file: (type_decl | const_decl | var_decl | function_decl | procedure_decl | class_decl)*; 
class_decl: 'class' ID '{' type_decl* (const_decl | var_decl)* (function_decl | procedure_decl)* '}'; 
type_decl: 'typedef' ('bool'|'int'|'real') ID; 
const_decl: 'const' ID ID; 
var_decl: 'var' ID ID; 
... 

回答

0

沒有,是在語法規則沒有這樣的事情。您可以在ANTLR的Github回購中提出一個問題/ RFE,例如:https://github.com/antlr/antlr4/issues

+0

[完成](https://github.com/antlr/antlr4/issues/1963) – ABW

0

您可以使用rule element labels。它們提供了類似的功能,但更多的限制(applicatble僅供一次性令牌或規則):

file: (item | class_decl)*; 
class_decl: 'class' class_name=ID '{' type_decl* data_decl* code_decl* '}'; 
type_decl: 'typedef' ('bool'|'int'|'real') type_name=ID; 
const_decl: 'const' type_name=ID const_name=ID; 
var_decl: 'var' type_name=ID var_name=ID; 
... 
item: type_decl | data_decl | code_decl; 
data_decl: const_decl | var_decl; 
code_decl: function_decl | procedure_decl; 
相關問題