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

📄 untpasscriptcompile.~pas

📁 delphi编写的pascal解释器
💻 ~PAS
📖 第 1 页 / 共 5 页
字号:
unit untPasScriptCompile;

interface

Uses
  Variants, Windows, Messages, Classes, SysUtils, MConnect, ScktComp, WinSock,
  WinInet, ComObj, Dialogs;

Type
  TCharSet = Set of char;

Const
  { 源程序字符集 }
  WhiteSpaces: TCharSet = ['+', '-', '/', '*', '(', ')', ':', '=', ',', ';', '>', '<',
                           '$', '.', '#', '[', ']', '^', '@', '&', '~', '|', '%'];

  BlackSpaces: TCharSet = [#1..#32];

  StopChars: TCharSet = [#0..#32, '+', '-', '/', '*', '(', ')', ':', '=', ',', '''',
                         '{', '}', ';', '>', '<', '$', '.', '#', '[', ']', '"', '^',
                         '@', '&', '~', '|', '%'];

  FirstIdentChar: TCharSet = ['A'..'Z', 'a'..'z', '_'];

  IdentBackChars: TCharSet = ['A'..'Z', 'a'..'z', '_', '0'..'9'];

  Digit: TCharSet = ['0'..'9'];
  
  HexDigit: TCharSet = ['0'..'9', 'A'..'F'];
  

  { 单个保留字符 Reserve Char  }
  rcidEndOfFile                 = 0;
  rcidEndOfLine                 = 13;
  rcidNewLine                   = 10;
  rcidPower                     = Integer('^');
  rcidPoint                     = Integer('.');
  rcidDelimeter                 = Integer(';');
  rcidGreater                   = Integer('>');
  rcidLess                      = Integer('<');
  rcidComma                     = Integer(',');
  rcidPlus                      = Integer('+');
  rcidMinus                     = Integer('-');
  rcidSlash                     = Integer('/');
  rcidStar                      = Integer('*');
  rcidOpenBracket               = Integer('(');
  rcidCloseBracket              = Integer(')');
  rcidOpenComment               = Integer('{');
  rcidCloseComment              = Integer('}');
  rcidEqual                     = Integer('=');
  rcidNotEqual                  = integer('#');
  rcid2Points                   = Integer(':');
  rcidStringChar                = Integer('''');
  rc2idStringChar               = Integer('"');
  rcidSqopenBracket             = integer('[');
  rcidSqcloseBracket            = integer(']');
  

  { 保留字 Reserve Word }
  ReserveWordBase = 1000;
  ReserveWordEnd = 1999;

  rwidProgram =                ReserveWordBase + 0;
  rwidLabel   =                ReserveWordBase + 1;
  rwidGoto    =                ReserveWordBase + 2;
  rwidVar     =                ReserveWordBase + 3;
  rwidBegin   =                ReserveWordBase + 4;
  rwidEnd     =                ReserveWordBase + 5;
  rwidAnd     =                ReserveWordBase + 6;
  rwidOr      =                ReserveWordBase + 7;
  rwidXor     =                ReserveWordBase + 8;
  rwidNot     =                ReserveWordBase + 9;
  rwidShl     =                ReserveWordBase + 10;
  rwidShr     =                ReserveWordBase + 11;
  rwidDiv     =                ReserveWordBase + 12;
  rwidMod     =                ReserveWordBase + 13;
  rwidTrue    =                ReserveWordBase + 14;
  rwidFalse   =                ReserveWordBase + 15;
  rwidIf      =                ReserveWordBase + 16;
  rwidThen    =                ReserveWordBase + 17;
  rwIdElse    =                ReserveWordBase + 18;
  rwidWhile   =                ReserveWordBase + 19;
  rwidRepeat  =                ReserveWordBase + 20;
  rwidUntil   =                ReserveWordBase + 21;
  rwidFor     =                ReserveWordBase + 22;
  rwidTo      =                ReserveWordBase + 23;
  rwidDownto  =                ReserveWordBase + 24;
  rwidDo      =                ReserveWordBase + 25;
  rwidNil     =                ReserveWordBase + 27;
  rwidNull    =                ReserveWordBase + 28;
  rwidUnitinit  =              ReserveWordBase + 31;
  rwidUnitfinal =              ReserveWordBase + 32;
  rwidClass     =              ReserveWordBase + 33;
  rwidType      =              ReserveWordBase + 34;
  rwidConstr    =              ReserveWordBase + 35;
  rwidDestr     =              ReserveWordBase + 36;
  rwidUses      =              ReserveWordBase + 37;
  rwidUnit      =              ReserveWordBase + 38;
  rwidInterface =              ReserveWordBase + 39;
  rwidImplement =              ReserveWordBase + 40;
  rwidProcedure =              ReserveWordBase + 41;
  rwidPrivate   =              ReserveWordBase + 42;
  rwidPublic    =              ReserveWordBase + 43;
  rwidProtected =              ReserveWordBase + 44;
  rwidPublished =              ReserveWordBase + 45;
  rwidFunction  =              ReserveWordBase + 46;
  rwidConst     =              ReserveWordBase + 47;
  rwidProperty  =              ReserveWordBase + 48;
  rwidVirtual   =              ReserveWordBase + 49;
  rwidOverride  =              ReserveWordBase + 50;
  rwidDynamic   =              ReserveWordBase + 51;
  rwidRecord    =              ReserveWordBase + 52;
  rwidForward   =              ReserveWordBase + 53;
  rwidIndex     =              ReserveWordBase + 54;
  rwidRead      =              ReserveWordBase + 55;
  rwidWrite     =              ReserveWordBase + 56;
  rwidStored    =              ReserveWordBase + 57;
  rwidDefault   =              ReserveWordBase + 58;
  rwidAbstract  =              ReserveWordBase + 59;
  rwidStdcall   =              ReserveWordBase + 69;

  { 用户自定义的标识 User Define Identifier }
  UserDefineIdentBase        = 256;
  udIdentifier               = UserDefineIdentBase + 0;
  udStringConst              = UserDefineIdentBase + 1;
  udNumberConst              = UserDefineIdentBase + 2;
  udHexConst                 = UserDefineIdentBase + 6;

  { PCode命令常量 }
  ocAdd                      = 0;
  ocSub                      = 1;
  ocMul                      = 2;
  ocDiv                      = 3;
  ocMod                      = 4;
  ocSlash                    = 5;
  ocShl                      = 6;
  ocShr                      = 7;
  ocNot                      = 8;
  ocOr                       = 9;
  ocXor                      = 10;
  ocAnd                      = 11;
  ocGreaterEqual             = 12;
  ocEqual                    = 13;
  ocLessEqual                = 14;
  ocNotEqual                 = 15;
  ocGreater                  = 16;
  ocLess                     = 17;
  ocNeg                      = 18;
  ocGoto                     = 19;
  ocIF                       = 20;
  ocIfFalseGoto              = 21;
  ocLoadConst                = 23;
  ocHalt                     = 26;
  ocIncVar                   = 29;
  ocDecVar                   = 30;
  ocBackDode                 = 34;
  ocExtFun                   = 42;
  ocExtProc                  = 43;
  ocSetSelf                  = 44;
  ocLoadextvar               = 45;
  ocStoreextvar              = 46;
  ocSelffromvar              = 47;
  ocMov                      = 48;
  ocCall                     = 49;
  ocReturn                   = 50;
  ocVarraycreate             = 51;
  ocSetvarray                = 52;
  ocSto                      = 53;
  
type
  TToken = record
    ID: Integer;
    Data: Variant;
  end;

  TTokenReader = class
  private
    FSourceCode: string;
    FCurPos: integer;
    FSourceLen: integer;
    FCurToken: TToken;

    FResWords: TStringList;        //保留字

    function ReadByte: byte;
    function NextByte: byte;
    function Next2Byte: byte;
    procedure BackByte(aNum: integer);

    procedure SetSourceCode(aSrcCode: string);
    function GetSourceCode: string;

    { 滤去不可见字符 }
    procedure FilterBalckChar;
    { 滤去注释 }
    procedure FilterNote;
    { 滤去不可见字符和注释 }
    procedure FilterBlackAndNote;

    function SetToken(ID: integer; V: Variant): TToken;

    { 读出字符串常量 }
    function getStringConst: TToken;
    { 读出数字常量 }
    function getNumberConst: TToken;

    { 是否是保留字符 }
    function IsReserveChar(aChar: char): boolean;
    { 读出保留字符 }
    function getReserveChar: TToken;

    { 读出用户标识符或保留字 }
    function getIdentOrReservWord: TToken;    

    procedure Error(astr: string);

    function ReadToken: TToken;
    function NextToken: TToken;
    function Next2Token: TToken;

    procedure getDelimeter;
    procedure getComma;
    procedure getCloseBracket;

    function GetCurToken: TToken;
  public
      
    constructor Create;
    destructor Destroy; override;

    property CurToken: TToken read GetCurToken;
    property SourceCode: string read GetSourceCode write SetSourceCode;
  end;


  TVarType = (vtStatic, vtDynamic, vtParam, vtResult);
  TDataType = (dtUnknown, dtInt, dtFloat, dtBool, dtStr, dtDateTime, dtOther);

  TUserVar = class
  private
    FID: Integer;
    FName: string;
    FValue: variant;

    FDataType: TDataType;

    FVarType: TVarType;  //变量类别,静态变量,动态变量,参数变量
    FOffPos: integer;        //位移

    function getText: string;

  public
    procedure Clone(aUserVar: TUserVar);

    property ID: integer read FID write FID;
    property Name: string read FName write FName;
    property Value: variant read FValue write FValue;
    property DataType: TDataType read FDataType write FDataType;
    property VarType: TVarType read FVarType write FVarType;
    property OffPos: integer read FOffPos write FOffPos;

    property Text: string read getText;
    
  end;

  TArrayUserVar = array of TUserVar;
  
  TUserVarList = class
  private
    FUserVarList: TArrayUserVar;
    FCount: integer;

    procedure CheckArray;
    function getText: string;

  public
    constructor Create;
    destructor Destroy; override;
    procedure Clear;

    function AddVar(aName: string): TUserVar; overload;
    function AddVar(aID: integer; aName: string; aValue: variant; aDataType: TDataType;
                    aVarType: TVarType; aOffPos: integer): TUserVar; overload;
    procedure AddVar(aUserVar: TUserVar); overload;

    function GetVarByName(aName: string): TUserVar;
    function GetVarByIndex(aIndex: integer): TUserVar;
    function getVarByID(aID: integer): TUserVar;

    procedure DelVarByID(aID: integer);
    procedure DelVarByIndex(aIndex: integer);
    procedure DelLastVar;

    property Count: integer read FCount;
    property Text: string read getText;

  end;      

  TMethodType = (mtProc, mtFun);

  TSysProcMethod = procedure(v: TUserVarList);

  TUserMethod = class
  private
    FID: Integer;
    FName: string;

    FMethodType: TMethodType;  //过程,函数

    FParamList: TList;

    FDynaVarList: TList;

    FCurOffPos: integer;           //当前位移数

    FResultVar: TUserVar;

    FAddr: integer;

    FSysMethodFlag: boolean;
    FSysProcMethod: TSysProcMethod;

    function getText: string;

  public
    constructor Create;

    procedure AddParamVar(aUserVar: TUserVar);
    procedure AddDynaVar(aUserVar: TUserVar);
    procedure AddResultVar(aUserVar: TUserVar);

    procedure Clone(aUserMethod: TUserMethod);

    function GetParamVarByIndex(aIndex: integer): TUserVar;
    function GetDyanVarByIndex(aIndex: integer): TUserVar;

    property ID: integer read FID write FID;
    property Name: string read FName write FName;
    property MethodType: TMethodType read FMethodType write FMethodType;
    property ParamList: TList read FParamList;
    property DynaVarList: TList read FDynaVarList;
    property CurOffPos: integer read FCurOffPos write FCurOffPos;
    property ResultVar: TUserVar read FResultVar;
    property Addr: integer read FAddr write FAddr;
    property Text: string read getText;
    property SysMethodFlag: boolean read FSysMethodFlag write FSysMethodFlag;
    property SysProcMethod: TSysProcMethod read FSysProcMethod write FSysProcMethod;
  end;

  TArrayUserMethod = array of TUserMethod;

  TUserMethodList = class
  private
    FUserMethodList: TArrayUserMethod;
    FCount: integer;

    procedure CheckArray;
    function getMethodByID(aID: integer): TUserMethod;

    function getText: string;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Clear;

    function AddMethod(aName: string): TUserMethod; overload;
    function AddMethod(aID: integer; aName: string; aMethodType: TMethodType;
                       aCurOffPos: integer; aAddr: integer): TUserMethod; overload;
    function AddMethod(aMethod: TUserMethod): TUserMethod; overload;
    function GetMethodByName(aName: string): TUserMethod;

    property UserMethod[aID: integer]: TUserMethod read getMethodByID;
    property Count: integer read FCount;
    property UserMethodList: TArrayUserMethod read FUserMethodList;
    property Text: string read getText;
  end;

  TVMPCode = class        //虚拟机代码
  private
    FCmd, FP1, FP2, FAddr: integer;

    function getText: string;
  public
    class function getCmdStr(aCmd: integer): string;
    
    property Cmd: integer read FCmd write FCmd;
    property P1: integer read FP1 write FP1;
    property P2: integer read FP2 write FP2;
    property Addr: integer read FAddr;

    property Text: string read getText;
  end;

  TArrayVMPCode = array of TVMPCode;

  TVMPCodeList = class
  private
    FVMPCodeList: TArrayVMPCode;
    FCount: integer;

    procedure CheckArray;
    function getVMPCodeByIndex(aIndex: integer): TVMPCode;
    function getLastVMPCode: TVMPCode;

    function getText: string;

  public
    constructor Create;
    destructor Destroy; override;
    procedure Clear;

    function AddVMPCode(aCmd, aP1, aP2: integer): TVMPCode;

    property VMPCodeList[aIndex: integer]: TVMPCode read getVMPCodeByIndex;
    property Count: integer read FCount;
    property LastVMPCode: TVMPCode read getLastVMPCode;

    property Text: string read getText;
  end;      

  TCodeMaker = class
  private
    FVarList: TList;
    FConstVarList: TList;
    FMethodList: TList;

    FAnalyDepth: integer;

    FParentCodeMaker: TCodeMaker;
    FParentTokenReader: TTokenReader;

  public
    function RegisterVar(aName: string; aAnalyDepth: integer = -1): TUserVar; virtual;
    function RegisterConstVar(aName: string): TUserVar; virtual;
    function FindVarByName(aName: string; var aLevel: integer): TUserVar; virtual;
    function FindVarByID(aID: integer): TUserVar; virtual;

    function RegisterMethod(aName: string; aAnalyDepth: integer = -1): TUserMethod; virtual;
    function FindMethodByName(aName: string; var aLevel: integer): TUserMethod; virtual;

    function PutCode(aCmd, aP1, aP2: integer): TVMPCode; virtual;

    function GetLastVMPCode: TVMPCode; virtual;
    function GetAnalyDepth: integer; virtual;

  public
    constructor Create(aCodeMaker: TCodeMaker; aTokenReader: TTokenReader); virtual; 
    destructor Destroy; override;

    property LastVMPCode: TVMPCode read GetLastVMPCode;
    property AnalyDepth: integer read GetAnalyDepth;
    property VarList: TList read FVarList;
    property ConstVarList: TList read FConstVarList;
    property MethodList: TList read FMethodList;
  end;  

  TStack = class
  private
    FDatas: array of variant;
    FCount: integer;

  public
    constructor Create;
    destructor Destroy; override;

    procedure Put(v: Variant);
    function Pop: variant;
    function getData(aIndex: integer): variant;

    procedure Clear;
  end;   




  TCallInfo = class
  private
    FBaseDynaVarAddr: integer;
    FVarCount: integer;
    FCallAddr: integer;
    FMethod: TUserMethod;

  public
    property BaseDynaVarAddr: integer read FBaseDynaVarAddr;
    property VarCount: integer read FVarCount;
    property CallAddr: integer read FCallAddr;
    property Method: TUserMethod read FMethod;
  end;

  TArrayCallInfo = array of TCallInfo;

  TCallStack = class
  private
    FCallInfoList: TArrayCallInfo;
    FCount: integer;  

    procedure CheckArray;
    function getLastCallInfo: TCallInfo;

  public
    constructor Create;
    destructor Destroy; override;

    function PutMethodCall(aMethod: TUserMethod; aCallAddr: integer): TCallInfo;
    procedure RemoveLastCall;

    function GetPreCallInfo(aOffPos: integer): TCallInfo;
    procedure Clear;

    property LastCallInfo: TCallInfo read getLastCallInfo;
    property Count: integer read FCount;
  end;
    
  TDynaVarStack = class

⌨️ 快捷键说明

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