プログラムのカスタム 'オブジェクト指向'表現を構築するために、Googleクローズコンパイラを使用して特定のES6ソースファイルを解析したいと思います。この表現には、ソースファイル内のすべてのクラスの詳細と、それらのクラスに含まれるメソッドおよび変数が含まれます。私はAntlrを使用したJavaプログラムのためにこのタスクを完了しました。適切なgrammarを取得したら、実装をかなり単純明快にした任意の文法ルール(クラス宣言、メソッド宣言など)に対して入力リスナーと終了リスナーを登録できます。私は、ソースコードに関する類似の情報を抽出するために、Googleクロージャコンパイラを使用してJavaScriptコードを解析できるように助けていただきありがとうございます。Googleクローズコンパイラを使用してjavascriptソースを解析する
これまでのところ、私は与えられたjavascriptのソースファイル解析する次のコードを持っている:
Compiler compiler = new Compiler();
CompilerOptions options = new CompilerOptions();
options.setIdeMode(true);
compiler.initOptions(options);
Node root = new JsAst(SourceFile.fromCode(file.name(), file.content())).getAstRoot(compiler);
NodeTraversal.traverseEs6(compiler, root, new JavaScriptParsePass());
JavaScriptParsePassクラスは、単純に処理され、すべてのノードの種類や修飾名を出力し、それは次のようになります。
を入力にこのプログラムを実行するpublic class JavaScriptParsePass extends AbstractPostOrderCallback implements CompilerPass {
@Override
public void process(Node externs, Node root) {
}
@Override
public void visit(NodeTraversal t, Node n, Node parent) {
System.out.println(n.getType() + ": " + n.getQualifiedName());
}
}
: class Model { constructor(properties) { this.properties = properties; }
は出力を生成します。
38: Model
124: null
38: null
38: properties
83: null
42: this
40: null
33: this.properties
38: properties
86: null
130: null
125: null
105: null
160: null
159: null
158: null
132: null`
発注とヌルが元の問題に取り組むための方法上の任意の一般的なガイダンスと一緒に私には意味がありませんように私は、この出力の説明をいただければ幸いです。
私は与えられたノードがいずれかのクラスであるかどうかを見つけ出すだろうか名前、関数名、または変数名?さらに、クラス名ノードを見つけたら、このノードが意味論的に表現するクラスの解析が完了したときはどうすればわかりますか?私が探すことができる特別な「出口」ノードはありますか、これを行う別の方法がありますか? –
AST全体を見る必要があります。コンパイラには、良い例を作るASTを分析する多くのパスがあります。ここに1つあります:https:// github。co.jp/google/closure-compiler/blob/master/src/com/google/javascript/jscomp/ProcessCommonJSModules.java#L257 –