我正在尝试对一个词法分析器规则使用多个词法分析器命令。我的代码看起来像这样:
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);
我知道我不能在一个词法分析器规则上使用多个词法分析器命令。有没有人知道其他的方法?我需要能够以某种方式离开模式。顺便说一下,我不允许使用语义谓词。谢谢!
发布于 2020-05-07 16:38:34
你就快到了!使用逗号插入:
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命令的更多信息:https://github.com/antlr/antlr4/blob/master/doc/lexer-rules.md#lexer-commands
https://stackoverflow.com/questions/61651852
复制相似问题