⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 expr.pas

📁 公式解析源码
💻 PAS
📖 第 1 页 / 共 4 页
字号:
{如果你修改了,请别忘记了给我一份:ssqsoft@163.com}
unit Expr;

interface

uses
  LexLib,
  YaccLib, Math, Dialogs;

(* Yacc parser template (TP Yacc V3.0), V1.2 6-17-91 AG *)
(* 24.3.98: repacked into an class to make code thread-safe *)

(* global definitions: *)

//在TYACC中定义标记变量TAG=0-SQL, 1-ACCESS
//定义函数类型TGetFuncValue:得到函数值
Type   
  TGetFuncValue = function (const FuncName, FuncParams: string): Double of object;
const _NAME = 257;
const _INTNUM = 258;
const _APPROXNUM = 259;
const _OR = 260;
const _AND = 261;
const _NOT = 262;
const _EQ = 263;
const _GREAT = 264;
const _GREATEQ = 265;
const _LESS = 266;
const _LESSEQ = 267;
const _NOTEQ = 268;
const UMINUS = 269;
const _ILLEGAL = 270;
const _IIF = 271;
const _ARCCOS = 272;
const _ARCCOTAN = 273;
const _ARCSIN = 274;
const _ARCTAN = 275;
const _COS = 276;
const _COTAN = 277;
const _ABS = 278;
const _ROUND = 279;
const _TRUNC = 280;
const _SIN = 281;
const _TAN = 282;
const _PI = 283;
const _SQR = 284;
const _SQRT = 285;

type YYSType = record case Integer of
                 1 : ( yyDouble : Double );
                 2 : ( yyShortString : ShortString );
                 3 : ( yyString : ShortString );
                 4 : ( yyboolean : boolean );
               end(*YYSType*);

type
  TLex = class
    llib: TLexLib;
    constructor Create;
    destructor Destroy; override;
    function yylex(var yylval: YYSType): Integer;
  end;

  TYacc = class
    ylib: TYaccLib;
    ylex: TLex;
    yylval: YYSType;
    GetFuncValue: TGetFuncValue;
    constructor Create;
    destructor Destroy; override;
    function yyparse: Integer;
  end;

implementation

uses
  SysUtils;

constructor TYacc.Create;
begin
  inherited Create;
  ylib := TYaccLib.Create;
end; { TYacc.Create }

destructor TYacc.Destroy;
begin
  ylib.Destroy;
  inherited Destroy;
end; { TYacc.Destroy }

function TYacc.yyparse : Integer;

var yystate, yysp, yyn : Integer;
    yys : array [1..yymaxdepth] of Integer;
    yyv : array [1..yymaxdepth] of YYSType;
    yyval : YYSType;

procedure yyaction ( yyruleno : Integer );
  (* local definitions: *)
