問題タブ [antlr2]

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 投票する
0 に答える
70 参照

java - オプションのトークンを使用した ANTLR 文法が単純なステートメントで失敗する

ANTLR 2.7 を使用して文法を作成し、次のような単純な式を解析します。

括弧とオプションのパーセント文字を使用できる単純な数値です

私の文法は次のようになります。

たとえば、正常に解析できます

しかし、単一の数値の解析に失敗します:

| LPAREN^ parexpr RPAREN!どちらかを削除すると、または: (NUMBER PCT) => NUMBER PCT^1 つの数値を解析できます (ただし、他の式は明らかにできません)。

この文法で単一の数値を解析できない理由がわかりません..?

私はずっと前にこのバージョンで実装されたプロジェクトに取り組んでおり、既存のものを拡張しているだけであることに注意してください。

0 投票する
0 に答える
44 参照

java - ANTLR2 エラー報告

パーサー/レクサーがエラーに遭遇すると、それをに出力してconsole回復し、解析が行われるようにします。エンドユーザーにとっては、これは API 呼び出しであり、修正できるように解析エラーについて彼に通知したいと思います。現在、エラーが発生したことしか検出できません。

私の質問: エラー メッセージをエンド ユーザーに伝えるにはどうすればよいですか? これは ANTLR が生成したパーサー/レクサー ファイルで処理されるため、エラー メッセージを取得できません。

Java 用に生成された文法。

編集 1: 文法はいつか書き戻されました。したがって、ANTLR2 でのみソリューションが必要です。

編集 2: を設定するdefaultErrorHandler=false;と、デフォルトのエラーハンドラーがレクサー/パーサーで生成されず、これらの例外を処理コードで直接キャッチできることがわかりました。

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

parsing - ANTLR 2 キーワードの問題を解決する

ユーザーからのSTRINGを期待するルールがあります。現在、文法で定義したキーワードをユーザーが指定すると、パーサーはセグメンテーション エラーを返します。

例:

ユーザーが strName として calc/CALC を入力すると、パーサーは Seg Fault をスローします。これを回避する方法がわかりません。

編集:パーサーがセグメンテーション違反を発生させないようにする方法も知りたいです。これにより、望ましくないアプリケーションがクラッシュします。これらの状況では、セグ フォールトではなく正常に終了したいと考えています。

PS: 依存関係があるため、ANTLR 2 のソリューションが必要です。

0 投票する
0 に答える
74 参照

java - ANTLR を使用して Eclipse (Java) でこのエラーが発生する理由

私はANTLR 2.7.6を使用しており、次のクラスMain.javaを実行すると

次のエラーが発生しました: 行 3:30: LT を予期し、'l' が見つかりました 行 4:82: 予期しないトークン: l 行 6:34: GT を予期し、'=' が見つかりました 行 6:58: LT を予期し、'= が見つかりました' 行 7:76: 予期しないトークン: l

私の Parser.g と私の Lexer.g

0 投票する
0 に答える
107 参照

antlr - Antlr「CASE」エラーパス

私はantlr 2.7.6を使用しています。plc 61131-3 ST 言語のパーサーをプログラミングしていますが、文法の問題を解決できません。

文法は次のとおりです。

この問題は、「enum_Value」が「case_Selection」の場合に発生し、パーサーはそれを新しい「Case_Selection」ではなく、新しい「stmt」として解釈します。例:

上記の例では、「enum.liteal2」を新しい「case_Selection」として使用する代わりに、「assign_Stmt」と解釈し、「:=」が見つからないためエラーを返します。本当に新しい「stmt」があるかどうかを理解するために、「:」または「:=」が見つかるまで最大文字数を読み取ろうとする方法はありますか?

ありがとうございました!Edit1: より良い構文;