2013-05-15 73 views
2

我需要創建JFlex的解析器從輸入文件中提取的所有單詞,包括那些重音字符像A,E,I,O,U,ñ,...JFlex的和重音符號

我問題在於即使設置了所有使用UTF8編碼和%unicode標記的文件,我也無法使其識別這些字符。

的.lex文件是這樣的:

import java_cup.runtime.*; 
%% 
%class ParserLex 
%unicode 
%public 
%final 
%cup 

%init{ 
%init} 

%{ 
    private Symbol sym(int type) { 
     return sym(type, yytext()); 
    } 
    private Symbol sym(int type, Object value) { 
     return new Symbol(type, yyline, yycolumn, value); 
    } 
%} 

Token  = [áéíóú] 
ANY   = . 

%% 

{Token} 
    { System.out.println(yytext()); } 

{ANY} 
    { } 

我的測試類是像這樣的:

class ParserTest { 
    public static void main(String[] args) throws IOException { 
     InputStreamReader reader = new InputStreamReader(new FileInputStream(args[0]), "UTF8"); 
     ParserLex parser = new ParserLex(reader); 
     for (Symbol sym = parser.next_token(); sym.sym != 0; sym = parser.next_token()) { 
     } 
     reader.close(); 
    } 
} 

有關此問題的任何意見或建議嗎?

+0

我會開始通過改變你的測試使用StringReader來儘量減少一些操作系統字符集設置的機會搞砸了你。否則,這對我來說很好。你是否檢查過生成的.java文件以查看可能出錯的內容? – Recurse

回答

0

我最近發現,JFLEX輸出像

Warning in file "scanner.jflex" (line 42): 
Rule can never be matched: 
"???" { return new Symbol(Symbols.CIRCLED_MINUS, 1, yycolumn + 1, null); } 

我的UTF-8字符文字

"⊖" { return new Symbol(Symbols.CIRCLED_MINUS, 1, yycolumn + 1, null); } 

作爲在Linux上的錯誤,我改變了LANG環境變量來指定編碼,例如C.UTF-8,並刪除了警告。使用命令行選項-Dfile.encoding=UTF-8更便於攜帶。我還發現feature request 29,暗示jFlex支持系統默認編碼。