#include<bits/stdc++.h>
using namespace std;
string s;
double exp();
double exp1();
double addop();
double term();
double term1();
double factor();
void mulop();
void match(char ch);
int idx=0;
void match(char ch){
if(idx<s.size()&&s[idx]==ch) idx++;
else{
printf("表达式错误!\n");
exit(0);
}
}
double exp(){
double sum=0;
if(idx<s.size()&&(s[idx]=='('||isdigit(s[idx]))){
sum=term();
sum+=exp1();
}
else {
printf("表达式错误!\n");
exit(0);
}
return sum;
}
double exp1(){
double sum=0;
if(idx<s.size()){
if(s[idx]=='+'||s[idx]=='-'){
sum+=addop()*term()+exp1();
}
}
return sum;
}
double term(){
double sum=0;
if(idx<s.size()&&(s[idx]=='('||isdigit(s[idx]))){
sum=factor();
sum*=term1();
}
else{
printf("表达式错误!\n");
exit(0);
}
return sum;
}
double term1(){
double sum=1.0;
if(idx<s.size()){
if(s[idx]=='*'){
mulop();
sum=factor();
sum*=term1();
}
else if(s[idx]=='/'){
mulop();
sum=1.0/factor();
sum*=term1();
}
}
return sum;
}
void mulop(){
if(idx<s.size()&&s[idx]=='*'){
match('*');
}
else if(idx<s.size()&&s[idx]=='/'){
match('/');
}
else{
printf("表达式错误!\n");
exit(0);
}
}
double factor(){
double sum=0;
if(idx<s.size()&&s[idx]=='('){
match('(');
sum=exp();
match(')');
}
else if(idx<s.size()&&isdigit(s[idx])){
while(idx<s.size()&&isdigit(s[idx])){
sum=sum*10+s[idx++]-'0';
}
}
else{
printf("表达式错误!\n");
exit(0);
}
return sum;
}
double addop(){
if(idx<s.size()&&s[idx]=='+'){
match('+');
return 1.0;
}
else if(idx<s.size()&&s[idx]=='-'){
match('-');
return -1.0;
}
else{
printf("表达式错误!\n");
exit(0);
}
}
int main()
{
printf("请输入:");
cin>>s;
double sum=exp();
printf("检查完毕,表达式正确,结果为:");
printf("%.2lf",sum);
return 0;
}
编译原理实验二
于 2022-04-28 17:13:37 首次发布