PA2是写一个词义分析器,重点在于理解flex的语法,然后是编写正则表达式。
- 多行注释
- 单行注释
- 多字符关键字
- 各种ERROR的处理
- 数字
- 字符串
- 字符串的转义字符
能实现以上功能,你的作业就差不多完成了,进一步需要比对你的lexer和reflexer的差别,还有修改测试样例等,这个我也没有往后做得很细。
当然,怎么实现呢?还是得靠一行行代码写啊,需要掌握的知识有:
正则表达式 { 处理语句 }
写一个正则表达式,然后写出匹配之后应该怎么处理。
去头文件里面看下它有哪些类,对应着什么功能,弄懂这两步,你就能写大概一半的内容了。
通过在定义区定义状态,如我定义一个COMMENT状态:
%x COMMENT
这样就定义好了,你可以用这个状态来专门处理注释,因为注释里面的符号和正文里面的符号处理方式肯定是不一样的,对吧,通过BEGIN()来完成状态的跳转,COMMENT状态的基本语句就是:
<COMMENT>正则表达式 { 处理语句 }
好了,弄懂了状态,你又可以写出一半中的一半了。
剩下的一半的一半,需要你通过调试,慢慢补全,这样,这个作业就基本做完啦。
总的来说,当写完之后,并不觉得有多复杂,但是初见的时候,确实是一头雾水,有点像玩魂类游戏的感觉,我的建议是看些已经做过的同志的文档,比如这篇,这样可以加快你通关的过程,有点像去B站找魂类游戏某个boss的速通打法哈哈
见我的仓库,我写的时候也参考了别人的代码,比如这篇的,不过修改了它们的代码中的不足,比如不能用下划线判断id,多字符关键字的大小写匹配不敏感等等,当然,应该还存在错误,希望有小伙伴能够指出,谢谢!