【实验目的】
练习词法分析程序的构造方法;加深对课堂教学的理解;提高词法分析方法的实践能力。
【实验要求】
利用c/c++等语言构造词法分析程序
【具体要求】
词法分析器能够识别实数
识别实数的状态转换图
其中,d ={0,1,2,3,4,5,6,7,8,9}。f代表±。
【源程序】
/*
实验名称:实验1 词法分析程序的构造
学号:
姓名:niu91(859222829)
班级:
*/
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define N 65535
/*符号表
f1[] 正负号数组
d[] 整数数组
以及 'e' 和'.'
*/
static char f1[2]={'+','-'};
static char d[10]={'0','1','2','3','4','5','6','7','8','9'};
/*函数列表*/
/*判断字符是否在符号表中
返回值
1:正负号
2:e
3:.
4:数字
0:查找失败
*/
int isBelong(char);
/*匹配字符串*/
void matching(char*);
/*判断是否是整数
返回值:
1:是
0:否
*/
int isInteger(int,char*,int);
/*判断是否是小数*/
int isDecimal(int,char*,int);
/*判断是否是指数*/
int isExponent(int,char*,int);
void main()
{
char *s=(char*)malloc(N*sizeof(char));
int flag=0;//标志符号 为0匹配失败 为1匹配成功
int n;
printf("请输入测试次数:");
scanf("%d",&n);
getchar();//吃掉回车符号,否则回车会存到s中!
while(n)
{
printf("请输入测试数据:");
gets(s);
s[strlen(s)+1]='\0';//添加符号结束标志
matching(s);
--n;
}
free(s);//释放指针s所指向的动态空间
}
int isBelong(char ch)
{
int i;
if(ch=='+' || ch=='-')
{
return 1;
}else if(ch=='e')
{
return 2;
}else if(ch=='.')
{
return 3;
}else{
for(i=0;i<10;i++)
{
if(ch==d[i])
return 4;
}
return 0;
}
}
void matching(char* s)
{
int size=strlen(s)-1;
int flag=0;
//首先判断首字符是否是 f1 或者 数字
if(isBelong(s[0])==1)//f1
{
printf("%c",s[0]);
matching(s+1);//递归
}else if(isBelong(s[0])==4){//d
//实数开头有大于一个零的字符数量,视为非法
if(size>=2 && s[0]=='0' && s[1]!='.')
{
printf("%s不是实数!\n",s);
}else if(isInteger(1,s,size))
{
printf("%s是整数!\n",s);
}else if(isDecimal(0,s,size))
{
printf("%s是小数!\n",s);
}else if(isExponent(0,s,size))
{
printf("%s是指数!\n",s);
}else
{
printf("%s不是实数!\n",s);
}
}else{
printf("%s不是实数!\n",s);
}
}
int isInteger(int start,char* s,int size)
{
int i;
int flag=0;
for(i=start;i<=size;i++)
{
if(isBelong(s[i])==4)
{
flag=1;
}else
{
return 0;
}
}
return flag;
}
int isDecimal(int start,char* s,int size)
{
int i;
int flag=0;
for(i=start;i<=size-2;i++)
{
if(isInteger(start,s,i) && isBelong(s[i+1])==3 && isInteger(i+2,s,size))
{
flag=1;
}
}
return flag;
}
int isExponent(int start,char* s,int size)
{
int i;
int flag=0;
for(i=start+2;i<=size-3;i++)
{
if(isDecimal(start,s,i) &&
isBelong(s[i+1])==2 &&isBelong(s[i+2])==1
&& isInteger(i+3,s,size))
{
flag=1;
}
}
return flag;
}
【实验结果】