东北大学编译原理实验1

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

}

}

相关文档
最新文档