問題タブ [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.

0 投票する
1 に答える
833 参照

antlr4 - label'label'タイプが以前の定義と一致しません:TOKEN_LABEL!= RULE_LABEL

私はこのようなルールを書くことができないことに気づきました:

次のエラーが発生します。

label'label'タイプが前の定義と一致しません:TOKEN_LABEL!= RULE_LABEL

これは、1回のラベルがパーサールールを参照し、もう1回はレクサールールを参照するためです。ルールを少し変更すると:

すべてが正常に動作します。しかし、なぜ?私の最初の試みの何が問題になっていますか?

0 投票する
1 に答える
447 参照

antlr - あいまいな文字列値を持つ ANTLR4 ルールの解析

ブール値または文字列に属する可能性のある値を明確にするのに問題があるという文法があります。

文法には、タイプ String およびタイプ Boolean のいくつかのフィールドがあります。文字列フィールドには、引用符内にほとんど何でも含めることができ、ブール値には「Y」または「N」を含めることができます。問題: String フィールドに "Y" または "N" が含まれることがあります (通常、複数の単一文字値のリストの一部として)。

関連する文法規則は次のとおりです。文字列が「Y」または「N」である限り、述語を使用して、文字列とのブール比較のあいまいさを解消しようとしました。

ブール式を解析しようとしたときのエラー メッセージ:

は:

antlr3 では先読みを使用していましたが、それはもはやオプションではありません。

そこに何か援助はありますか?

0 投票する
1 に答える
17635 参照

parsing - ANTLR4: 空白の処理

次のような空白処理を使用する多くの ANTLR 文法を見てきました。

したがって、空白はそれぞれ破棄され、非表示のチャネルに送信されます。

このような文法で:

有効な入力は、' not true ' または ' not false ' ですが、望ましい結果ではない' nottrue ' もあります。文法を次のように変更します。

問題は修正されましたが、各ルールで空白を手動で処理したくありません。

一般に、いくつかの例外を除いて、各トークンの間に空白を入れたいと考えています (たとえば、' !true ' の間に空白は必要ありません)。

これを行う簡単な方法はありますか?

0 投票する
1 に答える
681 参照

grammar - ANTLR 4 java.g4 -> 奇妙な文法規則

これは、java.g4 で見たルールの 1 つです。

DecimalLiteral : ('0' | '1'..'9' '0'..'9'*) IntegerTypeSuffix? ;

このように書いてみませんか:

DecimalLiteral : ('0'..'9'+) IntegerTypeSuffix? ;

足りないものはありますか?ご意見ありがとうございます

よろしく フィリップ・フランクソン

0 投票する
1 に答える
5625 参照

antlr4 - ANTLR4: ブ​​ール式のパーサー

次のタイプのブール式を解析しようとしています B1=p & A4=p | A6=p &(~A5=c)

上記の式を評価するために使用できるツリーが必要です。だから私はこれを Antlr3 で、and/or logic の Antlr パーサーの例で試しました - 論理演算子間の式を取得する方法は?

Antlr3で動作しました。次に、Antlr 4 に対して同じことを行いたいと思います。以下の文法を思いつき、コンパイルします。しかし、Java コードを書くのに問題があります。

Antlr4 文法の開始


「B1=p & A4=p | A6=p &(~A5=c)」という式のツリーを取得するための Java コード (以下のスニペット) を作成しました。子 B1=p と | を持つ & を期待しています。その子 | 演算子には子 A4=p および A6=p &(~A5=c) があります。等々。これがそのJavaコードですが、ツリーを取得する方法を理解しようとして立ち往生しています。Antlr 3でこれを行うことができました。

Java コード

get Children メソッドは以下のとおりです。しかし、これはトークンを抽出していないようです。

Javaでパーサーを書く方法を理解するのを手伝ってくれる人はいますか?

0 投票する
1 に答える
1108 参照

multithreading - 複数のANTLR4レクサー/パーサーインスタンスを並行して実行する

ANTLRv4で生成されたパーサーを使用して、複数のコアを備えたマシンで大量のファイルを処理しています。速度を上げるために、ファイルを並行して処理したいと思います。

パーサーのパフォーマンスがCPUにバインドされているかどうかを確認するために、ファイルをグループに分割し、専用のJVMインスタンスで同じパーサーを実行する独立したプロセスを使用してファイルを解析しました。これにより、パフォーマンスが大幅に向上しました。

これにより、プロセスの代わりに複数のスレッドを使用して同じことを試すようになりましたが、成功しませんでした。2つのワーカースレッドを作成しました。それぞれに、パーサー、レクサー、ファイルストリームの独自のインスタンスがあります。返される結果は正しいですが、2つのスレッドを使用すると、実際には1つを使用するよりも少し時間がかかります。

スレッドを正しく使用し、JVMのインストールに問題がないことを確認するために、解析コードを一時的にフィボナッチ数列を計算するコードに置き換えました。この場合、複数のスレッドを使用するとパフォーマンスが向上します。

この動作を分析すると、複数の解析スレッドを使用している場合、どのCPUも使用率が高くならないことがわかりました。スレッドが共有リソースをめぐって争っているようです。

ANTLRソースコードを見てみると、ParserATNSimulator.javaに次のコメントがあります。

「同じパーサーのすべてのインスタンスは、静的フィールドを介して同じ決定DFAを共有します。各インスタンスは独自のATNシミュレーターを取得しますが、同じdecisionToDFAフィールドを共有します。また、すべてのPredictionContextオブジェクトがDFA間で共有されるようにするPredictionContextCacheオブジェクトも共有します。これは大きなサイズの違いになります。」

これらの共有リソースへの同期アクセスがパフォーマンスの問題を引き起こしているかどうか疑問に思っています。もしそうなら、代わりにこれらのリソースの一意のインスタンスを作成する可能性はありますか?それとも、問題に対するもっと簡単な解決策があるのでしょうか?

前もって感謝します!

ファビアン

0 投票する
1 に答える
40120 参照

java - リスナーを使用したANTLRのif/elseステートメント

私は学校のプロジェクトのために簡単なプログラミング言語を作成しています。ANTLR 4を使用して、文法からレクサーとパーサーを生成しています。これまで、プログラミング言語の実際の機能を適用するためにANTLRリスナーパターンを使用してきました。

ここでif/elseステートメントを実装したいのですが、リスナーを使用するときにANTLRが解析ツリーをトラバースする順序を決定するため、リスナーパターンを使用するときにこれらを実際に実装できるかどうかはわかりません。また、if/の実装を想像します。 elseステートメントでは、ステートメント内のどの条件が満たされているかに応じて、解析ツリーをジャンプする必要があります。

ANTLRを使用してif/elseステートメントを実装できるかどうか、またはビジターパターンを自分で実装する必要があるかどうかを誰かに教えてもらえますか?また、誰かがステートメントの実装の非常に簡単な例を与えることができますか?

0 投票する
1 に答える
1888 参照

while-loop - ANTLR を使用して while と while を同時に行う

以前、ANTLR 4 を使用して if/else ステートメントを作成する方法を尋ねるこの質問を作成しました。while ループの実行方法も示した優れた回答を得ました。私は自分の言語でこれを実装しており、ほぼ同じ原則を使用して do-while ループを作成しようとしています。

while ループの構文は次のとおりです。

そして、これは私が do-while ループに望むものです:

私はそれをテストしましたが、両方とも機能しますが、同時には機能しません。以下は私の文法です(すべてを投稿して申し訳ありませんが、必要だと思います)。

myWHILEEND_WHILEトークンが myDO_WHILEDO_WHILE_CONDITIONトークンより上にある場合、while ループが機能します。ただし、それらを切り替えると、do-while ループが機能します。トークンをwhileDO_WHILE_CONDITION以外のものに変更すると、両方とも機能します。

とにかく、現在の構文で両方を機能させることができますか? 複数のことに同じキーワードを使用しているため、問題になる可能性があることは理解していますが、これを行う方法があることを願っています.

0 投票する
1 に答える
1269 参照

java - Antlr はサブトークンを取得します

用語が間違っていたらすみません。

次のような単純化された文法があるとします。

したがって、これはもちろん'boy vs girl'or'girl vs boy'などと一致します。しかし、私の質問は、レクサーを作成するときです。

これは次のようなものを出力します: 9 [boy vs girl]、つまり、クエリにうまく一致しますが、この現在のトークンのサブトークンを取得するようなことができるようにしたいと考えています。

私の直感では、ツリーを使用する必要があることがわかりましたが、実際には、私の例では Antlr4 でこれを行う方法がわかりません。ありがとう