gpt4 book ai didi

antlr - 在 ANTLR 中编写语言转换器

转载 作者:行者123 更新时间:2023-12-01 10:14:38 25 4
gpt4 key购买 nike

我正在编写同一编程语言的一些方言之间的转换器。我在网上找到了一个语法 - 它很复杂并且可以处理所有情况。现在我正在尝试编写适当的操作。

大部分输入将被重写为输出。我需要做的是解析函数调用,发挥我的魔力(重命名函数、重新排序参数等)并编写它。

我正在使用 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
}
;

最佳答案

获得 AST 后,您需要编写一个树遍历器,将您的程序作为转换后的源发出。根据更改的复杂性,您甚至可能有一个中级 tree walker 来执行树转换。

也就是说,通过 AST 步骤可能不是最好的方法。

您可能想看看 Terrence Parr(Pragmatic Programmers)的“语言设计模式”。第 11 章介绍了您的程序类型。

他提到了一个工具 ANTLRMorph,它可能更适合您的问题。

关于antlr - 在 ANTLR 中编写语言转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2491680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com