首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ANTLR: Lexer规则不匹配

ANTLR: Lexer规则不匹配
EN

Stack Overflow用户
提问于 2020-05-02 08:10:02
回答 2查看 153关注 0票数 1

我想匹配以下文本: test.define_shared_constant(:testConst,"12",false)

通过这种语法,它可以正确地匹配:

代码语言:javascript
复制
grammar test;

statement: shared_constant_defioniton | method_call;
KEY: ':' ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'?'|'!'|'|'|'-'|'()')+;
expr: STRING;
STRING: '"' (~'"')* ('"' | NEWLINE) | '\'' (~'\'')* ('\'' | NEWLINE);
NEWLINE: '\r'? '\n' | '\r'; 
BOOLEAN: 'true' | 'false';
ID: ('a'..'z'|'A'..'Z'|'!') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'!'|'?')*;
WS : [ \t\n\r]+ -> channel(HIDDEN);
DEF_SHARED_CONSTANT: 'define_shared_constant';

shared_constant_defioniton
  : ID('.define_shared_constant' '(' KEY ',' expr ',' (BOOLEAN) ')')
;

method_call
  : ID '.' ID? '('expr*(',' expr)*')'
;

与这种语法不匹配。它与method_call匹配,这甚至是不正确的。

代码语言:javascript
复制
 shared_constant_defioniton
  : ID('.' DEF_SHARED_CONSTANT '(' KEY ',' expr ',' (BOOLEAN) ')')
;

它将'define_shared_constant‘解释为ID,所以我必须指定ID不应该包含'define_’。但我怎么能做到呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-02 19:45:19

代码语言:javascript
复制
ID: ('a'..'z'|'A'..'Z'|'!') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'!'|'?')*;
WS : [ \t\n\r]+ -> channel(HIDDEN);
DEF_SHARED_CONSTANT: 'define_shared_constant';

在这里,IDDEF_SHARED_CONSTANT都可以匹配输入define_shared_constant。在这种情况下,多个规则可以匹配并产生相同长度的匹配,首先定义的规则将获胜。因此,defined_shared_constant被识别为ID令牌,因为ID是首先定义的。

要获得您想要的行为,您应该在DEF_SHARED_CONSTANT的定义之前移动ID的定义。如果您根本没有为它定义一个命名的lexer规则,而是在解析器规则中直接使用'define_shared_constant',这也有效,因为隐式定义的lexer规则的作用就好像它们是在文件开始时定义的一样。

票数 1
EN

Stack Overflow用户

发布于 2020-05-03 07:25:36

这是根据ANTLR规范工作的。但是,将其作为IntelliJ语言插件运行并没有实现。我使用了一个谓词,最后的解决方案如下所示:

代码语言:javascript
复制
ID: { getText().indexOf("define") == 0}? ('a'..'z'|'A'..'Z'|'!') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'!'|'?')*;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61556264

复制
相关文章

相似问题

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