词法分析实验报告
格式说明:排版时注意按此模板的字体,字号和行距。 报告提交和打印输出时请去掉此框。 |
实验一、词法分析实验
专业 商业软件 姓名 梁浩辉 学号201506110109
一、 实验目的
通过设计、开发一个高级语言的词法分析程序,加深对课堂教学内容(包括正规文法、正规表达式、有限自动机、NFA到DFA的转换、DFA的最小化)的理解,提高词法分析方法的实践能力。
二、 实验内容和要求
1)深入理解、掌握有限自动机及其应用;
(2)掌握根据语言的词法规则构造识别其单词的有限自动机的方法;
(3)掌握NFA到DFA的等价变换方法、DFA最小化的方法;
(4)掌握设计、编码、调试词法分析程序的技术与方法,具体实现S语言的词法分析程序。
三、 实验方法、步骤及结果测试
- 1. 程序名:词法分析.c
可执行程序名:词法分析.exe
- 2. 原理分析及流程图
主要总体设计问题。
采用数组存放数据,通过字符串的比较实现关键字的种别码输出。
问题:当输入连续的关键字时如ifif后面一个无法识别
解决:当输出完一个关键字后就释放token的数组
- 3. 主要程序段及其解释:
#include <stdio.h>
#include <string.h>
#define MAX 100
main()
{
int i=0,j,m,n,syn;
char standard[6][10]={"begin","if","then","while","do","end"},string[MAX],token[MAX],ch;
printf("请输入一串字符,以#结尾:");
do{
scanf("%c",&ch);
string[i]=ch;
i++;
}while(ch!='#');
string[i]='#';
i=0;
do{
for(j=0;j<MAX;j++)
token[j]=' ';
ch=string[i];
i++;
while(ch==' '||ch==' ')
{
ch=string[i];
i++;
}
j=0;
while(ch>='a'&& ch<='z' || ch>='A'&&ch<='Z') /*判断是否为字符关键字*/
{
token[j]=ch;
ch=string[i];
i++;
j++;
for(n=0;n<6;n++)
{
if(strcmp(token,standard[n])==0)
{
syn=n+1;
printf("%s,种别码%d ",standard[n],syn);
for(j=0;j<MAX;j++)
token[j]=' ';
j=0;
}
}
}
switch(ch)
{
case '+':
syn=13;
printf("%c,种别码%d ",ch,syn);
break;
case '-':
syn=14;
printf("%c,种别码%d ",ch,syn);
break;
case '*':
syn=15;
printf("%c,种别码%d ",ch,syn);
break;
case '/':
syn=16;
printf("%c,种别码%d ",ch,syn);
break;
case ':':
ch=string[i];
i++;
if(ch=='=')
{
syn=18;
printf("%c%c,种别码%d ",token[j-1],ch,syn);
}
else
{
syn=17;
printf("%c,种别码%d ",ch,syn);
}
break;
case '<':
token[j]=ch;
j++;
ch=string[i];
i++;
if(ch=='=')
{
syn=21;
printf("%c%c,种别码%d ",token[j-1],ch,syn);
}
else
{
syn=20;
printf("%c,种别码%d ",ch,syn);
}
break;
case '>':
token[j]=ch;
j++;
ch=string[i];
i++;
if(ch=='=')
{
syn=24;
printf("%c%c,种别码%d ",token[j-1],ch,syn);
}
else{
syn=23;
printf("%c,种别码%d ",ch,syn);
}
break;
case '=':
syn=25;
printf("%c,种别码%d ",ch,syn);
break;
case ';':
syn=26;
printf("%c,种别码%d ",ch,syn);
break;
case '(':
syn=27;
printf("%c,种别码%d ",ch,syn);
break;
case ')':
syn=28;
printf("%c,种别码%d ",ch,syn);
break;
default:
break;
}
}while(ch!='#');
getchar();
getchar();
}
利用string数组储存用户输入的字符串再一个个读取字符,当读到字母就用token数组存放,读完后再对照是否为关键字,当为其他字符时再判断输出。
- 4. 运行结果及分析
四、 实验总结
心得体会,在这次的实验中了解词法分析的过程,解决一些问题。在完成我的词法分析器的时候考虑到关键字固定的字符串,这就有利于字符串的比较,从而识别出对应的种别码。因为是第一次接触,显得有些不知所措,不知道从何下手,最后经过努力,勉勉强强算是完成了吧。