首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Antlr中对一个词法分析器规则使用多个词法分析器命令

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

Stack Overflow用户
提问于 2020-05-07 15:12:17
回答 1查看 53关注 0票数 1

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

代码语言:javascript
复制
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);

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

EN

回答 1

Stack Overflow用户

发布于 2020-05-07 16:38:34

你就快到了!使用逗号插入:

代码语言:javascript
复制
NO_NUM : ~[0-9] -> skip, mode(DEFAULT_MODE);

显然,这会丢弃任何与~[0-9]匹配的内容。所以,如果你有这样的语法:

代码语言:javascript
复制
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的一部分,则需要执行以下操作:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61651852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档