2009-07-18 77 views
2

我有以下的Antlr語法:ANTLR的隱藏通道空白問題

grammar MyGrammar; 

doc : intro planet; 
intro : 'hi'; 
planet : 'world'; 
MLCOMMENT 
    : '/*' (options {greedy=false;} : .)* '*/' { $channel = HIDDEN; }; 
WHITESPACE : ( 
    (' ' | '\t' | '\f')+ 
    | 
    // handle newlines 
    ('\r\n' // DOS/Windows 
     | '\r' // Macintosh 
     | '\n' // Unix 
    ) 
    ) 
{ $channel = HIDDEN; }; 

在ANTLRWorks 1.2.3解釋器,輸入hi worldhi/**/worldhi /*A*/ world工作,如所預期。

但是,輸入hiworld,其中不應該工作,也被接受。 如何使hiworld失敗?我如何在「hi」和「world」之間強制至少有一個空格(或註釋)?

請注意,在此示例中,我僅使用了MLCOMMENT和WHITESPACE來簡化,但其他類型的評論將受支持。使串hiworld失敗

+0

嗯,我不知道Antlr,但不會「doc:介紹WHITESPACE星球」或類似的東西最明顯? – schnaader 2009-07-18 16:58:59

+0

由於通道WHITESPACE隱藏,導致MismatchedTokenException。 – luiscubal 2009-07-18 17:01:22

+0

所以你不能創建另一個未隱藏的空白語法並使用它? – schnaader 2009-07-18 17:14:15

回答

6

你需要創建一個通用的ID令牌。由於詞法分析器可以創建最長的標記,因此它會將輸入「hiworld」看作單個詞,因爲它們本身比「hi」或「world」長。這樣的規則可能看起來像:

ID : ('a'..'z' | 'A'..'Z')+; 

舉個例子,這也正是編程語言解析器如何分開「雙規」的「做」關鍵字(關鍵字類型,開始與「做」)或「完成」(變量名)。

0

一種方法是使用註定要失敗,一個驗證語義謂詞,具體如下:

doc:  intro planet; 
failure : 'hiworld' { false }?; 
intro : 'hi'; 
planet : 'world'; 
// rest of grammar omitted