2009-11-07 137 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