编译原理 实验1 词法分析程序的构造

【实验目的】

  练习词法分析程序的构造方法;加深对课堂教学的理解;提高词法分析方法的实践能力。

【实验要求】

   利用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;
}

 

实验结果

 

 

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值