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

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? untcompile.pas

?? 運(yùn)用delphi編寫的小型解釋器
?? PAS
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(hào):
unit untCompile;

interface

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

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'];


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;
  ocSto = 53;


{ 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;
    FCount: integer;

  protected
    procedure AddWord(aWordName: String; aWordID: integer); virtual;

  public
    constructor Create;
    destructor Destroy; override;


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

    property Count: integer read FCount;
  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 = (dtUnknown, 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: TStringList;

    FDynaFlag: boolean;

    FOffPos: integer;

  public
    constructor Create;
    destructor Destroy; override;
    procedure AddParam(aIdent: TIdent);

    property Name: string read FName write FName;
    property ID: integer read FID write FID;
    property IdentType: TIdentType read FIdentType write FIdentType;
    property Params: TStringList read FParams write FParams;
    property Value: variant read FValue write FValue;
    property DataType: TDataType read FDataType write FDataType;
    property DynaFlag: boolean read FDynaFlag write FDynaFlag;
    property OffPos: integer read FOffPos write FOffPos;
  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;

    function getText: string;
    procedure SetValue(aID: integer; aValue: variant);

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

  TConstList = class(TIdentList)
  private
    FConstID: integer;

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

  TVariableList = class(TIdentList)
  private
    FID: integer;

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

  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;

    function getText: string;

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

    procedure Declarations(aPreFix: string = '');
    procedure Variables(aPreFix: string = '');

    function genVarName(aPreFix, aName: string): string;

    procedure Statement(aPreFix: string = '');
    procedure Condition;
    procedure Expression;
    procedure Term;
    procedure Factor;

    function ProcDef: integer;
    procedure ProcParam(aProcName: string);
    procedure ProcBody(aID: integer);

    procedure RaiseError(aErrStr: string);

    function getDataType(aStr: string): TDataType;

    function getVariableByName(aName: string): TIdent; overload;
    function getVariableByName(aPreFix, aName: string): TIdent; overload;

  public
    constructor Create;
    destructor Destroy; override;

    procedure Compile;

    function getVariables: string;
    function getConsts: string;
    function getPCode: string;

    procedure Run;

    property SrcCode: string read FSrcCode write FSrcCode;

  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;

var
  ResWords: TResWords;
  ResConsts: TResConsts;
  Stack: TStack;
  
  function getPCodeName(aCmd: integer): string;
implementation

function getPCodeName(aCmd: integer): string;
begin
  Result := 'unknown';

  if aCmd = ocMov then Result := 'Mov';
  if aCmd = ocLoadConst then Result := 'LoadConst';
  if aCmd = ocSto then Result := 'STO';
  if aCmd = ocAdd then Result := 'Add';
  if aCmd = ocSub then Result := 'Sub';
  if aCmd = ocMul then Result := 'Mul';
  if aCmd = ocDiv then Result := 'Div';
  if aCmd = ocGreater then Result := '>';
  if aCmd = ocGreaterEqual then Result := '>=';
  if aCmd = ocLess then Result := '<';
  if aCmd = ocLessEqual then Result := '<=';
  if aCmd = ocNotEqual then Result := '<>';
  if aCmd = ocIfFalseGoto then Result := 'IfFalseGoto';
  if aCmd = ocGoto then Result := 'Goto';
end;

{ 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 := 1;
  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;

  tmp := NextToken;
  
  while (tmp.ID = idPlus) or (tmp.ID = idMinus) or (tmp.ID = idOr) or (tmp.ID = idXor) do
    begin
    ReadToken;
    
    Case tmp.ID of
        idPlus:
          Begin
          Term; 
          FProgList.PutCode(ocAdd, 0, 0);
          End;

        idMinus:
          Begin
          Term;
          FProgList.PutCode(ocSub, 0, 0);
          End;

        idOr:
          Begin
          Term;
          FProgList.PutCode(ocOr, 0, 0);
          End;

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

    tmp := NextToken;
  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 + '沒(méi)有定義');

                    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('期望逗號(hào)!');
end;

procedure TCompile.getdelimeter;
begin
  ReadToken;

  If (FCurToken.ID <> idDelimeter) then raiseError('期望分號(hào)!');
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('期望標(biāo)識(shí)符!');

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

  If Result < 0 then raiseError('沒(méi)有定義變量' + 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

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91在线无精精品入口| 久久精品视频免费| 日韩欧美中文字幕公布| 日韩欧美电影在线| 国产亚洲va综合人人澡精品| 国产精品毛片大码女人| 一区二区三区中文字幕精品精品| 亚洲午夜在线视频| 久久9热精品视频| 成人丝袜18视频在线观看| 日本丶国产丶欧美色综合| 在线综合亚洲欧美在线视频| ww亚洲ww在线观看国产| 综合久久久久久久| 日韩电影在线看| 国产成人99久久亚洲综合精品| 99re亚洲国产精品| 91麻豆精品国产91久久久久 | 亚洲视频一区二区在线观看| 亚洲国产精品一区二区尤物区| 日本中文字幕一区二区视频| gogogo免费视频观看亚洲一| 欧美日韩午夜影院| 国产午夜精品久久久久久久 | 在线欧美日韩精品| 精品久久久久久最新网址| 日韩一区在线看| 美女高潮久久久| 91福利在线导航| 久久久久久夜精品精品免费| 亚洲午夜精品在线| 国产69精品久久久久777| 欧美三级电影精品| 国产精品看片你懂得| 日韩av成人高清| 色偷偷88欧美精品久久久 | 国产麻豆91精品| 色94色欧美sute亚洲线路一久| 欧美成人aa大片| 一区二区三区四区不卡在线| 国产精品一区二区你懂的| 555夜色666亚洲国产免| 亚洲欧美成人一区二区三区| 国内成人自拍视频| 欧美人牲a欧美精品| 亚洲欧美一区二区三区极速播放 | 欧美日韩精品专区| 成人免费在线播放视频| 国产一区二区免费视频| 欧美老人xxxx18| 亚洲色图视频免费播放| 国产精品888| 欧美不卡一区二区| 五月婷婷另类国产| 在线观看三级视频欧美| 国产精品毛片大码女人| 国产成人综合精品三级| 日韩欧美国产电影| 日韩国产在线观看一区| 欧美日韩一区国产| 亚洲男人电影天堂| 97se亚洲国产综合在线| 中文字幕欧美国产| 国产米奇在线777精品观看| 日韩一级欧美一级| 午夜影院久久久| 欧美亚洲日本国产| 一区二区三区久久久| 99精品视频一区二区三区| 中文字幕av一区 二区| 国产乱码精品一区二区三区av| 日韩美女在线视频| 免费欧美日韩国产三级电影| 欧美老肥妇做.爰bbww| 天堂影院一区二区| 欧美日产在线观看| 天涯成人国产亚洲精品一区av| 精品污污网站免费看| 一区二区不卡在线视频 午夜欧美不卡在 | 色视频一区二区| 亚洲美女少妇撒尿| 色综合久久中文综合久久牛| 亚洲欧美成aⅴ人在线观看| 97久久精品人人爽人人爽蜜臀| 欧美韩日一区二区三区四区| 国产91精品入口| 亚洲欧洲www| 色综合久久综合中文综合网| 亚洲黄色av一区| 欧美色图12p| 午夜电影一区二区| 91精品国产综合久久久蜜臀图片 | 日韩视频免费观看高清完整版在线观看 | 狠狠色丁香久久婷婷综| 久久久久久免费网| zzijzzij亚洲日本少妇熟睡| 国产精品久久久久久久久久久免费看| 成人网在线免费视频| 亚洲女人小视频在线观看| 在线中文字幕一区二区| 日本在线播放一区二区三区| 日韩女优毛片在线| 国产成人免费视频一区| 成人免费在线视频观看| 欧美三电影在线| 伦理电影国产精品| 中文字幕av一区二区三区| 色哟哟国产精品| 石原莉奈一区二区三区在线观看| 91精品免费观看| 高清久久久久久| 一区二区三区毛片| 精品久久久三级丝袜| 99久久99久久综合| 天天操天天综合网| 国产午夜精品理论片a级大结局| 91视频免费播放| 日韩av一区二区三区| 中文字幕欧美激情| 欧美久久久影院| 国产·精品毛片| 亚洲va韩国va欧美va| 久久综合久久综合久久| 色嗨嗨av一区二区三区| 激情五月激情综合网| 亚洲精品亚洲人成人网在线播放| 日韩一区二区免费在线电影| 99精品国产视频| 日本aⅴ精品一区二区三区| 中文字幕精品—区二区四季| 欧美日韩中文字幕一区二区| 国产伦精品一区二区三区视频青涩| 中日韩av电影| 欧美网站一区二区| 国产成人精品午夜视频免费| 亚洲精品免费播放| 日韩女优av电影| 国产一区二区成人久久免费影院 | 国产精品亚洲第一区在线暖暖韩国| 中文在线一区二区| 欧美日韩小视频| 韩国毛片一区二区三区| 中文在线资源观看网站视频免费不卡| 欧美调教femdomvk| 国产精品一区三区| 一区二区在线观看免费视频播放 | 蜜桃传媒麻豆第一区在线观看| 国产三区在线成人av| 色婷婷综合久久久| 国产制服丝袜一区| 亚洲高清中文字幕| 国产人伦精品一区二区| 日本高清不卡视频| 99久久久免费精品国产一区二区| 蜜臀av性久久久久av蜜臀妖精| 国产精品视频第一区| 欧美理论片在线| 久久精品99久久久| 午夜亚洲国产au精品一区二区| 久久久国产综合精品女国产盗摄| 精品污污网站免费看| 成人av在线播放网址| 国产精品一线二线三线| 亚洲va欧美va人人爽| 综合久久国产九一剧情麻豆| 久久一夜天堂av一区二区三区| 色综合一区二区三区| 国产成人免费网站| 久久机这里只有精品| 亚洲一区二区三区四区在线免费观看 | 久久九九国产精品| 91麻豆精品国产91久久久| 色综合久久中文综合久久97| 国产曰批免费观看久久久| 男女视频一区二区| 亚洲图片欧美视频| 国产农村妇女毛片精品久久麻豆| 欧美一区二区在线播放| 国产成人自拍在线| 狠狠色丁香婷婷综合| 五月婷婷另类国产| 亚洲午夜精品在线| 亚洲色图欧美激情| 国产精品网站在线观看| 国产精品精品国产色婷婷| 国产亚洲欧美一区在线观看| 精品久久久久久久人人人人传媒 | 夜夜嗨av一区二区三区网页 | 成人综合在线网站| 国内精品免费在线观看| 蜜臀av一区二区| 黄页视频在线91| 精品无人区卡一卡二卡三乱码免费卡| 亚洲国产美女搞黄色| 亚洲激情第一区| 亚洲成人精品一区二区| 亚洲国产综合人成综合网站| 亚洲激情五月婷婷| 亚洲影院在线观看| 免费在线看一区|