语法分析器 (基于预测分析表)

这篇博客分享了如何构建一个语法分析器,特别强调了使用预测分析表这一技术。作者提供了apart_from.h、floow.h、head.h、judge.h和table.h等关键文件,帮助读者理解并实现相关功能。这是一个实用的教程,适合对编译原理感兴趣的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  老师有木有让你写个语法分析器   

   在网上找也难  所以的福利了   绝对可以运行  

  apart_from。h文件

void apart(){
	int i,len,k=0,j,l,p;
	for(i=0;i<sum;i++){
		for(j=0;j<k;j++){
			if(ter_symbol[j]==form[i].formula[0])
				break;
		}
		if(j==k)
			ter_symbol[k++] = form[i].formula[0];
	}//新的非终结符加入
	ter_symbol[k]='\0';



	k=0;
	for(i=0;i<sum;i++){
		len = strlen(form[i].formula);
		for(j=3;j<len;j++){
			if(form[i].formula[j]=='$')
				break;
			for(l=0;l<strlen(ter_symbol);l++){
				if(form[i].formula[j]==ter_symbol[l])
					break;
			}
			for(p=0;p<k;p++){
				if(form[i].formula[j]==non_ter[p])
					break;
			}
			if(l==strlen(ter_symbol)&&p==k){
				non_ter[k++]=form[i].formula[j];
			}
		}
	}//终结符
	non_ter[k]='\0';
}
first.h

//求一个非终结符的first集
int getFirst(char a,int col){
	int i,j,k=1,l,p;
	for(i=0;i<sum;i++){
		if(form[i].formula[0]==a){
			for(j=0;j<strlen(non_ter);j++){
				if(form[i].formula[3]==non_ter[j])
					break;
			}	//判断是否是终结符
			if(j<strlen(non_ter)){
				if(is_sameFir(col,k,form[i].formula[3]))
					first_set[col][k++]=form[i].formula[3];
				continue;
			}//右部首字母是终结符;
			else if(form[i].formula[3]=='$'){
				if(is_sameFir(col,k,'$'))
					first_set[col][k++]='$';
				continue;
			}//右部首字母是kong;
			else if(form[i].formula[3]==a)
				continue;//右部首字母是自己;
			else{//printf("%d 1\n",col);
				for(l=3;l<strlen(form[i].formula);l++){//循环表达式找
						for(j=0;j<strlen(ter_symbol);j++){//printf("%d 2\n",col);
							if(form[i].formula[l]==ter_symbol[j])
								break;
						}//找到非终结符的下标
						if(j==strlen(ter_symbol)){//printf("%d 3\n",col);
							if(is_sameFir(col,k,form[i].formula[l]))
								first_set[col][k++]=form[i].formula[l];
							break;
						}//循环中碰到终结符,结束

						if(first_set[j][0]=='0')
							getFirst(form[i].formula[l],j);//printf("%d 4\n",col);}//first集未求,递归求first集

						for(p=1;p<strlen(f
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值