問題タブ [abstract-syntax-tree]

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

java - JavaコードのEclipseの解析に対処しますか?

eclipse は、参照されていないメソッドなどを検出したり、プロジェクト内のメソッド参照を見つけたりするために、Java コードの内部表現をどのように内部的に構築しますか? また、その情報にフックして、Eclipse の内部解析に基づいてツールを構築する方法はありますか (Eclipse プラグインまたはスタンドアロンとして)。(デッドコード検出用の小さなツールの構築に使用)

私が見つけた最も近いものは、bcelを使用して独自の表現を構築することですが、それは間違いなく車輪の再発明のにおいがします。

0 投票する
9 に答える
36626 参照

parsing - 抽象構文ツリーと具象構文ツリーの違いは何ですか?

インタープリター/コンパイラーがどのように機能するかについて少し読んでいますが、混乱している領域の 1 つは、AST と CST の違いです。私の理解では、パーサーは CST を作成し、それをセマンティック アナライザーに渡して AST に変換します。しかし、私の理解では、セマンティック アナライザーは単純にルールが守られていることを確認します。具体的ではなく抽象的にするために実際に変更を加える理由がよくわかりません。

セマンティック アナライザーについて私が見逃しているものはありますか、それとも AST と CST の違いはやや人為的なものですか?

0 投票する
3 に答える
3197 参照

java - Visitor パターンを使用したツリー変換

(免責事項: これらの例は、コンパイラを構築するという文脈で与えられていますが、この質問はすべてビジター パターンに関するものであり、コンパイラ理論の知識は必要ありません。)コンパイラの理論を独学で学んでいますが (いや、これは宿題ではありません)、彼がビジター パターンを使用して AST を IR ツリーに変換する方法を理解するのに苦労しています。(注: Python でこれを行っているので、Python も学習できます。これが、次の例が Java ではない理由です。) 私が理解しているように、Visitor パターンの visit メソッドと accept メソッドは設計により void 型になっています。だから私が何かを持っているなら

次に、次のようなビジターメソッドを記述できるようにしたいと思います

これにより、2 つの子式が IR に変換され、プラス式を表す BINOP にリンクされます。もちろん、追加情報を返すようにすべての受け入れ関数を変更しない限り、これは不可能です。また、何も返さない印刷ビジターが必要な場合があるため、これも面倒です。それでも、このテキストでは、ビジターが正しい方法であると主張しています。Java では、Python の柔軟性がなくても実行できることを意味します。信じられないほどハックではない解決策は考えられません-意図した設計について誰かが私に教えてくれますか?

0 投票する
4 に答える
5416 参照

python - Python で抽象構文木をプログラミングするためのライブラリ

単純な言語を表すツリーを作成しています。私は抽象構文木に精通しており、C++ でそれらを構築して使用するためのフレームワークに取り組んできました。任意の AST を指定または操作するための標準の Python ライブラリはありますか? それができない場合、同じ目的に役立つツリーライブラリはありますか?

注、私はPython ASTを操作していないので、AST モジュールは適切ではないと思います。

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

parsing - ANTLR に階層型 AST を出力させる方法は?

