实验一、词法分析实验

专业:商业软件工程   姓名:袁佳鹏  学号:201506110089

一、        实验目的

(1)    理解词法分析在编译程序中的作用。

(2)    加深对有穷自动机模型的理解。

(3)    掌握词法分析程序的实现方法。

(4)    用C语言对一个简单语言的子集编制一个一遍扫锚的编译理解,掌握编译程序的实现方法和技术。

二、        实验内容和要求

1,待分析的简单语言的词法

2,各种单词符号对应的种别码。

3,词法分析程序的功能(输入,输出)。

三、        实验方法、步骤及结果测试

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

char TOken[10];//分开进行比较

char ch;

/*char rwtab[6]={"begin","if","then","while","do","end"};*/

char r1[]={"auto"};

char r2[]={"break"};

char r3[]={"case"};

char r4[]={"char"};

char r5[]={"const"};

char r6[]={"continue"};

char r7[]={"default"};

char r8[]={"do"};

char r9[]={"double"};

char r10[]={"else"};

char r11[]={"enum"};

char r12[]={"extern"};

char r13[]={"float"};

char r14[]={"for"};

char r15[]={"goto"};

char r16[]={"if"};

char r17[]={"int"};

char r18[]={"long"};

char r19[]={"register"};

char r20[]={"return"};

char r21[]={"short"};

char r22[]={"signed"};

char r23[]={"sizeof"};

char r24[]={"static"};

char r25[]={"struct"};

char r26[]={"switch"};

char r27[]={"typedef"};

char r28[]={"union"};

char r29[]={"unsigned"};

char r30[]={"void"};

char r31[]={"volatile"};

char r32[]={"while"};

char r33[]={"end"};

char r34[]={"include"};

char r35[]={"stdio"};

char r36[]={"string"};

char r37[]={"main"};

char r38[]={"stdlib"};//这是我定义的

char A[10000];//输入的所有值

int syn,row;

int n,m,p,sum,j;

static int i = 0;

void scaner()

{

/*

共分为三大块,分别是标示符、数字、符号,对应下面的 if else if 和 else

*/

for(n=0;n<7;n++)

TOken[n]=0;//每次循环完就清零

ch=A[i];

while(ch==' '||ch=='\n')//如果字符是空格或者回车,跳过

{

i++;

ch=A[i];

}

if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) //可能是标示符或者变量名

{

m=0;

while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//找到一个变量名或者关键字,直到遇到空格为止

{

TOken[m]=ch;m++;

i++;ch=A[i];

}

TOken[m]='\0';

//将识别出来的字符和已定义的标示符作比较, //因为定义的begin为1,if为2......

if(strcmp(TOken,r1)==0){syn=1;}

else if(strcmp(TOken,r2)==0){syn=2; }

else if(strcmp(TOken,r3)==0){syn=3;}

else if(strcmp(TOken,r4)==0){syn=4;}

else if(strcmp(TOken,r5)==0){syn=5;}

else if(strcmp(TOken,r6)==0){syn=6;}

else if(strcmp(TOken,r7)==0){syn=7;}

else if(strcmp(r8,TOken)==0){syn=8;}

else if(strcmp(r9,TOken)==0){syn=9;}

else if(strcmp(r10,TOken)==0){syn=10;}

else if(strcmp(r11,TOken)==0){syn=11;}

else if(strcmp(r12,TOken)==0){syn=12;}

else if(strcmp(r13,TOken)==0){syn=13;}

else if(strcmp(r14,TOken)==0){syn=14;}

else if(strcmp(r15,TOken)==0){syn=15;}

else if(strcmp(r16,TOken)==0){syn=16;}

else if(strcmp(r17,TOken)==0){syn=17;}

else if(strcmp(r18,TOken)==0){syn=18;}

else if(strcmp(r19,TOken)==0){syn=19;}

else if(strcmp(r20,TOken)==0){syn=20;}

else if(strcmp(r21,TOken)==0){syn=21;}

else if(strcmp(r22,TOken)==0){syn=22;}

else if(strcmp(r23,TOken)==0){syn=23;}

else if(strcmp(r24,TOken)==0){syn=24;}

else if(strcmp(r25,TOken)==0){syn=25;}

else if(strcmp(r26,TOken)==0){syn=26;}

else if(strcmp(r27,TOken)==0){syn=27;}

else if(strcmp(r28,TOken)==0){syn=28;}

else if(strcmp(r29,TOken)==0){syn=29;}

else if(strcmp(r30,TOken)==0){syn=30;}

else if(strcmp(r31,TOken)==0){syn=31;}

else if(strcmp(r32,TOken)==0){syn=32;}

else if(strcmp(r33,TOken)==0){syn=33;}

else if(strcmp(r34,TOken)==0){syn=34;}

else if(strcmp(r35,TOken)==0){syn=35;}

else if(strcmp(r36,TOken)==0){syn=36;}

else if(strcmp(r37,TOken)==0){syn=37;}

else if(strcmp(r38,TOken)==0){syn=38;}

else{syn=100;} //变量名

}

