Parsing 生成Pmachine代码的Antlr树语法?

Parsing 生成Pmachine代码的Antlr树语法?,parsing,compiler-construction,antlr,antlr3,abstract-syntax-tree,Parsing,Compiler Construction,Antlr,Antlr3,Abstract Syntax Tree,我目前正在进行一个项目,以建立一个小型c编译器运行在一台pmachine上。现在,我开始使用完整c语法的精简版本。目前解析看起来还不错,我使用重写规则来构建AST 看起来还不错。目前,我正在构建一个树语法来遍历和生成pmachinecode。我的问题是, 树语法是遍历树并生成p代码的可行选择吗?(例如,我运行一个表达式并返回一个pcode字符串) 或者不使用Antlr手动构建AST的方法是实现这一点的正确方法吗 我只是想知道我是否真的在使用树语法 非常感谢你的建议 致以最诚挚的问候。如果您打算生

我目前正在进行一个项目,以建立一个小型c编译器运行在一台pmachine上。现在,我开始使用完整c语法的精简版本。目前解析看起来还不错,我使用重写规则来构建AST 看起来还不错。目前,我正在构建一个树语法来遍历和生成pmachinecode。我的问题是,

树语法是遍历树并生成p代码的可行选择吗?(例如,我运行一个表达式并返回一个pcode字符串) 或者不使用Antlr手动构建AST的方法是实现这一点的正确方法吗

我只是想知道我是否真的在使用树语法

非常感谢你的建议


致以最诚挚的问候。

如果您打算生成堆栈机器p代码,那么使用AST可能会很好。不要期望得到的代码是一流的

通过AST漫游和大量的窥视孔优化,您可以生成更关注(抽象或真实)寄存器的代码。(基本上是生成抽象代码,但尽可能长时间地延迟它的发出;窥视孔优化器查看抽象代码序列,找到有用的优化并发出这些优化

示例:发出的抽象代码:

  PUSH X
  PUSH Y
  ADD
窥视孔优化器识别这些并生成(其他p机器指令) 加载附件,X 加ACC,Y 推送ACC

这避免了3次内存读取和写入。如果您的pmachine有一个非常慢的解释器,您可能不会在意,但随着解释器速度的提高,这种开销开始变得非常大


您可以轻松地发明几十种有用的窥视孔优化。

谢谢您的回答。如果我完全理解您的意思,您认为使用Antlr树遍历器是一种可行的方法吗?对于代码生成,我是根据规则创建单独的类,还是只根据树遍历器规则返回一个字符串和一个pcode?您可以了解有关如何执行此操作的更多信息他的名字在这里: