我有一些规则看起来像这样:
INTEGER : [0-9]+;
field3 : INTEGER COMMA INTEGER;
在解析后的树中,我得到一个名为INTEGER的列表,其中包含两个元素。
我宁愿为每个元素找到一种命名方式。
但如果我这样做:
INTEGER : [0-9]+;
DOS : INTEGER;
UNO : INTEGER;
field3 : UNO COMMA DOS;
我仍然得到INTEGER数组。
我做得对吗?我只需要更深入地挖掘,找出问题所在?
对于这个命令,是否有某种语法可以将INTEGER别名为UNO(这实际上是我更喜欢的)?
只需使用标签来识别子组:
field : a=INTEGER COMMA b=INTEGER;
FieldContext
类将由两个额外的类字段生成:
TerminalNode a;
TerminalNode b;
相应的INTEGER
实例将被分配给这些字段。因此,在大多数情况下实际上不需要混叠。
然而,更改令牌的命名类型可能是有正当理由的,并且通常在lexer中通过使用模式、操作和谓词来处理。例如,使用模式,如果INTEGER
在UNO
和DOS
类型之间交替:
lexer grammar UD ;
UNO : INT -> mode(two);
mode two;
DOS : INT -> mode(default);
fragment INT : [0-9]+ ;
何时进行模式切换以及不同的具体方法是否更合适将取决于尚未提供的细节。