我是靠谱客的博主 呆萌雪碧,最近开发中收集的这篇文章主要介绍(原创)自顶向下分析法(递归下降分析程序构造),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

/*题目:自顶向下分析法(递归下降分析程序构造)
 *说明:功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。
*作者:董正荣 *邮箱:chinadongzr@163.com *开发环境:VC6.0 *时间:2011-5-21 */ #include<stdio.h> #include<string.h> //全局变量 char exp[30],gra[30],prod[30]="",chExp='#'; int expSize=0,graSize=0,step=0; //函数声明 /*(1)E->TG (2)G->+TG|-TG|ε (3)T->FS (4)S->*FS|/FS|ε (5)F->(E)|i */ int E(); int T(); int G(); int S(); int F(); //功能函数实现 /*打印文法*/ void printGrammar() { printf("ttt 递归下降分析程序构造ntt(作者:董正荣,邮箱:chinadongzr@163.com)n"); printf("-----------------------------------------------------------n"); printf("ttt (1)E->TGn"); printf("ttt (2)G->+TG|-TG|εn"); printf("ttt (3)T->FSn"); printf("ttt (4)S->*FS|/FS|εn"); printf("ttt (5)F->(E)|in"); printf("-----------------------------------------------------------n"); } void GetExp() { printf("请输入表达式:(以#结束)t"); gets(exp);//获得输入表达式 expSize=strlen(exp); chExp=exp[0]; printf("----------------------------------------------------------n"); //puts(exp);//显示 } void printHead() { printf("步骤:t 语法栈:tt输入串:t产生式:n"); } void printStep() { printf("%dt%-20s %10st t%-15sn",step,gra,exp,prod); strcpy(prod,""); step++; if(chExp=='#'&&gra[graSize-1]=='#') { printf("n表达式分析成功!n"); } } //语法栈入栈,匹配的语法产生式顺序入栈 void pushGraStack(char* ch) { for(int i=0;i<strlen(ch);i++) { gra[graSize]=ch[strlen(ch)-1-i]; graSize++; } } //语法栈出栈,返回字符ch char popGraStack() { char ch; ch=gra[graSize-1]; gra[graSize-1]=''; graSize--; return ch; } //表达式出栈,匹配字符ch void nextChar() { for(int i=0;i<expSize-1;i++) { exp[i]=exp[i+1]; } exp[expSize-1]=''; expSize--; chExp=exp[0]; printf("当前chExp=:%cn",chExp); } //初始化语法栈 void InitGra() { gra[graSize]='#'; graSize++; gra[graSize]='E'; graSize++; printStep(); } //错误打印 void printError() { printf("n表达式不匹配!n"); } //主程序 void main() { printGrammar();//输出文法 GetExp();//获取输入表达式 printHead();//打印题头 InitGra();//初始化语法栈 E(); printf("Recursive Down Analyse App!n"); } /*(1)E->TG (2)G->+TG|-TG|ε (3)T->FS (4)S->*FS|/FS|ε (5)F->(E)|i */ int E() { popGraStack(); char graE[]="TG"; pushGraStack(graE); strcpy(prod,"E-->TG"); printStep(); T(); G(); return 1; } /*(1)E->TG (2)G->+TG|-TG|ε (3)T->FS (4)S->*FS|/FS|ε (5)F->(E)|i */ int T() { popGraStack(); char graT[]="FS"; pushGraStack(graT); strcpy(prod,"T-->FS"); printStep(); F(); S(); return 1; } /*(1)E->TG (2)G->+TG|-TG|ε (3)T->FS (4)S->*FS|/FS|ε (5)F->(E)|i */ int G() { if(chExp=='+'||chExp=='-') { popGraStack(); char graG[]={chExp,'T','G',''}; pushGraStack(graG); strcpy(prod,"G-->"); strcat(prod,graG); printStep(); popGraStack(); nextChar(); strcpy(prod,"匹配"); printStep(); T(); G(); return 1; } else { strcpy(prod,"G-->ε"); printStep(); popGraStack(); strcpy(prod,"匹配"); printStep(); return 1; } } /*(1)E->TG (2)G->+TG|-TG|ε (3)T->FS (4)S->*FS|/FS|ε (5)F->(E)|i */ int F() { if(chExp=='(') { popGraStack(); char graF[]="(E)"; pushGraStack(graF); strcpy(prod,"F-->(E)"); printStep(); popGraStack(); nextChar(); strcpy(prod,"匹配"); printStep(); E(); if(chExp==')') { popGraStack(); nextChar(); strcpy(prod,"匹配"); printStep(); return 1; } else { printError(); return 0; } } else if(chExp=='i') { strcpy(prod,"F-->i"); printStep(); //nextChar(); popGraStack(); nextChar(); strcpy(prod,"匹配"); printStep(); return 1; } else { printError(); return 0; } } /*(1)E->TG (2)G->+TG|-TG|ε (3)T->FS (4)S->*FS|/FS|ε (5)F->(E)|i */ int S() { if(chExp=='*'||chExp=='/') { popGraStack(); char graS[]={chExp,'F','S',''}; pushGraStack(graS); strcpy(prod,"S-->"); strcat(prod,graS); printStep(); popGraStack(); nextChar(); strcpy(prod,"匹配"); printStep(); F(); S(); return 1; } else { strcpy(prod,"S-->ε"); printStep(); popGraStack(); strcpy(prod,"匹配"); printStep(); return 1; } }

转载于:https://www.cnblogs.com/MichaelDongzr/archive/2011/05/21/2052547.html

最后

以上就是呆萌雪碧为你收集整理的(原创)自顶向下分析法(递归下降分析程序构造)的全部内容,希望文章能够帮你解决(原创)自顶向下分析法(递归下降分析程序构造)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部