問題タブ [recursive-descent]
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.
parsing - 再帰降下パーサーと共に出力を生成する
簡単なパーサーを書くのは簡単で、私は何年にもわたっていくつか実装してきました。大学では、私たちもそれを書かなければなりませんでした。しかし、この方法を使用して意味のある出力を生成する必要はありませんでした。バックエンドの作成方法を学んだことはありません。
単純化された Pascal で動作する再帰降下パーサーがあり、そのコードを C++ に変換したい場合、どうすればよいでしょうか? 抽象構文ツリーの生成などの中間ステップが必要だとは思いません。
では、コンパイルまたは変換されたコードを出力するにはどうすればよいでしょうか。これについて私が見つけた唯一の有用な例は、Jack Crenshaw のチュートリアルにありますが、他のほとんどのリソースと同様に、フロント エンドに重点を置いています。パーサー コードと文法の関係は非常に明白です。パーサーのメソッドと出力の関係はどうですか? 関数宣言用の私のパーサー メソッドは、正確に 1 つの EmitLn(ここでは C++ コード) 呼び出しに関連付けることができます。しかし、式など、それほど簡単ではないパーサー メソッドについてはどうでしょう。式はさらに多くの呼び出しに分割される可能性があるため、式の出力コードを 1 つずつ分割できるようにする Emit() 関数が必要であることを暗示しています。コードを出力するための定型コードはありますか?Jack Crenshaw の Lets Build a Compiler? の EmitLn 関数など。これは、基本的なシンボル テーブルを維持する必要があることも示しています。これは、ほとんどの例で省略されていることがよくあります。
私は正しいですか?他に何を知っておくべきですか?ヒント/提案、またはリソースはありますか? 私の大きな質問は、コンパイラのフロント エンドに関するチュートリアルがたくさんありますが、バック エンドについての説明はどうですか? 私は言語を解析できますが、それを他の言語に翻訳してコンパイルできるように進化させたいと考えています。
parsing - 再帰下降パーサーの例外の代わりにオプションタイプを使用していますか?
私はOCamlで単純な再帰下降パーサーを書いています。通常(オンラインおよび書籍のチュートリアルからわかる限り)、例外は解析の失敗を示すために使用されます。次に例を示します。
ただし、代わりにオプションタイプを使用することを考えています。
これを実行したい主な理由は、オプションタイプを使用すると、一部のコンビネータを末尾再帰に最適化できるためです。
例外の代わりにオプションを使用することの欠点はありますか?より複雑な構造の解析を開始するときに、この決定は私を苦しめますか?
parsing - パーサー実装の比較: 正確性の確認と (おそらく) 最適化
再帰的降下と演算子の優先順位で、2 つの式パーサーを実装しました。これらは Object Pascal で実装されています。再帰的な降下は次のとおりです。
演算子の優先順位は次のとおりです。
これらは、両者の唯一の本質的な違いです。いくつかの簡単なテストでは、両方が正しく解析されているように見えることが示されています。ただし、実際に実装するのはこれが初めてなので、演算子の優先順位の実装についてはよくわかりません。そして、私を悩ませている驚くべき事実は、再帰降下バージョンよりも遅く実行されることです (1.5 倍多くかかります)! 私のコンパイラクラスと私が読んだすべての記事は、関数呼び出しが少ないため、演算子の優先順位の解析は再帰的降下よりも効率的であると述べており、コードがそれを示しているように見えるので、それも期待しています。演算子の優先順位と右結合テストを取得するために追加の関数をインライン化しましたが、これはあまり役に立たないようです。私が何か間違ったことをしたかどうか教えてください。特定の事項の明確化については、遠慮なくお尋ねください。
python - NLTK を使用して再帰降下パーサーで繰り返しトークンを指定する
これに似た文法を解析しようとしています。
これは、NLTK の再帰降下パーサーにとって有効な文法ではありません。この文法で繰り返しトークンを 1 つ以上指定するにはどうすればよいですか
c# - Perl の Parse::RecDescent モジュール
Parse::RecDescentは、自然言語パーサーを実装するための Perl モジュールであることがわかりました。Parse::RecDescent を C# 言語でも実装する方法はありますか?
php - PHP の再帰降下パーサー
私は長い間このパーサーを作りたいと思っていましたが、どこから始めればいいのかもわかりません。これらのパーサー スクリプトは、私にはまったくわかりません。そのため、初心者向けのチュートリアルは役に立ちます。これを行うには、PHP で十分な経験があります。
ありがとう!
python - PythonでのPython用のISO人間が読めるパーサー
人間が読めるPythonで書かれたPython(できればv。2.7)のパーサーを探しています。パフォーマンスや柔軟性は重要ではありません。ここでは、構文解析の正確性/正確性とパーサーのコードの明確さがはるかに重要な考慮事項です。
オンラインで検索すると、人間が読めるPythonコードを生成するパーサジェネレーターがいくつか見つかりましたが、対応するPython文法がそれらのいずれにも適合していません(私が見る限り、それらはすべて異なる文法仕様の規則に従っています)。いずれにせよ、適切なパーサジェネレータとPython文法の組み合わせを見つけたとしても、私の要件に合ったすぐに利用できるPythonパーサ(人間が読めるPythonコード)の方が当然はるかに望ましいです。
助言がありますか?
ありがとう!
c# - 括弧で囲まれた式再帰下降パーサー
以下にリストされている文法規則について、再帰下降パーサーを書きたいと思います。
だから私は以下のC#コードを使用しました:
パーサーは(2 + 3)のようなものには最適ですが、(3+(2 + 4)* 4)には機能しません
では、パーサーを作成して式を最後まで解析するにはどうすればよいですか?
java - 再帰的降下解析を実行するための Java メソッドの作成に助けが必要
公式の問題:
次のプロダクションの再帰降下解析を実行する Java メソッドを記述します。
これは私が思いついたものです:
私はここで一般的な考えを持っていると確信していますが、誰かがこれを磨くのを手伝ってくれたり、私が正しい軌道に乗っていることを確認したりできることを望んでいました..ありがとうございます!