中缀表达式求值与LL(1)方法

39 篇文章 0 订阅
35 篇文章 0 订阅
本文介绍了使用LL(1)方法来评估1位正整数的算术表达式,例如(3+4)*((4-5)/2)。通过给出的文法E->TG, G->+TG | -TG|e, T->FS, S->*FS | /FS | e, F->(E) | number,可以实现算法。由于该算法遵循LL(1)原则,它能正确解析表达式。" 128354560,9979768,Android全面屏状态栏适配指南,"['Android开发', '状态栏', 'Fragment', 'Kotlin', 'Java']
摘要由CSDN通过智能技术生成

EMAIL:1025679612@qq.com

Blog: http://my.csdn.net/wind_2008_06_29

 

显然如下的方法生成的语言是算术表达式

E->TG

G->+TG | -TG|e

T->FS

S->*FS | /FS | e

F->(E) | number

注:e表示空

所以我们可以根据这个式子写出相应的算法来对一个表达式求值。其算法如下:

输入:输入的是1位正整数的算术运算,如(3+4)*((4-5)/2),注意,这里为了简单,所有的数据都是一位的正整数,并且不能有阶乘和幂运算。



#include <iostream>
using namespace std;

char expr[10000];
int start;
double E();
double T();
double G();
double S();
double F();

int main(){
	cin>>expr;
	cout<<E()<<endl;
}

double E(){
	return T()+G();
}

double T(){
	return F()*S();
}

double G(){
	if(expr[start] == '-'){
		++start;
		return -T()+G();
	}else if(expr[start] == '+'){
		++start;
		return T()+G();
	}else{
		return 0;
	}
}

double S(){
	if(expr[start] == '*'){
		++start;
		return F()*S();
	}else if(expr[start] == '/'){
		++start;
		return 1.0/F()*S();
	}else{
		return 1;
	}
}

double F(){
	double result;
	if(expr[start] == '('){
		++start;
		result = E();
		++start;
	}else{
		result= expr[start++]-'0';
	}
	return result;
}


 

上面的程序正确的原因是因为他是LL(1)型方法,根据LL(1)型方法的判定,我们只需要向右查看一个字符就可以给出它的推导,故而上面的算法是正确的。


转载请标明出处,谢谢


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值