【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)

这篇具有很好参考价值的文章主要介绍了【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本实验基于词法分析程序实现,可参考本人前面的文章。


目录

一、目标任务

二、程序功能描述

三、主要数据结构描述

四、程序结构描述

设计方法

First集和Follow集

递归子程序框图

函数定义及函数之间的调用关系

五、程序测试

测试用例1

测试结果1

测试用例2

测试结果2

测试用例3

测试结果3

测试用例4

测试结果4


一、目标任务

完成以下描述赋值语句的 LL(1)文法的递归下降分析程序
G[S]: S→V=E
E→TE′
E′→ATE′|ε
T→FT′

T′→MFT′|ε
F→ (E)|i
A→+|-
M→*|/
V→i终结符号 i 为用户定义的简单变量,即标识符的定义。

二、程序功能描述

输入词法分析输出的二元式序列,能够输出该算术表达式是否为该文发定义的判断结果;

输出二元式序列对应的算术表达式;

输出算术表达式对应的单词符号类别编码;

输出递归下降语法分析的过程;

能够通过递归下降分析发现简单的语法错误。

三、主要数据结构描述

常量MAX_LENG定义数组的最大长度;

sign用于标记语句是否正确;

key[MAX_LENG]存放单词符号的编码类别;

   buf[MAX_LENG]保存词法分析程序的二元式序列;

   shuru[MAX_LENG]保存待检测的算术表达式;

   len为buf的长度。

四、程序结构描述

设计方法

First集和Follow集

【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)

递归子程序框图

【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)

【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)

函数定义及函数之间的调用关系

S():调用V、E

E():调用E’

E’():调用A、T、E’

T():调用F、T’、

T’():调用M、F、T’

F():调用E

A()

M()

V()

五、代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LENG 1024
int i;
int sign=0;//标记语句是否正确 
int key[MAX_LENG];//存放单词符号的编码类别 

void S();
void E(); 
void E_(); 
void T(); 
void T_(); 
void F(); 
void A(); 
void M(); 
void V(); 

