在Antlr的一个词法分析器规则上使用多个词法分析器命令

时间:2020-05-07 07:12:16

标签: antlr lexer mode

我试图在一个词法分析器规则上使用多个词法分析器命令。 我的代码看起来像这样:

_id

词法分析器规则NU仅是可选的,因此我不得不介绍不使用它的情况。但是,我也想跳过NO_NUM内的所有内容。

LEXER_RULE: something->mode(NUMBER); mode NUMBER; NU: [0-9]+ ->mode(ANOTHER_MODE); //Going into another mode in case the NU rule is used //now leaving the NUMBER mode, in case there is no number written NO_NUM: ~[0-9]->mode(DEFAULT_MODE);

我知道我不能在一个词法分析器规则上使用多个词法分析器命令。有人知道其他方法吗?我需要能够以某种方式退出该模式。顺便说一句,我不允许使用语义谓词。谢谢!

1 个答案:

答案 0 :(得分:1)

您快到了!使用逗号insetad:

NO_NUM : ~[0-9] -> skip, mode(DEFAULT_MODE);

这显然会丢弃~[0-9]匹配的任何内容。因此,如果您具有以下语法:

ID : [a-zA-Z]+;
...

mode NUMBER;
  NU.    : [0-9]+ -> mode(ANOTHER_MODE);
  NO_NUM : ~[0-9] -> skip, mode(DEFAULT_MODE);

mode ANOTHER_MODE;
  ...

mode NUMBER中遇到abc,然后将a丢弃,并将bc变成ID。如果您还希望a成为ID的一部分,则需要执行以下操作:

ID : [a-zA-Z]+;
...

mode NUMBER;
  NU.    : [0-9]+ -> mode(ANOTHER_MODE);
  NO_NUM : ~[0-9] -> more, mode(DEFAULT_MODE);

mode ANOTHER_MODE;
  ...

有关Lexer Command的更多信息:https://github.com/antlr/antlr4/blob/master/doc/lexer-rules.md#lexer-commands