else if((ch>='0'&&ch<='9')) //数字

{

sum=0;

while((ch>='0'&&ch<='9'))

{

sum=sum*10+ch-'0';//显示其数字sum

i++;

ch=A[i];

}

syn=40;

}

else switch(ch) //其他字符

{

case'<':m=0;TOken[m]=ch;m++;

i++;ch=A[i];

if(ch=='=')//<>为22

{

syn=41;

TOken[m]=ch;m++;i++;

}

else

{

syn=46;

}

break;

case'>':m=0;TOken[m]=ch;m++;

i++;ch=A[i];

if(ch=='=')

{

syn=42;

TOken[m]=ch;m++;i++;

}

else

{

syn=47;

}

break;

case':':m=0;TOken[m]=ch;m++;

i++;ch=A[i];

if(ch=='=')

{

syn=44;

TOken[m]=ch;m++;i++;

}

else

{

syn=49;

}

break;

case'@':syn=0;TOken[0]=ch;i++;break;

case'=':syn=48;TOken[0]=ch;i++;break;

case'#':syn=50;TOken[0]=ch;i++;break;

case'+':syn=50;TOken[0]=ch;i++;break;

case'-':syn=51;TOken[0]=ch;i++;break;

case'*':syn=52;TOken[0]=ch;i++;break;

case'/':syn=53;TOken[0]=ch;i++;break;

case'(':syn=54;TOken[0]=ch;i++;break;

case')':syn=55;TOken[0]=ch;i++;break;

case'{':syn=56;TOken[0]=ch;i++;break;

case'}':syn=57;TOken[0]=ch;i++;break;

case';':syn=58;TOken[0]=ch;i++;break;

case'.':syn=59;TOken[0]=ch;i++;break;

case'\'':syn=60;TOken[0]=ch;i++;break;

case'\n':syn=-2;break;

default: syn=-1;break;

}

}

main()

{

row = 0 ;

p = 0 ;

printf("Please input string:(end of '@')\n");

do

{

scanf("%c",&ch);

A[p]=ch;

p++;

}//输入值到数组A【】中,以@结束

while(ch!='@');

do

{

scaner();//进入函数进行判定

switch(syn)

{

case 40: printf("(%d,%d)\n",syn,sum); break;//如果是40,那么就是数字

case 0: printf("(%d,%c)\n",syn,TOken[0]);break;//如果是0,那么是@ 结束

case -2: row=row++;break;

default: printf("(%d,%s)\n",syn,TOken);break;//否则,就是变量名、关键词

}

}

while (syn!=0);

}

  1. 1.      源程序名:词法分析.c

 

 

 

 

 

 

 

  1. 2.      原理分析及流程图

主要总体设计问题。

(包括存储结构,主要算法,关键函数的实现等)

词法分析主程序示意图

  1. 3.      主要程序段及其解释:

实现主要功能的程序段,重要的是程序的注释解释。

void scaner()

{

/*

共分为三大块,分别是标示符、数字、符号,对应下面的 if else if 和 else

*/

for(n=0;n<7;n++)

TOken[n]=0;//每次循环完就清零

ch=A[i];

while(ch==' '||ch=='\n')//如果字符是空格或者回车,跳过

{

i++;

ch=A[i];

}

if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) //可能是标示符或者变量名