void S(){
	if(sign==0){
		printf("S ");
		if(key[i]==1){
			V();
			if(sign==0&&key[i]==31){
				i++;
				E();
			}
			else{
				sign=1;
				printf("\nS处出现错误\n");
			}
		}
		else{
			sign=1;
			printf("\nS处出现错误\n");
		}
	}
}
void E(){
	if(sign==0){
		printf("->E ");
		if(key[i]==23||key[i]==1){
			T();
			if(sign==0){
				if(key[i]==16||key[i]==17){
					E_();
				}else if(key[i]==24||key[i]==-1){
					return;
				}else{
					sign=1;
					printf("\nE处出现错误\n");
				}
			}
		}else{
			sign=1;
			printf("\nE处出现错误\n");
		} 
	}
}
void E_(){
	if(sign==0){
		printf("->E' ");
		if(key[i]==16||key[i]==17){
			A();
			if(sign==0){
				if(key[i]==23||key[i]==1){
					T();
					if(sign==0){
						if(key[i]==16||key[i]==17){
							E_();
						}else if(key[i]==24||key[i]==-1){
							return;
						}else{
							sign=1;
							printf("\nE'处出现错误\n");
						}
					}
				}else{
					sign=1;
					printf("\nE'处出现错误\n");
				}
			}
		}else if(key[i]==24||key[i]==-1){
			return;
		}else{
			sign=1;
			printf("\nE'处出现错误\n");
		}
	}
}
void T(){
	if(sign==0){
		printf("->T ");
		if(key[i]==23||key[i]==1){
			F();
			if(sign==0){
				if(key[i]==18||key[i]==19){
					T_();
				}else if(key[i]==16||key[i]==17||key[i]==24||key[i]==-1){
					return;
				}else{
					sign=1;
					printf("\nT处出现错误\n");
				}
			}
		}else{
			sign=1;
			printf("\nT处出现错误\n");
		}
	}
}
void T_(){
	if(sign==0){
		printf("->T' ");
		if(key[i]==18||key[i]==19){
			M();
			if(sign==0){
				F();
				if(sign==0){
					T_();
				}
			}
		}else if(key[i]==16||key[i]==17||key[i]==24||key[i]==-1){
			return;
		}else{
			sign=1;
			printf("\nT'处出现错误\n");
		}
	}
}
void F(){
	if(sign==0){
		printf("->F ");
		if(key[i]==23){
			i++;
			if(key[i]==23||key[i]==1){
				E();
				if(sign==0){
					if(key[i]==24){
						i++;
					}
					else{
						sign=1;
						printf("\nF处出现错误\n");
					}
				}
			}
			else{
				sign=1;
				printf("\nF处出现错误\n"); 
			}
		}
		else if(key[i]==1){
			i++;
		}
		else{
			sign=1;
			printf("\nF处出现错误\n");
		}
	}
}
void A()
{
	if(sign==0){
		printf("->A ");
		if(key[i]==16||key[i]==17){
			i++;
		}
		else{
			sign=1;
			printf("\nA处出现错误\n");
		}
	}
}
void M()
{
	if(sign==0){
		printf("->M");
		if(key[i]==18||key[i]==19){
			i++;
		}
		else{
			sign=1;
			printf("\nM处出现错误\n");
		}
	}
}
void V()
{
	if(sign==0){
		printf("->V ");
		if(key[i]==1){
			i++;
		}
		else{
			sign=1;
			printf("\nV处出现错误\n");
		}
	}
}
int main(){
	FILE *fp;
	char buf[MAX_LENG]={0};//用于保存文件词法分析的结果 
	char shuru[MAX_LENG]={0};//shuru为待检测的语句
	int len;//buf的长度 
	int k=0,x=0,j=0;
	printf("词法分析二元式序列:\n");
	if((fp=fopen("demo_out.txt","r"))!=NULL){
		while(fgets(buf,MAX_LENG,fp)!=NULL){//每次读取一行 
			len=strlen(buf);
			buf[len]='\0';//去除换行符 
			printf("%s \n",buf); 
			for(i=0;i<len;i++){
				if(buf[i]=='('){//将单词符号类别编码转换成数字 
					if(buf[i+2]!=',')//如果是十位数数字
						key[j++]=int((buf[i+1]-'0')*10+buf[i+2]-'0');
					else//如果是个位数数字 
						key[j++]=int(buf[i+1]-'0');
					continue;
				}
				if(buf[i]==','){
					i++;
					if(buf[i]==')')//解决(24,))的情况 
					{
						shuru[x++]=')';
						i++;
						continue;
					}
					while(buf[i]!=')'){//分析的词法可能多个字符,如果没有while则只能保存一个字符 
						shuru[x++]=buf[i];
						i++;	
					}
				}
			}
		}
	}
	shuru[x++]='#';
	key[j++]=-1;
	fclose(fp);
	printf("算术表达式为:\n%s\n",shuru);
	printf("算术表达式的单词符号类别编码依次为:\n");
	for(i=0;i<j;i++)
	printf("%d ",key[i]);
	printf("\n");
	if(key[0]==-1)//当输入的第一个字符为#,直接结束 
	return 0;
	printf("递归下降语法分析过程:\n"); 
	i=0;
	S();
	printf("\n");
	if(key[i]==-1&&sign==0){
		printf("此语句合法!\n");
	}else{
		printf("此语句不合法!\n");
	}
	return 0;
}

六、程序测试

输入为词法分析程序的二元式序列

测试用例1

(1,a)(31,=)(1,b)(18,*)(1,c)(16,+)(1,d)(16,+)(1,e)

【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)

测试结果1

【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)

测试用例2

(1,a)(31,=)(1,b)(18,*)(1,c)(16,+)(23,()(1,d)(16,+)(1,e)(24,))

【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)

测试结果2

【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)

测试用例3

(1,a)(31,=)(1,b)(18,*)(1,c)(16,+)(1,d)(16,+)(1,e)(24,))

【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)

测试结果3

【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)

测试用例4

(1,p)(31,=)(1,a)(16,+)(23,()(1,b)(18,*)(23,()(1,c)(16,+)(1,d)(24,))(19,/)(1,e)(16,+)(23,()(1,x)(16,+)(1,y)(24,))

【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)

测试结果4

【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)


如果对你有帮助,不妨点个赞~~~文章来源地址https://www.toymoban.com/news/detail-419920.html

