5

我目前正在考虑如何最好地将使用 Antlr 生成的 AST 转换为可以在我的程序中使用的有用对象。

我的语法(除了学习)的目的是创建一种可执行的(运行时解释的)语言。

例如,我将如何获取一个属性子树并实例化一个特定的 Attribute 类。例如

以下代码用我的语言编写:

Print(message:"Hello stackoverflow")

将产生以下 AST:

替代文字

我目前的想法是工厂类可以读取树,提取名称(message)和类型(STRING)值(“ Hello stackoverflow”)。现在,知道了类型,我可以实例化正确的类(例如 StringAttribute 类)并传入所需的属性数据 -namevalue

相同的方法可以用于定义工厂,提取定义名称 ( Print),实例化 Print 类,然后传入从属性工厂生成的属性。

使用更复杂的程序,事情确实会变得更复杂:

Program(args:[1,2,3,4,5])
{
    If(isTrue:IsInArray(array:{Program.args} value:5))
    {
        Then {
            Print(message:"5 is in the array")
        } Else {
            Print(message:"More complex " + "message")
        }
    }
}

替代文字

非常欢迎任何/所有帮助或想法。非常感谢。

我以前的相关问题(可能有用):

  1. 如何制作树解析器
  2. 解决LL递归问题
  3. Antrl3 条件树重写
4

4 回答 4

4

我推荐阅读Terence Parr的Language Implementation Patterns中的第 9 章, Building High-Level Interpreters 。

编辑

好的,为了让您度过等待那本书的时间,这是您(至少)需要的:

  • 全局内存空间;
  • 函数空间(每个函数空间也将有一个(本地)内存空间);

和浮现在脑海中的类(以UML风格):

  • class Interpreter
    • 全局:内存空间
    • 功能:堆栈<功能>
    • ...

  • class MemorySpace
    • 变量:地图<字符串,对象>
    • ...

  • class Function
    • 本地:内存空间
    • 执行():无效
    • ...
于 2010-02-07T19:20:53.347 回答
2

这是一个ANTLR -> LLVM

于 2010-02-17T18:16:27.980 回答
0

一旦你有了 AST,你所需要的只是一个遍历树的迭代器和发出你想要的对象的模板。

于 2010-02-07T15:56:25.403 回答
0

教程基于 Flex 和 Bison,但最后他详细说明了他如何将他的 AST 转换为 LLVM 汇编代码,这可能会有所帮助。

于 2010-02-09T16:16:17.647 回答