我正在学习ANTLR4并尝试使用词法模式。如何在多个词法模式中出现相同的标记?作为一个非常简单的例子,假设我的语法有两种模式,我想在这两种模式中匹配空格和行尾,我怎么能这样做而不以WS_MODE1和WS_MODE2为例。有没有办法在两种情况下重用相同的定义?我希望在输出流中获得所有空白区域的WS令牌,而不管模式如何。这同样适用于EOL和其他可在两种模式下出现的关键字。
我正在学习ANTLR4并尝试使用词法模式。如何在多个词法模式中出现相同的标记?作为一个非常简单的例子,假设我的语法有两种模式,我想在这两种模式中匹配空格和行尾,我怎么能这样做而不以WS_MODE1和WS_MODE2为例。有没有办法在两种情况下重用相同的定义?我希望在输出流中获得所有空白区域的WS令牌,而不管模式如何。这同样适用于EOL和其他可在两种模式下出现的关键字。
规则必须有不同的名称,但您可以使用 -> type(...)
lexer命令给它们相同的类型。
WS : [ \t]+;
mode Mode1;
Mode1_WS : WS -> type(WS);
mode Mode2;
Mode2_WS : WS -> type(WS);
即使 Mode1_WS
和 Mode2_WS
不是 fragment
规则,代码生成器将看到 type
命令并知道您重新分配了它们的类型,因此它不会为它们定义标记。
规则必须有不同的名称,但您可以使用 -> type(...)
lexer命令给它们相同的类型。
WS : [ \t]+;
mode Mode1;
Mode1_WS : WS -> type(WS);
mode Mode2;
Mode2_WS : WS -> type(WS);
即使 Mode1_WS
和 Mode2_WS
不是 fragment
规则,代码生成器将看到 type
命令并知道您重新分配了它们的类型,因此它不会为它们定义标记。