📄 compiler.pas
字号:
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 + -