实验一、词法分析器实验

专业:商业软件工程   姓名:陈楷涛  学号:201506110199

一、        实验目的

       通过编写一个词法分析器,进一步了解词法之间的关系

二、        实验内容和要求

对输入的字符串进行识别,并将输出该字符串和种别码

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

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

可执行程序名:词法分析.exe

2.      原理分析及流程图

 

#include <stdio.h>

#include <string.h>

char prog[80],token[8],ch;

int syn,p,m,n,sum;

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

void scaner(void);

main()          主函数:循坏输入字符串和输出最后的字符串和识别码

{

p=0;

printf("\n please input a string(end with ‘#‘):\n");

do{

scanf("%c",&ch);

prog[p++]=ch;

}while(ch!=‘#‘);

p=0;

do{

scaner();        调用scaner函数,循环输出字符串和识别码

switch(syn)

{

case 11:

printf("( %-10d%5d )\n",sum,syn);

break;

case -1:

printf("you have input a wrong string\n");

return 0;

break;

default:

printf("( %-10s%5d )\n",token,syn);

break;

}

}while(syn!=0);

}

void scaner(void)     子函数scaner:对输入的字符串进行分析

{

sum=0;

for(m=0;m<8;m++)

token[m++]= NULL;

ch=prog[p++];

m=0;

while((ch==‘ ‘)||(ch==‘\n‘))

ch=prog[p++];

if(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘)))

{

while(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘))||((ch>=‘0‘)&&(ch<=‘9‘)))

{

token[m++]=ch;

ch=prog[p++];

}

p--;

syn=10;

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

if(strcmp(token,rwtab[n])==0)

{

syn=n+1;

break;

}

}

else if((ch>=‘0‘)&&(ch<=‘9‘))

{

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

{

sum=sum*10+ch-‘0‘;

ch=prog[p++];

}

syn=11;

}

else

{

switch(ch)

{

case ‘<‘:

token[m++]=ch;

ch=prog[p++];

if(ch==‘=‘)

{

syn=22;

token[m++]=ch;

}

else

{

syn=20;

p--;

}

break;

case ‘>‘:

token[m++]=ch;

ch=prog[p++];

if(ch==‘=‘)

{

syn=24;

token[m++]=ch;

}

else

{

syn=23;

p--;

}

break;

case ‘+‘:

token[m++]=ch;

ch=prog[p++];

if(ch==‘+‘)

{

syn=17;

token[m++]=ch;

}

else

{

syn=13;

p--;

}

break;

case ‘-‘:

token[m++]=ch;

ch=prog[p++];

if(ch==‘-‘)

{

syn=29;

token[m++]=ch;

}

else

{

syn=14;

p--;

}

break;

case ‘!‘:

ch=prog[p++];

if(ch==‘=‘)

{

syn=21;

token[m++]=ch;

}

else

{

syn=31;

p--;

}

break;

case ‘=‘:

token[m++]=ch;

ch=prog[p++];

if(ch==‘=‘)

{

syn=25;

token[m++]=ch;

}

else

{

syn=18;

p--;

}

break;

case ‘*‘:

syn=15;

token[m++]=ch;

break;

case ‘/‘:

syn=16;

token[m++]=ch;

break;

case ‘(‘:

syn=27;

token[m++]=ch;

break;

case ‘)‘:

syn=28;

token[m++]=ch;

break;

case ‘{‘:

syn=5;

token[m++]=ch;

break;

case ‘}‘:

syn=6;

token[m++]=ch;

break;

case ‘;‘:

syn=26;

token[m++]=ch;

break;

case ‘\"‘:

syn=30;

token[m++]=ch;

break;

case ‘#‘:

syn=0;

token[m++]=ch;

break;

case ‘:‘:

syn=17;

token[m++]=ch;

break;

default:

syn=-1;

break;

}

}

token[m++]=‘\0‘;

}

4.      运行结果及分析

四、        实验总结

心得体会:这是我第一次用C语言编写这么一个词法分析的工具,在编写这个词法分析器的过程中,我感觉我对词法分析也有了更深入的了解,但也不可避免的出现了一些问题,例如,如何原字符串进行拆分,然后一个一个进行分析 一度成为这个程序的障碍,最后,我采用了数组的方式来解决了这个问题。总而言之,这个程序为我打开了一项从未涉及过的崭新的大门,我将在这座大门后面开始我新的学习旅程。

时间: 2024-10-12 00:18:48

实验一、词法分析器实验的相关文章

LB(Load balance)负载均衡集群--{LVS-[NAT+DR]单实例实验+LVS+keeplived实验} 菜鸟入门级

LB(Load balance)负载均衡集群 LVS-[NAT+DR]单实例实验 LVS+keeplived实验 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统. 逻辑可分为: 1调度层 (Director):它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的. 2[服务器池(server pool)/集群层(Real server)]:是一组真正执行客

