【发布时间】:2010-03-24 22:33:32
【问题描述】:
我正在编写相同编程语言的一些方言之间的转换器。我在网上找到了一个语法 - 它很复杂并且可以处理所有情况。现在我正在尝试编写适当的操作。
大部分输入将被重写为输出。我需要做的是解析函数调用,发挥我的作用(重命名函数、重新排序参数等)并编写它。
我使用 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
}
;
【问题讨论】: