递归下降分析
程序输入输出示例:
(
1
) E→TG
( 2 ) G→ + TG |- TG | ε
( 3 ) T→FS
( 4 ) S → * FS |/ FS | ε
( 5 ) F→(E) | i
( 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++;
}
// //
// //
// 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++;
}
输出正确的还行,错误方面的分析有些被动,因为情况太多了,我只把我想到的各种情况都写上了,至于其他的,还请各位大哥帮小弟侦查一下。嘿嘿,谢谢啦!~~~