ANTLR4中是否有与“片段”标记等价的解析器?

7
有没有一种方法可以告诉ANTLR4内联解析器规则?
拥有这样的功能似乎是合理的。在阅读了关于ANTLR的书籍(“The Definitive ANTLR 4 Reference”)之后,我没有发现这种可能性,但是自从该书出版以来,可能已经引入了更改,因此最好在这里提问。
考虑以下语法片段:
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;

标记为片段的规则是为了清晰/文档化和可重用性,然而从语法角度来看,实际上是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个回答

3

0

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

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接