2017-04-02 10 views
0

ANTLRとストリーム以前の次のコードが正常に動作:適切な実装及び使用はANTLR 4.6> = 4.7

String code = readFile(args[0]); 
ANTLRCustomStream codeStream = new ANTLRCustomStream(code); 
MyLexer lexer = new MyLexer(codeStream); 

Iは、ANTLRCustomStreamの方法によって無視チャー場合についてCaseInsensitiveInputStream.javaを使用します。

しかし、バージョン4.7以降のANTLRでは、大文字と小文字を区別しない入力ストリームをどのように使用できますか? ANTLRInputStreamは推奨されておらず、使用したくありません。

CharStream codeStream = CharStreams.fromFileName(args[0]); 
// customCharStream here 
MyLexer lexer = new MyLexer(customCharStream); 

答えて

0

残念ながら、CharStreamsインターフェイスではカスタムストリームを使用できません。前と同じようにカスタムストリームを作成する必要があります(new CaseInsensitiveInputStream(...)経由)。 CharStreamsインターフェイスは、(標準的なケース用に最適化されたストリームを作成するための)限定された使用のみです。

Btw。むしろ、大文字と小文字の区別を実装するための典型的なA: [aA]; B: [bB]; ..アプローチを使用することをお勧めします。その小文字の使い方は、完全なUnicode入力では機能しないハックです(例えば、いくつかの大文字には複数の小文字があります)。しかし、アッパーケースはここでも助けになりません(ドイツのアッパーケーシングのStraßeSTRASSEになります)。

一般に、入力と文法の両方のトークンを比較できるようにするには、完全なUnicode入力に対して真に大文字と小文字を区別しない解析を実装するのは非常に難しいです。

+0

大文字小文字を区別しない断片は、以下の理由により適切ではありません:(:「ABC」ABC)、(HTTPSをジム・アイドル[ケース新しい構文の問題を無視へのコメント] @見 1.彼らは普通のトークンよりも遅いです。 //github.com/antlr/antlr4/issues/1002#issuecomment-141955368)。 2. "Straße"の変換は、 "メッセージングや他の' getText() 'メソッドが元の入力文字列からデータを返すため問題にはなりません"(@ sam-harwell [comment here] ://gist.github.com/sharwell/9424666#gistcomment-1186748))。 "Straße"はキーワードではありません(一般的に文字列リテラルです)。 –

+0

あなたはかなりの時間、このケースの不感症の問題に取り組んでいるようです:-) 'Straße'の例:これは、大文字小文字の違いによる文字数の変化の問題です。大文字小文字を区別しません下部ケーシングによる比較は信頼性が低い。これはANSI入力では機能しますが、完全なUnicodeでは機能しません。あなたが本当に必要とするのは、ここで大文字小文字の折りたたみ(正規化)です。 –

関連する問題