Antlr 什么';这语法怎么了?
问题是Antlr 什么';这语法怎么了?,antlr,grammar,Antlr,Grammar,问题是define规则与令牌define、ID、as匹配,但与类型不匹配。我有一个例外 如果我内联类型,如下所示,它将按照我的预期工作: grammar Test; IDHEAD: ('a'..'z' | 'A'..'Z' | '_'); IDTAIL: (IDHEAD | '0'..'9'); ID: (IDHEAD IDTAIL*); fragment TYPE: ('text' | 'number' | 'bool'); define: 'define' ID 'as' T
define
规则与令牌define
、ID
、as
匹配,但与类型
不匹配。我有一个例外
如果我内联类型,如下所示,它将按照我的预期工作:
grammar Test;
IDHEAD: ('a'..'z' | 'A'..'Z' | '_');
IDTAIL: (IDHEAD | '0'..'9');
ID: (IDHEAD IDTAIL*);
fragment
TYPE: ('text' | 'number' | 'bool');
define: 'define' ID 'as' TYPE;
更新:添加
fragment
关键字是为了解决另一个冲突:以下令牌定义永远无法匹配,因为以前的令牌与相同的输入匹配:TYPE
不是因为TYPE被定义为fragment吗
现在无法进行测试,但请尝试删除片段,这样就可以了,还可以给您一个引导令牌。使用
片段的行应该做什么?我认为如果您删除它,它应该会像您期望的那样工作。我认为lexer规则优先考虑它们是如何列出的。因此,如果您希望实际创建令牌类型,请将其移动到所有其他lexer规则之上
grammar Test;
IDHEAD: ('a'..'z' | 'A'..'Z' | '_');
IDTAIL: (IDHEAD | '0'..'9');
ID: (IDHEAD IDTAIL*);
fragment
TYPE: ('text' | 'number' | 'bool');
define: 'define' ID 'as' ('text' | 'number' | 'bool');
在组合语法中,将解析器规则置于词法规则之上。另外,请记住,lexer首先运行,并且只有在完成解析器运行之后才运行。必须先匹配类型
(lexer)标记,然后才能知道定义
(解析器)规则需要它
片段lexer规则不创建标记,但可以将它们组合成创建标记的非片段规则。在您的示例中,IDHEAD
和IDTAIL
不是标记-它们只是用来描述ID
的部分。因此,TYPE
和ID
是非片段规则,IDHEAD
和IDTAIL
是片段规则
grammar Test;
fragment
TYPE: ('text' | 'number' | 'bool');
IDHEAD: ('a'..'z' | 'A'..'Z' | '_');
IDTAIL: (IDHEAD | '0'..'9');
ID: (IDHEAD IDTAIL*);
define: 'define' ID 'as' TYPE;
格式化已丢失,但您仍然可以看到lexer的顺序是如何规则的。
grammar Test;
define: 'define' ID 'as' TYPE;
/*
* Lexer rules only below here
*/
TYPE: ('text' | 'number' | 'bool');
ID: (IDHEAD IDTAIL*);
fragment
IDHEAD: ('a'..'z' | 'A'..'Z' | '_');
fragment
IDTAIL: (IDHEAD | '0'..'9');