begin
  (* actions: *)
  case yyruleno of
   1 : begin
         ylex.llib.yyoutput := FloatToStr(yyv[yysp-1].yyDouble);
       end;
   2 : begin
         yyval.yyDouble := yyv[yysp-2].yyDouble + yyv[yysp-0].yyDouble;
       end;
   3 : begin
         yyval.yyDouble := yyv[yysp-2].yyDouble - yyv[yysp-0].yyDouble;
       end;
   4 : begin
         yyval.yyDouble := yyv[yysp-2].yyDouble * yyv[yysp-0].yyDouble;
       end;
   5 : begin
         yyval.yyDouble := yyv[yysp-2].yyDouble / yyv[yysp-0].yyDouble;
       end;
   6 : begin
         yyval.yyDouble := yyv[yysp-1].yyDouble;
       end;
   7 : begin
         yyval.yyDouble := -yyv[yysp-0].yyDouble;
       end;
   8 : begin
         yyval.yyDouble := abs(yyv[yysp-1].yyDouble);
       end;
   9 : begin
         yyval.yyDouble := round(yyv[yysp-1].yyDouble);
       end;
  10 : begin
         yyval.yyDouble := trunc(yyv[yysp-1].yyDouble);
       end;
  11 : begin
         yyval.yyDouble := sin(yyv[yysp-1].yyDouble);
       end;
  12 : begin
         yyval.yyDouble := cos(yyv[yysp-1].yyDouble);
       end;
  13 : begin
         yyval.yyDouble := tan(yyv[yysp-1].yyDouble);
       end;
  14 : begin
         yyval.yyDouble := cotan(yyv[yysp-1].yyDouble);
       end;
  15 : begin
         yyval.yyDouble := arcsin(yyv[yysp-1].yyDouble);
       end;
  16 : begin
         yyval.yyDouble := arccos(yyv[yysp-1].yyDouble);
       end;
  17 : begin
         yyval.yyDouble := arctan(yyv[yysp-1].yyDouble);
       end;
  18 : begin
         yyval.yyDouble := arccot(yyv[yysp-1].yyDouble);
       end;
  19 : begin
         yyval.yyDouble := sqr(yyv[yysp-1].yyDouble);
       end;
  20 : begin
         yyval.yyDouble := sqrt(yyv[yysp-1].yyDouble);
       end;
  21 : begin
         yyval.yyDouble := GetFuncValue(UpperCase(yyv[yysp-3].yyString), yyv[yysp-1].yyShortString);
       end;
  22 : begin
         if yyv[yysp-4].yyboolean then yyval.yyDouble := yyv[yysp-2].yyDouble else yyval.yyDouble := yyv[yysp-0].yyDouble;
       end;
  23 : begin
         yyval.yyDouble := PI;
       end;
  24 : begin
         yyval.yyDouble := yyv[yysp-0].yyDouble;
       end;
  25 : begin
         yyval.yyDouble := yyv[yysp-0].yyDouble;
       end;
  26 : begin
         yyval.yyShortString := '';
       end;
  27 : begin
         yyval.yyShortString := yyv[yysp-2].yyShortString + ',' + yyv[yysp-0].yyShortString;
       end;
  28 : begin
         yyval.yyShortString := yyv[yysp-0].yyString;
       end;
  29 : begin
         yyval.yyShortString := FloatToStr(yyv[yysp-0].yyDouble);
       end;
  30 : begin
         yyval.yyboolean := yyv[yysp-2].yyboolean or yyv[yysp-0].yyboolean;
       end;
  31 : begin
         yyval.yyboolean := yyv[yysp-2].yyboolean and yyv[yysp-0].yyboolean;
       end;
  32 : begin
         yyval.yyboolean := not yyv[yysp-0].yyboolean; 
       end;
  33 : begin
         yyval.yyboolean := yyv[yysp-1].yyboolean; 
       end;
  34 : begin
         yyval.yyboolean := yyv[yysp-2].yyDouble > yyv[yysp-0].yyDouble; 
       end;
  35 : begin
         yyval.yyboolean := yyv[yysp-2].yyDouble >= yyv[yysp-0].yyDouble; 
       end;
  36 : begin
         yyval.yyboolean := yyv[yysp-2].yyDouble = yyv[yysp-0].yyDouble; 
       end;
  37 : begin
         yyval.yyboolean := yyv[yysp-2].yyDouble < yyv[yysp-0].yyDouble; 
       end;
  38 : begin
         yyval.yyboolean := yyv[yysp-2].yyDouble <= yyv[yysp-0].yyDouble; 
       end;
  39 : begin
         yyval.yyboolean := yyv[yysp-2].yyDouble <> yyv[yysp-0].yyDouble; 
       end;
  end;
end(*yyaction*);

(* parse table: *)

type YYARec = record
                sym, act : Integer;
              end;
     YYRRec = record
                len, sym : Integer;
              end;

const

yynacts   = 1038;
yyngotos  = 69;
yynstates = 106;
yynrules  = 39;

