📄 4.cpp
字号:
//利用递归下降分析程序,解决下列满足LL(1)条件的文法
//消除递归前的文法 消除递归后的等价文法
// E→E+T E→TP
// E→T P→+TP|ε
// T→T*F T→FQ
// T→F Q→*FQ|ε
////////////////////////////////////////////////////////////////////////////////////////////////
//在老师文法基础上添加的文法
//在老师文法基础上添加的文法
// F→F#C
// F→C
// C→C@S
// C→S
// M→(E)|i
/*消除递归之后的文法:
F→CN
N→#CN|ε
C→MS
S→@WS|ε
M→(E)|i */
/////////////////////////////////////////////////////////////////////////////////////////////
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
class anal
{
public:
anal(char * ch);
void start();
private:
void f();
void x();
void c();
void s();
void e();
void p();
void t();
void q();
void m();
void adva();
int n;
char * str; //字符型指针
char sym; //字符型变量
};
anal::anal(char * ch) //ch为待分析的字符串首地址
{
str=ch;
sym=*str;
n=0;
}
void anal::start() //开始分析
{
e();
cout<<"分析成功,输入串可以由该文法推导!"<<endl;
}
void anal::adva() //指向输入串当前字符的指针后移
{
n++;
sym=*(str+n);
}
void anal::e() //E→TP
{
printf("%s\t%s\n", "E→TP", str+n);
t(); //T→FQ
p(); //P→+TP|ε
}
void anal::p() //P→+TP|ε
{
if (sym=='+')
{
printf("%s\t%s\n", "P→+TP", str+n);
adva();
t();
p();
}
}
void anal::t() //T→FQ
{
printf("%s\t%s\n", "T→FQ", str+n);
f();
q();
}
void anal::q() //Q→*FQ|ε
{
if (sym=='*')
{
printf("%s\t%s\n", "Q→*FQ", str+n);
adva();
f();
q();
}
}
void anal::f() //F→CN
{
printf("%s\t%s\n", "F→CN", str+n);
c();
x();
}
void anal::x() //N→#CN|ε
{
if (sym=='#')
{
printf("%s\t%s\n", "N→#CN|ε", str+n);
adva();
c();
x();
}
}
void anal::c() //C→MS
{
printf("%s\t%s\n", "C→MS", str+n);
m();
s();
}
void anal::s() // S→@WS|ε
{
if (sym=='@')
{
printf("%s\t%s\n", "S→@WS|ε", str+n);
adva();
f();
q();
}
}
void anal::m() //M→(E)|i
{
if ((sym<='z'&&sym>='a')||(sym<='Z'&&sym>='A'))
{
printf("%s\t%s\n", "M→i", str+n);
adva();
}
else
{
if (sym=='(')
{
printf("%s\t%s\n", "M→(E)", str+n);
adva();
e();
if (sym==')')
{
printf("%s\t%s\n", " ", str+n);
adva();
}
else
{
cout<<"输入串不能由该文法推导!"<<endl;
exit(1);
}
}
else
{
cout<<"输入串不能由该文法推导!"<<endl;
exit(1);
}
}
}
void main()
{
while(true){
char a[80];
cout<<"以下是待分析的字符串"<<endl<<"请输入:"<<endl;
cout<<"注意:在这里的终结符是任意字符, 运算符包括+,*,'#',和'@':"<<endl;
cin>>a;
anal analyse(a);
analyse.start();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -