概述
/*题目:自顶向下分析法(递归下降分析程序构造)
*说明:功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。
*作者:董正荣
*邮箱: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]='