2012-04-20 30 views
0

私はunicodeをサポートする小さなDSLのantlr3文法を書こうとしていますが(ドイツ語のウムラウト、äöüÄÖÜßには必要です)、うまくいかないようです。私は(うまく動作します)「Xayの」または「Xayの」のようなUnicode文字の任意のシーケンスに一致することになっている最小限のテスト文法、書いたantlr3 unicode文字が原因でエラーが発生する

(しません。)

がここにあります文法:

line 1:1 mismatched character '?' expecting set null 

私は何をしないのです: "XAX" については

grammar X; 

@lexer::header { 
import org.antlr.runtime.ANTLRInputStream; 
import org.antlr.runtime.ANTLRStringStream; 
import org.antlr.runtime.CommonTokenStream; 
import java.io.ByteArrayInputStream; 
import java.io.IOException; 
} 

@lexer::members { 

    public static void main(String[] args) throws Exception { 
     ANTLRInputStream stream = new ANTLRInputStream(new ByteArrayInputStream("x\u00C4y".getBytes()), "utf-8"); 
     XLexer lex = new XLexer(stream); 
     CommonTokenStream c = new CommonTokenStream(lex); 
     XParser p = new XParser(c); 
     p.x(); 
    } 

} 

x : UTF8+; 

UTF8 : ('\u0000'..'\uF8FF'); 

は、私は次のエラーを取得していますか?

ありがとうございます!

+2

の可能性のある重複した([何文字エンコーディングがあると私はそれを気にしなければならない理由] http://stackoverflow.com/questions/10611455/何が文字エンコーディングで、なぜ私は邪魔になるのですか? – Raedwald

答えて

1

私はあなたの文法を(Antlr 3.4を使って)コンパイルしました。私は問題なく動作しました。

$ java -jar antlr-3.4-complete-no-antlrv2.jar X.g 
$ javac -cp antlr-3.4-complete-no-antlrv2.jar XLexer.java XParser.java 
$ CLASSPATH=$CLASSPATH:./antlr-3.4-complete-no-antlrv2.jar:./XLexer.class:./XParser.class java XLexer 

私もそれを解析する前にSTDOUTに文字列を印刷するためのいくつかのコードを挿入し、それが予想される文字列xÄyを印刷:は、ここで私は正確に何をしたかです。

ひとつのアイデアは、しかし:(、私が思うに、JVM起動時にfile.encodingプロパティで指定されている)おそらく、あなたのデフォルトのエンコーディングは、UTF-8以外の何かに設定されています。これをテストするには、getBytes()への呼び出しで明示的にエンコーディングを指定してみてください:

ANTLRInputStream stream = new ANTLRInputStream(new ByteArrayInputStream("x\u00C4y".getBytes("UTF-8")), "utf-8"); 
+0

Yessss!どうもありがとう! getBytes()で文字セットを指定すると、トリックが実行されました。 – fscld

+1

@fscldその場合は、答えを受け入れることを検討するかもしれません.. – jogojapan

関連する問題