实验2串口实验

0目标 1STM32 串口简介 2硬件设计 3软件设计 4下载验证 0.目标 利用串口1 不停的打印信息到电脑上,同时接收从串口发过来的数据,把发送过来的数据直接送回给电脑. 1.STM32 串口简介 串口设置的一般步骤可以总结为如下几个步骤:1) 串口时钟使能, GPIO 时钟使能2) 串口复位3) GPIO 端口模式设置4) 串口参数初始化5) 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤)6) 使能串口7) 编写中断处理函数注:对于复用功能的 IO,我们首先要使能GPIO 

信息安全系统设计基础 实验一、实验二 20135327郭皓 20135329 李海空

北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全设计基础                         班级:1353 姓名:郭皓 李海空 学号:20135327  20135329 成绩:             指导教师:娄嘉鹏        实验日期:2015.11.10 实验密级:         预习程度:         实验时间:15:30~18:00 仪器组次:          必修/选修:            实验序号:1 实验名称: 

实验报告(实验一)

北京电子科技学院(BESTI) 实     验    报     告 课程: 密码系统设计基础                                                               班级: 1352班.1353班 姓名:王玥.刘浩晨                                                                    学号:20135232.20135318 成绩:                      

SEED实验——Environment Variable and Set-UID Program实验描述与实验任务

第一部分:实验描述 该实验的学习任务是理解环境变量是如何影响程序和系统行为的.环境变量是一组动态命名的变量 第二部分:实验任务 2.1 任务一:操作环境变量 在这个任务中,我们研究可以用来设置和取消设置环境变量的命令.我们在seed实验环境中使用Bash.用户使用的默认shell在/etc/passwd文件(每个条目的最后一个字段)中设置.您可以使用命令chsh 将其更改为另一个shell程序(请不要在该实验中实现).执行以下任务: 使用printenv或env命令打印出环境变量.也可以单独打印

Java实验报告(实验四)

北京电子科技学院(BESTI) 实     验    报     告 课程:Java    班级:1352班      姓名:王国伊    学号:20135207 成绩:             指导教师:娄嘉鹏       实验日期:2015.6.9 实验密级:无       预习程度:           实验时间:15:30-18:00 仪器组次:         必修/选修:选修     实验序号:四 实验名称:  服务器与客户端间传送信息加解密 实验目的与要求: 1.没有Linux基础

实验报告(实验三)

北京电子科技学院(BESTI) 实     验    报     告 课程: 密码系统设计基础                     班级: 1352班.1353班 姓名:刘浩晨.王玥                学号:20135318. 20135232 成绩:             指导教师:娄嘉鹏       实验日期:2015.11.24 实验密级:        预习程度:        实验时间:15:30—18:00 仪器组次:          必修/选修:        

实验五存储管理实验

实验五存储管理实验 一.        实验目的 连续内存分配方式会形成许多“碎片”,虽然可以通过“紧凑”方法将许多碎片拼接成可用的大块空间,但须为之付出很大开销.如果允许将一个进程直接分散地装入到许多不相邻接的分区中,则无需再进行“紧凑”.基于这一思想而产生了离散分配方式. 如果离散分配的基本单位是页,则称为分页存储管理方式:如果离散分配的基本单位是段,则称为分段存储管理方式. 在分页存储管理方式中,如果不具备页面兑换功能,则称为基本的分页存储管理方式,或称为纯分页存储管理方式,它不具备支持虚

线段相交(快速排斥实验 + 跨立实验)

Description 给定线段P1P2(P1和P2是线段的两端点,且不重合).P3P4(P3和P4是线段的两端点,且不重合),判断P1P2和P3P4是否相交.P1P2和P3P4相交,即指存在一个点P,它既落在P1P2上又落在P3P4上(含线段的端点). Input 输入数据有多组,第一行为测试数据的组数N,下面包括2N行,每组测试数据含2行,第一行为P1P2的坐标值,第二行为P3P4的坐标值,比如下面的数据 表示P1.P2.P3.P4的坐标分别为:P1(0,0),P2(1,1),P3(2,2)

实验一词法分析实验报告

一.        实验目的 (1)    理解词法分析在编译程序中的作用. (2)    加深对有穷自动机模型的理解. (3)    掌握词法分析程序的实现方法. (4)    用C语言对一个简单语言的子集编制一个一遍扫锚的编译理解,掌握编译程序的实现方法和技术. 二.        实验内容和要求 1,待分析的简单语言的词法 2,各种单词符号对应的种别码. 3,词法分析程序的功能(输入,输出). 三.        实验方法.步骤及结果测试 1.      源程序名:压缩包文件(rar或zi