首页 > 代码库 > 词法分析实验报告
词法分析实验报告
实验一、词法分析实验
专业:商业软件工程
姓名: 陈 瑾
学号:201506110101
一、 实验目的
编制一个词法分析程序
二、 实验内容和要求
– 输入:源程序字符串
– 输出:二元组(种别,单词本身)
– 待分析语言的词法规则
三、 实验方法、步骤及结果测试
1. 源程序名:压缩包文件(rar或zip)中源程序名 1010.c
可执行程序名:E:\编程练习、C语言、c_file\Debug\1010.exe
2. 原理分析及流程图
主要总体设计问题。
(包括存储结构,主要算法,关键函数的实现等)
输入:所给文法的源程序字符串。
输出:二元组(syn,token或sum)构成的序列。
其中:syn为单词种别码;token为存放的单词自身字符串;sum为整型常数。
关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表)。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。
首先设置3个变量:①token用来存放构成单词符号的字符串;②sum用来整型单词;③syn用来存放单词符号的种别码。
3. 主要程序段及其解释:
实现主要功能的程序段,重要的是程序的注释解释。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char prog[100],ch,token[8];
int p=0,syn,n,i;
char *keyword[6]={"begin","then","if","while","do","end"};
void scaner();
void main()
{
p=0;
printf("please input sentence, end of ‘#‘ !\n");
do
{
ch=getchar();
prog[p++]=ch;
}while(ch!=‘#‘);
p=0;
do
{
scaner();
switch(syn)
{
case -1:printf("词法分析 出错\n");
break;
default :printf("<%d,%s>\n",syn,token);
break;
}
}while(syn!=0);
printf("词法分析 成功\n");
getchar();
}
void scaner()
{
for(n=0;n<8;n++)
{
token[n]=‘\0‘;
}
n=0;
ch=prog[p++];
while(ch==‘ ‘)
{
ch=prog[p++];
}
if((ch>=‘a‘&&ch<=‘z‘)||(ch>=‘A‘&&ch<=‘Z‘))
{
do{
token[n++]=ch;
ch=prog[p++];
}while((ch>=‘a‘&&ch<=‘z‘)||(ch>=‘a‘&&ch<=‘z‘)||(ch>=‘0‘&&ch<=‘9‘));
syn=10;
for(n=0;n<6;n++)
{
if(strcmp(token,keyword[n])==0)
{
syn=n+1;
}
}
p--;//return;
}
else if(ch>=‘0‘&&ch<=‘9‘)
{
p--;
do
{
token[n++]=prog[p++];
ch=prog[p];
}while(ch>=‘0‘&&ch<=‘9‘);
syn=11;
return;
}
else
{
switch(ch)
{
case ‘+‘:syn=13;token[0]=ch;
break;
case ‘-‘:syn=14;token[0]=ch;
break;
case ‘*‘:syn=15;token[0]=ch;
break;
case ‘/‘:syn=16;token[0]=ch;
break;
case ‘:‘:syn=17;token[0]=ch;
ch=prog[p++];
if(ch==‘=‘){token[1]=ch;syn++;}
else p--;
break;
case ‘<‘:syn=20;token[0]=ch;
ch=prog[p++];
if(ch==‘>‘)
{
token[1]=ch;syn++;
}
else if(ch==‘=‘){token[1]=ch;syn=syn+2;}
else p--;
break;
case ‘>‘:syn=23;token[0]=ch;
ch=prog[p++];
if(ch==‘=‘)
{
token[1]=ch;syn++;
}
else p--;
break;
case ‘=‘:syn=25;token[0]=ch;
break;
case ‘;‘:syn=26;token[0]=ch;
break;
case ‘(‘:syn=27;token[0]=ch;
break;
case ‘)‘:syn=28;token[0]=ch;
break;
case ‘#‘:syn=0;token[0]=ch;
break;
default: printf("词法分析出错! 请检查是否输入非法字符\n");
syn=-1;
break;
}
}
}
4、运行结果及分析
四、 实验总结
词法分析,当输入一个字符时,可以根据定义的语法进行分析。但当输入长的程序时候,应当如何获取,然后分割,最后进行分析。试着一个一个字来读取,遇到正常字符开始的就连续读取直到遇到一个分隔符(如空格)。 如果是连续的空格,如果是特殊的字, 如果是以特定字符开头的(如双引号”)类似这样多种情况,如何进行分析。后经过查找资料,询问同学,最终勉强完成作业。虽然不是很好,但过程有了更深的理解了词法分析的过程,以及该算法。
词法分析实验报告