令牌别名在Antlr

时间:2016-05-08 23:29:01

标签: antlr4

我的规则看起来像这样:

INTEGER           : [0-9]+;
field3     : INTEGER COMMA INTEGER;

在解析的树中,我得到一个名为INTEGER的List,其中包含两个元素。

我宁愿为每个要命名的元素找到一种方法。

但如果我这样做:

INTEGER  : [0-9]+;
DOS      : INTEGER;
UNO      : INTEGER;
field3     : UNO COMMA DOS;

我仍然得到INTEGER数组。

我做得对吗,我只需要深入挖掘以找出问题所在?

是否有某种语法将INTEGER别名为UNO,仅用于此命令(这实际上是我更喜欢的)?

1 个答案:

答案 0 :(得分:3)

只需使用标签来识别子标题:

field     : a=INTEGER COMMA b=INTEGER;

将使用另外两个类字段生成FieldContext类:

TerminalNode a;
TerminalNode b;

相应的INTEGER实例将分配给这些字段。因此,在大多数情况下,实际上不需要别名。

但是,可以有正当理由更改令牌的命名类型,通常通过使用模式,操作和谓词在词法分析器中处理。例如,如果INTEGERUNODOS类型之间切换,则使用模式:

lexer grammar UD ;

UNO : INT -> mode(two);

mode two;
    DOS : INT -> mode(default);

fragment INT : [0-9]+ ;

何时进行模式切换以及不同的特定方法是否更合适将取决于尚未提供的详细信息。