表达式求值----C语言 递归渐降语法分析

本文介绍了一个使用递归下降语法分析器实现的算术表达式解析器,该解析器能够处理包括加减乘除及括号在内的基本算术运算,通过逐步分解表达式为Term和Factor进行计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:  给定一个基本的算术表达式,请编程计算表达式的值。 

举例:  1*2 + 3*4

思路:  Expression  =  "Term   +  Term"         =======>  evalTerm( "1*2" )         +       evalTerm( "3*4" ) ;

         Term            =    "Factor  *  Facotr"     =======>  evalFactor( "1" )         *        evalFactor( "2" ); ..............

          括号  (  ......   ),看成  ( "......")             =======>  evalExpression( "......" );

注意:   evalExpression  调用  evalTerm  ,evalTerm 调用  evalFactor  ,在 evalFactor 中遇到括号  再调用 evalExpression 

           Facotr 以非数字字符(包含小数点) 返回

           Term   以    * 、/           运算字符返回

           Expression    以   +、-  运算字符返回

​
/**
	递归渐降语法分析器
	recursive-descent parser
*/

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

int Invalid = 0;
int pos = 0;

double evalExpression( char *str );
double evalTerm( char *str );
double evalFactor( char *str );
void replaceBlank( char *str );

int main()
{
	char str[] = "-1 + -4 / (2+3) ";
	replaceBlank( str );
	printf( "%s = ", str );
	double result = evalExpression( str );
	if( Invalid )
		printf( "Invalid\n" );
	else
		printf( "%g\n", result );
	return 0;
}

double evalExpression( char *str )
{
	double result = evalTerm( str );
	if( Invalid )
		return 0;
	while( str[pos] != '\0' ) {
		char op = str[pos];
		if( op != '+' && op != '-' ) {
			return result;
		}
		++pos;

		double term = evalTerm( str );
		if( Invalid )
			return 0;
		if( op == '+' )
			result += term;
		else
			result -= term;
	}
	return result;
}

double evalTerm( char *str )
{
	double result = evalFactor( str );
	if( Invalid )
		return 0;
	while( str[pos] != '\0' ) {
		char op = str[pos];
		if( op != '*' && op != '/' )
			return result;
		++pos;

		double term = evalFactor( str );
		if( Invalid || term == 0.0 )
			return 0;
		if( op == '*' )
			result *= term;
		else
			result /= term;
	}
	return result;
}

double evalFactor( char *str )
{
	double result;
	int negative = 0;
	char buf[20] = { 0 };
	int i = 0;

	if( str[pos] == '-' ) {
		negative = 1;
		++pos;
	}

	if( str[pos] == '(' ) {
		++pos;
		result = evalExpression( str );
		if( str[pos] != ')' ) {
			printf( "\n无右括号" );
			Invalid = 1;
			return 0;
		}
		++pos;
	}

	while( isdigit( str[pos] ) || str[pos] == '.' ) {
		buf[i] += str[pos];
		++pos;
		++i;
	}

	sscanf( buf, "%lf", &result );

	if( negative )
		result *= -1;
	return result;
}

// 去除表达式中的空格
void replaceBlank( char *exp )
{
	int i = 0;
	while( exp[i] != '\0' ) {
		if( exp[i] == ' ' )
			strcpy( exp + i, exp + i + 1 );
		else
			i++;
	}
}

​

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值