Я пишу конвертер между несколькими диалектами одного и того же языка программирования. Я нашел грамматику в сети - она сложная и обрабатывает все случаи. Сейчас я пытаюсь написать соответствующие действия.
Большая часть ввода будет просто переписана для вывода. Что мне нужно сделать, так это проанализировать вызовы функций, сделать мою магию (переименовать функцию, изменить порядок аргументов и т. Д.) И написать ее.
Я использую 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
}
;