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)型方法的判定,我们只需要向右查看一个字符就可以给出它的推导,故而上面的算法是正确的。
转载请标明出处,谢谢