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');