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