{

m=0;

while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//找到一个变量名或者关键字,直到遇到空格为止

{

TOken[m]=ch;m++;

i++;ch=A[i];

}

TOken[m]='\0';

//将识别出来的字符和已定义的标示符作比较, //因为定义的begin为1,if为2......

if(strcmp(TOken,r1)==0){syn=1;}

else if(strcmp(TOken,r2)==0){syn=2; }

else if(strcmp(TOken,r3)==0){syn=3;}

else if(strcmp(TOken,r4)==0){syn=4;}

else if(strcmp(TOken,r5)==0){syn=5;}

else if(strcmp(TOken,r6)==0){syn=6;}

else if(strcmp(TOken,r7)==0){syn=7;}

else if(strcmp(r8,TOken)==0){syn=8;}

else if(strcmp(r9,TOken)==0){syn=9;}

else if(strcmp(r10,TOken)==0){syn=10;}

else if(strcmp(r11,TOken)==0){syn=11;}

else if(strcmp(r12,TOken)==0){syn=12;}

else if(strcmp(r13,TOken)==0){syn=13;}

else if(strcmp(r14,TOken)==0){syn=14;}

else if(strcmp(r15,TOken)==0){syn=15;}

else if(strcmp(r16,TOken)==0){syn=16;}

else if(strcmp(r17,TOken)==0){syn=17;}

else if(strcmp(r18,TOken)==0){syn=18;}

else if(strcmp(r19,TOken)==0){syn=19;}

else if(strcmp(r20,TOken)==0){syn=20;}

else if(strcmp(r21,TOken)==0){syn=21;}

else if(strcmp(r22,TOken)==0){syn=22;}

else if(strcmp(r23,TOken)==0){syn=23;}

else if(strcmp(r24,TOken)==0){syn=24;}

else if(strcmp(r25,TOken)==0){syn=25;}

else if(strcmp(r26,TOken)==0){syn=26;}

else if(strcmp(r27,TOken)==0){syn=27;}

else if(strcmp(r28,TOken)==0){syn=28;}

else if(strcmp(r29,TOken)==0){syn=29;}

else if(strcmp(r30,TOken)==0){syn=30;}

else if(strcmp(r31,TOken)==0){syn=31;}

else if(strcmp(r32,TOken)==0){syn=32;}

else if(strcmp(r33,TOken)==0){syn=33;}

else if(strcmp(r34,TOken)==0){syn=34;}

else if(strcmp(r35,TOken)==0){syn=35;}

else if(strcmp(r36,TOken)==0){syn=36;}

else if(strcmp(r37,TOken)==0){syn=37;}

else if(strcmp(r38,TOken)==0){syn=38;}

else{syn=100;} //变量名

}

else if((ch>='0'&&ch<='9')) //数字

{

sum=0;

while((ch>='0'&&ch<='9'))

{

sum=sum*10+ch-'0';//显示其数字sum

i++;

ch=A[i];

}

syn=40;

}

else switch(ch) //其他字符

{

case'<':m=0;TOken[m]=ch;m++;

i++;ch=A[i];

if(ch=='=')//<>为22

{

syn=41;

TOken[m]=ch;m++;i++;

}

else

{

syn=46;

}

break;

case'>':m=0;TOken[m]=ch;m++;

i++;ch=A[i];

if(ch=='=')

{

syn=42;

TOken[m]=ch;m++;i++;

}

else

{

syn=47;

}

break;

case':':m=0;TOken[m]=ch;m++;

i++;ch=A[i];

if(ch=='=')

{

syn=44;

TOken[m]=ch;m++;i++;

}

else

{

syn=49;

}

break;

case'@':syn=0;TOken[0]=ch;i++;break;

case'=':syn=48;TOken[0]=ch;i++;break;

case'#':syn=50;TOken[0]=ch;i++;break;

case'+':syn=50;TOken[0]=ch;i++;break;

case'-':syn=51;TOken[0]=ch;i++;break;

case'*':syn=52;TOken[0]=ch;i++;break;

case'/':syn=53;TOken[0]=ch;i++;break;

case'(':syn=54;TOken[0]=ch;i++;break;

case')':syn=55;TOken[0]=ch;i++;break;

case'{':syn=56;TOken[0]=ch;i++;break;

case'}':syn=57;TOken[0]=ch;i++;break;

case';':syn=58;TOken[0]=ch;i++;break;

case'.':syn=59;TOken[0]=ch;i++;break;

case'\'':syn=60;TOken[0]=ch;i++;break;

case'\n':syn=-2;break;

default: syn=-1;break;

}

}

  1. 4.      运行结果及分析

一般必须配运行结果截图,结果是否符合预期及其分析。

   (截图需根据实际,截取有代表性的测试例子)

 

 

 

四、        实验总结

心得体会,实验过程的难点问题及其解决的方法。

对于词法分析还不是很熟练,实验当中对于各个标识符的辨别有些难度,没办法准确输出,对于C语言的一些用法由于太久没用也显得有一些生疏,整体上来说有很大不足。

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/a13798508446/p/5961105.html

