[英]What's the matter with this Grammar?
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
規則匹配標記define
, ID
, as
,但不匹配TYPE
。 我正在產生一個MissingTokenException。
如果我內聯TYPE,如下所示,它可以正常工作:
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');
更新:添加了fragment
關鍵字以解決另一個沖突: The following token definitions can never be matched because prior tokens match the same input: TYPE
。
在組合語法中,將解析器規則置於詞法規則之上。 另外,請記住詞法分析器首先運行,並且只有在完成解析器運行之后才會運行。 在知道define
(解析器)規則需要它之前,必須匹配TYPE
(詞法分析器)標記。
片段詞法分析器規則不會創建令牌,但它們可以組成為創建令牌的非片段規則。 在您的示例中, IDHEAD
和IDTAIL
不是標記 - 它們僅用於描述ID
的各個部分。 因此, TYPE
和ID
是非片段規則, IDHEAD
和IDTAIL
是片段規則。
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');
我認為詞法分析器規則優先考慮它們的列出方式。 因此,如果您想要實際創建令牌TYPE,請將其移到所有其他詞法分析器規則之上。
grammar Test;
fragment
TYPE: ('text' | 'number' | 'bool');
IDHEAD: ('a'..'z' | 'A'..'Z' | '_');
IDTAIL: (IDHEAD | '0'..'9');
ID: (IDHEAD IDTAIL*);
define: 'define' ID 'as' TYPE;
是不是因為TYPE被定義為片段?
現在無法測試,但嘗試刪除片段,這應該可以做到,然后給你一個令牌來啟動。
應該做fragment
的行是什么? 我認為如果你刪除它應該按預期工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.