Написание языкового конвертера в ANTLR

Я пишу конвертер между некоторыми диалектами одного и того же языка программирования. Я нашел грамматику в сети - она ​​сложная и обрабатывает все случаи. Сейчас я пытаюсь написать соответствующие действия.

Большая часть ввода будет просто переписана для вывода. Что мне нужно сделать, так это проанализировать вызовы функций, выполнить мою магию (переименовать функцию, изменить порядок аргументов и т. Д.) И написать ее.

Я использую AST в качестве вывода. Когда я сталкиваюсь с вызовом функции, я строю собственную структуру объекта (из классов, определенных на моем целевом языке), вызываю соответствующую функцию, и у меня есть строка, представляющая преобразованную функцию, которую я хочу получить.

Проблема в том, что я должен делать с этой строкой? Я хотел бы заменить атрибут .text правила включения, но setText () доступен только для правил лексера, а атрибут правила .text доступен только для чтения. Как решить эту проблему?

program
    : statement_list            { output = $statement_list.text; }
    ;

//...

statement
    :   expression_statement
    // ...
    ;

expression_statement
    : function_call
    // ...
    ;

function_call
    : ID '('                    { /* build the object, assign name */
                                  Function function = new Function();
                                  //...
                                }
      (
      arg1 = expression         { /* add first parameter */ }
      ( ',' arg2 = expression   { /* add the rest of parameters */ }
      )*
      )?
      ')'                       { /* convert the function call */
                                  string converted = Tools.Convert(function);
                                  // $setText(converted);               // doesn't work
                                  // $functionCall.text = converted;    // doesn't work
                                }
    ;

Ответы на вопрос(2)

Ваш ответ на вопрос