文法:
E->TQ
Q->+TQ|e
T->FR
R->*FR|e
F->a|(E)
LL(1)递归下降语法分析器
/*
E->TQ
Q->+TQ|e
T->FR
R->*FR|e
F->a|(E)
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
using namespace std;
const int MAX_N=101000;
char s[MAX_N];
vector<string>res;
int tot=0;
int flag=1;
void E();
void Q();
void T();
void R();
void F();
int main(void){
int i;
scanf("%s",s);
for(i=0;i<strlen(s);i++){
if(s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z'||s[i]>='0'&&s[i]<='9')
s[i]='a';
}
E();
if(s[tot]!='#'){
flag=0;
printf("NO\n");
}
if(flag){
printf("YES\n");
for(i=0;i<res.size();i++)
cout<<res[i]<<"\n";
}
return 0;
}
void E(){
res.push_back("E->TQ");
T();
Q();
}
void Q(){
if(s[tot]=='+'){
//printf("");
res.push_back("Q->+TQ");
tot++;
T();Q();
}
else{
res.push_back("Q->e");
}
}
void T(){
res.push_back("T->FR");
F();R();
}
void R(){
if(s[tot]=='*'){
res.push_back("R->*FR");
tot++;
F();R();
}
else{
res.push_back("R->e");
}
}
void F(){
if(s[tot]=='a'){
res.push_back("F->a");
tot++;
}
else if(s[tot]=='('){
res.push_back("F->(E)");
tot++;
E();
if(s[tot]==')')
tot++;
else{
printf("NO\n");
flag=0;
return ;
}
}
else{
printf("NO\n");
flag=0;
return ;
}
}
LL(1)预测分析器
把递归换成栈模拟即可
/*
E->TQ
Q->+TQ|e
T->FR
R->*FR|e
F->a|(E)
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
using namespace std;
const int MAX_N=101000;
char s[MAX_N];
int tot=0;
int flag=1;
int st[MAX_N],num=0;
int main(void){
int i;
scanf("%s",s);
for(i=0;i<strlen(s);i++){
if(s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z'||s[i]>='0'&&s[i]<='9')
s[i]='a';
}
int num=0;
st[++tot]=1;
while(tot){
tot--;
if(st[tot+1]==1){
printf("E->TE'\n");
st[++tot]=2,st[++tot]=3;
}
else if(st[tot+1]==2){
if(s[num]=='+'){
num++;
printf("E'->+TE'\n");
st[++tot]=4,st[++tot]=3;
}
else{
printf("Q->ε\n");
}
}
else if(st[tot+1]==3){
printf("T->FT'\n");
st[++tot]=4,st[++tot]=5;
}
else if(st[tot+1]==4){
if(s[num]=='*'){
printf("T'->*FT'\n");
num++;
st[++tot]=4,st[++tot]=5;
}
else{
printf("T'->ε\n");
}
}
else if(st[tot+1]==5){
if(s[num]=='a'){
printf("F->a\n");
num++;
}
else if(s[num]=='('){
printf("F->(E)\n");
num++;
st[++tot]=1;
if(s[num]==')')
num++;
else{
printf("ERROR\nNO\n");
flag=0;
break ;
}
}
else{
printf("ERROR\nNO\n");
flag=0;
break ;
}
}
}
if(s[num]!='#'){
flag=0;
printf("ERROR\nNO\n");
}
if(flag){
printf("YES\n");
}
return 0;
}