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

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

?? untpasscriptcompile.pas

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

  if aByte <> rcidStringChar then Error('字符串常量應(yīng)以單引號開頭!');

  aByte := ReadByte;

  str := '';

  while (aByte <> rcidStringChar) and (aByte <> rcidEndOfFile) and (aByte <> rcidEndOfLine)do
      begin
      str := str + char(aByte);
      aByte := ReadByte;
      end;

  if aByte <> rcidStringChar then Error('字符串常量沒有結(jié)束!');

  Result := SetToken(udStringConst, str);
end;

function TTokenReader.IsReserveChar(aChar: char): boolean;
var
  aByte: byte;
begin
  aByte := byte(aChar);

  case aByte of
    rcidEndOfFile,                // 0
    rcidEndOfLine,                 // 10
    rcidNewLine,                   // $0a
    rcidPower,                     // ^
    rcidPoint,                     // .
    rcidDelimeter,                 // ;
    rcidGreater,                   // >
    rcidLess,                      // <
    rcidComma,                     // ,
    rcidPlus,                      // +
    rcidMinus,                     // -
    rcidSlash,                     // /
    rcidStar,                      // *
    rcidOpenBracket,               // (
    rcidCloseBracket,              // )
    rcidOpenComment,               // {
    rcidCloseComment,              // }
    rcidEqual,                     // =
    rcidNotEqual,                  // #
    rcid2Points,                   // :
    rcidStringChar,                // '
    rc2idStringChar,               // "
    rcidSqopenBracket,             // [
    rcidSqcloseBracket:            // ]
      Result := True;

   else Result := False; 
  end;
end;

function TTokenReader.Next2Byte: byte;
var
  i: integer;
begin
  i := FCurPos;

  ReadByte;
  Result := ReadByte;

  FCurPos := i;
end;

function TTokenReader.Next2Token: TToken;
var
  tmp: TToken;
  i: integer;
begin
  tmp := FCurToken;
  i := FCurPos;

  ReadToken;
  Result := FCurToken;

  ReadToken;
  Result := FCurToken;
  
  FCurToken := tmp;
  FCurPos := i;

end;

function TTokenReader.NextByte: Byte;
var
  i: integer;
begin
  i := FCurPos;
  Result := ReadByte;
  FCurPos := i;
end;

function TTokenReader.NextToken: TToken;
var
  tmp: TToken;
  i: integer;
begin
  tmp := FCurToken;
  i := FCurPos;

  ReadToken;
  Result := FCurToken;
  
  FCurToken := tmp;
  FCurPos := i;
end;

function TTokenReader.ReadByte: byte;
begin
  if FCurPos > FSourceLen then
    begin
    Result := rcidEndOfFile;
    exit;
    end;

  Result := byte(FSourceCode[FCurPos]);

  Inc(FCurPos);
end;

function TTokenReader.ReadToken: TToken;
var
  aByte: byte;
begin
  FilterBlackAndNote;

  aByte := NextByte;

  while aByte <> rcidEndOfFile do
    begin
    if aByte = rcidStringChar then
        begin
        FCurToken := getStringConst;
        Result := FCurToken;
        exit;
        end;

    if IsReserveChar(char(aByte)) then
        begin
        FCurToken := getReserveChar;
        Result := FCurToken;
        exit;
        end;

    if char(aByte) in FirstIdentChar then
        begin
        FCurToken := getIdentOrReservWord;
        Result := FCurToken;
        exit;
        end;

    if char(aByte) in Digit then
        begin
        FCurToken := getNumberConst;
        Result := FCurToken;
        exit;
        end;

    Error('無法識別的字符' + char(aByte));
    end;


  FCurToken := SetToken(rcidEndOfFile, 0);
  Result := FCurToken;

end;

procedure TTokenReader.SetSourceCode(aSrcCode: string);
begin
  FSourceCode := aSrcCode;
  FSourceLen := Length(FSourceCode);
  FCurPos := 1;
end;

function TTokenReader.SetToken(ID: integer; V: Variant): TToken;
begin
  Result.ID := ID; Result.Data := V;
end;

{ TStack }

