📄 compilecomplex_hss.pas
字号:
procedure FunctionStackIn(const s:string); //
Function FunctionStackOut():string; //管理 函数符号调用堆栈
Function FunctionStackRead():string; //
function ParameterListIn(const PName:string):integer;overload; //将参数插入参数堆栈 并返回序号
function GetParameterListConstIndex(const PName:string):integer;
function ParameterListIn(const dValue:TComplex):string;overload; //将常数插入参数堆栈 并返回由系统定义的别名
function GetParameterIndex(const PName:string):integer; //得到指定名称参数的序号
procedure T_PTrueNowListIN(const TP:TT_PTrueCmCx); //管理 (编译优化常数时) 参数性质堆栈
function T_PTrueNowListOut():TT_PTrueCmCx; //
function OptimizeStackCall(const IfFxch:boolean=true):boolean; // 优化堆栈调用
//传入参数str,通过s返回
function Dbxch(var s:string;var str:string):boolean; // 书写格式转换函数 f(x,y) => ((x)f(y))
procedure DelStrNote(var str:string); // 去掉str注释部分
{编译 函数}
//约定: 单元函数 通过 st(0)传复数实部x值st(1)传复数虚部y值 ,
// 通过 st(0)返回复数实部x值st(1)返回复数虚部y值
// 双元函数 通过 st(0) st(1) 传第一参数值,通过 [ecx] [ecx+SYS_EFLength] 传第二个参数 ,
// 通过 st(0) st(1) 返回结果值
// 函数可以 通过 [edx] 及以后的临时数据交换区来保存、修改或读取数据
// 函数可以随意使用EAX
Procedure F_Sys_Function_i(); //处理 i //但因为编译优化的原因,所以该函数从不会被调用
Procedure F_Add();
Procedure F_Sub();
Procedure F_Mul();
Procedure F_Div();
Procedure F_Real();
Procedure F_Imag();
Procedure F_Power();
Procedure F_PowerX();
Procedure F_XPower();
Procedure F_Bracket(); { ()函数 }
Procedure F_Rev();
Procedure F_Conj();
Procedure F_Flip();
Procedure F_Unity();
Procedure F_Distance();
Procedure F_Sqr();
Procedure F_Sqr2Z();
Procedure F_Sqr3();
Procedure F_Sqr4();
Procedure F_Sqrt();
Procedure F_SqrtN();
Procedure F_Ln();
Procedure F_Log();
Procedure F_Log2();
procedure F_LogN();
Procedure F_Abs();
Procedure F_AbsSqr();
//Procedure F_AbsV();
Procedure F_Angle();
Procedure F_Max();
Procedure F_Min();
Procedure F_MaxX();
Procedure F_MinX();
Procedure F_FromPolar();
Procedure F_ToPolar();
Procedure F_Floor();
Procedure F_Trunc();
Procedure F_Round();
Procedure F_Ceil();
Procedure F_Sgn();
Procedure F_Exp();
procedure F_Rnd();
Procedure F_Sin();
Procedure F_Cos();
Procedure F_Tan();
procedure F_Ctg();
procedure F_Csc();
procedure F_Sec();
Procedure F_ArcSin();
Procedure F_ArcCos();
Procedure F_ArcTan();
Procedure F_ArcCot();
Procedure F_ArcCsc();
Procedure F_ArcSec();
Procedure F_SinH();
Procedure F_CosH();
Procedure F_TanH();
procedure F_CtgH();
procedure F_CscH();
procedure F_SecH();
Procedure F_ArcSinH();
Procedure F_ArcCosH();
Procedure F_ArcTanH();
Procedure F_ArcCotH();
Procedure F_ArcCscH();
Procedure F_ArcSecH();
procedure F_SYS_IF_0(); //IF函数0
procedure F_SYS_IF_1(); //IF函数1
//布尔运算
//所有布尔运算只考虑复数的实部
//procedure FB_True(); //常量函数 true 真=1+0*
//procedure FB_False(); //常量函数 false 假=0+0*i
procedure FB_AND(); //逻辑 与
procedure FB_OR(); //逻辑 或
procedure FB_XOR(); //逻辑 异或
procedure FB_NOT(); //逻辑 非
//关系运算(返回布尔值)
procedure FB_EQ(); //相等
procedure FB_NE(); //不等于
procedure FB_LT(); //小于
procedure FB_GT(); //大于
procedure FB_LE(); //小于等于
procedure FB_GE(); //大于等于
//procedure FB_ABS(); //|Z|,返回实数
//编译函数调用的编译子函数(实数函数) ,一般完成 st=f(st)的工作
procedure FF_Exp();
procedure FF_Ln();
procedure FF_Log2();
procedure FF_Log10();
procedure F_SYS_Fld_Value();//代码中载入值
//procedure FF_Floor();
//procedure FF_Trunc();
//procedure FF_Round();
//procedure FF_Ceil();
procedure FF_FldHalf(); //载入0.5
procedure FF_Fld_X(const x:extended); //载入x
procedure FF_Fld_C(const Value:TComplex); //载入TComplex
{有限状态自动机}
function DbxchSYS_FunctionIf(var s:string;var str:string):boolean; // 书写格式转换函数 If(a,b,c) =>TCmCxSYS_IF_1(TCmCxSYS_IF_0(b,c),a)
function DefineMarker(var Text:string;const Key,Value : string):boolean; // 替换标识符 将Text 中 Key=>Value
// 得到字符串中标识符的位置(源字符串,标识符,起始位置);
function GetMarkerPos(const str:string;const key:string;const ifirst:integer):integer;
// myPos=pos
function myPos(const str:string;const key:string;const ifirst:integer):integer;
function Conversion0(var s:string;var str:string):boolean; //得到参数(常数)列表、函数转换
procedure GetMarker(const Str:string;const iFirst:integer;var iEnd:integer); //含'@'、'&'取出标识符
procedure GetMarkerValue0(const Str:string;const iFirst:integer;var iEnd:integer);{取出标识符的有限状态自动机}
procedure GetMarkerValue1(const Str:string;const iFirst:integer;var iEnd:integer);
procedure GetFloatValue0(const Str:string;const iFirst:integer;var iEnd:integer); {取出常数的有限状态自动机}
procedure GetFloatValue1(const Str:string;const iFirst:integer;var iEnd:integer);
procedure GetFloatValue2(const Str:string;const iFirst:integer;var iEnd:integer);
procedure GetFloatValue3(const Str:string;const iFirst:integer;var iEnd:integer);
procedure GetFloatValue4(const Str:string;const iFirst:integer;var iEnd:integer);
procedure GetFloatValue5(const Str:string;const iFirst:integer;var iEnd:integer);
procedure GetFloatValue6(const Str:string;const iFirst:integer;var iEnd:integer);
public
{ Public declarations }
constructor Create();
destructor Destroy();Override;
end;
{$IFDEF MSWINDOWS}
TSystemTime = record
wYear : Word;
wMonth : Word;
wDayOfWeek : Word;
wDay : Word;
wHour : Word;
wMinute : Word;
wSecond : Word;
wMilliSeconds: Word;
reserved : array [0..7] of char;
end;
procedure GetSystemTime(var lpSystemTime: TSystemTime); stdcall;
{$EXTERNALSYM GetSystemTime}
{$ENDIF}
type TCmCx=TCompileComplex; {简写 , :) }
//错误号定义
const csTCmCx_NoError = 0; //没有发现错误!
csTCmCx_NoKnownError = 101; //不知道的错误!
csTCmCx_NoErrorCode = 102; //找不到错误号所对应的错误描述!
csTCmCx_CompileHexCodeError = 103; //编译时指令的十六进制代码错误!
csTCmCx_HexMod2_EQ_1_Error = 104; //编译时传入指令长度错误!
csTCmCx_PMMarker_Error = 105; //编译得到参数名称时发生错误!
csTCmCx_FMMarker_Error = 106; //编译得到函数名称时发生错误!
csTCmCx_Wording_Error = 107; //语法发生错误!
csTCmCx_Bracket_Error = 108; //语法错误,在 ( ) 处!
csTCmCx_Optimize_Error = 109; //编译优化时发生错误!
csTCmCx_Define_Error = 110; //函数编译错误(或超出定义域)!
csTCmCx_Handwriting_Error = 111; //函数书写格式错误!
csTCmCx_ReadFloat_Error = 113; //编译读取常数数字时发生错误!
csTCmCx_ReadMarker_Error = 114; //编译读取标识符时发生错误!
csTCmCx_Read_Error = 115; //语法错误,有不识别的字符!
csTCmCx_Note_Match_Error = 116; //注释符号不匹配! { } 或 /* */
csTCmCx_FPList_Error = 117; //参数列表错误!
csTCmCx_IFHandwriting_Error = 118; //If函数书写格式错误!
implementation
function TCompileComplex.GetError():string;
begin
result:=GetErrorGB(ErrorCode);
end;
function TCompileComplex.GetErrorGB(const xErrorCode:integer):string; //返回错误描述
begin
case xErrorCode of
csTCmCx_NoError :result:='';//没有发现错误!
csTCmCx_NoKnownError :result:='不知道的错误!';
csTCmCx_NoErrorCode :result:='找不到错误号所对应的错误描述!';
csTCmCx_CompileHexCodeError :result:='编译时指令的十六进制代码错误!';
csTCmCx_HexMod2_EQ_1_Error :result:='编译时传入指令长度错误!';
csTCmCx_PMMarker_Error :result:='编译得到参数名称时发生错误!';
csTCmCx_FMMarker_Error :result:='编译得到函数名称时发生错误!';
csTCmCx_Wording_Error :result:='语法发生错误!';
csTCmCx_Bracket_Error :result:='语法错误,在 ( ) 处!';
csTCmCx_Optimize_Error :result:='编译优化时发生错误!';
csTCmCx_Define_Error :result:='函数编译错误(或超出定义域)!';
csTCmCx_Handwriting_Error :result:='函数书写格式错误!';
csTCmCx_ReadFloat_Error :result:='编译读取常数数字时发生错误!';
csTCmCx_ReadMarker_Error :result:='编译读取标识符时发生错误!';
csTCmCx_Read_Error :result:='语法错误,有不识别的字符!';
csTCmCx_Note_Match_Error :result:='注释符号不匹配! { } 或 /* */';
csTCmCx_FPList_Error :result:='参数列表错误!';
csTCmcX_IfHandwriting_Error :result:='If函数书写格式错误!';
else result:=GetErrorGB(csTCmCx_NoErrorCode);
end;
end;
function TCompileComplex.GetErrorBIG5(const xErrorCode:integer):string; //返回错误描述
begin
//注意:以下使用的是中文繁体BIG5码,要使用内码转换器才能察看
case xErrorCode of
csTCmCx_NoError :result:='';//⊿Τ祇瞷岿粇!
csTCmCx_NoKnownError :result:='ぃ
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -