(原创)自顶向下分析法(递归下降分析程序构造)

/*题目:自顶向下分析法(递归下降分析程序构造)
 *说明:功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。
*作者:董正荣 *邮箱: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("\t\t\t 递归下降分析程序构造\n\t\t(作者:董正荣,邮箱:chinadongzr@163.com)\n"); printf("-----------------------------------------------------------\n"); printf("\t\t\t (1)E->TG\n"); printf("\t\t\t (2)G->+TG|-TG|ε\n"); printf("\t\t\t (3)T->FS\n"); printf("\t\t\t (4)S->*FS|/FS|ε\n"); printf("\t\t\t (5)F->(E)|i\n"); printf("-----------------------------------------------------------\n"); } void GetExp() { printf("请输入表达式:(以#结束)\t"); gets(exp);//获得输入表达式 expSize=strlen(exp); chExp=exp[0]; printf("----------------------------------------------------------\n"); //puts(exp);//显示 } void printHead() { printf("步骤:\t 语法栈:\t\t输入串:\t产生式:\n"); } void printStep() { printf("%d\t%-20s %10s\t \t%-15s\n",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]='\0'; graSize--; return ch; } //表达式出栈,匹配字符ch void nextChar() { for(int i=0;i<expSize-1;i++) { exp[i]=exp[i+1]; } exp[expSize-1]='\0'; expSize--; chExp=exp[0]; printf("当前chExp=:%c\n",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','\0'}; 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','\0'}; 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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值