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