📄 a3.cpp
字号:
//利用递归下降分析程序,解决下列满足LL(1)条件的文法
//消除递归前的文法 消除递归后的等价文法
// E→E+T E→TP
// E→T P→+TP|ε
// T→T*F T→FQ
// T→F Q→*FQ|ε
// F→(E)|i F→(E)|i
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
class anal
{
public:
anal(char * ch);
void start();
private:
void e();
void p();
void t();
void q();
void f();
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();
p();
}
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→(E)|i
{
if (sym=='i')
{
printf("%s\t%s\n", "F→i", str+n);
adva();
}
else
{
if (sym=='(')
{
printf("%s\t%s\n", "F→(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()
{
char a[80];
cout<<"请输入待分析的字符串:"<<endl;
cin>>a;
anal analyse(a);
analyse.start ();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -