問題タブ [antlr3]
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 - 語彙素バリアントとAntlr3のマッチング
Antlr 3.2とJava1.6を使用して、英語の入力テキストの測定値を一致させようとしています。次のような字句規則があります。
大文字と小文字の入力の任意の組み合わせを受け入れ、さらに重要なことに、MILLIMETREのすべてのバリアントに対して単一の字句トークンを返すことができるようにしたいと思います。しかし、現時点では、私のASTには、入力テキストと同じように、「ミリメートル」、「ミリメートル」、「mm」などが含まれています。
http://www.antlr.org/wiki/pages/viewpage.action?pageId=1802308を読んだ後、私は次のようなことをする必要があると思います。
ただし、これを行うと、Antlrによって生成されたJavaコードで次のコンパイラエラーが発生します。
代わりに次のことを試しました。
しかし、その後、MEASUREMENTは一致しなくなります。
書き換えルールを使用したより明白な解決策:
NPEを引き起こします:
MEASUREMENTをパーサールールにすると、「以前のトークンが同じ入力に一致するため、次のトークン定義は一致しません」という恐ろしいエラーが発生します。
パーサールールを作成する
「トークンに対応するレクサールールがありません:T_MILLIMETRE」という警告が表示されます。Antlrは実行されますが、T_MILLIMETREではなくASTの入力テキストが表示されます。
私は明らかに、Antlrのように世界をまだ見ていません。誰かが私に何かヒントやアドバイスを教えてもらえますか?
スティーブ
javascript - ANTLR を使用して JavaDoc コメントを解析する
JavaScript ファイル内の 1 つの特定の (自家製の) JavaDoc タグを解析しようとしていますが、これを実現する方法を理解するのに苦労しています。Antlr は、以下に記載されているように不平を言っています。
注 1: 次の選択肢は決して一致しません: 1
注 2: 決定は、複数の選択肢 1、2 を使用して「'_'..'.'」などの入力と一致する可能性があります。その結果、その入力に対して選択肢 2 が無効になりました。
ここに私が解析しようとしているものがあります:
「IMPORT」という名前の AST ツリー要素の下に作成された @import ステートメント (その Maven group:artifact 値とともに) だけで、すべての行が正常に解析されるはずです。
ご協力ありがとうございます。
java - Antlr トークナイザーで Unicode エスケープ デコードを行う方法
AntlrWorks を使用して antlr 文法を作成し、内部使用のためのローカリゼーション ツールを作成しました。解析中に Unicode エスケープ シーケンスを実際の Java 文字に変換したいのですが、これを行う最善の方法がわかりません。これが私の文法でのトークン定義です。フラグメント UNICODE_ESC に対して、6 文字のエスケープ シーケンスの代わりに文字を返すアクションを指定する方法はありますか?
antlr - ANTLR3レクサーの優先順位
'..'
ANTLR3レクサーからトークンを作成します。これは、次のような式をつなぎ合わせるために使用されます。
だから、私は付け加えました、
問題は、私がすでにルールを持っているということです:
そして、上記の例[3]では1..2
、として一致していますFLOAT
(最初の後に続くのは、INTではなく.
別のものであるため理由はわかりませんが、そうです)。.
DOTDOTSEP
レクサールールの優先順位を変更して、最初に一致させてから、次に一致させる方法があるかどうか疑問に思いますFLOAT
。
ここを見ると、私は負けているように見えます"The rule having the greatest count is the winner.",
が、それを回避する方法があるのだろうかと思います。
PSINTは次のように定義されます...
編集。
もう少しテストすると、FLOAT
ルールに直接一致するほど単純ではないと思います。(質問を変更するつもりでしたが、今は答えがあるので、変更しません。)問題(私は信じています)はまだレクサールールの優先順位にあるので、質問は同じままです。
java - ANTLR3解析の問題
TaskJuggler III予約ファイルを解析するためのANTLR3文法を作成しました(以下を参照)。
オンライン
projectprj"サンプルプロジェクト""1.0" 2010-10-24-00:00-+ 0200 --2010-11-23-09:00- + 0100 {
次のエラーが発生します:
1:42行の不一致文字'-'はセット'0'..'9'を期待しています
1:48行の不一致文字':'セット '0'..'9'が必要です
行1:67不一致の文字'-'セット'0'..'9'が必要です
1:73行の不一致文字':'セット '0'..'9'が必要です
その後、OutOfMemoryエラーが発生します。
文法の関連部分は次のとおりです。
BookingsFileは[DefaultBookingsFilebookingsFile]を返します
{bookingsFile.addSupplementStatement($ suppStmt.suppStmt); }
projectHeader
TJ3_BOOKING_TIME'{'
TJ3_BOOKING_TIME
'-' DIGIT DIGIT':' DIGIT DIGIT'-' TIMEZONE
タイムゾーン
質問:私は何が間違っているのですか?
前もって感謝します
ドミトリ
PS:文法の完全版は次のURLで入手できます。
以下
parsing - ANTLR Lua の長い文字列の文法規則
Lua 用の ANTLR パーサーを作成しようとしています。そこで、Nicolai Mainero が作成した文法 (ANTLR のサイト、Lua 5.1 grammar で入手可能) を取り、作業を開始しました。
文法は得意です。機能しないことが 1 つあります: 長い文字列。
Lua 仕様規則: リテラル
文字列は、長い括弧で囲まれた長い形式を使用して定義することもできます。レベル n の左長い括弧は、左角括弧の後に n 個の等号が続き、その後に別の左角括弧が続くものとして定義します。したがって、レベル 0 の左大括弧は [[ と記述され、レベル 1 の左大括弧は [=[ と記述されます。以下同様です。閉じ長括弧も同様に定義されます。たとえば、レベル 4 の閉じ長括弧は ]====] のように記述されます。長い文字列は、任意のレベルの開き長い括弧で始まり、同じレベルの最初の閉じ長い括弧で終わります。このブラケット形式のリテラルは、複数行にわたって実行でき、エスケープ シーケンスを解釈せず、他のレベルの長いブラケットを無視します。それらには、適切なレベルの閉じ括弧以外のものを含めることができます.適切なレベル.
私の質問はこれに近い意味ですが、ツールは異なります。
LONGSTRING のちょっとした例:
「=」記号を使用しない LONGSTRING のルールは次のとおりです。
誰か助けてくれませんか?ありがとう!
header - ANTLR で @header を使用する
「@header」またはその他の @ ルールを ANTLR で機能させるのに問題があります。次のような非常に基本的な文法を使用します。
これは、オンラインの ANTLR ドキュメントやその他のさまざまな例に準拠しているようですが、ANTLRWorks v1.4 または ANTLR jar v3.2 を使用して出力を生成しようとすると、次のエラーが発生します。
次の理由により文法を生成できません:
エラー (100): [パス]\test.g:11:1 構文エラー: antlr: [パス]\test.g:11:1 予期しないトークン: トークン {
私が振ることができないようです。文法に @header が含まれていなくても、レクサーとパーサーを正常に生成できます。Windows で最新バージョンの Java を使用しています。
Java バージョン "1.6.0_22" Java(TM) SE ランタイム環境 (ビルド 1.6.0_22-b04) Java HotSpot(TM) クライアント VM (ビルド 17.1-b03、混合モード、共有)
これは非常に単純なことだと思いますが、私はそれに気づいていないので、明白な答えを出してください。
antlr - ANTLR で単純な AST を生成する
私はANTLRで少し遊んでいて、次のような関数を作成したいと考えています:
これにより、次の AST が生成されます。
これまでのところ、私は運が悪かったのですが、AST にパラメーターを子ではなく兄弟として持たせ続けています。
これまでのコード:
C#:
ANTLR:
java - ANTLR がこのルールを期待どおりに認識しないのはなぜですか?
ANTLR を使用して、現在持っている既存の (小さな) パーサーを置き換えています。解析しようとしているファイルのスニペットを次に示します。
ここにShared.gがあります:
そして Pdb.g:
私の問題は、パーサーを実行すると、次のエラーが発生することです。
私の文法は「b」を受け入れますが、なぜ「Bk」を受け入れないのですか? 私が見落としている明らかな何かがあるように感じます。前もって感謝します
antlr - ANTLR前方参照
前方参照のある言語の文法を作成する必要があります。これを実現する最も簡単な方法は、生成されたASTを複数回パスすることだと思いますが、シンボル情報をツリーに格納する方法が必要です。
現在、私のパーサーはASTを正しく生成し、変数と関数定義のスコープを計算します。問題は、スコープ情報をツリーに保存する方法がわからないことです。
私の文法の断片:
現在のスコープへの参照をツリーに入れたいと思います。
それも可能ですか?生成されたツリーに現在のスコープを保存する他の方法はありますか?ツリー文法でスコープ情報を生成できますが、ツリーの2回目のパスのためにどこかに保存する必要があるため、何も変更されません。