procedure TStack.Clear;
begin
  FCount := 0;
  setLength(FDatas, 30);  
end;

constructor TStack.Create;
begin
  setLength(FDatas, 100);
  FCount := 0;
end;

destructor TStack.Destroy;
begin
  setLength(FDatas, 0);
  
  inherited;
end;

function TStack.getData(aIndex: integer): variant;
begin
  if aIndex < 0 then raise Exception.Create('參數(shù)不應(yīng)小于0!');
  if aIndex >= FCount then raise Exception.Create('參數(shù)大于堆棧上限!');

  Result := FDatas[aIndex];
end;

function TStack.Pop: variant;
begin
  if FCount = 0 then raise Exception.Create('堆棧下溢出!');

  Result := FDatas[FCount - 1];

  Dec(FCount);
end;

procedure TStack.Put(v: Variant);
begin
  if FCount >= Length(FDatas) then
    begin
    setLength(FDatas, FCount + 100);
    end;

  FDatas[FCount] := v;

  Inc(FCount);
end;


{ TVMCPU }

procedure TVMCPU.Clear;
begin
  FDynaVarStack.Clear;
  FCallStack.Clear;
  FStack.Clear;
end;

constructor TVMCPU.Create(aProgram: TAnalyProgram);
var
  i, j: integer;
  aUserVar, aUserVar2: TUserVar;
  aMethod, aMethod2: TUserMethod;
begin
  //其實是克隆aPrgram中的變量和方法,寫得有點冗余
  FVarList := TUserVarList.Create;

  for i := 0 to aProgram.VarList.Count - 1 do
    begin
    aUserVar := TUserVar(aProgram.VarList.Items[i]);
    FVarList.AddVar(aUserVar.ID, aUserVar.Name, aUserVar.Value,
                    aUserVar.DataType, aUserVar.VarType, aUserVar.OffPos);
    end;

  FConstVarList := TUserVarList.Create;
  
  for i := 0 to aProgram.ConstVarList.Count - 1 do
    begin
    aUserVar := TUserVar(aProgram.ConstVarList.Items[i]);
    FConstVarList.AddVar(aUserVar.ID, aUserVar.Name, aUserVar.Value,
                    aUserVar.DataType, aUserVar.VarType, aUserVar.OffPos);
    end;


  FMethodList := TUserMethodList.Create;

  for i := 0 to aProgram.MethodList.Count - 1 do
    begin
    aMethod := TUserMethod(aProgram.MethodList.Items[i]);
    aMethod2 := FMethodList.AddMethod(aMethod.ID, aMethod.Name, aMethod.MethodType, 0, aMethod.Addr);
    
    aMethod2.SysMethodFlag := aMethod.SysMethodFlag;
    aMethod2.SysProcMethod := aMethod.SysProcMethod;

    for j := 0 to aMethod.ParamList.Count - 1 do
      begin
      aUserVar := TUserVar(aMethod.ParamList.Items[j]);
      aUserVar2 := FVarList.getVarByID(aUserVar.ID);
      
      aMethod2.AddParamVar(aUserVar2);
      end;

    for j := 0 to aMethod.DynaVarList.Count - 1 do
      begin
      aUserVar := TUserVar(aMethod.DynaVarList.Items[j]);
      aUserVar2 := FVarList.getVarByID(aUserVar.ID);
      
      aMethod2.AddDynaVar(aUserVar2);
      end;
    end;

  FVMPCodeList := TVMPCodeList.Create;

  for i := 0 to aProgram.FVMPCodeList.Count - 1 do
    begin
    FVMPCodeList.AddVMPCode(aProgram.FVMPCodeList.VMPCodeList[i].Cmd,
                            aProgram.FVMPCodeList.VMPCodeList[i].P1,
                            aProgram.FVMPCodeList.VMPCodeList[i].P2);
    end;

  FCallStack := TCallStack.Create;
  FDynaVarStack := TDynaVarStack.Create;
  FStack := TStack.Create;


end;

