从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号串的中间程序。词法分析器的功能是输入源程序,输出单词符号,并保存token的内容。程序语言的单词符号分为以下六种:iT标识符、cT字符、sT字符串、CT常数、KT关键字、PT界符。
二、实验内容 2.1概要设计
词法分析器,实现固定语法的识别,就要明白什么是词法分析器,它的功能是什么。词法分析是编译程序进行编译时第一个要进行的任务,主要是对源程序进行编译预处理(去除注释、无用的回车换行找到包含的文件等)之后,对整个源程序进行分解,分解成一个个单词,这些单词有且只有6类,分别是标识符、保留字、常数、字符、字符串、界符。以便为下面的语法分析和语义分析做准备。词法分析是所有后续工作的基础,如果这一步出错,比如明明是‘<=’却被拆分成‘<’和‘=’就会对下文造成不可挽回的影响。因此,在进行词法分析的时候一定要定义好这6种符号的集合。
词法分析器的设计包括:读取文件里的内容、有限自动机的设计、将读取的token序列存入字典之后按照文件里单词的顺序输出。其中有限自动机的设计为词法分析器的核心,实现了对预处理之后的文件中的token的识别。有限自动机通过分析当前读入的字符,跳转到下一状态,直到进入终止状态。并且根据当前token的终止状态,判断出token所属的类型码,存入相应的符号类型表。
(1)Dict为token序列建立字典,键是分割出的单词,值是单词所属的类型码
(2)词法分析类Scanner:
表 3 Scanner的数据成员
数据成员
countt, IDentifierTbl[1000][20]
i标识符表和其对应的计数器
countct, SingleChar[1000]
c字符表和其对应的计数器
counts, StringChar[1000][20]
S字符串表和其对应的计数器
countc, ConstantTbl[1000][20]
CT常数表和其对应的计数器
operatorOrDelimiter[36][10]
P界符表
reserveWord[32][20]
K关键字表
resourceProject[10000]
输入源程序的存放处
Token[]
每次分析出来的单词
表 4 关键函数
成员函数
int searchReserve(char reserve[][20],char s[])
搜索解析出来的单词在二维字符数组中是否出现
int searchRReserve(char reserve[],char s)
搜索解析出来的单词在一维字符数组中是否出现
bool IsLetter(char letter)
bool IsDigit(char digit)
判断当前字符是否是数字或字符,返回布尔型
void filterResource(char r[],int pProject)
过滤掉注释的部分,得到一个纯净的代码
void Scanner(int &syn,char resourceProject[],char token[],int &pProject)
生成token序列,同时将序列输出到文件里
int main()
运行主函数,进行文件数据输入
初始化标识符表,字符表,字符串表,字符表,界符表,关键字表和定义存储字符数组表称全局变量,所以不需要初始化函数,变量的调用也方便;