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

📄 compiler.pas

📁 一个编译器源代码。用法看里面的“使用说明”
💻 PAS
📖 第 1 页 / 共 2 页
字号:
      end;
      Coder.FuncVar('result',LowerCase(Copy(PPart(Parser.Parts[i]).Extra,2,Length(PPart(Parser.Parts[i]).Extra))),'0');
    end
   else if PPart(Parser.Parts[i]).PartType = ptDLLFunc then
   begin
      // WriteToScreen('Function import: ' + PPart(Parser.Parts[i]).Dll + ' -> ' + PPart(Parser.Parts[i]).Func);
      // Call Function
      // AssignS <- EAX
   end
   else if PPart(Parser.Parts[i]).PartType = ptFunction then
   begin
    if PPart(Parser.Parts[i]).Func = 'begin' then
    begin
      if Coder.InStub then Coder.FuncEnd;
      Coder.InStub := False;
      Coder.AddSymbol('start',Coder.CurrSize,stLabel,Coder.Size(True));
      hb := True;
    end
    else if PPart(Parser.Parts[i]).Func = 'stub' then
    begin
      Coder.InStub := True;
      Coder.FuncBegin;
    end
    else if PPart(Parser.Parts[i]).Func = 'output' then
    begin
      NotReturn;
      NotExtra;
      if (PPart(Parser.Parts[i]).ParamCount >= 1) and (PPart(Parser.Parts[i]).ParamCount < 11) then
      begin
        for ii := 0 to PPart(Parser.Parts[i]).ParamCount - 1 do
        begin
          X[ii] := Coder.GetNumber(PPart(Parser.Parts[i]).Params[ii]);
        end;
        Coder.AddBytes(X,PPart(Parser.Parts[i]).ParamCount);
      end
      else
        Parser.AddMsg(WrongCountOfArgs,PPart(Parser.Parts[i]).CurrFile,PPart(Parser.Parts[i]).LineNum);
    end
    else if PPart(Parser.Parts[i]).Func = 'writeln' then
    begin
      NotReturn;
      NotExtra;
      if PPart(Parser.Parts[i]).ParamCount = 1 then
      begin
        GetString(PPart(Parser.Parts[i]).Params[0]);
        Coder.FuncWriteLn;
      end
      else if PPart(Parser.Parts[i]).ParamCount = 4 then
      begin
        Coder.FuncMoveCursor(PPart(Parser.Parts[i]).Params[3],PPart(Parser.Parts[i]).Params[2]);
        Coder.FuncSetColor(PPart(Parser.Parts[i]).Params[1]);
        GetString(PPart(Parser.Parts[i]).Params[0]);
        Coder.FuncWriteLn;
      end
      else
        Parser.AddMsg(WrongCountOfArgs,PPart(Parser.Parts[i]).CurrFile,PPart(Parser.Parts[i]).LineNum);
    end
    else if PPart(Parser.Parts[i]).Func = 'write' then
    begin
      NotReturn;
      NotExtra;
      if PPart(Parser.Parts[i]).ParamCount = 1 then
      begin
        GetString(PPart(Parser.Parts[i]).Params[0]);
        Coder.FuncWrite;
      end
      else if PPart(Parser.Parts[i]).ParamCount = 4 then
      begin
        Coder.FuncMoveCursor(PPart(Parser.Parts[i]).Params[3],PPart(Parser.Parts[i]).Params[2]);
        Coder.FuncSetColor(PPart(Parser.Parts[i]).Params[1]);
        GetString(PPart(Parser.Parts[i]).Params[0]);
        Coder.FuncWrite;
      end
      else
        Parser.AddMsg(WrongCountOfArgs,PPart(Parser.Parts[i]).CurrFile,PPart(Parser.Parts[i]).LineNum);
    end
    else if PPart(Parser.Parts[i]).Func = 'color.set' then
    begin
      NotReturn;
      NotExtra;
      if PPart(Parser.Parts[i]).ParamCount = 1 then
        Coder.FuncSetColor(PPart(Parser.Parts[i]).Params[0])
      else if PPart(Parser.Parts[i]).ParamCount = 2 then
        Coder.FuncSetColor(PPart(Parser.Parts[i]).Params[0],PPart(Parser.Parts[i]).Params[1])
      else
        Parser.AddMsg(WrongCountOfArgs,PPart(Parser.Parts[i]).CurrFile,PPart(Parser.Parts[i]).LineNum);
    end
    else if PPart(Parser.Parts[i]).Func = 'cursor.get' then
    begin
      NotReturn;
      NotExtra;
      if PPart(Parser.Parts[i]).ParamCount = 2 then
        Coder.FuncGetCursor(PPart(Parser.Parts[i]).Params[1],PPart(Parser.Parts[i]).Params[0])
      else
        Parser.AddMsg(WrongCountOfArgs,PPart(Parser.Parts[i]).CurrFile,PPart(Parser.Parts[i]).LineNum);
    end
    else if PPart(Parser.Parts[i]).Func = 'cursor.set' then
    begin
      NotReturn;
      NotExtra;
      if PPart(Parser.Parts[i]).ParamCount = 2 then
        Coder.FuncMoveCursor(PPart(Parser.Parts[i]).Params[1],PPart(Parser.Parts[i]).Params[0])
      else
        Parser.AddMsg(WrongCountOfArgs,PPart(Parser.Parts[i]).CurrFile,PPart(Parser.Parts[i]).LineNum);
    end
    else if PPart(Parser.Parts[i]).Func = 'screen.clear' then
    begin
      NotReturn;
      NotExtra;
      if PPart(Parser.Parts[i]).ParamCount = 0 then
        Coder.FuncClearScreen
      else
        Parser.AddMsg(WrongCountOfArgs,PPart(Parser.Parts[i]).CurrFile,PPart(Parser.Parts[i]).LineNum);
    end
    else if PPart(Parser.Parts[i]).Func = 'beep' then
    begin
      NotReturn;
      NotExtra;
      if PPart(Parser.Parts[i]).ParamCount = 0 then
        Coder.FuncBeep
      else
        Parser.AddMsg(WrongCountOfArgs,PPart(Parser.Parts[i]).CurrFile,PPart(Parser.Parts[i]).LineNum);
    end
    else if PPart(Parser.Parts[i]).Func = 'wait' then
    begin
      NotReturn;
      NotExtra;
      if PPart(Parser.Parts[i]).ParamCount = 0 then
        Coder.FuncWait
      else
        Parser.AddMsg(WrongCountOfArgs,PPart(Parser.Parts[i]).CurrFile,PPart(Parser.Parts[i]).LineNum);
    end
    else if PPart(Parser.Parts[i]).Func = 'loop' then
    begin
      if PPart(Parser.Parts[i]).ParamCount = 1 then
        Coder.FuncLoop(PPart(Parser.Parts[i]).Params[0])
      else
        Parser.AddMsg(WrongCountOfArgs,PPart(Parser.Parts[i]).CurrFile,PPart(Parser.Parts[i]).LineNum);
    end
    else if PPart(Parser.Parts[i]).Func = 'count.set' then
    begin
      if PPart(Parser.Parts[i]).ParamCount = 1 then
        Coder.FuncSetCount(PPart(Parser.Parts[i]).Params[0])
      else
        Parser.AddMsg(WrongCountOfArgs,PPart(Parser.Parts[i]).CurrFile,PPart(Parser.Parts[i]).LineNum);
    end
    else if PPart(Parser.Parts[i]).Func = 'count.get' then
    begin
      if PPart(Parser.Parts[i]).ParamCount = 0 then
        Coder.FuncGetCount(PPart(Parser.Parts[i]).SAssign,PPart(Parser.Parts[i]).Extra)
      else
        Parser.AddMsg(WrongCountOfArgs,PPart(Parser.Parts[i]).CurrFile,PPart(Parser.Parts[i]).LineNum);
    end
    else if PPart(Parser.Parts[i]).Func = 'sleep' then
    begin
      if PPart(Parser.Parts[i]).ParamCount = 0 then
        Coder.FuncSleep
      else
        Parser.AddMsg(WrongCountOfArgs,PPart(Parser.Parts[i]).CurrFile,PPart(Parser.Parts[i]).LineNum);
    end
    else if PPart(Parser.Parts[i]).Func = 'random' then
    begin
      if PPart(Parser.Parts[i]).ParamCount = 0 then
        Coder.FuncRead(PPart(Parser.Parts[i]).SAssign,PPart(Parser.Parts[i]).Extra)
      else
        Parser.AddMsg(WrongCountOfArgs,PPart(Parser.Parts[i]).CurrFile,PPart(Parser.Parts[i]).LineNum);
    end
    else if PPart(Parser.Parts[i]).Func = 'screen.setmode' then
    begin
      if PPart(Parser.Parts[i]).ParamCount = 1 then
        Coder.FuncSetMode(PPart(Parser.Parts[i]).Params[0])
      else
        Parser.AddMsg(WrongCountOfArgs,PPart(Parser.Parts[i]).CurrFile,PPart(Parser.Parts[i]).LineNum);
    end
    else if PPart(Parser.Parts[i]).Func = 'screen.pixel' then
    begin
      if PPart(Parser.Parts[i]).ParamCount = 3 then
        Coder.FuncPixel(PPart(Parser.Parts[i]).Params[0],PPart(Parser.Parts[i]).Params[1],PPart(Parser.Parts[i]).Params[2])
      else
        Parser.AddMsg(WrongCountOfArgs,PPart(Parser.Parts[i]).CurrFile,PPart(Parser.Parts[i]).LineNum);
    end
    else if PPart(Parser.Parts[i]).Func = 'read' then
    begin
      if PPart(Parser.Parts[i]).ParamCount = 0 then
        Coder.FuncRead(PPart(Parser.Parts[i]).SAssign,PPart(Parser.Parts[i]).Extra)
      else
        Parser.AddMsg(WrongCountOfArgs,PPart(Parser.Parts[i]).CurrFile,PPart(Parser.Parts[i]).LineNum);
    end
    else if PPart(Parser.Parts[i]).Func = 'readln' then
    begin
      NotExtra;
      if PPart(Parser.Parts[i]).ParamCount = 0 then
        Coder.FuncReadLn(PPart(Parser.Parts[i]).SAssign)
      else
        Parser.AddMsg(WrongCountOfArgs,PPart(Parser.Parts[i]).CurrFile,PPart(Parser.Parts[i]).LineNum);
    end
    else if PPart(Parser.Parts[i]).Func = 'end' then
    begin
      NotReturn;
      NotExtra;
      he := True;
      if PPart(Parser.Parts[i]).ParamCount = 0 then
      begin
        if Format = 'dos.mz' then
          Coder.FuncEnd
        else if (Format = 'windows.gui') or (Format = 'windows.gui') then
          Coder.FuncEndWin;
      end
      else
        Parser.AddMsg(WrongCountOfArgs,PPart(Parser.Parts[i]).CurrFile,PPart(Parser.Parts[i]).LineNum);
    end
    else if PPart(Parser.Parts[i]).Func = 'return' then
    begin
      NotReturn;
      NotExtra;
      if PPart(Parser.Parts[i]).ParamCount = 0 then
          Coder.FuncReturn
      else
        Parser.AddMsg(WrongCountOfArgs,PPart(Parser.Parts[i]).CurrFile,PPart(Parser.Parts[i]).LineNum);
      Coder.CurrFunc := '';
    end
    else if PPart(Parser.Parts[i]).Func = 'offset' then
    begin
      NotReturn;
      NotExtra;
      if PPart(Parser.Parts[i]).ParamCount = 0 then
        WriteToScreen('Current Offset: '+IntToHex(Coder.Size(True),8))
      else
        Parser.AddMsg(WrongCountOfArgs,PPart(Parser.Parts[i]).CurrFile,PPart(Parser.Parts[i]).LineNum);
    end
    else if PPart(Parser.Parts[i]).Func = 'jump' then
    begin
      NotReturn;
      NotExtra;
      if PPart(Parser.Parts[i]).ParamCount = 1 then
      begin
        if PPart(Parser.Parts[i]).Params[0] = '@B' then PPart(Parser.Parts[i]).Params[0] := 'NN' + IntToStr(lex)
        else if PPart(Parser.Parts[i]).Params[0] = '@F' then PPart(Parser.Parts[i]).Params[0] := 'NN' + IntToStr(lex+1);
        Coder.AsmJmp(0,Coder.CurrSize);
        Coder.AddFixup(Coder.Size(True),Coder.CurrSize,ftJump,Coder.CurrFunc+PPart(Parser.Parts[i]).Params[0]);
      end
      else
        Parser.AddMsg(WrongCountOfArgs,PPart(Parser.Parts[i]).CurrFile,PPart(Parser.Parts[i]).LineNum);
    end
    else if (PPart(Parser.Parts[i]).SAssign <> '') and (PPart(Parser.Parts[i]).Func <> '') and (PPart(Parser.Parts[i]).IsFunc = False) then
      Coder.FuncExpr(PPart(Parser.Parts[i]).SAssign,PPart(Parser.Parts[i]).Func)
    else if not PPart(Parser.Parts[i]).Done then
    begin
      for ii := 0 to PPart(Parser.Parts[i]).ParamCount - 1 do
      begin
        tmp := PPart(Parser.Parts[i]).Params[ii];
        val := Copy(tmp,Pos(':',tmp)+1,Length(tmp));
        tmp := Copy(tmp,1,Pos(':',tmp)-1);
        Coder.FuncExpr(PPart(Parser.Parts[i]).Func+'.'+tmp,val);
      end;
      Coder.AsmCall(0,Coder.CurrSize);
      Coder.AddFixup(Coder.Size(True),Coder.CurrSize,ftJump,PPart(Parser.Parts[i]).Func);
      Coder.FuncResult(PPart(Parser.Parts[i]).SAssign,PPart(Parser.Parts[i]).Func);
      if PPart(Parser.Parts[i]).Extra <> '' then Coder.FuncExpr(PPart(Parser.Parts[i]).SAssign,PPart(Parser.Parts[i]).SAssign+PPart(Parser.Parts[i]).Extra);
    end;
   end
   else if (PPart(Parser.Parts[i]).PartType = ptIf) or (PPart(Parser.Parts[i]).PartType = ptWhile) then
   begin
     if PPart(Parser.Parts[i]).Extra = '@B' then
       PPart(Parser.Parts[i]).Extra := 'NN' + IntToStr(lex)
     else if PPart(Parser.Parts[i]).Extra = '@F' then
       PPart(Parser.Parts[i]).Extra := 'NN' + IntToStr(lex+1);
     if PPart(Parser.Parts[i]).DLL = 'in' then
     begin
       tmp := PPart(Parser.Parts[i]).Func;
       val := Copy(tmp,Pos(',',tmp)+1,Length(tmp));
       tmp := Copy(tmp,1,Pos(',',tmp)-1);
       if PPart(Parser.Parts[i]).IsNot then
       begin
         Coder.FuncIf(PPart(Parser.Parts[i]).SAssign,tmp,'<',PPart(Parser.Parts[i]).Extra);
         Coder.FuncIf(PPart(Parser.Parts[i]).SAssign,val,'>',PPart(Parser.Parts[i]).Extra);
       end
       else
       begin
         lc := lc + 1;
         Coder.FuncIf(PPart(Parser.Parts[i]).SAssign,tmp,'<','label'+IntToStr(lc));
         Coder.FuncIf(PPart(Parser.Parts[i]).SAssign,val,'<=',PPart(Parser.Parts[i]).Extra);
         Coder.AddSymbol('label'+IntToStr(lc),Coder.CurrSize,stLabel,Coder.Size(True));
       end;
     end
     else
       Coder.FuncIf(PPart(Parser.Parts[i]).SAssign,PPart(Parser.Parts[i]).Func,PPart(Parser.Parts[i]).DLL,PPart(Parser.Parts[i]).Extra,PPart(Parser.Parts[i]).IsNot);
   end;
   PPart(Parser.Parts[i]).Offset := Coder.Size(True);
  end;
  if (not hb) or (not he) then Parser.AddMsg(NoBeginEnd,'',0);
  if Parser.Errors.Count = 0 then Coder.SaveFile(Output,Format);
end;

destructor TCompiler.Destroy;
begin
  Parser.Free;
  Coder.Free;
  inherited;
end;

end.

⌨️ 快捷键说明

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