089-袁佳鹏-实验报告1相关推荐

  1. 2017-2018-2 20165236 实验四《Android开发基础》实验报告

    2017-2018-2 20165236 实验四<Android开发基础>实验报告 一.实验报告封面 课程:Java程序设计       班级:1652班       姓名:郭金涛     ...

  2. java程序设计输入输出实验_20145320《Java程序设计》第五次实验报告

    20145320<Java程序设计>第五次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.05.06 18: ...

  3. 用python语言实现人工智能猴子摘香蕉的问题_人工智能实验报告大全:猴子摘香蕉问题的VC编程实现等八次.docx...

    人工智能课内实验报告(8次)学 院: 自动化学院 班 级: 智能1501 姓 名: 刘少鹏(34) 学 号: 目 录课内实验1:猴子摘香蕉问题的VC编程实现--------1课内实验2:编程实现简单动 ...

  4. 20145240 《Java程序设计》第四次实验报告

    20145240 <Java程序设计>第四次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1452 指导教师:娄嘉鹏 实验日期:2016.04.26 实验 ...

  5. 2017—2018 实验报告:实验一

    实验一:实验报告 课程:程序设计与数据结构 班级: 1623 姓名: 张旭升 学号:20162329 指导教师:娄嘉鹏 王志强 实验日期:9月25日 实验密级: 非密级 预习程度: 已预习 必修/选修 ...

  6. 2018-2019-2 20175223 实验三《敏捷开发与XP实践》实验报告

    目录 北京电子科技学院(BESTI)实验报告 实验名称:实验三 敏捷开发与XP实践 实验内容.步骤与体会: 一.实验三 敏捷开发与XP实践-1 二.实验三 敏捷开发与XP实践-2 三.实验三 敏捷开发 ...

  7. Java第二次实验报告——Java面向对象程序设计

    北京电子科技学院(BESTI) 实    验    报    告 课程名称:java程序设计实验      班级:1352         姓名:洪韶武      学号:20135219 成绩:   ...

  8. 2018-2019-2-20175225 实验四《Android开发基础》实验报告

    一.实验报告封面 课程:Java程序设计 班级:1752班 姓名:张元瑞 学号:20175225 指导教师:娄嘉鹏 实验日期:2019年5月14日 实验时间:13:45 - 21:00 实验序号:实验 ...

  9. java程序设计实验报告册_20145215《Java程序设计》实验一实验报告

    实验一 Java开发环境的熟悉 实验内容及步骤 使用JDK编译.运行简单的Java程序 命令行下程序开发: 在命令行下建立实验目录,进入该目录后创建exp1目录 敲入以下代码: package exp ...

最新文章

  1. 2021-03-26习题4-7 最大公约数和最小公倍数 (15 分)
  2. Binder通信模型 :ServiceManager
  3. Shell中的case语句
  4. c++申请内存空间_有没有想过:malloc分配的内存空间地址连续吗
  5. 怎么使用缓存、缓存穿透、热点数据处理、缓存雪崩解决方案 - 公开课笔记
  6. java g1 gc ref proc_深入理解垃圾收集器的G1及日志分析
  7. tensorflow入门书籍推荐_架构书籍推荐(入门读)
  8. AJAX最大的特点以及作用是什么?经典面试题
  9. 应用系统适配迁移方案
  10. python xy 官网_zwPython,字王集成式python开发平台,比pythonXY更强大、更方便。
  11. 在面试过程中面试官可能会问到的问题
  12. 利用CH341A编程器刷新BIOS,恢复BIOS,妈妈再也不用担心BIOS刷坏了
  13. 机械祭天法力无边:C++primer之书店程序包含Sales_item.h源码
  14. 听a16z讲安全:钱包的「非托管」谬论
  15. Windows8 安装Vs2008 报错的解决方法
  16. NAT-T下的端口浮动
  17. 数据结构:堆 的详解
  18. 致远a8 java,致远A8协同办公系统poc/seeyon 0day
  19. 安卓小程序——聊天室(一)
  20. Atomic原子类及原理

热门文章

  1. Eigen::Map
  2. 重读《从菜鸟到测试架构师》-- 单元测试测点啥
  3. MySQL连接问题【如何解决MySQL连接超时关闭】
  4. Castle.ActiveRecord的嵌套事务处理
  5. hibernate annotations和hbm.xml配置文件在spring中的并存配置
  6. Google正式收购百度
  7. 图像投影特征图的波峰波谷查找的相关原理及利用差分遍历法查找波峰的OpenCV代码
  8. c语言 while 教案,c语言电子教案(刘丹)
  9. dataset中获取图像的名字_GDAL与OpenCV的图像像素读取格式互相转换
  10. C#.NET 连接 Access操作类