简单的递归下降分析
2008-04-24 21:16
246 查看
递归下降分析
程序输入输出示例:
(1) E→TG
(2) G→+TG|-TG|ε
(3) T→FS
(4) S →*FS|/FS|ε
(5) F→(E)|i
输出的格式如下:
(1)输出一个以#结束的符号串(包括+ - * / i #):
(2)输出结果:i+i*i#为合法符号串
备注:输入一符号串如i+i*#,要求输出为"非法的符号串"
/**/////////////////////////////////////
// //
// //
// E→TG //
// G→+TG|-TG|ε //
// T→FS //
// S→*FS|/FS|ε //
// F→(E)|i //
// //
/**/////////////////////////////////////
#include <iostream>
using namespace std;
char A[100]; //用于存放符号串,不能多于100个字符
int i=0; //记录当前要判断的字符位置
void E(); //E()
void G(); //G()
void T(); //为每个非终节符构造一个子程序
void S(); //S()
void F(); //F()
void match(int &k); //此程序只是此执行加1操作,为了取到后一个终结符
void main( )
...{
cout<<"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
cout<<"+ 递归下降分析 +"<<endl;
cout<<"+ 作者:杨浩 +"<<endl;
cout<<"+ 日期:2008年4月 +"<<endl;
cout<<"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
cout<<"请输入一个有待判断的符号串(以#结尾): ";
cout<<"输入的符号串: ";
cin>>A;
cout<<"输出的符号串: "<<A<<endl<<endl;
cout<<"匹配的结果: ";
E();
if(A[i]!='#')
...{
cout<<"此输入串不合法"<<endl;
cout<<"不合法的原因: 不匹配开始于在第"<<i+1<<"个终结符处,没有发现与"<<A[i]<<"相匹配的文法"<<endl;
}
}
void E() //E->TG
...{
T();
G();
}
void G() //G->+TG|-TG|ε
...{
// 这里分了三个情况,“+”“-”以及“ε”三种情况。
// 如果是前两种,则很好,本步骤匹配 。如果没有匹配,则默认取到“ε”
if(A[i]=='+') //匹配“+”
...{
match(i);
T();
G();
}
else if(A[i]=='-') //匹配“-”
...{
match(i);
T();
G();
}
else return; //没有与之匹配,则默认为空
}
void T() //T->FS
...{
F();
S();
}
void S() //S->*FS|/FS|ε
...{
// 这里分了三个情况,“*”“/”以及“ε”三种情况。
// 如果是前两种,则很好,本步骤匹配 。如果没有匹配,则默认取到“ε”
// 情况雷同G()
if(A[i]=='*')
...{
match(i);
F();
S();
}
else if(A[i]=='/')
...{
match(i);
F();
S();
}
else return;
}
void F() //F->(E)|i
...{
if(A[i]=='(')
...{
match(i);
if(A[i]=='#') //如果是“#”则说明已经搜索匹配完毕了,肯定合法
...{
cout<<"此输入串不合法"<<endl;
cout<<"不合法的原因: 没有与'('相配对的')'"<<endl;
exit(0);
}
E();
if(A[i]==')')
...{
match(i);
if(A[i]=='#') //如果是“#”则说明已经搜索匹配完毕了,肯定合法
...{
if(A[i-2]=='i')
...{
cout<<" 此输入串合法 ";
exit(0);
}
else
...{
cout<<"此输入串不合法"<<endl;
cout<<"不合法的原因: 前面没有与'('相配对的'i'"<<endl;
exit(0);
}
}
}
}
else if(A[i]=='i')
...{
match(i); //匹配后继续判断有没有到结束
if(A[i]=='#') //如果是“#”则说明已经搜索匹配完毕了,肯定合法
...{
if(A[i-2]=='(')
...{ cout<<"此输入串不合法"<<endl;
cout<<"不合法的原因: 没有与'('相配对的')'"<<endl;
exit(0);
}
else
...{
cout<<" 此输入串合法 ";
exit(0);
}
}
return ;
}
else if (A[i]=='#')
...{
cout<<"此输入串不合法"<<endl;
cout<<"不合法的原因: 不匹配开始于在第"<<i<<"个终结符处,没有发现与"<<A[i-1]<<"相匹配的文法"<<endl;
exit(0);
}
else
...{
cout<<"此输入串不合法"<<endl;
cout<<"不合法的原因: 不匹配开始于在第"<<i+1<<"个终结符处,没有发现与"<<A[i]<<"相匹配的文法"<<endl;
exit(0);
}
}
void match(int &k) //如果匹配的话,取下一个终结符
...{
k++;
}
输出正确的还行,错误方面的分析有些被动,因为情况太多了,我只把我想到的各种情况都写上了,至于其他的,还请各位大哥帮小弟侦查一下。嘿嘿,谢谢啦!~~~
程序输入输出示例:
(1) E→TG
(2) G→+TG|-TG|ε
(3) T→FS
(4) S →*FS|/FS|ε
(5) F→(E)|i
输出的格式如下:
(1)输出一个以#结束的符号串(包括+ - * / i #):
(2)输出结果:i+i*i#为合法符号串
备注:输入一符号串如i+i*#,要求输出为"非法的符号串"
/**/////////////////////////////////////
// //
// //
// E→TG //
// G→+TG|-TG|ε //
// T→FS //
// S→*FS|/FS|ε //
// F→(E)|i //
// //
/**/////////////////////////////////////
#include <iostream>
using namespace std;
char A[100]; //用于存放符号串,不能多于100个字符
int i=0; //记录当前要判断的字符位置
void E(); //E()
void G(); //G()
void T(); //为每个非终节符构造一个子程序
void S(); //S()
void F(); //F()
void match(int &k); //此程序只是此执行加1操作,为了取到后一个终结符
void main( )
...{
cout<<"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
cout<<"+ 递归下降分析 +"<<endl;
cout<<"+ 作者:杨浩 +"<<endl;
cout<<"+ 日期:2008年4月 +"<<endl;
cout<<"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
cout<<"请输入一个有待判断的符号串(以#结尾): ";
cout<<"输入的符号串: ";
cin>>A;
cout<<"输出的符号串: "<<A<<endl<<endl;
cout<<"匹配的结果: ";
E();
if(A[i]!='#')
...{
cout<<"此输入串不合法"<<endl;
cout<<"不合法的原因: 不匹配开始于在第"<<i+1<<"个终结符处,没有发现与"<<A[i]<<"相匹配的文法"<<endl;
}
}
void E() //E->TG
...{
T();
G();
}
void G() //G->+TG|-TG|ε
...{
// 这里分了三个情况,“+”“-”以及“ε”三种情况。
// 如果是前两种,则很好,本步骤匹配 。如果没有匹配,则默认取到“ε”
if(A[i]=='+') //匹配“+”
...{
match(i);
T();
G();
}
else if(A[i]=='-') //匹配“-”
...{
match(i);
T();
G();
}
else return; //没有与之匹配,则默认为空
}
void T() //T->FS
...{
F();
S();
}
void S() //S->*FS|/FS|ε
...{
// 这里分了三个情况,“*”“/”以及“ε”三种情况。
// 如果是前两种,则很好,本步骤匹配 。如果没有匹配,则默认取到“ε”
// 情况雷同G()
if(A[i]=='*')
...{
match(i);
F();
S();
}
else if(A[i]=='/')
...{
match(i);
F();
S();
}
else return;
}
void F() //F->(E)|i
...{
if(A[i]=='(')
...{
match(i);
if(A[i]=='#') //如果是“#”则说明已经搜索匹配完毕了,肯定合法
...{
cout<<"此输入串不合法"<<endl;
cout<<"不合法的原因: 没有与'('相配对的')'"<<endl;
exit(0);
}
E();
if(A[i]==')')
...{
match(i);
if(A[i]=='#') //如果是“#”则说明已经搜索匹配完毕了,肯定合法
...{
if(A[i-2]=='i')
...{
cout<<" 此输入串合法 ";
exit(0);
}
else
...{
cout<<"此输入串不合法"<<endl;
cout<<"不合法的原因: 前面没有与'('相配对的'i'"<<endl;
exit(0);
}
}
}
}
else if(A[i]=='i')
...{
match(i); //匹配后继续判断有没有到结束
if(A[i]=='#') //如果是“#”则说明已经搜索匹配完毕了,肯定合法
...{
if(A[i-2]=='(')
...{ cout<<"此输入串不合法"<<endl;
cout<<"不合法的原因: 没有与'('相配对的')'"<<endl;
exit(0);
}
else
...{
cout<<" 此输入串合法 ";
exit(0);
}
}
return ;
}
else if (A[i]=='#')
...{
cout<<"此输入串不合法"<<endl;
cout<<"不合法的原因: 不匹配开始于在第"<<i<<"个终结符处,没有发现与"<<A[i-1]<<"相匹配的文法"<<endl;
exit(0);
}
else
...{
cout<<"此输入串不合法"<<endl;
cout<<"不合法的原因: 不匹配开始于在第"<<i+1<<"个终结符处,没有发现与"<<A[i]<<"相匹配的文法"<<endl;
exit(0);
}
}
void match(int &k) //如果匹配的话,取下一个终结符
...{
k++;
}
输出正确的还行,错误方面的分析有些被动,因为情况太多了,我只把我想到的各种情况都写上了,至于其他的,还请各位大哥帮小弟侦查一下。嘿嘿,谢谢啦!~~~
相关文章推荐
- 递归下降语法分析程序设计
- 1231-递归下降语法分析
- 1230递归下降语法分析
- 递归下降语法分析程序
- 递归下降语法分析程序设计
- 递归下降语法分析程序
- 递归下降的语法分析
- 利用递归下降分析法求解简单正整数四则运算
- +递归下降语法分析程序设计
- 递归下降语法分析实验
- 【现代编译器】语法分析——正则表达式,上下文无关文法,递归下降分析,分析树
- 递归下降分析子程序
- 自顶向下的语法分析–递归下降分析–表达式求值
- 编译原理 递归下降分析 的应用
- 12.16_实验四 递归下降语法分析程序设计
- 1231递归下降语法分析程序设计
- 1217递归下降语法分析程序设计
- 1217 实验四 递归下降语法分析程序设计
- 1217 实验四 递归下降语法分析程序设计
- 1217 递归下降语法分析程序设计