سؤال

هل من الممكن للوصول إلى بناء الجملة شجرة ملخص (AST) داخل javac.exe برمجيا؟ هل يمكن تقديم مثال؟

هل كانت مفيدة؟

المحلول

نعم، فمن الممكن، ولكن فقط منذ جافا 6. بيتر فون دير AHE يتحدث عن JSRs اثنين في هذه المقابلة . من JSR 199:

<اقتباس فقرة>   

ومترجم API JSR 199 يتكون من ثلاثة أشياء: الأول يسمح أساسا لك استدعاء مترجم عن طريق API. ثانيا، API يسمح لك لتخصيص كيف يجد المترجم ويكتب من الملفات. أعني ملفات بالمعنى المجرد، لأن ملفات الصفقات مترجم مع ليست بالضرورة على نظام الملفات. يسمح التجريد ملف JSR 199 في أن يكون لديك ملفات في قاعدة بيانات، وتوليد الإخراج مباشرة إلى الذاكرة، على سبيل المثال. وأخيرا، يتيح API JSR 199 التي تجمعها التشخيص من المترجم بطريقة منظمة بحيث يمكنك بسهولة تحويل رسائل الخطأ، على سبيل المثال، إلى خطوط في محرر بيئة تطوير متكاملة ل.

وJSR 269 هو API معالجة الشرح.

<وأ href = "http://today.java.net/pub/a/today/2008/04/10/source-code-analysis-using-java-6-compiler-apis.html" يختلط = "نوفولو noreferrer"> هذه المقالة يعطي لمحة عامة ممتازة من الوصول في مترجم شجرة API . قسم "<لأ href =" https://web.archive.org/web/20151023040328/http://today.java.net/pub/a/today/2008/04/10/source-code-analysis- باستخدام جافا-6-مترجم-apis.html # الوصول إلى رأس مجردة-بناء الجملة شجرة ومترجم شجرة-API "يختلط =" نوفولو noreferrer "> الوصول إلى بناء الجملة شجرة الخلاصة: API مترجم شجرة "يبدو مناسبة خاصة بالنسبة لسؤالك.

واعتمادا على ما تفعلونه، قد تحتاج أيضا إلى إلقاء نظرة على الجائزة حكم اللغة ، وهو محرك إعادة بيع ديون مستقل أن الإضافات إلى شجرة مترجم.

نصائح أخرى

وتجميع وتشغيل هذا مع -cp tools.jar (حيث لديك لتحديد موقع tools.jar الخاص بك، من الواضح).

import com.sun.source.util.Trees;
import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

public class JCTreeTest {
    private static final JavaCompiler javac
            = ToolProvider.getSystemJavaCompiler();

    public static void main(String[] args) {
        final StandardJavaFileManager jfm
                = javac.getStandardFileManager(null, null, null);
        final JavaCompiler.CompilationTask task
                = javac.getTask(null, jfm, null, null, null,
                  jfm.getJavaFileObjects(args));
        final Trees trees = Trees.instance(task);
        // Do stuff with "trees"
    }
}

ويجمع ويدير بالنسبة لي، على الرغم من أنني لم ألعب مع الأشجار الاشياء نفسي، لذلك عليك أن <لأ href = "http://java.sun.com/javase/6/docs/jdk/ المعهد / javac / شجرة / "يختلط =" noreferrer "> قراءة جافادوك نفسك. :-) حظا سعيدا!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top