Compiler 暂时不开课,但是不要紧

Andy,programming_language

stanford 的 compiler 暂时还没有开课,但是我已经在看作业说明了,发现第一个作业的说明怎么这么难懂,这要尼玛说什么啊。 所以就把作业说明先翻译出来,自己做个笔记,以后开课的时候可以看。

作业说明

pdf地址 (opens in a new tab)

下面是用flex做词法分析器要求的翻译,其他的资源如cool手册和flex的手册课程上都有给链接。


3.文件和目录

要开始的话,在你想要做作业的地方创建一个新的目录,执行下面的指令在那个新目录。

make -f /usr/class/cs143/assignments/PA2/Makefile

这个命令将产生一堆文件,下面对三个文件进行说明:

4 词法扫描结果

在这个课程中,你需要写Flex的规则去匹配正确的正则表达式,认证Cool正确的taken,产生正确的动作,纪录词法的值,或者抛出错误当错误条件触发时。有关正确token资料在Cool手册的第十章第一节上。在你做这个作业之前,确保你认真阅读了Cool手册的第十章第一节,然后学习不同的token是怎么在cool-parse.h文件上定义的(这个文件在cool编译器中有)。你应该实现Flex的规则为每个在cool-parse.h上定义的正确的token,去匹配对应的正则表达式,为每个token执行正确的动作。例如:假如你匹配了一个BOOL_CONST的token,你的词法分析器必须记录这个bool的值是真还是假;相似的,假如你匹配了一个TYPEID的token,你应该记录这个type的的名字。注意,不是每个token都需要记录额外的信息;例如,只有返回的token类型符合某些token类型才需要记录额外信息,例如:keywords。
你的词法扫描器健壮性一定要强,应该可以在任何可以想象到的输入都正常工作。例如,你必须要处理错误,当关键词EOF出现在字符串或者注释中间的时候,还有就是字符串过长的情况也要考虑。这都是一些你应该处理的常见错误,其余的部分自己看手册啦。 假如一个错误出现,你必须优雅地引起错误并显示。核心异常或者不可捕捉的异常是不可以接受的。

4.1 错误处理

所有错误信息都应该传递语法分析器。词法分析器不应该输出任何东西。错误应该通过返回特殊的错误信息ERROR与语法分析器进行交流(注意,你应该忽视名为error的token,这个是在作业3中的语法分析器中用的)。还有几个需要注意的地方需要词法分析器错误抛出:

4.2 字符串表

程序会对一个token分析多次。例如,一个定义标示一般都会在程序中用到很多次。为了节省空间和时间,一个正常编译器的实现方法是保存词法在一个字符串表上。我们提供一个字符串表的C++接口。
有一个问题,就是怎么为基础的类(Object, Int, Bool, String),SELF_TYPE和self,去处理特殊的定义标示。在语法分析器部分之前,这个问题不会真正出现。词法分析器应该处理这些特殊标示符像其他定义标示一样。

4.3 字符串

词法分析器应该对一个字符串的中逃离的字符进行转义,变成一个正确的字符串。例如,假如这个字符串为"ab\ncd",词法分析器应该返回 STR_CONST,值为ab\ncd,其中\n为单独的字符。根据Cool手册第15页的描述,你应该为包含了null字符的字符串返回一个错误信息。像\0这样的转义字符应该转化为0。

4.4 其他需要注意的地方

词法分析器因该保留变量curr_lineno,指出现在分析的词是在源文件中的第几行。这个功能会帮助语法分析器打印出有用的错误信息。
你应该忽视token LET_STMT。这个会在作业3中的使用。最后,注意假如词法分析器不完整的话,flex生成的C语言文件将不能正常运行,保证每一部分都正确。

5 特别注意

© FTAndy.RSS