如何定义在ANTLR4中可以出现在多种词法模式中的标记?

med*_*hat 13 lexer antlr4

我正在学习ANTLR4并尝试使用词法模式.如何在多个词法模式中出现相同的标记?作为一个非常简单的例子,假设我的语法有两种模式,我想在这两种模式中匹配空格和行尾,我怎么能这样做而不以WS_MODE1和WS_MODE2为结尾.有没有办法在两种情况下重用相同的定义?我希望在输出流中获得所有空白区域的WS令牌,而不管模式如何.这同样适用于EOL和其他可在两种模式下出现的关键字.

Sam*_*ell 17

规则必须具有不同的名称,但您可以使用-> type(...)lexer命令为它们指定相同的类型.

WS : [ \t]+;

mode Mode1;

    Mode1_WS : WS -> type(WS);

mode Mode2;

    Mode2_WS : WS -> type(WS);
Run Code Online (Sandbox Code Playgroud)

即使Mode1_WS并且Mode2_WS不是fragment规则,代码生成器也会看到type命令并知道您重新分配了它们的类型,因此它不会为它们定义标记.

  • “type”命令显式分配令牌类型,这是解析器将看到的类型。在这种情况下,“WS”将用于引用由这 3 个规则中的任何一个创建的令牌。 (2认同)
  • 可以在所有模式下匹配的标记将是一个非常受欢迎的词法分析器语法功能。我发现自己在没有这样的功能的情况下“别名”令牌。 (2认同)