实验一 词法分析实验
专业:商业软件三班 姓名:曾铭杰 学号:201506110197
一、 实验目的
用C语言设计一个词法分析程序,将字符流的源程序进行分析,从左到右逐个字符地扫描源程序,同时滤掉空格符和回车换行符,逐个读取字符,然后将它们拼在一起组成一个有意义的单词符号,识别出单词的种别及单词自身的值.
二、 实验内容和要求
1.输入一段源程序字符串;
2.输出格式按照二元组(种别,单词符号本身)。
三、 实验方法、步骤及结果测试
- 1. 源程序名:压缩包文件(rar或zip)中源程序名:词法分析.c
可执行程序名:词法分析.exe
- 2. 原理分析及流程图
通过读取用户输入字符串,滤掉空格符合回车换行符,如果单词以字母开头则为标识符,再让标志符与关键字数组比较,存在与之相同元素即为关键字,否则则进入switch语句,与运算符,分隔符等有意义符号进行比较即可。
- 3. 主要程序段及其解释:
do{
scaner();
switch(type)
{
case 11:
printf(" %-10d%5d\n",sum,type);
break;
case -1:
printf("有无法识别的字符\n");
return 0;
break;
default:
printf(" %-10s%5d \n",word,type);
break;
}
}while(type!=0);
do while 循环语句中有scaner函数,scaner函数是对用户输入的字符串进行处理,滤掉空格和回车换行符读取有意义的单词,并对单词进行分析,判断起种别,根据返回值的情况进行分类,如果返回值type为11,则证明该单词为数字,如果为-1则表示无法识别,其他值则表示该单词为标识符或关键字或运算符等。对一个单词进行判断后继续循环,知道scaner返回值type为0,即为用户输入的字符串结束符‘#为止。
scanner函数部分程序段如下所示:
if(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘)))
{
while(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘))||((ch>=‘0‘)&&(ch<=‘9‘)))
{
word[i++]=ch;
ch=string[p++];
}
p--;
type=10; //先将以字母开头的字符识别为标识符
for(n=0;n<6;n++)
if(strcmp(word,keyword[n])==0) //与关键字数组比较,相同则表示为关键字,种别码即为下标值加1
{
type=n+1;
break;
}
}
else if((ch>=‘0‘)&&(ch<=‘9‘))
{
while((ch>=‘0‘)&&(ch<=‘9‘))
{
sum=sum*10+ch-‘0‘; //将字符型转化为整形sum
ch=string[p++];
}
p--;
type=11;
}
- 4. 运行结果及分析
四、 实验总结
刚开始进行词法分析程序编写时候毫无头绪,虽然知道其原理和要求,但是不知道从何入手,在通过网上查询资料后才有所头绪,实验过程也遇到很多问题。
由于程序需要返回单词符号和种别码给用户查看,而函数只能有一个返回值,所以返回的参数需设为全局变量,以便调用和查询。其次是在关键字数组的设定上,本程序中keyword数据存储关键字,数组的下标值+1即表示该关键字的种别码,在程序开始时就已初始化好的了。在程序运行时,如果计算机读取到已字母开头的单词时,会暂时将它识别为标识符,再将标识符与关键字数组进行比较,相同时即为关键字,种别码即为下标值+1。