编译原理3-构建递归下降的语法分析器

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++;
	}
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值