問題タブ [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.
python - Python デバッガー/エディターの書き方
一般的な質問で申し訳ありません。私が欲しいものの詳細:
ユーザーが Python コードを記述して実行できるようにしたいと考えています。処理されない例外が発生したら、デバッガーで実行を一時停止し、現在の状態/環境/スタック/例外に関する情報を表示して、コードを編集できるようにします。
例外が発生した場所で特別なコード ブロックを編集可能にしたいだけで、他には何もありません (今のところ)。つまり、ループ内で発生した場合は、ループfor
内のコード ブロックのみをfor
編集可能にしたいのです。これは、ユーザー エディター スコープ内にある最新/最新のコード ブロックである必要があります (他のライブラリや Python ライブラリ内ではありません)。この条件下では、どのコード ブロックを編集するかは常に明確です。
少し迷っていますが、これを行う方法を少し調査しようとしました。
Python のトレースバックは、コード ブロックを直接提供するのではなく、関数とコード行だけを提供します。私はそれを逆算することができましたが、それは私には少しハックなようです. コードの AST でコード ブロックへの参照を何らかの方法で取得できれば、より良い (そしてより自然な) ものになります。
AST を取得する (そしてそれを操作する、つまり操作/編集する) には、おそらくcompiler
(どちらが非推奨ですか?) および/またはparser
モジュールを使用します。またはast
モジュール。ASTで特別なノード/コードブロックを再コンパイルする方法がわかりません。または、関数全体を再コンパイルすることしかできない場合。
algorithm - 前置順序式から構文木を構築するアルゴリズム
接頭辞順表記で表現された式から構文木を構築するために使用されるアルゴリズムのタイプは何ですか?
python - Python AST の等価性 (参照またはオブジェクト ID ではない) をテストするエレガントな方法
ここでの用語はわかりませんが、これはスキームの と の違い、またはeq?
C文字列の との違いです。どちらの場合も、実際には同じ内容を持つ 2 つの異なる文字列に対して最初の文字列は false を返し、2 番目の文字列は true を返します。equal?
==
strncmp
Python の AST については、後者の操作を探しています。
今、私はこれをやっています:
どうやらうまくいきますが、災害が起こるのを待っているように感じます。誰かがより良い方法を知っていますか?
編集: 残念ながら、2 つの AST を比較しようとすると__dict__
、その比較ではデフォルトで個々の要素の__eq__
メソッドが使用されます。AST は他の AST のツリーとして実装され__eq__
、参照 ID を明らかにチェックします。==
したがって、トーマスのリンク作業のストレートでも解決策でもありません。(それに加えて、すべての AST ノード タイプをサブクラス化して、この custom を挿入したくありません__eq__
。)
java - Eclipse AST の使用
最近、いくつかの Java コードを変更する必要が生じました (メソッドの追加、いくつかのフィールドの署名の変更、およびメソッドの削除)。これはすべて、Eclipse SDK の AST を使用して達成できると思います。
ソースファイルを解析する方法はいくつかの調査から知っていますが、上記のことを行う方法がわかりません。誰かが良いチュートリアルを知っていますか、またはこれらの問題を解決する方法について簡単に説明してもらえますか?
どうもありがとう、
エクストリームコーダー
編集:
私は今、JCodeModel をもっと調べ始めました。これはもっと使いやすいと思いますが、既存のドキュメントをロードできるかどうかはわかりません。
これが機能する場合はお知らせください;)
再度、感謝します。
php - 別のプログラミング言語への翻訳を容易にするために、コードにどのようなパターンを適用できますか?
私は、あるプログラミング言語から別のプログラミング言語にコードを翻訳することを目的としたサイドプロジェクトに着手しています。私が始めている言語はPHPとPythonです(PythonからPHPへの方が簡単に始められるはずです)が、理想的には他の言語を(比較的)簡単に追加できるでしょう。計画は次のとおりです。
これはWeb開発を対象としています。元のコードとターゲットコードは、フレームワークの上に配置されます(これも作成する必要があります)。これらのフレームワークはMVCデザインパターンを採用し、厳密なコーディング規則に従います。これにより、翻訳がいくらか簡単になります。
また、IOCと依存性注入も検討しています。これらは、翻訳プロセスを容易にし、エラーが発生しにくくなる可能性があるためです。
Pythonのパーサーモジュールを利用します。これにより、抽象構文ツリーをいじることができます。どうやら私がPHPで得ることができる最も近いものはtoken_get_all()であり、これは始まりです。
それ以降、AST、シンボルテーブル、および制御フローを構築できます。
そうすれば、コードの出力を開始できると思います。完璧な翻訳は必要ありません。生成されたコードを確認して問題を修正する必要があります。理想的には、翻訳者は問題のある翻訳にフラグを立てる必要があります。
「これのポイントは一体何なのか」と尋ねる前に。答えは...それは興味深い学習体験になるでしょう。これをそれほど難しくしない方法について何か洞察があれば、私に知らせてください。
編集:
変換方法よりも、コードの変換(IoC、SOA?など)を容易にするために、コードにどのようなパターンを適用できるかを知りたいと思っています。
ruby - クラス階層のどこでメソッドが定義され、Rubyでオーバーライドされたかを確認するにはどうすればよいですか?
メソッドがプログラムでサブクラスによってオーバーライドされているかどうかを知る方法はありますか?このように機能するもの:
何か案は?
python - AST が与えられた場合、ソースを取得するための作業ライブラリはありますか?
特定の Python 抽象構文ツリー (AST) をソース コードに変換する方法はありますか?
Pythonのast
モジュール、特にNodeTransformer
. 結果のASTをソースに戻す方法を探していたので、変更を視覚的に検査できます。
ruby - Ruby(MRI)構文ツリーノードのドキュメント
mriの構文木からのほとんどのノードの意味は簡単に推測できます。ただし、リストは非常に長いです(ソース:bin / parse_tree_abc):
PythonのAST操作は組み込みのライブラリであるため、そのドキュメントははるかに優れています。解析ツリーの構文ツリーのすべてのノードが文書化されている場所はありますか?
perl - Perlのcoderefから構文ツリーを取得するにはどうすればよいですか?
Perlで任意のPerlプロシージャ(coderefsによって取得)のコードを検査して操作したいと思います。そのためのツール/モジュール/ライブラリはありますか?B :: Conciseに似ていますが、B :: Conciseが出力にコードを出力する点が異なりますが、プログラムで検査したいと思います。
こんな感じで使いたいです。F
たとえばと呼ばれるcoderefが与えられます。10個の引数付き:
F1
関数stを作成したいのですが。
つまり、2つの部分に「因数分解」します。2つ目は依存せずx1
、1つ目は可能な限り単純です(私はF
巨大な製品として構築されていると思います)。
これが必要なアプリケーションは、メトロポリスサンプリングアルゴリズムの最適化です。分布をサンプリングしていると仮定しますp(x1 | x2 = X1, x3 = X3, ...) = f(x1, x2, x3, ...)
。アルゴリズム自体は不変です。乗法定数係数やその他の変数はアルゴリズムによって変化しないため、依存しない部分x1
(つまり$c
上から)を評価する必要はまったくありません)。
同時確率は、例えばを持っているかもしれません。次のフォーム:
p
また、特定の因子が依存する変数の注釈が付いた因子で構成されるオブジェクトとして構築することも検討します。これでも、コードのイントロスペクション(変数を自動的に決定する)の恩恵を受けます。
terminology - 抽象構文木の使用は何ですか?
私はプログラミング言語のインタプリタを書くことについて自分で学んでおり、抽象構文木について読んだことがあります。私はそれらが何であるかについては知っていますが、それらの使用法はわかりません。
ASTが役立つのはなぜですか?