在ANTLR4中是否存在等同于'fragment'标记的解析器?

时间:2017-07-19 12:52:46

标签: antlr4

有没有办法告诉ANTLR4内联解析器规则?

拥有这样的功能似乎是合理的。在阅读了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;
...

2 个答案:

答案 0 :(得分:1)

不,解析器规则中没有这样的东西。你可以在ANTLRs Github repo中提出一个问题/ RFE:https://github.com/antlr/antlr4/issues

答案 1 :(得分:0)

您可以使用rule element labels。它们提供类似的功能但更受限制(仅适用于单个令牌或规则):

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;