【问题标题】:how to evaluate of an abstract syntax tree of a new programming languag [closed]如何评估新编程语言的抽象语法树[关闭]
【发布时间】:2014-03-07 04:40:18
【问题描述】:

我想为“新”语言设计一个编译器。新语言将有自己的语法并输出有效的 C 代码。也就是说,从伪代码生成 c 代码。我设计了一个语法。执行递归下降解析并得到抽象语法树。例如,我得到了 if 结构的树。如何将其映射到原始 c 代码?我可以执行按顺序遍历吗?

我读过 Aho Ullman 的书。解释器的执行和编译的区别是什么? 我可以应用访客模式吗?

【问题讨论】:

    标签: java parsing abstract-syntax-tree expression-evaluation


    【解决方案1】:

    与将其映射到机器代码的方式相同,但输出 C。这将使一些事情变得更容易(您可以利用 C 编译器的符号表而不是构建自己的符号表)和一些事情更难(因为您必须以 C 可以接受的方式表达事物)。

    请注意,在大多数情况下,您需要将抽象语法树转换为具体语义树,除非两者在您的语言中几乎相同。

    解释器只运行语义树中实际执行的部分,并且可能重复运行这些部分;它还在解释器的内存模型中处理数据。编译器必须在整个语义树上运行一次,并生成所有可能执行的代码;一般来说,它还必须生成一个完整的内存模型,但正如我所说,输出 C 会让你部分作弊。

    龙书对这些问题有更详细的解答。基本上,您会将 C 视为“高级汇编程序”。

    【讨论】:

    • 我的疑问是如何评估一个 ast?
    • 只有您知道语法的每个组件的预期语义是什么,因为您正在发明语言。您需要将语法映射到表示程序预期行为的形式,以一种足够直接的方式,然后您可以从该形式转到解释或编译。
    • 在我的 Aho/Ullman 旧副本中,您的问题从第 7 章“语法导向翻译”开始。使用 AST 生成 IL(中间代码)表示。第 8-11 章提供了有关该过程的更多详细信息。您最初可以发布关于代码优化的第 12-14 章。第 15 章介绍了如何使用 IL 生成代码;那是您将适应输出 C 而不是汇编程序或二进制目标代码文件的那个。
    • 如果你在写一个解释器,它会运行在 IL 上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 2011-08-20
    • 1970-01-01
    • 2014-05-28
    相关资源
    最近更新 更多