簡體   English   中英

這個語法有什么關系?

[英]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規則匹配標記defineIDas ,但不匹配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 (詞法分析器)標記。

片段詞法分析器規則不會創建令牌,但它們可以組成為創建令牌的非片段規則。 在您的示例中, 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');

我認為詞法分析器規則優先考慮它們的列出方式。 因此,如果您想要實際創建令牌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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM