我正在编写一个转换器,用于一些相同编程语言的方言之间的翻译。我在网络上找到了一个复杂的语法可以处理所有的情况。现在,我正在尝试编写适当的操作。
大部分输入只需要重写为输出。我需要做的是解析函数调用,进行必要的更改(例如,重命名函数、重新排序参数等),并将其写入。
我使用AST作为输出。当我遇到函数调用时,我会构建一个自定义对象结构(使用我目标语言中定义的类),调用适当的函数,然后我得到了一个表示我想获得的转换函数的字符串。
问题在于,我该用这个字符串做什么?我想替换包含规则的.text属性,但是setText()仅适用于词法分析规则,而规则的.text属性是只读的。如何解决这个问题?
大部分输入只需要重写为输出。我需要做的是解析函数调用,进行必要的更改(例如,重命名函数、重新排序参数等),并将其写入。
我使用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
}
;