LL(1)递归下降语法分析器 和 LL(1)预测分析器

文法:

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;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值