我试图在一个词法分析器规则上使用多个词法分析器命令。 我的代码看起来像这样:
_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);
我知道我不能在一个词法分析器规则上使用多个词法分析器命令。有人知道其他方法吗?我需要能够以某种方式退出该模式。顺便说一句,我不允许使用语义谓词。谢谢!
答案 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