問題タブ [lalr]

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 に答える
114 参照

compiler-construction - bison を使用したスコープ付き言語のコンパイラ

C++ と flex + bison を使用した変数のスコープをサポートするカスタム C ベース言語用のコンパイラを作成しようとしています。レクサーとパーサーを作成しましたが、スコープの問題を解決できません。バイソンパーサーファイルにセマンティックアクションを実装しました。

私が問題を抱えているのは、新しいシンボル テーブルをコンテキスト シンボル テーブル スタックに配置するタイミングを見つけることです。ボトムアップのパーサーなので、新しいブロックがいつ開始されるか、いつ終了するか、リダクションが実行されてからでは手遅れです。ルールの後ろに置いたコードは、縮小後に実行されます。

バイソンを使用してこれをどのように解決できますか? 私はしばらくの間ブレインストーミングを行っていますが、解決策はありません。ありがとう。

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

parsing - LALR のあいまいさの解決

最近、 LALRジェネレーターを書くのに十分なほどLALRに頭を悩ませており、そのためのJavaまたはc#スタイルの文法を構築しようとしています(その始まりはここで指定されています)。

車輪の再発明のように、パーサー ジェネレーターを作成するのは余分な労力であることはわかっていますが (なぜ Antlr を使用しないのですか?)、私の目標は、サードパーティのツールチェーンに依存せずに自分自身をコンパイルできるホビー OS をブートストラップすることです。私の問題はジェネレーターではなく、文法にあります。

ステートメントと式のあいまいさを減らす/減らすことに遭遇しています。

dangling-else などの特定の種類のあいまいさを解決する方法は知っていますが、これらのいくつかは直感的ではなく、困惑しています。

これらを解決する最善の方法は何ですか? また、ソリューションの視覚化に役立つプロトタイピング ツールはありますか? それとも、振り出しに戻って、文法用の GLR パーサー ジェネレーターを実装してみるべきでしょうか?

これらのステートメントは合法です。

設定方法は次のとおりです。

したがって、パーサーがステートメントを予期している場合、*LR(k) アイテム セット カーネルはmethod-body -> { * stmts-opt }、状態の完全なアイテム セットは次のようになります。

識別子がシフトされると、次の状態になります。

これは解析または縮小され、次の状態になります。

競合の可能性。nested-name親状態では、とにドットがあるため、先読みは役に立ちませんprimary-expr。よし、ネストされた名前で削減してみましょう:

ここには何も表示されません...では、primary-expr代わりに by を減らすのはどうですか:

++ をシフトすると、次のようになります。

...別のreduce-reduce競合。

(の代わりに をシフトしてみましょうident:

identまたは(をスタックにシフトする場合も同じ問題が発生します。

これらは、私がこれまでに遭遇したものです。basic-nameは よりも優先されるため、 のようなものは と解釈され、実際に関係式である場合はエラーになるとrel-expr想定しています。x < nbasic-name -> ident < type-list *

私の脳は、本当に助けが必要なところまで来ました。

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

c - 文法を変えることで衝突を減らす

文法について次の仕様があるとします。

これらは、YACC/BISON プログラムで使用するために私が考え出したルールです。ただし、Shift/Reduce Conflicts があります。

この文法も試しました:

どちらも機能しませんでした。それでも衝突がありました。(これは私が設定したテストケースに合格しましたが)

そして、これもしませんでした:

何か助けはありますか?

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

compiler-construction - 自動エラー回復を使用して効率的な LALR(k) パーサーを構築するための実用的な方法で非 LR(0) 還元状態を理解する方法

これが用語の場所です

非 LR(0) 削減状態がどこから来るのかわかりません。それは次のことを意味しますか?

  1. LR(0) 還元状態を削除し、LR'(0) 状態を取得します
  2. LR'(0) states を使用して LR(K) states を生成します。非 LR(0) 還元状態は LR(K) 状態から来ます。

これは、Authomatic Error Recovery を使用して効率的な LALR(K) Parders を構築するためのパティカル メソッドのコピーです。

4.2章をお読みください

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

compiler-construction - 状態が shift-reduce のときに JDT パーサーが要素をポップしなかったのはなぜですか?


章 4.2 の自動エラー回復を使用して効率的な LALR(K) パーサーを構築するための実用的な方法によると。

パーサーが shift-reduce に遭遇すると、|α| をポップする必要があります。要素。しかし、JDT のパーサーは要素をポップしませんでした。理由はわかりませんが、何か助けてくれますか。

parser.java の shift-reduce アクション ここに画像の説明を入力

DiagnoseParser.java の shift-reduce アクション ここに画像の説明を入力

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

parsing - CLR 解析での競合

これは文法です:

私はCLRで解析してから、削減/削減の競合が発生しました。次はどうする?解決した問題を以下に添付します。

解析テーブル

これはプロセスです