一、实验目的
学习和掌握利用有限自动机编写词法分析程序。
实验要求如下:
二、程序功能描述
简要描述:该程序根据C语言的文法,实现了C语言词法分析。
详细来说,其功能主要表现在:
①该程序可以从头到尾扫描整个文本
②该程序可以分析每个token是什么,如int为保留字,>=是双字符分节符
③该程序可以实现报错
三、主要数据结构描述
1、keyArray【】
key是一个数组,存放保留字。 提供给扫描器,以识别每个token是否为保留字。
2、ch
ch是一个字符变量,保存的是从源程序中读取的单个字符。
3、result
result是一个字符串变量,保存的是从源程序中连续读取的字符串。
4、resultArray【】
resultArray是一个字符串数组,用于存放每个获取的单词的值。
5、resultNum
resultNum是一个整型变量,用于记录获取单词的个数。
四、程序结构描述
1、设计方法——构造有限自动机
为方便表示,加上了
→ |
其余略。
2、函数定义及函数之间的调用关系
(1)bool isKey(string s)
函数名称:isKey
参数解释:字符串变量s
返回值:bool值
功能:判断一个字符串是否为保留字,若是,返回True,否则返回False。
(2)bool isOperator(char ch)
函数名称:isOperator
参数解释:字符变量ch
返回值:bool值
功能:判断一个字符是否为运算符,若是,返回True,否则返回False。
(3)bool isSeparator(char ch)
函数名称:isSeparator
参数解释:字符变量ch
返回值:bool值
功能:判断一个字符是否为分隔符,若是,返回True,否则返回False。
(4)int main( )
函数名称:main
参数解释:无
返回值:int
功能:主函数,实现文本读取,扫描分析,结果文件输出功能。
调用关系:扫描每一个字符时利用自定义的isOperator(ch)
和isSeparator(ch) 以及string库中的isalpha(ch) 和 isdigit(ch)来判断该字符为何类型,有以下几种情况:
1、若读入首字符为字母
①:继续读入字母、数字,组成标识符或关键字
②:读取过程中读到操作符或分隔符,则保存该标识符或关键字。
③:读取过程中遇到违规字符,则一并读取后续字母和数字,直到遇到操作符或分隔符,并报错。
2、若读入首字符为数字
①:继续读入数字,组成无符号整数
②:遇到操作符或分隔符正常终止,并保存该常数
③:若读入其他错误字符,一并读取后续字母和数字,直到遇到操作符或分隔符,并报错。
3、若读入首字符为运算符
①:判断是否为双字符边界
②:下一个字符若为字母、数字、分隔符,正常保存运算符。
③:若非上述字符,则将错误输入符一并读取并报错。
4、若读入首字符为分隔符
①:保存该分隔符
5、若读入首字符为非法字符——报错
五、程序测试
测试用例1:
测试结果截图1:
测试用例2:
测试结果截图2:
六、实验总结
词法分析是编译器进行文法分析的第一步,完成词法分析任务的程序称为词法分析程序或词法分析器或扫描器。从左至右地对源程序进行扫描,按照语言的词法规则识别各类单词,并产生相应单词的属性字。
经过本次实验,我学会了如何用有限自动机理论编写词法分析程序,对编译器如何分析文法有了更深一步的理解。
七、源代码
cpp
#include
#include
#include
#include
#define LENGTH 32
using namespace std;
//判断当前字符串是否为关键字
bool isKey(string s){
//关键字数组
string keyArray【】 = {"int","char","string","void","bool","float","double","float","true","false","return",
"if","else","while","for","default","do","public","static","switch","case","include"};
//与当前字符串一一对比
for(unsigned int i=0;i[span class="hljs-built_in">sizeof(keyArray);i++){
if(s==keyArray【i】){
return true;
}//代码效果参考:http://www.ezhiqi.com/bx/art_7627.html
if("include"==keyArray【i】){