問題タブ [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.
antlr - Stringtemplate テンプレート引数は常に文字列に評価されます
Antlr 4 RC1 (完全な jar) を使用して文法を解析し、カスタム ast を構築し、その AST から stringtemplate4 を使用してコードを生成しています (antlr jar で stringtemplate クラスを使用しています)。テンプレート内で、Bean のリストを使用して別のテンプレートを呼び出します。
次に、サブテンプレート内で文字列のリストを取得します (各文字列は、文字列に評価される Bean の 1 つです)。しかし、Bean の値ではなく、Bean のプロパティを処理したいので、Java Bean のリスト (プロパティを持つ単純な Java オブジェクトなど) が必要です。
テンプレートのパラメーターは常に文字列に評価されるように見えます。それは意図した動作ですか?はいの場合、他に何を書くべきですか?
escaping - 継続記号と改行('\ n')をエスケープ(無視)して次の行にトークン(つまりID)を継続する文法
IBM i制御言語(CL)ステートメントは\n
(改行)で終了し、次の行で長いステートメントを使用+\n
または継続します(次の行の位置1に続き、次の行の最初の非ブランク文字に続きます)。この本では、ANTLR4RC1の「FunwithPython Newlines」の例を使用しました。これは、または継続文字がトークンテキストを分割しない限り、厳密に一致し、正常に機能します。たとえば、これはCLで有効です。-\n
-
+
+
-
-また-
単純なテストリグの文法は次のとおりです。サポートのみID
をサポートし-
、ラインエスケープとして使用します。
注:lexmagic/SimplePy.g4に基づく
これはそれを実行する方法です(ターミナルで必要なすべてのエクスポートとエイリアスの後):
ANTLR4は、をではなくID
2つのトークンabc
と見なし、その理由を理解しています(レクサーがトークンを発行し、を破棄して新しいトークンとして開始することを確認すると)。パーサーはの代わりに表示します。 def
abcdef
-\n
ID
abc
-\n
def
abc
def\n
abcdef\n
問題は、パーサーabc-\ndef\n
に2つではなく1つのトークンとして表示させる方法はありますか?
一方、ソースコード=の場合、abc -\ndef\n
との間のスペースのために、合法的に2つのトークンを発行する必要がabc
あり-\n
ます。
antlr4 - antlr4 sql 文法
ANTLR4 には利用可能な SQL 文法がありますか? もしそうなら、どこでそれを見つけることができますか?
ANTLR wiki からのリンクがありますが、リンクが壊れています: grammar list
antlr4 - ANTLR4 文法のデバッグ
私は ANTLR の初心者であり、ANTLR4 で ASN.1 パーサーを実行することを試みることで大きくなりました。私は現在、入力ファイルをgrunに渡している段階で、「入力時に1:12029行目では実行可能な代替手段がありません...」などのエラーが表示されます。
これをルールの問題に関連付けようとしていますが、問題のある入力を文字数で特定するのは困難です。ANTLR パーサーが入力を 1 行として表示するのは正常ですか? それとも、ルールの問題 (私は OSX システムを使用しています) のために EOL を認識できませんか? 入力が 1 つの長い行として表示されるのが正常な場合、ファイル内の特定の文字位置を見つけるためのツールを誰かが推奨できますか?
java - Java からの ANTLR 逆コンパイル
私は .java ファイルに ANTLR 3 のパーサーとレクサーの Java ソース コードを持っており、すべてのルールなどの背後にある実際の文法を確認したいと考えています。
それは可能ですか?
antlr4 - ANTLR4 ツリー ウォーキングの手がかりが必要
私の(1つの)コンパイラコースから何年も経っているので、この質問が間違っていたら許してください。私はANTLRとJavaではなくCのコーダーも初めてです。私がやりたいことは、私の問題を説明してから、採用する最善の手法についてアドバイスを求めることです.
ASN.1 プロダクションを ML に変換しようとしています。例えば、
の中へ
私の(簡略化された)ASN1文法は次のとおりです。
「The Definitive ANTLR4 Reference」のいくつかの例は、BaseListener でいくつかの enterNode または exitNode メソッドをオーバーライドする方法を示しており、必要なものはすべてノードのコンテキストにあります。enterTypeAssignment
私の問題は、 andをオーバーライドしたいということですexitTypeAssignment
が、必要な情報の一部は、解析ツリーの上位ノード (代入など) または下位ノード (列挙など) にあります。
ビジター パターンとリスナー パターンのどちらを使用する必要があるかを尋ねるのに十分な説明はありますか? どの本の例に焦点を当てるかについてのアドバイスは大歓迎です。
ブルートフォースアプローチで運が良かった:
しかし、おそらくもっとエレガントな解決策があります...
更新: ツリーを下る途中で TerminalNodes をグローバル変数に保存し、これらの変数にアクセスして、ツリーのさらに下にあるリスナーのメソッドをオーバーライドすることで、必要な結果を得ています。特定のノードから親または祖父母のコンテキストにアクセスするより良い方法はありますか?
antlr - ANTLR4ツリーインジェクト/リライトオペレーター
ANTLR 3では、次のことを実行できます。
新しいバージョンでそれを行う方法はありますか?
parsing - ANTLR 4:文法が正しくなく、「入力時に実行可能な代替手段がない」
私はそのようなANTLR4を使用しています:
そして、次の文法:
次の出力があります。
文法に誤りがあると思いますが、見えません。アイデアはありますか?
よろしくお願いします。
lexer - 反復可能なストリームとしてantlr4TokenStreamを使用するにはどうすればよいですか?
トルコ語の自然言語テキストをトークン化するためにantlr4を使用してレクサーを作成しました。必要なのは、トークンを1つずつフェッチできるトークンストリームを用意することです。CommonTokenStreamは、次のように使用するとリストを返します。
ただし、入力が膨大になる可能性があるため、トークンのリストを作成したくありません。次のようなものが必要です。
EOFトークンを取得するまでこれを繰り返します。
トークンを反復処理できるトークンストリームはありますか?