AcWing 3302. 表达式求值-编译原理 LL 递归
原题链接
简单
作者:
东边的西瓜皮
,
2021-05-27 13:39:07
,
所有人可见
,
阅读 213
E为表达式,T为只含乘除的表达式
E -> T + E | T
T -> F * T | F
F -> (E) | digits
E -> _ET
_E -> _ET+|null
T -> _TF
_T -> _TF*|null
F -> (E) | num
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
char arr[100004];
int pos;
int E();
int T();
int _E();
int _T();
int F();
int E(){
int Tval=T();
if(arr[pos]=='+')return Tval+_E();
if(arr[pos]=='-')return _E()-Tval;
return Tval;
}
int _E(){
if(arr[pos]=='+'||arr[pos]=='-'){
pos--;
int Tval=T();
if(arr[pos]=='+'){return Tval+_E();}
if(arr[pos]=='-'){return _E()-Tval;}
return Tval;
}else{
return 0;
}
}
int T(){
int Fval=F();
if(arr[pos]=='*')return Fval*_T();
if(arr[pos]=='/')return _T()/Fval;
return Fval;
}
int _T(){
if(arr[pos]=='*'||arr[pos]=='/'){
pos--;
int Fval=F();
if(arr[pos]=='*'){return Fval*_T();}
if(arr[pos]=='/'){return _T()/Fval;}
return Fval;
}else{
return 0;
}
}
int F(){
if(arr[pos]==')'){
pos--;
int val=E();
pos--;
return val;
}else{
while(isdigit(arr[pos]))pos--;
int val=atoi(arr+pos+1);
return val;
}
}
int main(){
cin>>(arr+1);
pos=strlen(arr+1);
cout<<E();
}