实现一个词汇扫描器cs143PA2
0x00 词汇扫描器简介
原理①扫描文本,将其分成词②对每个词进行分类
工具flex:flex是一个scaner generator,只需要指定不同的词汇规则就生成对应的c语言代码,因此主要工作是编写flex规则,pa2环境上的flex是2.5.3版,官网文档为2.6使用其他差不多。官方文档写的很好,而且有使用的例子,特别是对于如何用flex匹配注释 字符串都有例子。
0x01 PA2实验
PA2的指南中对要完成的任务,和各个文件的作用都做出了说明,唯一遗漏了一点是stringtable.h中三个全局变量的作用,stringtable inttable idtable是用来储存不同类型token的值的表。
PA2全部在cool.flex文件中进行编写,依次匹配一下几种类型的词汇,按优先级排列
comments
string const
white space
keywords
special notation (self operator)
identifiers
intergers
由于flex是按顺序匹配的,规则越靠前,优先级越高。首先匹配注释很好理解,要把注释都忽略,其次匹配字符串,字符串里的所有内容都不用扫描。当然字符串里有特殊的内容,比如转义 比如换行 或者eof要特殊处理,这里用到的是flex的start condition,比如匹配到第一个’ “ ‘时进入str状态,然后调用只有str条件才能启用的扫描规则,来处理字符串里的转义字符串 换行 以及普通字符 ,然后遇到第二个’ “ ‘ 时退出str状态(即回归到默认initial状态)