destructor TVMCPU.Destroy;
begin
  FreeAndNil(FVarList);
  FreeAndNil(FConstVarList);

  FreeAndNil(FMethodList);

  FreeAndNil(FDynaVarStack);
  FreeAndNil(FStack);
  FreeAndNil(FCallStack);

  FreeAndNil(FVMPCodeList);
  inherited;
end;

{ TAnalyzeDeclare }

procedure TAnalyDeclare.Analy;
begin
  while true do
    begin
    case FTokenReader.NextToken.ID of
      rwidVar: begin
               FTokenReader.ReadToken;
               Variables;
               end;

      rwidProcedure,
      rwidFunction: begin
                    Methods;
                    end;

      else break;
      end;

    end;
end;

class procedure TAnalyDeclare.Analy(aCodeMaker: TCodeMaker;
  aTokenReader: TTokenReader);
var
  aAnaly: TAnalyDeclare;
begin
  aAnaly := TAnalyDeclare.Create(aCodeMaker, aTokenReader);
try
  aAnaly.Analy;

  finally
  FreeAndNil(aAnaly);
  end;
end;

constructor TAnalyDeclare.Create(aCodeMaker: TCodeMaker; aTokenReader: TTokenReader);
begin
  FCodeMaker := aCodeMaker;
  FTokenReader := aTokenReader;
end;

destructor TAnalyDeclare.Destroy;
begin
  FCodeMaker := nil;
  FTokenReader := nil;
  
  inherited;
end;

procedure TAnalyDeclare.Methods;
var
  aMethodAnaly: TAnalyMethod;
begin
  aMethodAnaly := TAnalyMethod.Create(FCodeMaker, FTokenReader);
  
try
  while (FTokenReader.NextToken.ID = rwidProcedure) or (FTokenReader.NextToken.ID = rwidFunction) do
    begin

    aMethodAnaly.FAnalyDepth := FCodeMaker.AnalyDepth + 1;
    aMethodAnaly.Analy;
    end;

  finally
  FreeAndNil(aMethodAnaly);
  end;

end;

procedure TAnalyDeclare.Variables;
var
  i: integer;
  aLevel: integer;
  aUserVar: TUserVar;
  aList: TList;
begin
  aList := TList.Create;

try
  while true do
    begin
    FTokenReader.ReadToken;

    if FTokenReader.CurToken.ID <> udIdentifier then FTokenReader.Error('期望變量!');

    aUserVar := FCodeMaker.FindVarByName(FTokenReader.CurToken.Data, aLevel);
    if (aUserVar <> nil) and (aLevel = 0) then FTokenReader.Error(FTokenReader.CurToken.data + '變量重復(fù)聲明!');

    aUserVar := FCodeMaker.RegisterVar(FTokenReader.CurToken.Data);
    aList.Add(Pointer(aUserVar));

    while FTokenReader.NextToken.ID = rcidComma do
        begin
        FTokenReader.ReadToken;

        FTokenReader.ReadToken;

        if FTokenReader.CurToken.ID <> udIdentifier then FTokenReader.Error('期望變量!');

        aUserVar := FCodeMaker.FindVarByName(FTokenReader.CurToken.Data, aLevel);
        if (aUserVar <> nil) and (aLevel = 0) then FTokenReader.Error(FTokenReader.CurToken.data + '變量重復(fù)聲明!');

        aUserVar := FCodeMaker.RegisterVar(FTokenReader.CurToken.Data);
        aList.Add(Pointer(aUserVar));
        end;

    if FTokenReader.NextToken.ID = rcid2Points then
        begin
        FTokenReader.ReadToken;
        FTokenReader.ReadToken;

        for i := 0 to aList.Count - 1 do
            begin
            aUserVar := TUserVar(aList.Items[i]);
            aUserVar.FDataType := getDataType(FTokenReader.CurToken.Data);
            end;

        FTokenReader.getDelimeter;
        end;

    if (FTokenReader.NextToken.ID <= ReserveWordEnd) and (FTokenReader.NextToken.ID >= ReserveWordBase) then exit;
    end;

    finally
    FreeAndNil(aList);
    end;

end;

function TVMCPU.GetConstVarList: TUserVarList;
begin
  Result := FConstVarList;
end;

function TVMCPU.GetMethodList: TUserMethodList;
begin
  Result := FMethodList;
