問題タブ [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.
java - 抽象構文木から制御フロー グラフを取得する
ANTLR Parser Generator for Java から派生した AST があります。私がやりたいことは、ソース コードの制御フロー グラフを何らかの形で構築することです。ここで、各ステートメントまたは式は一意のノードです。この識別には再帰性があるに違いないことを理解しています。最良のオプションとして何を提案するか、ANTLR にこのジョブに使用できるツールセットがあるかどうか疑問に思っていました。乾杯、クリス
編集 - 私の主な関心事は、AST から制御フロー グラフ (CFG) を取得することです。このようにして、ソースのツリー表現を取得できます。明確にするために、ソース コードと実装言語の両方が Java です。
java - javac.exe AST プログラムによるアクセスの例
javac.exe 内の抽象構文ツリー (AST) にプログラムでアクセスすることはできますか? 例を挙げていただけますか?
java - Eclipse 抽象構文ツリーのプログラムによるアクセス
特定のコードに対してプログラムで Eclipse 抽象構文ツリーにアクセスする例を教えてください。
たとえば、次の AST を取得します。
Class1.java
}
c# - C#コードをASTに変換しますか?
現在、C#コードを抽象構文木に変換することは可能ですか?
編集:いくつかの説明; コンパイラがASTを生成することを必ずしも期待しているわけではありません。「公式」なものを使用したいのですが、パーサーで十分です。ラムダ式は、私が探しているステートメント本体を使用できないため、残念ながら十分ではありません。
c - CコードからのAST
Cソースコードにいくつかの変換を実行したいと思います。Linuxで、ソースコードから完全なASTを生成するツールが必要です。これにより、このASTに変換を適用して、Cソースコードに変換し直すことができます。ELSAを試しましたが、コンパイルされません。(私はUbuntu 8.4を使用しています)。誰かがより良いツール/アプリケーションを提案できますか?
php - PHP での正規表現の結合
正規表現を含む次の 2 つの文字列があるとします。それらを合体させるにはどうすればよいですか?より具体的には、2 つの式を代替として使用したいと考えています。
もちろん、これを文字列操作として行うのは実用的ではありません。これには、式の解析、構文ツリーの構築、ツリーの合体、およびツリーに相当する別の正規表現の出力が含まれるためです。この最後のステップがなくても、私は完全に満足しています。残念ながら、PHP には RegExp クラスがありません (またはありますか?)。
これを達成する方法はありますか?ちなみに、他に方法を提供する言語はありますか?これはごく普通のシナリオではないでしょうか。ないと思います。:-(
あるいは、 2 つの式のどちらかが一致するかどうか、どちらが先に一致するか (同じ位置で一致する場合、どちらの一致が長いか) を効率的にチェックする方法はありますか? これが私が現在行っていることです。残念ながら、私はこれを長い文字列に対して行います。非常に頻繁に、2 つ以上のパターンを作成します。結果は遅いです(はい、これは間違いなくボトルネックです)。
編集:
もっと具体的に書くべきでした - すみません。$a
と$b
は変数であり、その内容は私の制御外です! それ以外の場合は、それらを手動で合体させます。したがって、使用されている区切り文字や正規表現修飾子について、私は何の推測もできません。たとえば、最初の式ではi
修飾子 (大文字と小文字を区別しない) を使用し、2 番目の式ではx
(拡張構文) を使用していることに注意してください。したがって、2 番目の式は大文字と小文字を区別せず、最初の式は拡張構文を使用しないため、2 つを連結することはできません (そして、その中の空白は重要です!
compiler-construction - 簡単な変換のために私のASTはどのように見えるべきですか?
私はjavascriptに似た最小限のおもちゃの言語を持っています。ASTを生成して、エスケープ分析や型推論などの最適化手法を試します。それぞれのクラス/関数の代わりに演算子トークンを一般化して、すべてのノードで型情報を保持するなど、いくつかのアプローチを試しました...しかし、それでもどこにも行かないような気がします。作業するのはすぐに扱いにくくなります...
私はlua5、neko、v8を勉強しましたが、..まあ...私は周りで最も明るいものの1つではないと確信しています。
ASTの設計と、作業が簡単なASTでの変換の実装の経験がある人はいますか?私はあなたの生活を楽にするためのヒントやコツをいただければ幸いです。
(ドラゴンの本を読みに行くように言わないでください。私はすでに持っています。)
parsing - 具体的および抽象的な構文ツリーの標準形式
コードの分析と操作を行う趣味のプロジェクトのアイデアがあります。このプロジェクトでは、特定のソース ファイルの具体的な構文ツリーと抽象的な構文ツリーの両方が必要になります。さらに、2 つのツリー間の双方向参照が役立ちます。文法を書き写して独自のレクサーとパーサーを構築する作業は避けたいと思います。
具体的または抽象的な構文ツリーを記述するための標準形式はありますか? 広く使用されているツール チェーンは、これらの形式への出力をサポートしていますか?
特定のターゲット プログラミング言語を念頭に置いているわけではありません。プロトタイプには一般的なものを使用できますが、Python、C#、Javascript、または C/C++ など、私がよく知っているものを使用したいと思います。
ツールまたはライブラリを介してソース ファイルを実行し、両方のツリーを取得する機能が必要です。理想的な世界では、このツールをユーザーが編集しているコードで実行し、エラーを許容することが実用的です。繰り返しますが、私は単にプロトタイプを開発しようとしているだけなので、これらの要件はかなり緩いです。
ありがとう!
groovy - Groovy で AST 変換を使用してその構文を拡張できますか?
Groovy AST 変換を使用して言語を拡張する方法の例を見てきました。たとえば、ここに示すように、メソッド呼び出しの前後にログを記録します。しかし、このフレームワークを使用して、言語自体の構文を拡張することも可能でしょうか? たとえば、以下を解析して AST に変換し、一連のステートメントを生成できるようにしたい場合はどうなるでしょうか。
groovy - Groovy AST の例が機能しない
私は groovy の使用方法 (および拡張方法) を学ぼうとしています。このページの例に従っています。基本的に、Groovy コードのアノテーションを定義して、コンパイラ プロセスにフックする方法を示します。この例は、メソッド呼び出しの前後に行を出力する書き込みと注釈を中心に展開しています。
私のコードは次のようになります。最初に必要なインポート:
次に、使用する注釈を定義します。
次に、変換自体:
最後に、この変換を使用するはずの私のコード:
さて、これはStarting f\n hello from f \n Ending fを出力することになっていますが、表示されるのはhello from fだけです(そこに私の問題があります)。コードからわかるように、変換自体に訪問中の astnodesメッセージを入れて、うまくいけばそこに到達するかどうかを確認しましたが、残念ながらそうではありません (またはそう思われます)。
groovy -version
版画Groovy Version: 1.6.0 JVM: 1.6.0_11
誰でもこのコードを試して、自分のシステムで動作するかどうかを確認できますか、または何が間違っている可能性があるかについての指針を教えてください。