本文使用 Zhihu On VSCode 创作并发布
这是本人实现斯坦福CS143
变编程作业的笔记,对应第一次作业PA1
。环境搭建和一些说明请看:CS143:编译原理 | 环境搭建HelloWorld
从第一篇搬运一段话。
你可能发现了,课程官网上的PA1
和我们下载的PA1
不相符,课程官网上的PA1
已经开始写编译器了。这是MOOC版本和正式课程的区别。正式课程如课程官网所示,有4个主要编程作业,最后一个是加分项Extra Credit
,第一个作业就开始写编译器。MOOC版本的第一个编程作业是熟悉Cool语言,之后的4个编程作业和正式课程相同。在文章环境搭建中,我们下载到的是MOOC版本的材料,也就接着使用这个版本的,反正和正式课程没有特别大的区别。
你可以像正式课那样,跳过这个熟悉Cool语言部分,直接开始写编译器,那么你就没必要阅读本文。如果你想在写Cool语言的编译器之前,先熟悉它的语法,可以参考本文。
PA1
的主要难度在于coolc
编译器的报错信息很不友好,导致不熟悉Cool
语法的我们经常对着报错信息不知所措,而说明文档说得不太明白,需要我们自己探索,十分伤脑筋。换一种角度来看,这也是一种锻炼,所以还是加油试试吧。
本文md文档源码链接:AnBlogs
简单的编程要求
这个PA
的要求在handouts/PA1.pdf
中。我们需要实现一个栈机器Stack Machine
,这个机器以栈为存储和执行的基础。这里简单翻译一下PDF里面的描述。
启动栈机器后,机器创造一个命令行空间,在终端显示一个>
,可以接受以下指令,这些指令都被压入到栈中。
输入字符e
,会针对当前栈顶指令进行一些操作。
若栈顶为+
,则将+
和+
之后的两个整数弹出,将两个整数相加后的结果压栈。我们不考虑+
之后的两个元素不是整数、是其它指令的情况。
若栈顶为s
,则将s
弹出,再将之后的两个元素互换在栈中的位置。
若栈顶为一个整数,或栈为空,不进行任何操作。
输入字符x