問題タブ [antlr]
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.
unicode - Antlr 文法に Unicode 文字を入れるにはどうすればよいですか?
私は次の文法を構築しようとしています:
数値: 整数 | フロート | インフィニティ | インフィニティ | PI ... INFINITY: '∞' PI: 'π'
しかし、Antlr は文法のロードを拒否します。
ant - Antlr Ant タスクはどこで入手できますか?
次のように、Ant build.xml で Antlr タスクを呼び出そうとしています。
しかし、Ant はタスク定義を見つけることができません。その中に次のすべてを入れましたdir.lib.build
:
- antlr-3.1.jar
- antlr-2.7.7.jar
- antlr-runtime-3.1.jar
- stringtemplate-3.2.jar
しかし、それらのどれもタスク定義を持っていないようです。(これらの jar を Ant クラスパスに入れてみましたが、同じ問題です。)
c# - .NET例外がtry/catchブロックによってキャッチされないのはなぜですか?
私はC#用のANTLRパーサーライブラリを使用してプロジェクトに取り組んでいます。私はいくつかのテキストを解析するための文法を構築しました、そしてそれはうまくいきます。ただし、パーサーが不正または予期しないトークンに遭遇すると、多くの例外の1つをスローします。問題は、場合によっては(すべてではない)、try / catchブロックがそれをキャッチせず、代わりに未処理の例外として実行を停止することです。
私にとっての問題は、この問題を他の場所では再現できないことですが、完全なコードでしか再現できません。呼び出しスタックは、例外がtry / catch(Exception)ブロック内で確実に発生することを示しています。私が考えることができる唯一のことは、私のコードと例外をスローするコードの間にいくつかのANTLRアセンブリ呼び出しが発生し、このライブラリではデバッグが有効になっていないため、ステップスルーできないことです。デバッグ不可能なアセンブリが例外バブリングを禁止するのだろうか?呼び出しスタックは次のようになります。外部アセンブリ呼び出しはAntlr.Runtimeにあります:
Parse()の一番下の呼び出しからのコードスニペットは次のようになります。
私にとって、catch(Exception)句は、あらゆる例外をキャプチャする必要がありました。そうしない理由はありますか?
更新: Reflectorを使用して外部アセンブリをトレースしましたが、スレッド化の形跡はまったく見つかりませんでした。アセンブリは、ANTLRで生成されたコードのランタイムユーティリティクラスのようです。スローされる例外はTimeDefLexer.mTokens()メソッドからのものであり、そのタイプはNoViableAltExceptionであり、RecognitionException->Exceptionから派生します。この例外は、レクサーがストリーム内の次のトークンを理解できない場合にスローされます。つまり、入力が無効です。この例外は発生することが想定されていますが、try/catchブロックによってキャッチされているはずです。
また、ParserExceptionの再スローは、この状況とはまったく関係ありません。これは、解析中に例外を受け取り、自分のParserExceptionに変換する抽象化レイヤーです。私が経験している例外処理の問題は、そのコード行に到達することはありません。実際、「新しいParserExceptionをスローする」部分をコメントアウトしても、同じ結果が得られました。
もう1つ、問題の元のtry / catchブロックを変更して、代わりにNoViableAltExceptionをキャッチし、継承の混乱を排除しました。私はまだ同じ結果を受け取りました。
ある人は、デバッグモードでVSが処理された例外をキャッチするのに過度にアクティブになることがあると提案しましたが、この問題はリリースモードでも発生します。
男、私はまだ困惑しています!以前は触れていませんでしたが、VS 2008を実行していて、コードはすべて3.5です。外部アセンブリは2.0です。また、私のコードのいくつかは、2.0アセンブリのクラスをサブクラス化します。バージョンの不一致がこの問題を引き起こす可能性がありますか?
更新2: .NET3.5コードの関連部分を.NET2.0プロジェクトに移植し、同じシナリオを複製することで、.NETバージョンの競合を解消することができました。.NET 2.0で一貫して実行しているときに、同じ未処理の例外を複製することができました。
ANTLRが最近3.1をリリースしたことを知りました。そこで、3.0.1からアップグレードして再試行しました。生成されたコードは少しリファクタリングされていることがわかりましたが、同じ未処理の例外が私のテストケースで発生します。
更新3:このシナリオを簡略化されたVS2008プロジェクト に複製しました。プロジェクトをダウンロードして、自分で調べてみてください。私はすべての素晴らしい提案を適用しましたが、この障害をまだ克服することができていません。
回避策を見つけることができる場合は、調査結果を共有してください。再度、感謝します!
ありがとうございますが、VS2008は未処理の例外で自動的に中断します。また、[デバッグ]->[例外]ダイアログがありません。スローされるNoViableAltExceptionは完全に意図されており、ユーザーコードによってキャッチされるように設計されています。期待どおりにキャッチされないため、未処理の例外としてプログラムの実行が予期せず停止します。
スローされる例外はExceptionから派生したものであり、ANTLRでマルチスレッドが実行されることはありません。
antlr - .Net で動作するように ANTLR を正しくインストールする方法を知っている人はいますか?
ANTLR は、StringTemplate または任意のテキストを使用して C# を出力できますか? 私が見た例から、それは非常にJava中心のツールのようです。
antlr - Antlr: 日付と数字を認識する最も簡単な方法は?
同じ文法で有効な日付と数値の両方を解析する最も簡単な (最短で、ルールが最も少なく、警告がない) 方法は何ですか? 私の問題は、有効な月 (1 ~ 12) に一致するレクサー ルールが、1 ~ 12 のすべての出現に一致することです。したがって、数値を一致させたい場合は、次のような解析ルールが必要です。
日と年のレクサー規則を追加すると、さらに複雑になります。次のような日付の解析ルールが必要です。
同じツリー構造になる限り、月、日、年が解析規則であるかレクサー規則であるかは気にしません。また、他の場所で数字を認識できる必要があります。たとえば、次のようになります。
exception - ANTLR 2 でキャラクターの位置を見つけるにはどうすればよいですか?
私は単純な文法を持っており、antlr 2.7.7 を使用して一対の C# クラスを作成しました。パーサーがトークンでエラーを検出すると、例外をスローします。トークンが解析されたストリームに何文字入ったかを知りたいです。それ、どうやったら出来るの?
c++ - Antlrの利点(たとえば、lex / yacc / bison)
私は過去にさまざまなプロジェクト、通常は翻訳者(EDAアプリにストリーミングされたEDIFのサブセットなど)にlexとyacc(より一般的にはbison)を使用しました。さらに、数十年前にさかのぼるlex/yacc文法に基づくコードをサポートする必要がありました。ですから、私は専門家ではありませんが、ツールの使い方を知っています。
私は過去にさまざまなフォーラムでAntlrについて前向きなコメントを見てきましたが、何が欠けているのか興味があります。したがって、両方を使用したことがある場合は、Antlrで何が優れているかより高度であるかを教えてください。私の現在の制約は、私がC ++ショップで働いていることであり、出荷する製品にはJavaが含まれないため、結果として得られるパーサーはその規則に従う必要があります。
parsing - このANTLR 2.0文法ファイルをANTLR 3.0構文に変換するのを手伝ってくれる人はいますか?
「簡単な」部分 (フラグメント、@header および @member 宣言など) を変換しましたが、Antlr を初めて使用するため、Tree ステートメントなどを変換するのに非常に苦労しています。
次の移行ガイドを使用します。
以下に、私が問題に遭遇した例をいくつか示します。
たとえば、次のような問題があります。
また
antlr - AntLR で開始位置と終了位置を取得する
現在、AntLR を使用して、独自の言語でいくつかのファイルを解析しています。エディターでそのセクションを強調表示する必要があります (たとえば、Java クラスのメソッドを強調表示することを考えてください)。
誰もそれらを取得する方法についてのヒントを持っていますか? このコードがあるとします:
関数はキーワードであるため、パーサーで取得する最初の位置は識別子「test」の位置です。そこから最後の中括弧までの位置を取得するにはどうすればよいですか? 当然のことながら、パラメーター リストは動的であるため、事前にその長さを知ることはできません。
ありがとうございました!
java - ANTLRでトークンの正確な出現回数を指定する方法は?
以下に示すようなファイルの文法を定義する必要があります。
//サンプルファイル
NameCount = 4
Name = a
Name = b
Name = c
Name = d
//ファイルの終わり
これで、 NameCountとNameのトークンを定義できるようになりました。しかし、 NameCountの後の値であるトークンNameのインスタンスの有効な数を含むファイル構造を定義する必要があります。値を解析して整数に変換し、文法のグローバルスコープで変数に保存します(変数ncなど)。
Nameが正確にnc回繰り返されるように文法で定義する方法は?