Stanford CS143 速通PA2教程

PA2是写一个词义分析器,重点在于理解flex的语法,然后是编写正则表达式。

速通前的准备

  • PA2.pdf(见我的仓库):写得很多很详细,但是其实读起来的时候,没办法很好地理解是什么意思,建议通读一遍吧。
  • Flex官方文档:读完一遍PA2的文档后,你大概率还是不知道应该干嘛,唯一的办法就是去看Flex的官方文档,弄清楚它是怎么实现词义分析功能的。
  • 偷懒的方法:这篇文章写得很好,实际上你只看这一篇,再看看人家的实现,你就可以比较偷懒地做完这个作业了;当然,你想完全自己写,建议还是上面两个材料,再加上这篇文章前半部分,没涉及到代码的解释,到这里,你应该知道大概要做什么了。
  • 具体的实现:当然,要完成这个作业,只知道大概是不够的,具体的实现主要包括以下部分:
  • 多行注释
  • 单行注释
  • 多字符关键字
  • 各种ERROR的处理
  • 数字
  • 字符串
  • 字符串的转义字符

能实现以上功能,你的作业就差不多完成了,进一步需要比对你的lexer和reflexer的差别,还有修改测试样例等,这个我也没有往后做得很细。
当然,怎么实现呢?还是得靠一行行代码写啊,需要掌握的知识有:

  • 基本语法:
正则表达式 { 处理语句 }

写一个正则表达式,然后写出匹配之后应该怎么处理。

  • cool_yylval

去头文件里面看下它有哪些类,对应着什么功能,弄懂这两步,你就能写大概一半的内容了。

  • <>状态

通过在定义区定义状态,如我定义一个COMMENT状态:

%x COMMENT

这样就定义好了,你可以用这个状态来专门处理注释,因为注释里面的符号和正文里面的符号处理方式肯定是不一样的,对吧,通过BEGIN()来完成状态的跳转,COMMENT状态的基本语句就是:

<COMMENT>正则表达式 { 处理语句 }

好了,弄懂了状态,你又可以写出一半中的一半了。
剩下的一半的一半,需要你通过调试,慢慢补全,这样,这个作业就基本做完啦。

我的体会

总的来说,当写完之后,并不觉得有多复杂,但是初见的时候,确实是一头雾水,有点像玩魂类游戏的感觉,我的建议是看些已经做过的同志的文档,比如这篇,这样可以加快你通关的过程,有点像去B站找魂类游戏某个boss的速通打法哈哈

代码实现和资料

见我的仓库,我写的时候也参考了别人的代码,比如这篇的,不过修改了它们的代码中的不足,比如不能用下划线判断id,多字符关键字的大小写匹配不敏感等等,当然,应该还存在错误,希望有小伙伴能够指出,谢谢!

你可能感兴趣的:(Stanford,CS143学习之路,编译器,c++)