yya : array [1..yynacts] of YYARec = (
{ 0: }
  ( sym: 40; act: 4 ),
  ( sym: 45; act: 5 ),
  ( sym: 257; act: 6 ),
  ( sym: 258; act: 7 ),
  ( sym: 259; act: 8 ),
  ( sym: 262; act: 9 ),
  ( sym: 272; act: 10 ),
  ( sym: 273; act: 11 ),
  ( sym: 274; act: 12 ),
  ( sym: 275; act: 13 ),
  ( sym: 276; act: 14 ),
  ( sym: 277; act: 15 ),
  ( sym: 278; act: 16 ),
  ( sym: 279; act: 17 ),
  ( sym: 280; act: 18 ),
  ( sym: 281; act: 19 ),
  ( sym: 282; act: 20 ),
  ( sym: 283; act: 21 ),
  ( sym: 284; act: 22 ),
  ( sym: 285; act: 23 ),
{ 1: }
  ( sym: 63; act: 24 ),
  ( sym: 260; act: 25 ),
  ( sym: 261; act: 26 ),
{ 2: }
  ( sym: 42; act: 27 ),
  ( sym: 43; act: 28 ),
  ( sym: 45; act: 29 ),
  ( sym: 47; act: 30 ),
  ( sym: 59; act: 31 ),
  ( sym: 263; act: 32 ),
  ( sym: 264; act: 33 ),
  ( sym: 265; act: 34 ),
  ( sym: 266; act: 35 ),
  ( sym: 267; act: 36 ),
  ( sym: 268; act: 37 ),
{ 3: }
  ( sym: 0; act: 0 ),
{ 4: }
  ( sym: 40; act: 4 ),
  ( sym: 45; act: 5 ),
  ( sym: 257; act: 6 ),
  ( sym: 258; act: 7 ),
  ( sym: 259; act: 8 ),
  ( sym: 262; act: 9 ),
  ( sym: 272; act: 10 ),
  ( sym: 273; act: 11 ),
  ( sym: 274; act: 12 ),
  ( sym: 275; act: 13 ),
  ( sym: 276; act: 14 ),
  ( sym: 277; act: 15 ),
  ( sym: 278; act: 16 ),
  ( sym: 279; act: 17 ),
  ( sym: 280; act: 18 ),
  ( sym: 281; act: 19 ),
  ( sym: 282; act: 20 ),
  ( sym: 283; act: 21 ),
  ( sym: 284; act: 22 ),
  ( sym: 285; act: 23 ),
{ 5: }
  ( sym: 40; act: 4 ),
  ( sym: 45; act: 5 ),
  ( sym: 257; act: 6 ),
  ( sym: 258; act: 7 ),
  ( sym: 259; act: 8 ),
  ( sym: 262; act: 9 ),
  ( sym: 272; act: 10 ),
  ( sym: 273; act: 11 ),
  ( sym: 274; act: 12 ),
  ( sym: 275; act: 13 ),
  ( sym: 276; act: 14 ),
  ( sym: 277; act: 15 ),
  ( sym: 278; act: 16 ),
  ( sym: 279; act: 17 ),
  ( sym: 280; act: 18 ),
  ( sym: 281; act: 19 ),
  ( sym: 282; act: 20 ),
  ( sym: 283; act: 21 ),
  ( sym: 284; act: 22 ),
  ( sym: 285; act: 23 ),
{ 6: }
  ( sym: 40; act: 41 ),
{ 7: }
{ 8: }
{ 9: }
  ( sym: 40; act: 4 ),
  ( sym: 45; act: 5 ),
  ( sym: 257; act: 6 ),
  ( sym: 258; act: 7 ),
  ( sym: 259; act: 8 ),
  ( sym: 262; act: 9 ),
  ( sym: 272; act: 10 ),
  ( sym: 273; act: 11 ),
  ( sym: 274; act: 12 ),
  ( sym: 275; act: 13 ),
  ( sym: 276; act: 14 ),
  ( sym: 277; act: 15 ),
  ( sym: 278; act: 16 ),
  ( sym: 279; act: 17 ),
  ( sym: 280; act: 18 ),
  ( sym: 281; act: 19 ),
  ( sym: 282; act: 20 ),
  ( sym: 283; act: 21 ),
  ( sym: 284; act: 22 ),
  ( sym: 285; act: 23 ),
{ 10: }
  ( sym: 40; act: 44 ),
{ 11: }
  ( sym: 40; act: 45 ),
{ 12: }
  ( sym: 40; act: 46 ),
{ 13: }
  ( sym: 40; act: 47 ),
{ 14: }
  ( sym: 40; act: 48 ),
{ 15: }
  ( sym: 40; act: 49 ),
{ 16: }
  ( sym: 40; act: 50 ),
{ 17: }
  ( sym: 40; act: 51 ),
{ 18: }
  ( sym: 40; act: 52 ),
{ 19: }
  ( sym: 40; act: 53 ),
{ 20: }
  ( sym: 40; act: 54 ),
{ 21: }
{ 22: }
  ( sym: 40; act: 55 ),
{ 23: }
  ( sym: 40; act: 56 ),
{ 24: }
  ( sym: 40; act: 4 ),
  ( sym: 45; act: 5 ),
  ( sym: 257; act: 6 ),
  ( sym: 258; act: 7 ),
  ( sym: 259; act: 8 ),
  ( sym: 262; act: 9 ),
  ( sym: 272; act: 10 ),
  ( sym: 273; act: 11 ),
  ( sym: 274; act: 12 ),
  ( sym: 275; act: 13 ),
  ( sym: 276; act: 14 ),
  ( sym: 277; act: 15 ),
  ( sym: 278; act: 16 ),
  ( sym: 279; act: 17 ),
  ( sym: 280; act: 18 ),
  ( sym: 281; act: 19 ),
  ( sym: 282; act: 20 ),
  ( sym: 283; act: 21 ),
  ( sym: 284; act: 22 ),
  ( sym: 285; act: 23 ),
{ 25: }
  ( sym: 40; act: 4 ),
  ( sym: 45; act: 5 ),
  ( sym: 257; act: 6 ),
  ( sym: 258; act: 7 ),
  ( sym: 259; act: 8 ),
  ( sym: 262; act: 9 ),
  ( sym: 272; act: 10 ),
  ( sym: 273; act: 11 ),
  ( sym: 274; act: 12 ),
  ( sym: 275; act: 13 ),
  ( sym: 276; act: 14 ),
  ( sym: 277; act: 15 ),
  ( sym: 278; act: 16 ),
  ( sym: 279; act: 17 ),
  ( sym: 280; act: 18 ),
  ( sym: 281; act: 19 ),
  ( sym: 282; act: 20 ),
  ( sym: 283; act: 21 ),
  ( sym: 284; act: 22 ),
  ( sym: 285; act: 23 ),
{ 26: }
  ( sym: 40; act: 4 ),
  ( sym: 45; act: 5 ),
  ( sym: 257; act: 6 ),
  ( sym: 258; act: 7 ),
  ( sym: 259; act: 8 ),
  ( sym: 262; act: 9 ),
  ( sym: 272; act: 10 ),
  ( sym: 273; act: 11 ),
  ( sym: 274; act: 12 ),
  ( sym: 275; act: 13 ),
  ( sym: 276; act: 14 ),
  ( sym: 277; act: 15 ),
  ( sym: 278; act: 16 ),
  ( sym: 279; act: 17 ),
  ( sym: 280; act: 18 ),
  ( sym: 281; act: 19 ),
  ( sym: 282; act: 20 ),
  ( sym: 283; act: 21 ),
  ( sym: 284; act: 22 ),
  ( sym: 285; act: 23 ),
{ 27: }
  ( sym: 40; act: 4 ),
  ( sym: 45; act: 5 ),
  ( sym: 257; act: 6 ),
  ( sym: 258; act: 7 ),
  ( sym: 259; act: 8 ),
  ( sym: 262; act: 9 ),
  ( sym: 272; act: 10 ),
  ( sym: 273; act: 11 ),
  ( sym: 274; act: 12 ),
  ( sym: 275; act: 13 ),
  ( sym: 276; act: 14 ),
  ( sym: 277; act: 15 ),
  ( sym: 278; act: 16 ),
  ( sym: 279; act: 17 ),
  ( sym: 280; act: 18 ),
  ( sym: 281; act: 19 ),
  ( sym: 282; act: 20 ),
  ( sym: 283; act: 21 ),
  ( sym: 284; act: 22 ),
  ( sym: 285; act: 23 ),
{ 28: }
  ( sym: 40; act: 4 ),
  ( sym: 45; act: 5 ),
  ( sym: 257; act: 6 ),
  ( sym: 258; act: 7 ),
  ( sym: 259; act: 8 ),
  ( sym: 262; act: 9 ),
  ( sym: 272; act: 10 ),
  ( sym: 273; act: 11 ),
  ( sym: 274; act: 12 ),
  ( sym: 275; act: 13 ),
  ( sym: 276; act: 14 ),
  ( sym: 277; act: 15 ),
  ( sym: 278; act: 16 ),
  ( sym: 279; act: 17 ),
  ( sym: 280; act: 18 ),
  ( sym: 281; act: 19 ),
  ( sym: 282; act: 20 ),
  ( sym: 283; act: 21 ),
  ( sym: 284; act: 22 ),
  ( sym: 285; act: 23 ),
{ 29: }
  ( sym: 40; act: 4 ),
  ( sym: 45; act: 5 ),
  ( sym: 257; act: 6 ),
  ( sym: 258; act: 7 ),
  ( sym: 259; act: 8 ),
  ( sym: 262; act: 9 ),
  ( sym: 272; act: 10 ),
  ( sym: 273; act: 11 ),
  ( sym: 274; act: 12 ),
  ( sym: 275; act: 13 ),
  ( sym: 276; act: 14 ),
  ( sym: 277; act: 15 ),
  ( sym: 278; act: 16 ),
  ( sym: 279; act: 17 ),
  ( sym: 280; act: 18 ),
  ( sym: 281; act: 19 ),
  ( sym: 282; act: 20 ),
  ( sym: 283; act: 21 ),
  ( sym: 284; act: 22 ),
  ( sym: 285; act: 23 ),
{ 30: }
  ( sym: 40; act: 4 ),
  ( sym: 45; act: 5 ),
  ( sym: 257; act: 6 ),
  ( sym: 258; act: 7 ),
  ( sym: 259; act: 8 ),
  ( sym: 262; act: 9 ),
  ( sym: 272; act: 10 ),
  ( sym: 273; act: 11 ),
  ( sym: 274; act: 12 ),
  ( sym: 275; act: 13 ),
  ( sym: 276; act: 14 ),
  ( sym: 277; act: 15 ),
  ( sym: 278; act: 16 ),
  ( sym: 279; act: 17 ),
  ( sym: 280; act: 18 ),
  ( sym: 281; act: 19 ),
  ( sym: 282; act: 20 ),
  ( sym: 283; act: 21 ),
  ( sym: 284; act: 22 ),
  ( sym: 285; act: 23 ),
{ 31: }
{ 32: }
  ( sym: 40; act: 4 ),
  ( sym: 45; act: 5 ),
  ( sym: 257; act: 6 ),
  ( sym: 258; act: 7 ),
  ( sym: 259; act: 8 ),
  ( sym: 262; act: 9 ),
  ( sym: 272; act: 10 ),
  ( sym: 273; act: 11 ),
  ( sym: 274; act: 12 ),
  ( sym: 275; act: 13 ),
  ( sym: 276; act: 14 ),
  ( sym: 277; act: 15 ),
  ( sym: 278; act: 16 ),
  ( sym: 279; act: 17 ),
  ( sym: 280; act: 18 ),
  ( sym: 281; act: 19 ),
  ( sym: 282; act: 20 ),
  ( sym: 283; act: 21 ),
  ( sym: 284; act: 22 ),
  ( sym: 285; act: 23 ),
{ 33: }
  ( sym: 40; act: 4 ),
  ( sym: 45; act: 5 ),
  ( sym: 257; act: 6 ),
  ( sym: 258; act: 7 ),
  ( sym: 259; act: 8 ),
  ( sym: 262; act: 9 ),
  ( sym: 272; act: 10 ),
  ( sym: 273; act: 11 ),
  ( sym: 274; act: 12 ),
  ( sym: 275; act: 13 ),
  ( sym: 276; act: 14 ),
  ( sym: 277; act: 15 ),
  ( sym: 278; act: 16 ),
  ( sym: 279; act: 17 ),
  ( sym: 280; act: 18 ),
  ( sym: 281; act: 19 ),
  ( sym: 282; act: 20 ),
  ( sym: 283; act: 21 ),
  ( sym: 284; act: 22 ),
  ( sym: 285; act: 23 ),
{ 34: }
  ( sym: 40; act: 4 ),
  ( sym: 45; act: 5 ),
  ( sym: 257; act: 6 ),
  ( sym: 258; act: 7 ),
  ( sym: 259; act: 8 ),
  ( sym: 262; act: 9 ),
  ( sym: 272; act: 10 ),
  ( sym: 273; act: 11 ),
  ( sym: 274; act: 12 ),
  ( sym: 275; act: 13 ),
  ( sym: 276; act: 14 ),
  ( sym: 277; act: 15 ),
  ( sym: 278; act: 16 ),
  ( sym: 279; act: 17 ),
  ( sym: 280; act: 18 ),

⌨️ 快捷键说明

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