17

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

4

1 回答 1

23

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

WS : [ \t]+;

mode Mode1;

    Mode1_WS : WS -> type(WS);

mode Mode2;

    Mode2_WS : WS -> type(WS);

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

于 2013-04-04T13:06:16.587 回答