我目前正在做一个项目,构建一个小型的c编译器在pmachine上运行。目前,我开始使用一个完整的c语法的剥离版本。解析目前看起来没问题,我使用重写规则来构建AST看起来还可以。目前,我正处于构建树语法的阶段,以行走和生成机器代码。我的问题是,
树语法是遍历树并生成p代码的可行选择吗?(例如,我运行一个表达式并返回一个字符串的pcode)或者在没有Antlr的情况下手动构建AST是实现这一目标的正确方法吗?
我只是想知道我是否真的在使用树语法的轨道上。
请多多指教。
问好。
如果您的目的是生成堆栈机器p代码,遍历AST可能会很好。不要期望生成的代码是一流的。
您可以通过AST遍历生成更专注于(抽象或实际)寄存器的代码,以及大量的窥视孔优化。(基本上,你生成抽象代码,但尽可能延迟释放它;窥视孔优化器查看抽象代码序列,找到有用的优化并发出这些优化。
示例:发出的抽象代码:
PUSH X
PUSH Y
ADD
窥视孔优化器识别这些并产生(额外的Pmachine指令)加载acc, x加上acc y推动ACC
这避免了3次内存读写。如果您的机器有一个非常慢的解释器,您可能不会在意,但是随着它变得越来越快,这个开销开始变得显著。
你可以很容易地发明几十个有用的窥视孔优化。