东北大学编译原理实验1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理程序设计实验报告
——实验题目班级:计算机1507班姓名:罗艺博学号:20154377
一、实验目标:
词法分析扫描器的设计实现。在程序源文件中输入类C语言程序源文件,设计词法分析扫描器,并以TOKEN类别码序列的形式输出扫描结果。
二、实验内容:
1.概要设计:
将程序大致分为:主函数、识别器(有限自动机state_change)、词法分析器(state_to_code)三大部分。
其中,主函数所完成的功能为:打开、读取、关闭文件(即C语言源程序),重置token串等。
识别器的功能为:识别字符,完成token串的生成,判断词法错误等。
词法分析器的功能为:生成token类别码,判断token 是否出错等。
主函数、识别器、词法分析器关系图2.流程图
词法分析扫描器流程图
3.关键函数
a. 识别器(有限自动机state_change)
int state_change(state,ch) //识别器,有限自动机
{
if((ch == ' ') || (ch == '\t') || (ch == '\n'))
//略去空格、TAB、换行
return 0;
else if((IsAlpha(ch) == 1) || (ch == '_')) //判断是否为字母或'_',从而判断是关键字、
标识符、CT字符还是ST字符串
{
if(state == 1)
return 2;
else if(state == 2)
return 2;
else if(state == 7)
return 8;
else if(state == 8)
return 8;
else if(state == 10)
return 11;
else if(state == 11)
return 11;
else if(state == 6) //考虑与PT相连的情况
{
state_to_code(state_before,token);
i = 0;
memset(token,0,10);
return 2;
}
else
return -1;
}
else if(IsNum(ch) == 1) //判断是否为数字,从而进一步判断是为IT,CT,KT
{
if(state == 1)
return 3;
else if(state == 2)
return 2;
else if(state == 3)
return 3;
else if(state == 4)
return 4;
else if(state == 5)
return 5;
else if(state == 6) //考虑与PT相连的情况
{
state_to_code(state_before,token);
i = 0;
memset(token,0,10);
return 3;
}
else
return -1;
}
else if(ch == '.') //判断是否为CT中的小数点{
if(state == 3)
return 4;
else
return -1;
}
else if(ch == '\'') //判断是否为CT字符{
if(state == 1)
return 7;
else if(state == 6) //考虑与PT相连的情况{
state_to_code(state_before,token);
i = 0;
memset(token,0,10);
return 7;
}
else if(state == 8)
return 9;
else
return -1;
}
else if(ch == '\"') //判断是否为ST {
if(state == 1)
return 10;
else if(state == 6) //考虑与PT相连的情况{
state_to_code(state_before,token);
i = 0;
memset(token,0,10);
return 10;
}
else if(state == 11)
return 12;
else
return -1;
}
else //判断是否为PT {
if(state == 1)
return 6;
else if(state == 2) //考虑与IT,KT相连的情况
{
state_to_code(state_before,token);
i = 0;
memset(token,0,10);
return 6;
}
else if(state == 3) //考虑与CT相连的情况
{
state_to_code(state_before,token);
i = 0;
memset(token,0,10);
return 6;
}
else if(state == 9) //考虑与CT字符相连的情况
{
state_to_code(state_before,token);
i = 0;
memset(token,0,10);
return 6;
}
else if(state == 12) //考虑与ST相连的情况
{
state_to_code(state_before,token);
i = 0;
memset(token,0,10);
return 6;
}
else if(state == 6)
{
if(((i == 1)&&(ch == '='))&&((token[0] == '>')||(token[0] == '<')||(token[0] == '=')))
{
return 6;
}
else
return 0;
}
else
return -1;
}
}