2010-01-17 99 views
5

我想挑選出文本的所有令牌和需要匹配所有的ASCII和Unicode字符,所以這裏是我已經擺開Unicode字符怎麼辦。我匹配ANTLR

fragment CHAR  : ('A'..'Z') | ('a'..'z'); 
fragment DIGIT : ('0'..'9'); 
fragment UNICODE : '\u0000'..'\u00FF'; 

現在,如果我寫我的令牌規則爲:

TOKEN : (CHAR|DIGIT|UNICODE)+; 

我拿到「決定可以匹配輸入諸如 「 'A' .. 'Z'」 使用多個備選方案:1,3 其結果是,可替代(S)3爲輸入「 」決定可以匹配輸入諸如禁用‘‘0’..‘9’’使用多個替代:2,3 其結果是,可替代(S)3被禁用該輸入「

並沒有得到匹配: 並且如果我把它寫成

TOKEN : (UNICODE)+; 

沒有得到匹配。

有沒有辦法做到這一點。

+3

「\ u0000的」 ..「\ u00FF」並不包括「所有Unicode字符」,只有它涵蓋第256個。 – 2010-01-17 17:24:34

+0

那也是。我錯過了! – 2010-01-17 17:26:19

+0

是的,但我認爲Java還不支持五位數的Unicode。 – Lezan 2010-01-17 19:24:59

回答

5

另一個要考慮的,如果你在使用Unicode的是,你應該設置charvocabulary選項說計劃要允許在0 Unicode的範圍內的任何字符通過FFFE

options 
{ 
charVocabulary='\u0000'..'\uFFFE'; 
} 

默認你通常會在例子中看到是

options 
{ 
charVocabulary = '\3'..'\377'; 
} 

爲了覆蓋上面所述的觀點。一般來說,如果您需要兩個ASCII字符範圍'A'..'Z',你會作出這樣一個unicode詞法規則unicode的範圍: '\u0080'..'\ufffe'

+1

注意:選項「charVocabulary」在antlr3中不可用,因爲它默認使用unicode。 – 2012-11-27 10:05:29

5

實事求是地講,TOKEN: (UNICODE)+是完全無用的。

既然一切是一個令牌字符,如果您嘗試使用這樣的規則匹配一個Java程序,也就是說,它只會匹配整個程序,並返回到你作爲一個大標誌。

你,如果你想來拆分您的輸入轉換成有意義的片段確實需要向下打破你的人物分成不同的組。

它可以幫助你看看如何「利弊」都做到了。這裏是a BNF grammar for Java,這裏是BNF for an identifier,這說明他們是如何走上麻煩組出

identifier 
    ::= "a..z,$,_" { "a..z,$,_,0..9,unicode character over 00C0" }