Conversor de idiomas de escritura en ANTLR

Estoy escribiendo un convertidor entre algunos dialectos del mismo lenguaje de programación. He encontrado una gramática en la red: es compleja y maneja todos los casos. Ahora estoy tratando de escribir las acciones apropiadas.

La mayor parte de la entrada se reescribirá en la salida. Lo que necesito hacer es analizar llamadas de función, hacer mi magia (cambiar el nombre de la función, reordenar argumentos, etc.) y escribirla.

Estoy usando AST como salida. Cuando me encuentro con una llamada de función, construyo una estructura de objeto personalizada (a partir de clases definidas en mi idioma de destino), llamo a la función apropiada y tengo una cadena que representa la función transformada que quiero obtener.

El problema es, ¿qué se supone que debo hacer con esa cuerda? Me gustaría reemplazar el atributo .text de la regla adjunta, pero setText () solo está disponible en reglas lexer y el atributo .text de la regla es de solo lectura. ¿Cómo resolver este problema?

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
                                }
    ;

Respuestas a la pregunta(2)

Su respuesta a la pregunta