亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? untcomile.pas

?? 運用delphi編寫的小型解釋器
?? PAS
?? 第 1 頁 / 共 2 頁
字號:
unit untComile;

interface

Uses
  classes, sysutils, forms, windows, dialogs,controls,
  stdctrls, variants;

Type TCharSet = Set of char;

Const
  WhiteSpaces: TCharSet = ['+', '-', '/', '*', '(', ')', ':', '=', ',', ';', '>', '<',
                           '$', '.', '#', '[', ']', '^', '@', '&', '~', '|', '%'];

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

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

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

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

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


Const
  wInteger = 1;
  wDouble = 2;
  wString = 3;
  WBoolean = 4;

Const
  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;


{ Character IDs}

  idEndOfFile = 0;
  idEndOfLine = 10;
  idNewLine = $0a;
  idpower = Integer('^');
  idPoint = Integer('.');
  idDelimeter = Integer(';');
  idGreater = Integer('>');
  idLess = Integer('<');
  idComma = Integer(',');
  idPlus = Integer('+');
  idMinus = Integer('-');
  idSlash = Integer('/');
  idStar = Integer('*');
  idOpenBracket = Integer('(');
  idCloseBracket = Integer(')');
  idOpenComment = Integer('{');
  idCloseComment = Integer('}');
  idEqual = Integer('=');
  idNotEqual = integer('#');
  id2Points = Integer(':');
  idStringChar = Integer('''');
  id2StringChar = Integer('"');
  idSqopenBracket = integer('[');
  idSqcloseBracket = integer(']');

 { ID Bases and ID ends }
  idBase = 256;
  idReservedBase = 1000;
  idReservedEnd = 1999;

 { Other IDs }
  idIdentifier = idBase + 0;
  idStringConst = idBase + 1;
  idNumberConst = idBase + 2;
  
  idResWord = idBase + 4;
  idResConst = idBase + 5;
  idHexConst = idBase + 6;

 { Reserverd Words [idReservedBase,idReservedEnd] }
  idProgram = idReservedBase + 0;
  idLabel = idReservedBase + 1;
  idGoto = idReservedBase + 2;
  idVar = idReservedBase + 3;
  idBegin = idReservedBase + 4;
  idEnd = idReservedBase + 5;
  idAnd = idReservedBase + 6;
  idOr = idReservedBase + 7;
  idXor = idReservedBase + 8;
  idNot = idReservedBase + 9;
  idShl = idReservedBase + 10;
  idShr = idReservedBase + 11;
  idDiv = idReservedBase + 12;
  idMod = idReservedBase + 13;
  idTrue = idReservedBase + 14;
  idFalse = idReservedBase + 15;
  idIf = idReservedBase + 16;
  idThen = idReservedBase + 17;
  IdElse = idReservedBase + 18;
  idWhile = idReservedBase + 19;
  idRepeat = idReservedBase + 20;
  idUntil = idReservedBase + 21;
  idFor = idReservedBase + 22;
  idTo = idReservedBase + 23;
  idDownto = idReservedBase + 24;
  idDo = idReservedBase + 25;
  idNil = idReservedBase + 27;
  idNull = idReservedBase + 28;
  idUnitinit = idReservedBase + 31;
  idUnitfinal = idReservedBase + 32;
  idClass = idReservedBase + 33;
  idType = idReservedBase + 34;
  idConstr = idReservedBase + 35;
  idDestr = idReservedBase + 36;
  idUses = idReservedBase + 37;
  idUnit = idReservedBase + 38;
  idInterface = idReservedBase + 39;
  idImplement = idReservedBase + 40;
  idProcedure = idReservedBase + 41;
  idPrivate = idReservedBase + 42;
  idPublic = idReservedBase + 43;
  idProtected = idReservedBase + 44;
  idPublished = idReservedBase + 45;
  idFunction = idReservedBase + 46;
  idConst = idReservedBase + 47;
  idProperty = idReservedBase + 48;
  idVirtual = idReservedBase + 49;
  idOverride = idReservedBase + 50;
  idDynamic = idReservedBase + 51;
  idRecord = idReservedBase + 52;
  idForward = idReservedBase + 53;
  idIndex = idReservedBase + 54;
  idRead = idReservedBase + 55;
  idWrite = idReservedBase + 56;
  idStored = idReservedBase + 57;
  idDefault = idReservedBase + 58;
  idAbstract = idReservedBase + 59;
  idStdcall = idReservedBase + 69;


Type
  TWordList = class
  private
    FList: TStringList;

  protected
    procedure AddWord(aWordName: String; aWordID: integer); virtual;
    
  public
    constructor Create;
    destructor Destroy; override;


    function GetWordID(aWordName: string): integer;
    function GetWordName(aWordID: integer): string;
  end;

  TResWords = class(TWordList)
  public
    procedure AddWord(aWordName: String; aWordID: integer); override;
  end;

  TResConsts = class(TWordList)
  public
    procedure AddWord(aWordName: String; aWordID: integer); override;
  end;

  TDynaWords = class(TWordList)
  private
    FConstID: integer;

  public
    constructor Create;
    function AddWord(aWordName: String): integer; reintroduce;
  end;

  TProgItem = record
    Cmd, P1, P2: integer;
  end;

  TIdentType = (itVariable, itProcedure, itFunction);
  TDataType = (dtInt, dtFloat, dtBool, dtStr, dtDateTime, dtOther);

  TIdent = class
  private
    FName: string;
    FID: Integer;
    FIdentType: TIdentType; {0-Variable 1-procedure 2-function}

    FDataType: TDataType;

    FValue: variant;

    FParCount: Integer;

    FParams: TByteArray;

    FParamNames: TStringList;

  public
    constructor Create;
    destructor Destroy; override;

    property Name: string read FName write FName;
    property ID: integer read FID write FID;
    property IdentType: TIdentType read FIdentType write FIdentType;
    property Params: TByteArray read FParams write FParams;
    property ParamNames: TStringList read FParamNames write FParamNames;
    property Value: variant read FValue write FValue;
    property DataType: TDataType read FDataType write FDataType;
  end;

  TIdentList = class
  private
    FIdents: array of TIdent;
    FCount: integer;

    function getIdentByIndex(aIndex: integer): TIdent;
    function Add(aName: string; aID: Integer): TIdent; virtual;

  public
    function IndexOf(aName: string): integer;

    function getIdentByName(aName: String): TIdent;
    function getIdentByID(aID: integer): TIdent;

    constructor Create;
    destructor Destroy; override;

    property Idents[aIndex: integer]: TIdent read getIdentByIndex;
  end;

  TConstList = class(TIdentList)
  private
    FConstID: integer;

  public
    function Add(aName: string): TIdent; reintroduce;
    constructor Create;
  end;

  TVariableList = class(TIdentList)
  public
    function Add(aName: string; aID: integer): TIdent; reintroduce;  
  end;

  TArrayOfTProgItem = array of TProgItem;

  TProgList = class
  private
    FCount: integer;
    FProgList: TArrayOfTProgItem;

  public
    constructor Create;
    function PutCode(aCmd, aP1, aP2: integer): integer;
    destructor Destroy; override;

    property ProgList: TArrayOfTProgItem read FProgList;
    property Count: integer read FCount;
    
  end;

  TToken = Record
    ID: Integer;
    Data: Variant;
  End;

  TCompile = class
  private
    FSrcCode: string;
    FCurPos: integer;
    FSrcLen: integer;

    FCurToken: TToken;

    FConsts: TConstList;
    FVariables: TVariableList;

    FLastVarID: integer;

    FProgList: TProgList;

    function ReadByte: Byte;
    function NextByte: Byte;
    procedure BackByte(aNum: integer);

    procedure ReadToken;
    function NextToken: TToken;
    function SetToken(ID: integer; V: Variant): TToken;

    procedure GetVarType;
    function GetVar: integer;
    procedure getComa;
    procedure getIdentifier;
    procedure getdelimeter;
    procedure getOpenBracket;
    procedure getCloseBracket;

    procedure Statement;
    procedure Condition;
    procedure Expression;
    procedure Term;
    procedure Factor;

    procedure RaiseError(aErrStr: string);

  public
    constructor Create;
    destructor Destroy; override;

  end;



var
  ResWords: TResWords;
  ResConsts: TResConsts;
  

implementation

{ TCompile }

procedure TCompile.BackByte(aNum: integer);
begin
  if FCurPos - aNum > 0 then FCurPos := FCurPos - aNum
    else FCurPos := 1;
end;

constructor TCompile.Create;
begin
  FSrcCode := '';
  FCurPos := 0;
  FSrcLen := 0;

  FConsts := TConstList.Create;
  FVariables := TVariableList.Create;

  FProgList := TProgList.Create;

  FConsts.Add('null');  //id = 1;
  FConsts.Add('nil');  //id = 2;
end;

destructor TCompile.Destroy;
begin
  FreeAndNil(FConsts);
  FreeAndNil(FVariables);
  FreeAndNil(FProgList);
  
  inherited;
end;

procedure TCompile.Expression;
var
  tmp: TToken;
begin
  tmp := NextToken;

  if tmp.ID = idMinus then
      begin
      ReadToken;
      Term;

      FProgList.PutCode(ocNeg, 0, 0);
      end
     else Term;

  if (tmp.id = idPlus) or (tmp.id = idMinus) or (tmp.id = idOr) or (tmp.id = idXor) then
    begin
    Case tmp.id of
        idPlus:
          Begin
          ReadToken;

          Term;

          FProgList.PutCode(ocAdd, 0, 0);
          End;

        idMinus:
          Begin
          ReadToken;

          Term;
          FProgList.PutCode(ocSub, 0, 0);
          End;

        idOr:
          Begin
          ReadToken;

          Term;
          FProgList.PutCode(ocOr, 0, 0);
          End;

        idXor:
          Begin
          ReadToken;
        
          Term;
          FProgList.PutCode(ocXor, 0, 0);
          End;
    End;

  Term;
  end;
end;

procedure TCompile.Factor;
var
  str: string;
  aIdent: TIdent;
begin
  ReadToken;

  case FCurToken.ID of
      idIdentifier: begin
                    str := FCurToken.data;

                    if FVariables.IndexOf(str) < 0 then raiseError('變量' + str + '沒有定義');

                    aIdent := FVariables.getIdentByName(str);

                    case aIdent.IdentType of
                       itVariable: begin
                                   FProgList.PutCode(ocMov, 0, aIdent.ID);
                                   end;

                       end;

                    end;

      idFalse: begin
               aIdent := FConsts.Add('False');
               aIdent.IdentType := itVariable;
               aIdent.DataType := dtBool;
               aIdent.Value := false;

               FProgList.PutCode(ocLoadConst, 0, aIdent.ID);
               end;

      idTrue: begin
               aIdent := FConsts.Add('True');
               aIdent.IdentType := itVariable;
               aIdent.DataType := dtBool;
               aIdent.Value := true;

               FProgList.PutCode(ocLoadConst, 0, aIdent.ID);
             end;

      idNil: begin
             FProgList.PutCode(ocLoadConst, 0, 2);
             end;

      idNull: begin
             FProgList.PutCode(ocLoadConst, 0, 1);
             end;


      idNumberConst: begin
                     aIdent := FConsts.Add('Number');
                     aIdent.Value := FCurToken.Data;
                     aIdent.IdentType := itVariable;
                     aIdent.DataType := dtFloat;

                     FProgList.PutCode(ocLoadConst, 0, aIdent.ID);
                     end;

      idStringConst: begin
                     aIdent := FConsts.Add('str');
                     aIdent.Value := FCurToken.Data;
                     aIdent.IdentType := itVariable;
                     aIdent.DataType := dtStr;

                     FProgList.PutCode(ocLoadConst, 0, aIdent.ID);
                     end;

      idOpenBracket: begin
                     Expression;
                     getCloseBracket; 
                     end;

  end;
end;

procedure TCompile.getCloseBracket;
begin
  ReadToken;
  if FCurToken.id <> idCloseBracket then raiseError('期望右括弧!');
end;

procedure TCompile.getComa;
begin
  ReadToken;
  
  If FCurToken.id <> idComma then raiseError('期望逗號!');
end;

procedure TCompile.getdelimeter;
begin
  ReadToken;

  If (FCurToken.ID <> idDelimeter) then raiseError('期望分號!');
end;

procedure TCompile.getIdentifier;
begin
  ReadToken;
  If FCurToken.id <> idIdentifier then raiseError('期望變量!');
end;

procedure TCompile.getOpenBracket;
begin
  ReadToken;
  If FCurToken.id <> idOpenBracket then raiseError('期望左括弧!');
end;

function TCompile.GetVar: integer;
begin
  ReadToken;

  If FCurToken.id <> idIdentifier then raiseError('期望標識符!');

  Result := FVariables.IndexOf(FCurToken.Data);

  If Result < 0 then raiseError('沒有定義變量' + FCurToken.Data);

  FLastVarID := FVariables.Idents[Result].ID;
end;

procedure TCompile.GetVarType;
begin
  ReadToken;
end;

procedure TCompile.Term;
var
  tmp: TToken;
begin
  Factor;

  tmp := NextToken;

  while (tmp.id = idAnd) or (tmp.id = idStar) or (tmp.id = idSlash) or
        (tmp.id = idDiv) or (tmp.id = idMod) do
        begin
        Case tmp.id of
          idAnd: begin
                 ReadToken;
                 Factor;
                 FProgList.PutCode(ocAnd, 0, 0);
                 end;

          idStar: begin
                  ReadToken;

                  Factor;

                  FProgList.PutCode(ocMul, 0, 0);
                  end;

          idSlash: begin
                   ReadToken;
                   Factor;
                   FProgList.PutCode(ocSlash, 0, 0);
                   end;

          idDiv: begin
                  ReadToken;
                  Factor;
                  FProgList.PutCode(ocDiv, 0, 0);
                  end;

          idMod: begin
                 ReadToken;
                 Factor;

                 FProgList.PutCode(ocMod, 0, 0);
                 end;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美色中文字幕| 久久成人羞羞网站| 午夜精品久久久久久久久久久 | 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 国产电影一区二区三区| 91黄色激情网站| 久久久亚洲午夜电影| 亚洲国产一区二区视频| 国产成人精品免费| 日韩欧美另类在线| 一区二区成人在线观看| 成人黄色在线视频| 欧美一二三在线| 日韩不卡一区二区三区| 一本色道久久综合亚洲aⅴ蜜桃| 久久久久久黄色| 看电影不卡的网站| 日韩一二三区不卡| 青娱乐精品视频在线| 欧美一区二区三区免费观看视频 | 波多野结衣在线aⅴ中文字幕不卡| 日韩欧美另类在线| 国产一区二区精品久久99| 日韩欧美亚洲一区二区| 精品一区二区三区在线播放视频| 精品免费国产二区三区| 偷拍亚洲欧洲综合| 欧美一区二区三区四区久久| 天天射综合影视| 久久久亚洲精华液精华液精华液| 国产成人午夜99999| 亚洲激情成人在线| 欧美日韩成人综合| 国产精品自拍av| 日韩专区欧美专区| 久久精品一区四区| 欧美精品第一页| 国产v综合v亚洲欧| 蜜桃一区二区三区在线观看| 日韩一区在线播放| 国产亚洲一区二区三区在线观看| 久久久久久久综合日本| 日韩伦理av电影| 日本大香伊一区二区三区| 色婷婷一区二区| 欧美日韩国产片| 精品久久久久久久久久久院品网 | 色婷婷av一区二区三区gif| 高清av一区二区| 蜜桃一区二区三区在线观看| 综合激情网...| 欧美极品少妇xxxxⅹ高跟鞋| 91精品蜜臀在线一区尤物| 国产91精品精华液一区二区三区| 久久成人久久爱| 日本成人在线不卡视频| 亚洲成人在线网站| 亚洲综合一二区| 午夜精品久久久久久不卡8050| 亚洲区小说区图片区qvod| 中文字幕欧美一区| 亚洲同性同志一二三专区| 欧美一区二区女人| 在线日韩一区二区| 欧美亚洲国产一区在线观看网站| 国产不卡一区视频| 91原创在线视频| 欧美日韩免费一区二区三区| 色婷婷激情综合| 欧美乱熟臀69xxxxxx| 欧美日韩在线电影| 日韩视频永久免费| 久久影院午夜片一区| 亚洲丝袜自拍清纯另类| 亚洲精品国产无套在线观| 亚洲欧洲av色图| 婷婷综合久久一区二区三区| 日本女人一区二区三区| 波多野结衣一区二区三区| 91国产福利在线| 久久综合国产精品| 视频在线观看一区| 91在线观看高清| 日本一区二区电影| 蜜桃av一区二区三区| 欧美日韩高清一区二区三区| 国产精品乱人伦| 99精品视频在线观看| 精品国产免费人成电影在线观看四季 | 日韩国产在线观看| www.日韩大片| 欧美国产日韩精品免费观看| 日日骚欧美日韩| 色婷婷激情一区二区三区| 国产精品福利一区| 99久久婷婷国产| 日韩一区欧美一区| 亚洲综合免费观看高清完整版在线| 亚洲图片欧美色图| 97久久久精品综合88久久| 精品蜜桃在线看| 国产精品自产自拍| 精品日韩欧美在线| 国产一区在线不卡| 久久久一区二区三区捆绑**| 国产精品亚洲视频| 精品国产麻豆免费人成网站| 国产精品亲子伦对白| av一本久道久久综合久久鬼色| 久久精品夜夜夜夜久久| 99久久久无码国产精品| 玉足女爽爽91| 精品国产123| 丁香另类激情小说| 亚洲婷婷综合久久一本伊一区 | 久久精品99国产国产精| 久久先锋影音av鲁色资源网| 成人在线一区二区三区| 五月婷婷激情综合网| 久久久国产一区二区三区四区小说| av一区二区久久| 韩国精品主播一区二区在线观看 | 奇米精品一区二区三区在线观看 | 亚洲一区二区视频在线观看| 精品国产一区二区三区久久影院 | 成人网男人的天堂| 夜夜操天天操亚洲| 日韩免费高清av| 欧日韩精品视频| 91福利在线播放| av午夜精品一区二区三区| 久久99日本精品| 亚洲成av人在线观看| 久久黄色级2电影| 视频一区中文字幕| 一区在线观看视频| 日韩欧美国产一区在线观看| 91成人网在线| 色综合久久中文综合久久97| 99re66热这里只有精品3直播| 狠狠网亚洲精品| 另类小说图片综合网| 五月婷婷色综合| 视频一区视频二区中文| 亚洲电影在线免费观看| 亚洲h动漫在线| 国产精品成人在线观看| 国产伦精品一区二区三区视频青涩| 亚洲最大的成人av| 亚洲在线视频网站| 日韩av一区二区三区四区| 亚洲欧美日韩国产一区二区三区 | 日本视频在线一区| 久久精品国产网站| 精品一区二区影视| 91猫先生在线| 欧美成人免费网站| 中文字幕在线观看一区二区| 亚洲国产视频在线| 国产黄色精品网站| 色综合久久99| 国产精品网曝门| 亚洲一区二区成人在线观看| 极品少妇一区二区| 亚洲高清视频中文字幕| 91久久精品午夜一区二区| 在线播放日韩导航| 欧美日精品一区视频| 久久老女人爱爱| 国产精品激情偷乱一区二区∴| 99久久精品国产毛片| 午夜成人免费电影| 综合自拍亚洲综合图不卡区| 91国偷自产一区二区三区观看| 日韩精品三区四区| 亚洲一区二区三区三| 91丨porny丨最新| 精油按摩中文字幕久久| 一区二区欧美国产| 精品国产一区二区三区不卡| 欧美私模裸体表演在线观看| 国产经典欧美精品| 蜜桃久久久久久| 日韩av电影天堂| 久久人人爽爽爽人久久久| 91黄视频在线观看| 丁香啪啪综合成人亚洲小说| 麻豆一区二区99久久久久| 一区二区三区四区国产精品| 中文av一区特黄| 国产午夜精品久久久久久久| 欧美日韩另类一区| 99久久er热在这里只有精品15| 激情偷乱视频一区二区三区| 日韩精品久久久久久| 亚洲欧美日韩久久| 樱花草国产18久久久久| 亚洲综合在线五月| 亚洲一线二线三线视频| 五月婷婷激情综合|