📄 expr.pas
字号:
{如果你修改了,请别忘记了给我一份: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 + -