社区
C++ Builder
帖子详情
过年人人没事,给个问题大家解, 表达式分析问题
comanche
2001-01-18 10:38:00
...全文
155
8
打赏
收藏
过年人人没事,给个问题大家解, 表达式分析问题
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
sharer
2001-01-21
打赏
举报
回复
还有很多错误要好好改一下,字符串相加还不支持,TMD赶快加把劲,ST!
xiaoyu
2001-01-21
打赏
举报
回复
会数据结构的,这个不难,不就是堆栈的问题改进,容易的
猛禽
2001-01-20
打赏
举报
回复
Comanche?!那个98年写的东东你还在改吗?不会吧.真是Herbert的好学生.^_^
不过我现在没票回不去了,5555555555555555,要等22日的飞机了.我可怜的Money啊.
回去找你麻烦.
comanche
2001-01-18
打赏
举报
回复
给个例子
TExprAnalyze ea;
double Answer = ea.Calculate( "8 * ( 8 + ( 8 - 8 ) ) / ( 8^( 8 / 8 % 8 ) )" )
应等于 8
祝大家年年发财了
comanche
2001-01-18
打赏
举报
回复
cpp 文件,reset没用(忘记删)
//---------------------------------------------------------------------------
#include <vcl.h>
#include <Math.h>
#pragma hdrstop
#include "ExprAnalyze.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
TExprAnalyze::TExprAnalyze( ):
pFFormula( 0 ),
pszMeta( 0 ),
FMetaStyle( msNone ),
Warnings( new TStringList( ) )
{
}
//---------------------------------------------------------------------------
TExprAnalyze::~TExprAnalyze( )
{
if ( pszMeta != 0 )
delete pszMeta;
}
//---------------------------------------------------------------------------
double __fastcall TExprAnalyze::Calculate( AnsiString AFormula )
{
FFormula = AFormula;
pszMeta = new char[FFormula.Length( )];
pFFormula = FFormula.c_str( );
double Value = 0.0;
GetMeta( );
while ( FMetaStyle != msNone && FMetaStyle != msError )
{
AddSub( Value );
if ( FMetaStyle == msNone || FMetaStyle == msError )
break;
GetMeta( );
}
delete pszMeta;
if ( FMetaStyle == msError )
throw EExprAnalyze( "error" );
return Value;
}
//---------------------------------------------------------------------------
void __fastcall TExprAnalyze::AddSub( double &Value )
{
double FValue = 0.0;
char Operator;
MulDiv( Value );
if ( FMetaStyle == msNone || FMetaStyle == msError )
return;
while ( FMetaStyle == msOperator &&
( pszMeta[0] == '+' || pszMeta[0] == '-' ) )
{
Operator = pszMeta[0];
GetMeta( );
if ( FMetaStyle == msNone || FMetaStyle == msError )
return;
MulDiv( FValue );
if ( Operator == '+' )
Value += FValue;
else
Value -= FValue;
}
}
//---------------------------------------------------------------------------
void __fastcall TExprAnalyze::MulDiv( double &Value )
{
double FValue = 0.0;
char Operator;
Factor( Value );
if ( FMetaStyle == msNone || FMetaStyle == msError )
return;
while ( FMetaStyle == msOperator &&
( pszMeta[0] == '*' || pszMeta[0] == '/' || pszMeta[0] == '%' ) )
{
Operator = pszMeta[0];
GetMeta( );
if ( FMetaStyle == msNone || FMetaStyle == msError )
return;
Factor( FValue );
if ( Operator == '*' )
Value *= FValue;
else if ( Operator == '/' )
{
if ( FValue == 0.0 )
{
FMetaStyle = msError;
return;
}
Value /= FValue;
}
else if ( Operator == '%' )
{
if ( ( Value - ( int )Value != 0.0 ) ||
( FValue - ( int )FValue ) != 0.0 )
{
FMetaStyle = msError;
return;
}
Value = ( int )Value % ( int )FValue;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TExprAnalyze::Factor( double &Value )
{
double FValue = 0.0;
char Operator;
LeadOperator( Value );
if ( FMetaStyle == msNone || FMetaStyle == msError )
return;
while ( FMetaStyle == msOperator &&
( pszMeta[0] == '^' || pszMeta[0] == '!' ) )
{
Operator = pszMeta[0];
if ( Operator == '!' )
{
if ( Value - ( int )Value != 0 )
{
FMetaStyle = msError;
return;
}
int Temp = ( int )Value;
for ( int i = 2; i < Temp; i ++ )
Value *= i;
GetMeta( );
if ( FMetaStyle == msNone || FMetaStyle == msError )
return;
}
else
{
GetMeta( );
if ( FMetaStyle == msNone || FMetaStyle == msError )
return;
LeadOperator( FValue );
Value = pow( Value, FValue );
}
}
}
//---------------------------------------------------------------------------
void __fastcall TExprAnalyze::LeadOperator( double &Value )
{
char Operator;
if ( FMetaStyle == msOperator &&
( pszMeta[0] == '+' || pszMeta[0] == '-' ) )
{
Operator = pszMeta[0];
GetMeta( );
Parenthesis( Value );
if ( Operator == '-' )
Value = -Value;
}
else
Parenthesis( Value );
}
//---------------------------------------------------------------------------
void __fastcall TExprAnalyze::Parenthesis( double &Value )
{
if ( FMetaStyle == msOperator )
{
if ( pszMeta[0] == '(' )
{
GetMeta( );
AddSub( Value );
if ( ! ( FMetaStyle == msOperator && pszMeta[0] == ')' ) )
FMetaStyle = msError;
else
GetMeta( );
}
else
FMetaStyle = msError;
}
else
GetNumeric( Value );
}
//---------------------------------------------------------------------------
void __fastcall TExprAnalyze::GetVariable( double &Value )
{
}
//---------------------------------------------------------------------------
void __fastcall TExprAnalyze::GetNumeric( double &Value )
{
if ( FMetaStyle == msVariable )
GetVariable( Value );
else
Value = StrToFloat( pszMeta );
GetMeta( );
}
//---------------------------------------------------------------------------
void __fastcall TExprAnalyze::GetMeta( )
{
char *pMeta = pszMeta;
while ( *pFFormula && *pFFormula == ' ' )
pFFormula ++;
if ( *pFFormula == 0 )
FMetaStyle = msNone;
else if ( strchr( "+-*/^!()%", *pFFormula ) )
{
FMetaStyle = msOperator;
*pMeta = *pFFormula, pMeta ++, pFFormula ++;
}
else if ( strchr( "0123456789.", *pFFormula ) )
{
FMetaStyle = msNumeric;
while ( *pFFormula && strchr( "0123456789.", *pFFormula ) )
*pMeta = *pFFormula, pMeta ++, pFFormula ++;
}
else
{
FMetaStyle = msVariable;
while ( *pFFormula && ( ! strchr( " +-*/^!()%", *pFFormula ) ) )
*pMeta = *pFFormula, pMeta ++, pFFormula ++;
}
*pMeta = 0;
}
//---------------------------------------------------------------------------
void __fastcall TExprAnalyze::Reset( )
{
FMetaStyle = msNone;
pFFormula = 0;
delete pszMeta;
Warnings->Clear( );
}
//---------------------------------------------------------------------------
Mickey_Chue
2001-01-18
打赏
举报
回复
题呢?
comanche
2001-01-18
打赏
举报
回复
我已写了个不完美的,支持
+
-
*
/
%
^ N次方
! 阶层
( ) 无限括号优先级
大家帮忙测试,还有什么建议提出来
comanche
2001-01-18
打赏
举报
回复
来头论文件
//---------------------------------------------------------------------------
#ifndef ExprAnalyzeH
#define ExprAnalyzeH
#ifndef __CHINESE_MESSAGE && __ENGLISH_MESSAGE
#define __CHINESE_MESSAGE
#endif
#ifdef __CHINESE_MESSAGE
#define UNKNOW_CHARACTER "在表达式[%d]位置上存在非法的字符'%s'"
#else
#define UNKONW_CHARACTER "unkonw character '%s' in the expression at position %d"
#endif
//---------------------------------------------------------------------------
#include <DString.h>
//---------------------------------------------------------------------------
class EExprAnalyze :public Exception
{
public:
EExprAnalyze( AnsiString Msg ):Exception( Msg ) { }
};
//---------------------------------------------------------------------------
typedef enum { msOperator, msNumeric, msVariable, msNone, msError } TMetaStyle;
//---------------------------------------------------------------------------
class TExprAnalyze
{
public:
TExprAnalyze( );
~TExprAnalyze( );
double __fastcall Calculate( AnsiString AFormula );
protected:
private:
void __fastcall AddSub( double &Value );
void __fastcall MulDiv( double &Value );
void __fastcall Factor( double &Value );
void __fastcall LeadOperator( double &Value );
void __fastcall Parenthesis( double &Value );
void __fastcall GetVariable( double &Value );
void __fastcall GetNumeric( double &Value );
void __fastcall GetMeta( );
void __fastcall Reset( );
AnsiString FFormula;
char *pFFormula;
char *pszMeta;
TMetaStyle FMetaStyle;
TStringList *Warnings;
};
//---------------------------------------------------------------------------
#endif
算法设计与
分析
: 3-14 正则
表达式
匹配
问题
3-14 正则
表达式
匹配
问题
问题
描述 许多操作系统采用正则
表达式
实现文件匹配功能。一种简单的正则
表达式
由英文字母、数字及通配符“ * ”和“?”组成。“?”代表任意一个字符。“ * ”则可以代表任意多个字符。 现要用正则
表达式
对部分文件进行操作。 试设计一个算法,找出一个正则
表达式
,使其能匹配的待操作文件最多,但不能匹配任何不进行操作的文件。所找出的正则
表达式
的长度还应是最短的。 数...
语法
分析
:算术
表达式
递归下降
分析
程序设计
1、实验目的: (1)掌握自上而下语法
分析
的要求与特点。 (2)掌握递归下降语法
分析
的基本原理和方法。 (3)掌握相应数据结构的设计方法。 2、实验内容: 编程实现给定算术
表达式
的递归下降
分析
器。 算术
表达式
文法如下: E-->E+T|T T-->T*F|F F-->(E)|i 3、设计说明: 首先改写文法为LL(1)文法;然后为每一个非终结符,构造相应
表达式
语法
分析
——预测
分析
法
表达式
语法
分析
——预测
分析
法 Time Limit: 1000MS Memory Limit: 65536KB Problem Description 预测
分析
法是自顶向下
分析
的一种方法,一个预测
分析
程序是由三个部分组成: (1) 预测
分析
程序 (2) 先进后出栈 (3) 预测
分析
表 现给出
表达式
文法: E→TG G→+TG | ε T→FS S→*FS |
算术
表达式
的语法
分析
及语义
分析
程序设计 —— LR
分析
法、输出三元式
通过设计、编制、调试一个算术
表达式
的语法及语义
分析
程序,加深对语法及语义
分析
原理的理
解
,并实现词法
分析
程序对单词序列的词法检查和
分析
。
C语言条件
表达式
的
分析
条件
表达式
的一般形式为:
表达式
1?
表达式
2:
表达式
3 条件运算符的执行顺序是,先求
解
表达式
1,若为真则求
解
表达式
2,此时
表达式
2的值作为整个条件
表达式
的值。若
表达式
1的值为假,则求
解
表达式
3,
表达式
3的值为整个条件
表达式
的值。 a = 10; b = (a == 1) ? 20: 30;//最前面的是赋值运算符 printf( "b 的值是 %d\n", b ); ...
C++ Builder
13,873
社区成员
102,696
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章