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

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

拥有这样的功能似乎是合理的.在阅读了关于ANTLR的书(“最终的ANTLR 4参考”)之后,我还没有发现这种可能性,但是这些变化可能已经在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,它是file或class_decl的实际直接元素,我想让它反映在解析器创建的上下文的内容中.为item,data_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;
...

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

点赞