2009-04-20 74 views
3

我使用JavaCC創建了一個語法,並且遇到了一個小問題。我試圖允許ASCII擴展集中的任何有效字符被結果編譯器識別。使用JAVACC識別擴展字符

< CHARACTER: 

    ( (~["'"," ","\\","\n","\r"]) 
    | ("\\" 
     (["n","t","b","r","f","\\","'","\""] 
     | ["0"-"7"] (["0"-"7"])? 
     | ["0"-"3"] ["0"-"7"] ["0"-"7"] 
     ) 
    ) 
) 

> 

如果我正確理解這一點,應該在八進制表示選配:看同JavaCC的例子我設置以下令牌識別我的人物(主要地顯示了JavaCC的格拉默本身的例子)後所有ASCII字符,從0-377(涵蓋擴展ASCII集中的所有256個字符)。這對所有鍵盤字符(a-z,0-9,?,。/ etc)以及大多數特殊字符(©,¬,®)均按預期執行。然而,無論何時我試圖解析'商標'符號(™),我的解析器都會持續拋出文件結束異常,表示它無法識別該符號。有沒有一些明顯的方法可以提高我對角色的定義,以便讓商標符號被接受?

回答

1

事實證明,我希望我的語法做的是接受所有有效的Unicode字符而不是ASCII字符,™符號是Unicode規範的一部分,而不是ASCII擴展字符集。更改我的令牌概述如下解決我的問題是有效的字符:

< CHARACTER:( (~["'"," ","\\","\n","\r"]) 
| ("\\" 
    (["n","t","b","r","f","\\","'","\""] 
    | ["u","U"]["+"]["0"-"9","a"-"f","A"-"F"]["0"-"9","a"-"f","A"-"F"]["0"-"9","a"-"f","A"-"F"]["0"-"9","a"-"f","A"-"F"] 
    ) 
))> 
0

我有類似的問題,一個用於識別文本文件中的特殊符號(在格式 - U + 00FF的一個有效的Unicode幸福)(無論是CP1252或ISO-8859-1編碼),它在解析之前被讀入字符串。我的溶液加入到UNICODE_INPUT語法標題:

options { 
    UNICODE_INPUT=true; 
} 

工作就像微風。

有關JavaCC選項的更多信息:http://javacc.java.net/doc/javaccgrm.html