私はLua grammarを持っています (C# 用に出力するためのマイナーな変更、名前空間ディレクティブといくつかのオプションの変更のみ) をいくつかのサンプル入力で実行すると、ルート「nil」ノードを持つツリーが返されます子として、入力コードのトークン化されたバージョンのように見えます。ANTLRのツリー文法は「フラット」ツリーではなく階層ツリーで動作するように見えるため、出力をそのまま使用できるとは思いません。

文法の簡単な修正はありますか、それとも最初から書き直す必要がありますか?

0 投票する
3 に答える
804 参照

c - 抽象構文木の質問

私は現在 C でコンパイラに取り組んでおり、AST のデータ構造を構築する部分、特に ID の構造を構築する部分で少し迷っています。これは「シンボル テーブル エントリ」と呼ばれます。

次のようなネット上の構造が表示されます。

前のエントリ (*prev) へのポインターを保持しているため、リンクされたリストのように見えますが、この背後にあるロジックは何ですか?

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

scala - ライブ scala コードから AST を取得できますか?

「ライブ コード」と言ったのは、テキスト ソース ファイルやソース文字列からではなく、partialFunctions / lambdas からという意味だからです。(Ruby1.8 の parseTree と C# linq でできることは知っています)

partialFunction f を考えてみましょう:

次のようなツールが機能することを願っています。

セマンティックなことは気にしません (コンテキストの解析と暗黙は複雑すぎて、私には不必要です)。ライブ コードから構文ツリーが必要なだけです。それは可能ですか?

他の人のコードを検査すると問題が発生する可能性がありますが、自分のコードはどうでしょうか? 以下のことは可能ですか?

コンパイラへのハッキングが必要なようです、うーん...

0 投票する
3 に答える
4540 参照

erlang - 有効なErlang式を含む文字列を抽象構文木(AST)に変換するにはどうすればよいですか?

有効なErlang式を含む文字列をその抽象構文ツリー表現に変換したいのですが、これまでのところ成功していません。

以下は私がやりたいことの例です。コンパイル後、allingはモジュールをz:z().生成します。このモジュールzedを呼び出すと、指定されたリストzed:zed().に適用した結果が返されlists:reverseます。

String"[1,2,3]."、、、または同様のものである可能性があり"begin A=4, B=2+3, [A,B] end."ます。

(これは私がやりたいことの単なる例であるため、評価することStringは私にとって選択肢ではないことに注意してください。)


編集

以下のようにListASTを指定すると、巨大なdict-digraph-error-monsterが生成され、「lint_moduleの内部エラー」と表示されます。


EDIT2

このソリューションは、簡単な用語で機能します。

0 投票する
6 に答える
4532 参照

f# - F#抽象構文木を解析する

F#を使用してASTを解析し、インタープリターを構築するための最良の方法は何ですか?簡単な構文(基本的な算術演算)のF#の例はたくさんありますが、機能の範囲がはるかに広い言語では何も見つからないようです。

識別された共用体は非常に便利に見えますが、多数のオプションを備えた共用体をどのように構築しますか?タイプ(加算、減算、条件、制御フローなど)を他の場所で定義し、それらを結合内の事前定義されたタイプとしてまとめる方がよいでしょうか?

それとも、通訳を書くためのはるかに効果的な手段を逃したことがありますか?タイプごとにeval関数を使用する方が効果的ですか、それともモナドを使用するのでしょうか。

前もって感謝します

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

php - (構文ツリー) 現在のトップダウン パスを使用してツリーをボトムアップで再帰的に反復する

反復する必要がある抽象構文ツリーがあります。AST は、 PHP へのレモン ポートによって生成されます。

さて、「通常」、私は真新しくてピカピカの (PHP 5.3.1) SPL クラスでそれを行います。それは次のようになります:

実際、これはツリー全体の大まかなタイプを決定するコードの別の部分で既に行っていることです (つまり、代入、条件などである可能性があります)。詳細はさておき、唯一重要なことは、反復が RecursiveIteratorIterator::SELF_FIRST、つまりトップダウンで行われることです。

私の問題に戻ると、ツリーでいくつかの置換と最適化を行うために、AST ボトムアップ、つまり RecursiveIteratorIterator::CHILD_FIRST のようなものを繰り返す必要があります。

問題は、これらの操作がコンテキストを認識している必要があることです。つまり、現在のノードまでのパスが必要です。そして、ボトムアップで反復したいので、RecursiveIteratorIterator ではそれができません。

ちょっと考えてみてください。ボトムアップを反復し、各反復で現在のノードのトップダウン コンテキスト (スタック) を取得したいと考えています。RecursiveIteratorIterator は逆方向に反復するために、最初にツリーの末尾に移動する必要があるため、技術的には可能であるはずです。末尾に向かう途中で、現在の位置をキャッシュし、再帰から戻るときに要素を単純にポップアウトすることができます。

これはキーワードです: caching。これが、別の SPL クラス RecursiveCachingIterator で可能であると思われる理由です。

問題は、それは本当に可能かということです。はいの場合、どのように?

私はいくつかのコードでパズルを解こうとしましたが、成功しませんでした。ドキュメントはほとんどありません。本当に、本当に希少です。

SPL を使用してこれに対する最もエレガントなソリューションを見つけた人は誰でも脱帽です! あなたはPHPの第一人者です!

PS: 不明な点がある場合は、できるだけ多くの SPL () 使用法を探しています。カスタム スタックを使用して独自の再帰関数を記述できることはわかっています。そのことを思い出させる必要はありません。