到了这里,关于【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 编译原理——语法分析器(C/C++代码实现)

    编写一个简单的LL(1)语法分析器。(注意:此实验是简化版的LL(1)文法,已给出预测分析表,不需要求FIRST和FOLLOW集,直接根据预测分析表编写程序即可) 根据编译原理理论课中学习的算术表达式文法,以及该文法LL(1)分析表,用C语言编写接受算术表达式为输入的语法

    2023年04月26日
    浏览(40)
  • 编译原理——SLR(1)语法分析器(C/C++代码实现)

    设计、编制、实现并调试SLR(1)语法分析器,加深对语法分析的理解。 根据编译原理理论课中学习的算术表达式文法以及该文法的LR分析表,用C语言编写接受算术表达式为输入的语法分析器,以控制台(或文本文件,也可以结合词法分析器完成)为输入,控制台(或文件)

    2024年02月11日
    浏览(41)
  • 【编译原理】词法分析程序设计(C语言)

      给定下表所示的一个简单语言的词法规则描述完成以下任务: (1)画出识别该语言词法规则的 状态转换图 ; (2)依据状态转换图,设计并编制词法分析程序,实现从输入源程序中,识别出各类单词,即 、标识符、常数、运算符、界符 五大类,并输出各个单词

    2024年02月15日
    浏览(70)
  • LL(1)语法分析设计原理与实现——以赋值语句为例

    一、实验目的 语法分析的设计方法和实现原理;LL(1)分析表的构造;LL(1)分析过程;LL(1)分析器 的构造; 二、实验内容 实现 LL(1)分析中控制程序(表驱动程序);完成以下描述赋值语句的 LL(1) 文法的 LL(1)分析过程。 G[S]:S→V=E E→TE′ E′→ATE′|ε T→FT′ T′→MFT′|ε F→

    2024年02月03日
    浏览(52)
  • 编译原理——语法分析

    原文链接请访问https://code-child.cn lm表示的是最左 例子 例子 比如求x的first集合,那么就是求的x—字符串,所有字符串首字母构成的集合 计算需要反复 算法 预测分析表 预测分析中的错误检测 预测分析中的错误恢复 例子: M表示预测分析表,A表示栈顶的非终结符,a表示当前

    2024年02月06日
    浏览(45)
  • 研究性学习专题 3_LL(1)语法分析设计原理与实现

    实现 LL(1)分析中控制程序(表驱动程序);完成以下描述赋值语句的 LL(1)文法的 LL(1)分析过程。重点 LL(1)分析方法和 LL(1)分析器的实现。G[S]: S→ V=E E→ TE’ E’→ ATE’ | e T→ FT’ T’→ MFT’ | E F→ (E) | i A→ + | - M→ * | / V→ i 设计说明:终结符号 i 为用户定义的简单变量,即

    2024年02月03日
    浏览(47)
  • 编译原理实验三:算符优先分析算法的设计与实现

    实验三 算符优先分析算法的设计与实现 一、 实验目的 根据算符优先分析法,对表达式进行语法分析,使其能够判断一个表达式是否正确。通过算符优先分析方法的实现,加深对自下而上语法分析方法的理解。 二、 实验要求 1、输入文法。可以是如下算术表达式的文法(你

    2024年02月06日
    浏览(56)
  • 编译原理:算符优先分析算法的设计与实现(含代码)

    写在最前面:我的编译原理学的不是很好,不怎么听课,所以我写代码的思路比较简单。简单的思路也就意味着代码很笨重,介意的话请点叉叉。如果有什么指教欢迎评论区留言。 特别说明 :本博代码在识别: E→E+T E→E-T E→T 时,firstvt集和lastvt集可能会出现错误。 最好合

    2024年02月10日
    浏览(52)
  • python 算符优先分析法的设计实现 编译原理

    1、给出文法如下: G[E] E-T|E+T; T-F|T*F; F-i|(E); 可以构造算符优先表如下: + * ( ) i + * ( = ) i 2、计算机中表示上述优先关系,优先关系的机内存放方式有两种1)直接存放,2)为优先关系建立优先函数,这里由学生自己选择一种方式; 3、给出算符优先分析算法如下: k:=1;S[k]:=\\\'#\\\'; REPE

    2024年02月07日
    浏览(43)
  • 编译原理-6-LR语法分析器

    自顶向下的、不断归约的、基于句柄识别自动机的、适用于LR(∗) 文法的、LR(∗) 语法分析器 只考虑无二义性的文法 自底向上 构建语法分析树 根节点 是文法的起始符号 S S S 每个中间 非终结符节点 表示 使用它的某条产生式进行归约 叶节点 是词法单元$w$$ 仅包含终结符号与

    2024年02月05日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包