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

问题描述 投票:1回答:1

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

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);

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

之类的东西

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

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

antlr lexer mode
1个回答
0
投票

您快到了!使用逗号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

© www.soinside.com 2019 - 2024. All rights reserved.