2009-11-07 100 views
4
grammar Test; 

IDHEAD: ('a'..'z' | 'A'..'Z' | '_'); 
IDTAIL: (IDHEAD | '0'..'9'); 
ID:  (IDHEAD IDTAIL*); 
fragment 
TYPE: ('text' | 'number' | 'bool'); 

define: 'define' ID 'as' TYPE; 

的问题是define规则令牌defineIDas,但不会匹配TYPE匹配。我正在产生MissingTokenException。这个语法有什么问题?

如果我内联类型,如下所示,它的作品,因为我打算:

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

更新:The following token definitions can never be matched because prior tokens match the same input: TYPE:本fragment关键字在努力解决相互冲突增加。

回答

4

在组合语法中,将解析器规则放在词法分析器规则的上方。另外,请记住词法分析器首先运行,并且只在分析器运行完成后才运行。在知道define(解析器)规则需要它之前,必须匹配TYPE(词法分析器)标记。

片段词法分析器规则不会创建令牌,但它们可以组成创建令牌的非片段规则。在你的例子中,IDHEADIDTAIL不是令牌 - 它们只是用来描述ID的部分。因此,TYPEID是您的非片段规则,并且IDHEADIDTAIL是片段规则。

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

是不是因为TYPE被定义为fragment?

现在不能测试,但尝试并删除片段,并应该做的伎俩,再加上给你一个令牌引导。

0

fragment应该在做什么?我认为它应该按照您的预期工作,如果您将其删除。

1

我认为词法分析规则优先考虑它们是如何列出的。所以如果你想让token实际被创建,把它移到所有其他词法分析器规则之上。

grammar Test; 

fragment 
TYPE: ('text' | 'number' | 'bool'); 
IDHEAD: ('a'..'z' | 'A'..'Z' | '_'); 
IDTAIL: (IDHEAD | '0'..'9'); 
ID:  (IDHEAD IDTAIL*); 

define: 'define' ID 'as' TYPE; 
+0

格式化丢失了,但您仍然可以看到词法分析器规则的顺序。 – WayneH