1、设计的计算器实现加(+)减(-)乘(*)除(/)运算。
2、根据LL(1)文法实现递归下降的语法分析程序。
3、判断用户输入表达式的语法正确性,如果表达式语法正确输出“表达式正确”,否则输出“表达式错误”。
判断实例:
1、+4-9
2、3+3*5+(3+7
3、 58+6*15/4
4、3+(9+6.5)*2
5、(3-9)*2+5
6、a+3
7、9+?+8
文法:
E->T|E+T|E-T
T->F|T*F|T/F
F->i|(E)
#include<stdio.h>
#include <ctype.h>
#include <stdlib.h>
/*
文法:
E->T|E+T|E-T
T->F|T*F|T/F
F->i|(E)
//i是整数和小数
*/
void E(char a[]);
void T(char a[]);
void F(char a[]);
int flag = 0;
char i=0;
int main(){
char a[100];
printf("请输入一个表达式:");
scanf("%s",&a);
E(a);
if(flag==0){
printf("表达式正确\n");
}else{
printf("表达式错误\n");
}
return 0;
}
void E(char a[]){
while(a[i] !='\0'){//保证遍历每一个数
T(a);
while(a[i] == '+'){
i++;
T(a);
}
while(a[i] == '-'){
i++;
T(a);
}
if(a[i] == ')'){//防止有(后出不去循环
break;
}
}
}
void T(char a[]){
F(a);
if(a[i] == '*'){
i++;
F(a);
}
if(a[i] == '/'){
i++;
F(a);
}
}
void F(char a[]){
if(a[i] == '('){
i++;
E(a);
if(a[i] == ')'){
i++;
}else{
flag = 1;
i++;
}
}else if(isdigit(a[i])){
i++;
if(a[i]=='.'){//flaot型
i++;
while(isdigit(a[i])){
i++;
}
}
}else{
flag = 1;
i++;
}
}