https://github.com/CicholGricenchos/tiny-c
做了一个微型 c 编译器,大概四百来行,可以编译一些简单的 c 代码(参见测试用例)。
语法分析自己写了一套 DSL,用深度优先搜索找一个可行的解,大概算是 LL(0)?这样语法定义可以写的比较简洁,但是坏处是不能给出“unexpected token xxx”这样细致的提示,因为在搜索途中不知道哪个规则才是正确的。
有了语法树(sexp)之后,就可以直接塞到 interpreter 递归执行了,也可以塞到 compiler 生成汇编,同样是在一次递归里完成。
compiler 会将每个语法树节点直译成汇编代码,途中想了好久应该怎么分配寄存器,但是还是搞不定,所以汇编中有不少多余的出入栈代码,来保证每个操作都是相互隔离的,当然代码也变慢了很多。不过能正确运行就很开心了。。