ANTLR преобразует файл Java в XML и считывает обратно XML для создания проблемы с объектом Java - PullRequest
1 голос
/ 06 апреля 2011

Хорошо ... это то, что я хочу сделать .....

  1. Создание классов Java из некоторого языка выражений ....
  2. Предположим, шаг № 1 выполнен ... У меня есть файл Java. Я создал JavaLaxer и JavaParser, используя файл Java.g после небольшой модификации Java.g ((1006 *)
  3. Я использую antlr-3.3-complete.jar для получения дерева AST. Теперь я написал класс Test, где я получаю объект CommonTree (см. Код под этим списком) ...
  4. Теперь я хочу преобразовать дерево AST в вывод XML, чтобы сохранить его в БД ...
  5. Я хочу написать класс Reader, который может читать XML-файл и создавать исходный код Java.
  6. Использовать этот источник Java для создания объекта во время выполнения ...


static final TreeAdaptor adaptor = new CommonTreeAdaptor() {      
    @Override
    public Object create(Token payload) {     
        CommonTree cTree = new CommonTree();
        cTree.token = payload;
        return cTree;        
    }    
};

CharStream c = new ANTLRFileStream(
                "C:/Documents and Settings/kkk/IBM/rationalsdp/workspace17"+
                "/myproject/src/main/java/com/xyz/abc/infrastructure/"+
                "email/service/impl/EmailServiceImpl.java");

JavaLexer lexer = new JavaLexer(c);

CommonTokenStream tokens = new CommonTokenStream();        
tokens.setTokenSource(lexer);

JavaParser parser = new JavaParser(tokens);
parser.setTreeAdaptor(adaptor);

/* AST tree for my java code */
CommonTree tree = (CommonTree) parser.compilationUnit().getTree();  

Я борюсь с шага 4 к шагу 6 ... Я пока не могу найти решение !!

Ответы [ 2 ]

1 голос
/ 07 апреля 2011

Я не эксперт ANTLR.

Однако, шаг 4 должен быть довольно простым. Определите посетителя, чтобы пройти AST. Для каждого узла дерева запишите:

  <node type="*type*" value="*value*"> *child1* ... *childn* </node>

где child_i - это XML для подтипов. (Мы делаем почти именно это для ANTLR-подобная система, которую я предлагаю на коммерческой основе; это встроенный).

Для выполнения шага 5 вам понадобится программа для чтения XML и знания о том, как создавать узлы ANTLR. Прочитайте сгенерированный текст и создайте дерево XML. Пройдите по этому дереву и снизу вверх создайте узлы ANTLR, вызвав конструкторы узлов ANTLR.

Предположительно, ANTLR распечатает имеющееся у него дерево Java, решив 6).

Предположительно после симпатичной печати вам нужно будет запустить javac для сгенерированного файла, а затем заставить этот файл загружаться классом.

0 голосов
/ 07 апреля 2011

@ Ира, спасибо за ответ. Я попробую это завтра и дам вам знать, как это происходит. Скорее всего, мне не придется обходить дерево и менять узлы, но это возможно. Бизнес-требования пока не ясны, поэтому я не уверен, как мне реализовать динамическую генерацию кода. Это может быть комбинация нижеприведенных техник ...

1) Создание дерева AST, сохранение в БД в виде XML, при необходимости получить обратно XML, сгенерировать дерево AST, при необходимости изменить его, внести некоторые изменения, преобразовать дерево AST в источник Java, скомпилировать источник Java в класс, загрузить объект в память в время выполнения и использовать его.

2) Реализовать класс Java, который расширяет интерфейс. Реализовать новый Impl с помощью RAD IDE ... Конвертировать это дерево Impl AST, сохранить в db как xml, при необходимости получить обратно как xml, сгенерировать дерево AST, Преобразовать дерево AST в Java исходный код, скомпилируйте исходный код Java в класс с помощью реализации родительского интерфейса, загрузите объект в память с помощью шаблона Factory (который может загружать либо оригинальный IMPL, либо новый IMPL, созданный на этом шаге)

Я новичок в ANTLR, поэтому довольно сложно понять, как это работает ... Я надеялся, что когда я конвертирую Java в дерево AST, я могу легко его сериализовать ... Я также надеялся, что должно быть просто способ получить обратно сериализованный объект AST и создать дерево AST в памяти и легко создать исходный код Java из него. Я ненавижу тот факт, что не так много примеров для его использования.

...