問題タブ [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.
compiler-construction - bison を使用したスコープ付き言語のコンパイラ
C++ と flex + bison を使用した変数のスコープをサポートするカスタム C ベース言語用のコンパイラを作成しようとしています。レクサーとパーサーを作成しましたが、スコープの問題を解決できません。バイソンパーサーファイルにセマンティックアクションを実装しました。
私が問題を抱えているのは、新しいシンボル テーブルをコンテキスト シンボル テーブル スタックに配置するタイミングを見つけることです。ボトムアップのパーサーなので、新しいブロックがいつ開始されるか、いつ終了するか、リダクションが実行されてからでは手遅れです。ルールの後ろに置いたコードは、縮小後に実行されます。
バイソンを使用してこれをどのように解決できますか? 私はしばらくの間ブレインストーミングを行っていますが、解決策はありません。ありがとう。
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 < n
basic-name -> ident < type-list *
私の脳は、本当に助けが必要なところまで来ました。
c - 文法を変えることで衝突を減らす
文法について次の仕様があるとします。
これらは、YACC/BISON プログラムで使用するために私が考え出したルールです。ただし、Shift/Reduce Conflicts があります。
この文法も試しました:
どちらも機能しませんでした。それでも衝突がありました。(これは私が設定したテストケースに合格しましたが)
そして、これもしませんでした:
何か助けはありますか?
compiler-construction - 自動エラー回復を使用して効率的な LALR(k) パーサーを構築するための実用的な方法で非 LR(0) 還元状態を理解する方法
非 LR(0) 削減状態がどこから来るのかわかりません。それは次のことを意味しますか?
- LR(0) 還元状態を削除し、LR'(0) 状態を取得します
- LR'(0) states を使用して LR(K) states を生成します。非 LR(0) 還元状態は LR(K) 状態から来ます。
これは、Authomatic Error Recovery を使用して効率的な LALR(K) Parders を構築するためのパティカル メソッドのコピーです。
4.2章をお読みください
parsing - CLR 解析での競合
これは文法です:
私はCLRで解析してから、削減/削減の競合が発生しました。次はどうする?解決した問題を以下に添付します。