实验一、词法程序分析实验
专业:商业软件2班 姓名:蔡瑞奇 学号:201506110161
一、 实验目的
设计和调解一个词法分析程序,加强对词法分析的理解。
二、 实验内容和要求
用户输入一条字符串,程序对用户输入的字符逐一进行判断,逐一识别出该字符串哪些是关键字,哪些是数字,字母,并将识别的结果以二元组的形式进行输出。
三、 实验方法、步骤及结果测试
- 1. 源程序名:压缩包文件(rar或zip)中源程序名×××.c
可执行程序名:×××.exe
- 2. 原理分析及流程图
- 1. 主要程序段及其解释:
#include<stdio.h>
#include<string.h>
#define N 100
main()
{
int t;
int i,j;
char ch;
char x[N];
char y[N];
char a[5]={'b','e','g','i','n'};
char b[5]={'w','h','i','l','e'};
char c[4]={'t','h','e','n'};
char d[2]={'i','f'};
char e[3]={'e','n','d'};
char f[2]={'d','o'};
printf("请输入一个字符串: ");
gets(x);
i=0;
j=0;
do
{
while(x[i]==10||x[i]==13||x[i]==9)
{
i++;
}
if(x[i]>='a'&&x[i]<='z')
{
y[j]=x[i];
j++;
}
if((t=strcmp(a,y))==0)
printf("(begin,1)");
else if((t=strcmp(b,y))==0)
printf("(while,4)");
else if((t=strcmp(c,y))==0)
printf("(then,3)");
else if((t=strcmp(d,y))==0)
printf("(if,2");
else if((t=strcmp(e,y))==0)
printf("(end,6)");
else if((t=strcmp(f,y))==0)
printf("(do,5)");
switch(x[i])
{
case '+':printf("(13,+)");
break;
case '-':printf("(14,-)");
break;
case '*':printf("(15,*)");
break;
case '/':printf("(16,/)");
break;
case ':':printf("(17,:)");
break;
case ':=':printf("(18,:=)");
break;
case '<':printf("(20,<)");
break;
case '<=':printf("(21,<=)");
break;
case '<>':printf("(22,<>)");
break;
case '>':printf("(23,>)");
break;
case '=':printf("(25,=)");
break;
case ';':printf("(26,;)");
break;
case '(':printf("(27,()");
break;
case ')':printf("(28,))");
break;
case '#':printf("(0,#)");
break;
}
i++;
}while(x[i]!=' ');
}
把几个关键字用几个字符数组把存储起来,接着让用户输入一段字符串存储在数组x里面,用一个do{}while循环对数组x的每个元素进行判断,如果是字母的话,就将该元素暂时存储在y数组里面,全部读完再对y数组进行判断,看时不时与所定义的字符数组相同,接下来的switch语句是对用户输入的其它字符进行判断,并以二元组的形式进行输出。
- 2. 运行结果及分析
一般必须配运行结果截图,结果是否符合预期及其分析。
(截图需根据实际,截取有代表性的测试例子)
一、 实验总结
心得体会,实验过程的难点问题及其解决的方法。
从第一次接触编译原理的上机课的时候,就发现这门课程并不是那么地好学,尤其是让我们做这么一个以前在c语言上都还没讲过的例子,感觉词法分析有思路,但是却难以用c的语言完美地表达出来,因此这次试验我认为还是需要再进一步改进,而且关于字符串的理解还尚浅,对于字符串的处理和理解还是有难度,因为字符与数字不同,连回车和空格都是字符串,我无法确定我所输入的字符串究竟是不是我所想要的,这个步骤就难倒了我。