問題タブ [antlr4]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sockets - 終わりのないストリームからのデータを解析するための Antlr の使用
Antlr は、解析するテキストの直後に EOF がないストリームからのデータの解析に適していますか? 私の観察によると、レクサーは次のトークンの最初の文字が受信されるまで現在のトークンを発行しません。その上、次のルールの最初のトークンが受信されるまで、パーサーはルールを発行しないようです。これが私が試した簡単な文法です:
次に、生成されたパーサーを UnbufferedCharStream と UnbufferedTokenStream で使用しました。
ストリームが「クイック」になると、何も起こりません。
' b ' が入ったとき - 入力ルール ' fox '
then ' roun ' - 何もない (2 つのトークンがストリームにある - それらのどれもまだ leser することが知られていない!)
' f ' の後でのみ、リスナーは最初のトークン ' quick 'にアクセスします。
then - ' ox 'には何もありません
新しい行 (unix): トークン ' brown 'にアクセスしてください
これで、ストリームにはすべてのデータ (4 つのトークン) が含まれていますが、認識されるのは 2 つのトークンのみです。
これらのトークンをシステムにプッシュするために、ストリームは 2 つのトークンを発行できることがわかりました。これは、文法で認識されている任意のトークンです。2 つの余分な新しい行、または ' fox ' と ' Brown ' としましょう。その後、トークン ' fox ' と ' \n ' が訪問され、パーサーはルール ' fox ' を終了し、解析が終了します。
それはバグですか、それとも機能ですか?そのラグをなくす方法はありますか?
ありがとう!
java - さまざまなモードを使用するANTLR4レクサー文法をインポートします
レクサー文法を別のレクサー文法にインポートしようとしています。インポートされた文法は、異なるモードを使用します(XMLLexerの例ではモードINSIDEおよびPROC_INSTR)。
コンパイル時に、モード名に対応する変数が定義されていないというエラーが表示されます。
具体的な例として、(antlr4ブックの)XMLLexerの上にHTMLLexerを定義すると、次のエラーが発生します。
トップレベルのレクサーのモードを追加のトークンで再定義することでこのエラーを克服できますが、他のモード内にインポートされたトークンは、デフォルトとして認識されません。
インポートされた部分をメインのレクサー定義にインライン化するとパーサーは機能しますが、インポート機能を使用して明確に分離したいと思います。(xml / htmlの例ではありませんが、別の場合です。)
インポートを使用して動作させることは可能ですか、それともantlr4の制限ですか?
antlr4 - 引数を使用してルールをテストする
バリアントをチェックするために、パーサーでいくつかのサブルールをテストしようとしています。チェックしているルールは式ルールです
生成された解析では、メソッド シグネチャは次のとおりです。
_p 引数として渡す値がわかりません。
パーサーで式メソッドの呼び出しを確認すると、0 が渡されていることがわかります。ただし、parser.expression(0) を直接呼び出そうとすると、null ポインター例外が発生します。
単体テストを有効にするためにこのサブルールを呼び出す推奨される方法は何ですか?
参考までに、私が書こうとしている単体テスト リグのコードを次に示します。
antlr4 - ANTLR追記ツリー
antlr4 TestRig を使用-ps
すると、PostScript ツリーを生成できます。ツリーが表示されません。
追記:
GhostView のエラー:
eclipse - ANTLR4とMavenでlexer+parserを自動的に生成する方法は?
私は ANTLR4 が初めてで、v4 用の Eclipse プラグインがないようです。したがって、.g4 文法から Java ソースを自動的に構築するとよいでしょう。src/main/java、src/test/java を使用した単純な空の Maven プロジェクトがあります。.g4 ファイルをどこに配置しますか? Maven で文法を自動的に構築するにはどうすればよいですか?
私自身のPOMテストが失敗しました:
エクリプス 言います:
antlr4 - ANTLR4: すべての入力候補を 1 回だけ一致させる
ANTLR で、すべての選択肢を任意の順序で 1 回だけ一致させるルールを作成するにはどうすればよいですか?
すなわち
次のルールに移る前に、'example' と 'example2' が 1 回だけ一致するようにします。
次の入力と一致する必要があります。
また
ただし、次の入力ではありません:
antlrworks - インポートされた文法からのレクサーモードは、結合された文法では識別されません。'run intestRig'Antlrworks2をクリックした後のコンパイルエラー
私はAntlrworks2を使用しています。「字句モード」が定義されている字句文法があります。レクサー文法をインポートする文法を組み合わせました。結合された文法からコードを生成した後、2つの.javaファイルを生成します。例:結合された文法ファイル名が「xyz.g4」の場合、Javaファイル名は「xyzLexer.java」、「xyzParser.java」です。しかし、Antlrworks2で[TestRigで実行]をクリックすると、コンソールで以下のエラーが発生します。
CDFCombinedGrammarLexer.java(上記の例ではxyzLexer.java)で観察したように、「字句モード」のコードは存在しません。実際のレクサーファイルから生成されたJavaファイルでモードのコードを見つけることができました。
以下は、実際のレクサーで生成されたJavaファイルで確認できるコードです。
これに関する助けはありますか?お待ちしております!!!
前もって感謝します!
antlr4 - ANTLR4:リスナーの特定のルールのトークンのリストを取得する
ANTLR4でリスナーを拡張していますが、パーサーの特定のルールに関連付けられているすべてのトークンを取得したいのですが、それを行う方法はありますか?
すなわち
解析ルールの値CONFIG
を検索するようにリスナーに指示するにはどうすればよいですか?EQUALS
myConfiguration
使用できるある種のforループはありますか?
パーサークラスを介してトークンのリストがあることはわかりますが、現在のルールに関連付けられているトークンのリストが見つかりません。
私がこれを求めている理由は、リスナーと文法で必要なトークン名を再入力することを避けるためです。そうすることで、名前を手動で入力しなくても、その特定のルールの各トークンタイプが見つかったかどうかを確認できます。
antlr4 - ANTLR4:ツリー構造
baseClassリスナーを拡張し、いくつかの値を読み込もうとしていますが、順序に階層がないようです。
私の文法の縮小版は次のとおりです。
ただし、この実装の解析ツリーはconfig_optionsレベル(ターミナルレベル)でフラットです。つまり、ルールの開始にはconfig_optionsの子が多数ありますが、EQUALSはconfig_optionsのサブツリーのルートではなく、すべてのTOKENSのルートノードとしてルールconfig_optionsがあります。代わりに、端末の1つをルートノードにするにはどうすればよいですか?
この特定のルールでは、スペースをキャプチャしたくありません。レクサーに向けられた->スキップがあることはわかっていますが、スペースが必要な場合もあります。つまり、文字列'"'(ALPHANUM |'')'"'
(注:^は機能していないようです)
入力の例は次のとおりです。
key = abcdefg
key = 90weata
key = acbefg9
私がやりたいのは、キーと値のペアを抽出することだけです。'='がルートになり、2つの子がキーと値になると思います。
parsing - ANTLR4整数解析が失敗する
antlr 4でファイルを解析しようとしていますが、1桁を超える整数が解析されない理由がわかりません(79:44行目入力「17」で実行可能な代替手段がありません)。
これはエンティエ文法ですhttp://pastebin.com/rxktvUBi
これがintの定義です
これはまったく機能しません。このバージョン
1桁の整数に対してのみ機能します。
これは、分割されていない行の例です
問題は
識別子を使用する場合は注意してください
整数の代わりに
それは動作します。
なんで?何か案が?