mathparser.h

来自「自定义的报表」· C头文件 代码 · 共 84 行

H
84
字号
//---------------------------------------------------------------------------

#ifndef MathParserH
#define MathParserH
//---------------------------------------------------------------------------
#define  ParserStackSize        100
#define  MaxFuncNameLen         5
#define  ExpLimit               11356
#define  SQRLIMIT               1E246
#define  MaxVarName             30
#define  MaxExpLen              4
#define  TotalErrors            7
#define  ErrParserStack         1
#define  ErrBadRange            2
#define  ErrExpression          3
#define  ErrOperator            4
#define  ErrOpenParen           5
#define  ErrOpCloseParen        6
#define  ErrInvalidNum          7

//type  ErrorRange = 0..TotalErrors;

typedef enum 
{
	PLUS, MINUS, TIMES, DIVIDE, EXPO, OPAREN, CPAREN, NUM,
	FUNC, EOL, BAD, ERR, MODU
}TokenTypes;

typedef WORD POSITION;
typedef struct
{
	  BYTE State;
	  Extended Value;
	  AnsiString FuncName;
}TokenRec;

typedef struct{
	Extended Value;	
	char VarName[MaxVarName];
}VARSTRU;

class  TMathParser
{
public:
        TMathParser(AnsiString s);
        ~TMathParser();
        void AddVar(Extended Value, AnsiString  VarName);
        BOOL __fastcall EditVar(AnsiString VarName, Extended Value);

protected:
        AnsiString  FInput;
        TokenRec  CurrToken;
        BOOL MathError;
        TokenRec Stack[ParserStackSize];
        int StackTop;// : 0..ParserStackSize;
        int TokenError;// : ErrorRange;
        WORD TokenLen;// : Word;
        TokenTypes TokenType;
        TList * m_VarList;

        WORD GotoState(WORD Production);
        BOOL IsFunc(AnsiString S);
        BOOL IsVar(Extended &Value);

        TokenTypes NextToken();
        void Push(TokenRec Token);
        void Pop(TokenRec &Token);
        void Reduce(WORD Reduction);
        void Shift(WORD State);
        int Round(double value);

        BOOL GetVar(AnsiString VarName, Extended &Value);
public:
        WORD Position;
        BOOL ParseError;
        Extended ParseValue;
        void  Parse();
private:
        BOOL __fastcall CharIn(char ch, char StartCh, char EndCh);
        BOOL __fastcall CharIn(char ch, AnsiString Str);
};

#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?