end;

function TVMCPU.GetVarList: TUserVarList;
begin
  Result := FVarList;
end;

function TVMCPU.GetVMPCodeList: TVMPCodeList;
begin
  Result := FVMPCodeList;
end;

procedure TVMCPU.Run;
var
  i, j: integer;
  cmd, p1, p2: integer;
  aUserVar: TUserVar;
  v1, v2: variant;
  aCallInfo: TCallInfo;
  aMethod: TUserMethod;
  aDynaAddr: integer;
  aUserVarList: TUserVarList;
begin
  i := 0;

  Clear;

  aUserVarList := TUserVarList.Create;
   
  while i < FVMPCodeList.Count do
    begin
    cmd := FVMPCodeList.VMPCodeList[i].Cmd;
    p1 := FVMPCodeList.VMPCodeList[i].P1;
    p2 := FVMPCodeList.VMPCodeList[i].P2;

    case cmd of
         ocMov: begin
                aUserVar := FVarList.getVarByID(p2);

                if aUserVar.VarType = vtStatic then FStack.Put(aUserVar.Value)
                    else if (aUserVar.VarType = vtDynamic) or (aUserVar.VarType = vtParam) then
                              begin
                              aCallInfo := FCallStack.GetPreCallInfo(p1);

                              aDynaAddr := aCallInfo.BaseDynaVarAddr + aUserVar.OffPos;
                              
                              FStack.Put(FDynaVarStack.GetVarByPos(aDynaAddr).Value);
                              end;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品日韩一区二区三区| 日韩三级在线观看| 亚洲成人免费视频| 久久久久久麻豆| 欧美色网一区二区| 国产精品亚洲一区二区三区妖精| 亚洲一区免费观看| 久久免费电影网| 欧美日韩久久久久久| 不卡在线视频中文字幕| 久久精品国产**网站演员| 亚洲黄色av一区| 国产日产欧美一区二区三区| 91精品国产综合久久精品麻豆| 91视频一区二区三区| 国产成人午夜电影网| 免费国产亚洲视频| 亚洲成av人片在线观看无码| 亚洲视频一区二区免费在线观看| 久久在线观看免费| 欧美一级片在线观看| 欧洲色大大久久| 99在线精品观看| 国产成人在线免费| 精品影视av免费| 日本sm残虐另类| 午夜免费久久看| 亚洲一区二区三区免费视频| 国产精品欧美一级免费| 久久精品亚洲乱码伦伦中文| 日韩欧美区一区二| 日韩欧美视频在线| 日韩欧美资源站| 日韩午夜激情av| 日韩欧美亚洲国产另类 | 久久精品免费看| 午夜精品免费在线观看| 亚洲国产另类精品专区| 亚洲一区二区视频在线观看| 亚洲综合视频在线观看| 一区二区三区中文字幕电影| 依依成人综合视频| 亚洲综合999| 午夜电影网亚洲视频| 五月综合激情婷婷六月色窝| 丝袜诱惑亚洲看片| 日本在线不卡视频一二三区| 青青青伊人色综合久久| 日本不卡123| 国产乱人伦精品一区二区在线观看 | 国产精品一区在线观看乱码| 久久99精品国产麻豆婷婷| 激情小说欧美图片| 国产精品99久久久久久有的能看 | 国产精品国产自产拍高清av | 久久精品国产99久久6| 日本一区中文字幕| 九九视频精品免费| 国产成人午夜视频| av网站免费线看精品| 色婷婷一区二区| 欧美日韩国产高清一区二区三区 | 91在线播放网址| 欧美日韩视频在线观看一区二区三区| 欧美日韩免费观看一区二区三区| 91精品国产综合久久久久| 久久综合国产精品| 亚洲色图都市小说| 日韩精品乱码av一区二区| 精品午夜久久福利影院| 成+人+亚洲+综合天堂| 欧美日韩三级一区| 久久嫩草精品久久久精品| 中文字幕亚洲一区二区av在线| 一级精品视频在线观看宜春院| 视频一区国产视频| 高清久久久久久| 欧美视频三区在线播放| 欧美精品一区二区久久久| 亚洲视频小说图片| 美女视频一区二区| 91丨porny丨最新| 91麻豆精品国产无毒不卡在线观看| 久久久午夜精品理论片中文字幕| 亚洲精品视频观看| 精品一区二区影视| 色88888久久久久久影院按摩| 日韩视频在线观看一区二区| 国产精品美日韩| 日韩不卡一区二区三区| 不卡一区在线观看| 日韩欧美一区二区不卡| 亚洲精品久久久蜜桃| 国产一区二区日韩精品| 欧美又粗又大又爽| 日本一区二区不卡视频| 三级影片在线观看欧美日韩一区二区 | 久久久久久久久久久黄色| 亚洲黄网站在线观看| 国产麻豆一精品一av一免费| 欧美日韩在线播放一区| 中文字幕在线视频一区| 精品一区二区三区免费视频| 欧美自拍偷拍一区| 国产精品网友自拍| 激情五月播播久久久精品| 欧美日韩成人综合天天影院| 成人欧美一区二区三区黑人麻豆| 韩国精品免费视频| 在线不卡免费av| 亚洲专区一二三| 99九九99九九九视频精品| 久久综合狠狠综合| 久久国产生活片100| 精品视频一区 二区 三区| 国产精品国产三级国产aⅴ中文| 韩国精品免费视频| 欧美大片顶级少妇| 日本韩国欧美一区| 国产精品久线在线观看| 国产在线视频精品一区| 日韩欧美色电影| 日韩av电影天堂| 欧美另类变人与禽xxxxx| 亚洲最快最全在线视频| 91在线精品一区二区三区| 久久精品日产第一区二区三区高清版| 免费黄网站欧美| 欧美成人aa大片| 日韩二区在线观看| 欧美一区二区在线免费播放| 午夜精品在线看| 91精品久久久久久久久99蜜臂| 亚洲大片在线观看| 欧美精品免费视频| 午夜欧美视频在线观看| 欧美精品乱码久久久久久按摩| 天天亚洲美女在线视频| 91精品国产综合久久精品app | 日韩精品1区2区3区| 欧美电影一区二区| 日本不卡一二三区黄网| 91精品国产色综合久久不卡蜜臀| 天堂av在线一区| 日韩欧美aaaaaa| 国产精一品亚洲二区在线视频| 久久久久亚洲综合| 懂色av一区二区夜夜嗨| 国产精品国产三级国产aⅴ入口| 97国产精品videossex| 一区二区三区日韩在线观看| 欧美日韩精品一区二区天天拍小说 | 国产色产综合产在线视频| 高清不卡一二三区| 亚洲视频网在线直播| 91福利在线看| 日韩精品乱码av一区二区| 精品国免费一区二区三区| 国产精品99久久久久久久女警| 国产精品视频在线看| 在线观看视频欧美| 视频一区欧美日韩| 国产午夜精品理论片a级大结局| av综合在线播放| 亚洲午夜精品一区二区三区他趣| 欧美精品视频www在线观看| 久久99国产精品尤物| 国产日韩三级在线| 欧美亚洲自拍偷拍| 久久91精品久久久久久秒播| 中文字幕国产一区二区| 欧美亚洲国产一区在线观看网站| 日本亚洲免费观看| 国产精品无圣光一区二区| 欧美在线看片a免费观看| 久久99精品国产91久久来源| 亚洲欧美日韩国产综合在线| 欧美一区二区三区四区视频| www日韩大片| 91网上在线视频| 日本午夜一区二区| 国产精品人妖ts系列视频| 欧美日韩中文另类| 成人性视频免费网站| 亚洲国产日韩a在线播放| 国产日韩欧美在线一区| 欧美日韩视频不卡| www.欧美色图| 日本不卡123| 亚洲精品五月天| 国产亚洲女人久久久久毛片| 欧美羞羞免费网站| 国产自产高清不卡| 亚洲一区二区三区免费视频| 欧美激情一区二区三区在线| 日韩一级片在线观看| 在线观看欧美精品| 成人精品电影在线观看| 久国产精品韩国三级视频| 亚洲成人精品一区|