1

Unicode をサポートする小さな DSL 用の antlr3 文法を作成しようとしています (ドイツ語のウムラウト äöüÄÖÜß に必要) が、うまく動作しないようです。

"xay" (問題なく動作する) や "xäy" (動作しない) など、Unicode 文字の任意のシーケンスに一致するはずの最小限のテスト文法を作成しました。

文法は次のとおりです。

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');

「xäx」の場合、次のエラーが表示されます。

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

私は何が欠けていますか?

ありがとう!

4

1 に答える 1

2

私はあなたの文法を(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

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

ANTLRInputStream stream = new ANTLRInputStream( new ByteArrayInputStream("x\u00C4y".getBytes("UTF-8")), "utf-8");
于 2012-04-20T14:09:16.077 に答える