首页 > 代码库 > 词法分析实验报告
词法分析实验报告
实验一、词法分析实验
专业 商业软件工程
姓名 黄施策
学号 201506110228
一、 实验目的
编制一个词法分析程序。
二、 实验内容和要求
输入:源程序字符串
输出:二元组(种码,单词符号本身)。
三、 实验方法、步骤及结果测试
- 1. 源程序名:词法分析.c
可执行程序名:词法分析.exe
- 2. 原理分析及流程图
主要总体设计问题。
(包括存储结构,主要算法,关键函数的实现等)
- 3. 主要程序段及其解释:
实现主要功能的程序段,重要的是程序的注释解释。#include<stdio.h>
#include<string.h>
#define N 100
void priint(char str[],int i,int semp[]);
void pristring(char str[],int i,int semp[]);
void prichar(char str[],int i,int semp[]);
void main()
{
int i;
int temp;
char str[N];
int semp[N]={0}; /*此数组用来标记str字符串里每个成员是否已进行分析,已分析为1,否则为0*/
printf("输入您需要进行词法分析的源程序:");
gets(str);
temp=strlen(str); /*temp所储存的是输入的字符串的长度*/
for(i=0;i<temp;i++)
{ /*利用ASCII码对字符进行分类并进入各自对应的函数*/
if((semp[i]==0)&&(str[i-1]<48||str[i-1]>57)&&(str[i]>=48&&str[i]<=57)){
priint(str,i,semp);}/*数字*/
if((semp[i]!=1)&&((str[i]>=65&&str[i]<=90)||(str[i]>=97&&str[i]<=122))){
pristring(str,i,semp);}/*字母*/
if((semp[i]!=1)&&((str[i]>=32&&str[i]<=47)||(str[i]>=58&&str[i]<=64)||(str[i]>=91&&str[i]<=96)||(str[i]>=123&&str[i]<=126))){
prichar(str,i,semp);}/*符号*/
}
}
void priint(char str[],int i,int semp[])
{
char strtemp[N]={‘\0‘};
int j,k;
for(j=0;j<N;j++)
{
if(str[i]<48||str[i]>57) break;
strtemp[j]=str[i];
semp[i]=1;
i++;
}
printf("<11,");
k=0;
do{
printf("%c",strtemp[k]);
k++;
}while(strtemp[k]!=‘\0‘);
printf(">\n");
strnset(strtemp,‘\0‘,N);/*将字符串strtemp的前N个字符都设为指定字符‘\0‘*/
}
void pristring(char str[],int i,int semp[])
{
int j=0;
int k;
char gechar[N];
char *tempp[10]={"begin","if","then","while","do","end"}; /*二维字符数组*/
do{
gechar[j]=str[i];
semp[i]=1;
i++;
j++;
}while((semp[i]!=1)&&((str[i]>=65&&str[i]<=90)||(str[i]>=97&&str[i]<=122)));
if(strcmp(gechar,tempp[0])==0) {printf("<1,begin>");} /*strcmp功能:对两字符进行比较,相同返回0,不同则为其他数*/
else if(strcmp(gechar,tempp[1])==0) {printf("<2,if>");}
else if(strcmp(gechar,tempp[2])==0) {printf("<3,then>");}
else if(strcmp(gechar,tempp[3])==0) {printf("<4,while>");}
else if(strcmp(gechar,tempp[4])==0) {printf("<5,do>");}
else if(strcmp(gechar,tempp[5])==0) {printf("<6,end>");}
else {
printf("<10,");
for(k=0;k<j;k++)
{
printf("%c",gechar[k]);
}
printf(">\n");
}
strnset(gechar,‘\0‘,N);
}
void prichar(char str[],int i,int semp[])
{
char gchar=str[i];
switch(gchar)
{
case ‘+‘:printf("<13,%c>\n",gchar);semp[i]=1;break;
case ‘-‘:printf("<14,%c>\n",gchar);semp[i]=1;break;
case ‘*‘:printf("<15,%c>\n",gchar);semp[i]=1;break;
case ‘/‘:printf("<16,%c>\n",gchar);semp[i]=1;break;
case ‘:‘:
if(str[i+1]!=‘=‘){
printf("<17,%c>\n",gchar);
semp[i]=1;
}
else if(str[i+1]==‘=‘){
printf("<18,%c%c>\n",gchar,str[i+1]);
semp[i]=1;
semp[i+1]=1;
}
break;
case ‘<‘:
if((str[i+1]!=‘=‘)&&(str[i+1]!=‘>‘)){
printf("<20,%c>\n",gchar);
semp[i]=1;
}
else if(str[i+1]==‘=‘){
printf("<21,%c%c>\n",gchar,str[i+1]);
semp[i]=1;
semp[i+1]=1;
}
else if(str[i+1]==‘>‘){
printf("<22,%c%c>\n",gchar,str[i+1]);
semp[i]=1;
semp[i+1]=1;
}
break;
case ‘>‘:
if(str[i+1]!=‘=‘){
printf("<23,%c>\n",gchar);
semp[i]=1;
}
else if(str[i+1]==‘=‘){
printf("<24,%c%c>\n",gchar,str[i+1]);
semp[i]=1;
semp[i+1]=1;
}
break;
case ‘=‘:
if((str[i-1]!=‘<‘)&&(str[i-1]!=‘:‘)&&(str[i-1]!=‘>‘)){
printf("<25,%c>\n",gchar);
semp[i]=1;
}
break;
case ‘;‘:printf("<26,%c>\n",gchar);semp[i]=1;break;
case ‘(‘:printf("<27,%c>\n",gchar);semp[i]=1;break;
case ‘)‘:printf("<28,%c>\n",gchar);semp[i]=1;break;
case ‘#‘:printf("<0,%c>\n",gchar);semp[i]=1;break;
default:printf("<非法字符,%c>\n",gchar);semp[i]=1; break; /*对种码表里没有的符号都默认为非法字符*/
}
}
- 4. 运行结果及分析
四、 实验总结
词法分析文法不熟练,还需多加练习,巩固提高。
词法分析实验报告