Описание разработанных тестов. — КиберПедия 

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Описание разработанных тестов.

2023-01-01 23
Описание разработанных тестов. 0.00 из 5.00 0 оценок
Заказать работу

1. В первом тесте проверяется правильность работы макропроцессора с командами AIF и AGO.

   

Рис. 1.

На рис.1 изображен результат выполнения макропроцессором и ассемблером 1-го и 2-го проходов. Как видно на рисунке, в исходном файле есть только одно внешнее макроопределение – макрос $M1.Этот макрос заносится в ТИМ и ТМО на первом проходе. На втором проходе производится макровызов “$M1”. При обработке макровызова производятся следующие действия. Сначала выводится команда NOP. Затем проверяется условие &A ==10. Пока оно ложно выводится команда MOV R1 &A, где вместо &A подставляется текущее значение этой переменной. В конце завершается обработка макровызова и выводится директива END.

2. Во втором тесте программы проверяется обработка макровызовов с различными значениями параметров.

    

Рис. 2.

На рис. 2 изображен результат выполнения программы. В исходном файле имеется одно макроопределение $M1, который заносится в ТИМ и ТМО на первом проходе. На втором проходе производится 3 макровызова макроса M1 “$M1”, “$M1 &A = 10”, “$M1 &A = 100”. При обработке макровызова выполняются следующие действия. Выводится строка MOV R1 &A. Затем производится подстановка значения параметра &A в строку MOV &A. Для каждого макровызова подставляется соответствующее значение переменной &A. В случае 1-го макровызова значение данной переменной не задано во время вызова, поэтому ей будет присвоено значении по умолчанию, равное 0. В 2-м и 3-м макровызовах переменная &A принимает значения 10 и 100 соответственно. Далее завершается обработка макровызова и выводится директива END.

 

 

Список использованной литературы.

1. Бек Л. Введение в системное программирование. М. Мир. 1988г. 448 с.

2. Браун П. Макропроцессоры и мобильность программного обеспечения. М. Мир 1977г. 254с.

3. Кэмпбел-Келли М.Введение в макросы. Пер. с англ.1978. 152 с

4. Фельдман С.К. Системное программирование на персональном компьютере. – 2е изд. – М.: Букпресс, 2006.— 512 с

Листинг программы.

Модуль MP.

 

uses

Forms,

SysUtils,

Windows,

AVLTree,

Main in 'Main.pas' {Form1},

Expr in 'Expr.pas',

Strings in 'Strings.pas',

MacroGen in 'MacroGen.pas',

Assembler in 'Assembler.pas';

 

{$R *.res}

 

{$APPTYPE CONSOLE}

 

const

PAR1        = '/if';

PAR2        = '/mof';

PAR3        = '/aof';

PAR4        = '/?';

ERRORS_FILE_NAME = 'errors.txt';

 

procedure showHelp();

begin

writeln;

writeln('Project1 [' + PAR1 + ' <filename>] [' + PAR2 + ' <filename>] [' + PAR3 + ' <filename>] [' + PAR4 + ']');

writeln(#9 + PAR1 + ' - input filename (default = ' + inputFileName + ')');

writeln(#9 + PAR2 + ' - macroassembler output file name (default = ' + macroOutputFileName + ')');

writeln(#9 + PAR3 + ' - assembler output file name (default = ' + asmOutputFileName + ')');

writeln(#9 + PAR4 + ' - help');

writeln;

end;

 

function getParamIndex(param: string): integer;

begin

result:=0;

param:= ansiLowerCase(param);

if (param = PAR1) then

result:= 1;

if (param = PAR2) then

result:= 2;

if (param = PAR3) then

result:= 3;

if (param = PAR4) then

result:= 4;

end;

 

function isRightFileName(fileName: string; rw: boolean): boolean;

var

tmpFile: textFile;

begin

result:= true;

 

if (fileName='') then

begin

result:=false;

exit;

end;

 

try

assignFile(tmpFile, fileName);

if (rw) then

rewrite(tmpFile)

else

reset(tmpFile);

closefile(tmpFile);

except

result:=false;

end;

end;

 

procedure outErrors(fileName, errors: string);

var

outputFile: textFile;

begin

assignFile(outputFile, fileName);

rewrite(outputFile);

writeln(outputFile, errors);

closefile(outputFile);

end;

 

var

result   : TResult;

Error    : TError;

 

currParamStr,

currLexem,

Header   : string;

 

i,

charPos,

numCurrOutputStr,

currParamIndex: integer;

 

isParamFound: array [1..4] of boolean;

currOutput: array [0..MAX_OUTPUT_LEN - 1] of string;

begin

SymbNameTree:= TAVLTree.Create;

 

if (paramStr(1) = '') then

begin

freeConsole;

Application.Initialize;

Application.CreateForm(TForm1, Form1);

Application.Run;

end else

begin

for i:= 1 to 4 do

begin

isParamFound[i]:= false;

end;

 

i:=1;

while (paramStr(i) <> '') do

begin

currParamStr:= paramStr(i);

currParamIndex:= getParamIndex(currParamStr);

 

if (currParamIndex = 0) then

begin

   writeln('Error: bad parameter: ' + currParamStr);

   if (not isParamFound[4]) then

     showHelp;

   exit;

end;

 

if (isParamFound[currParamIndex]) then

begin

   writeln('Error: duplicating params');

   exit;

end;

 

isParamFound[currParamIndex]:= true;

 

case (currParamIndex) of

   1: begin inputFileName:= paramStr(i + 1); inc(i, 2); end;

   2: begin macroOutputFileName:= paramStr(i + 1); inc(i, 2); end;

   3: begin asmOutputFileName:= paramStr(i + 1); inc(i, 2); end;

   4: begin showHelp; inc(i); end;

end;

end;

 

if (not isRightFileName(inputFileName, false)) then

begin

writeln('Error: incorrect input file name or file is not found: ' + inputFileName);

exit;

end;

if (not isRightFileName(macroOutputFileName, true)) then

begin

writeln('Error: incorrect output file name or file is not found: ' + macroOutputFileName);

exit;

end;

if (not isRightFileName(asmOutputFileName, true)) then

begin

writeln('Error: incorrect output file name or file is not found: ' + asmOutputFileName);

exit;

end;

 

if (isParamFound[1] or isParamFound[2] or isParamFound[3]) then

begin

numSrcStr:= loadSrcCode(inputFileName);

 

result:= doFirstStep(srcCode, numSrcStr);

if (result.code <> NORM_RESULT) then

begin

   writeln('Errors was found!');

   outErrors(ERRORS_FILE_NAME, ERR_DESC[result.code - 1] + ': ' + result.additionalInfo);

   exit;

end;

 

result:= doSecondStep(srcCode, numSrcStr);

if (result.code <> NORM_RESULT) then

begin

   writeln('Errors was found!');

   outErrors(ERRORS_FILE_NAME, ERR_DESC[result.code - 1] + ': ' + result.additionalInfo);

   exit;

   end;

 

getCurrOutput(currOutput, numCurrOutputStr);

numLines:= numCurrOutputStr;

 

for i:= 0 to numCurrOutputStr - 1 do

begin

   charPos:= 1;

   currLexem:= getNextLexem(currOutput[i], charPos, COMMON_SEPARATOR);

   if ((currLexem <> '') and (currLexem[1] = ASM_MARK_SYMBOL)) then

   begin

     InputTable[i].SymbName:= currLexem;

     InputTable[i].MOpCode:= ansiUpperCase(getNextLexem(currOutput[i], charPos, COMMON_SEPARATOR));

   end else

     InputTable[i].MOpCode:= ansiUpperCase(currLexem);

   InputTable[i].Opd1:= getNextLexem(currOutput[i], charPos, COMMON_SEPARATOR);

   InputTable[i].Opd2:= trim(getNextLexem(currOutput[i], charPos, ''));

end;

 

SymbNameTree.RemoveAll;

FirstParse(InputTable, TempTable, SymbNameTree, NumSymbNames, Error, NumLines, ProgLen, Header);

Output[0]:= Header;

if (Error.ErrType <> eNoErr) then

begin

   writeln('Errors was found!');

  outErrors(ERRORS_FILE_NAME, 'Строка ' + IntToStr(Error.StrNum + 1) + ': ' + ErrText[Error.ErrType]);

   exit;

end;

 

SecondParse(TempTable, Output, Error, SymbNameTree, NumSymbNames, NumLines);

if (Error.ErrType <> eNoErr) then

  begin

   writeln('Errors was found!');

   outErrors(ERRORS_FILE_NAME, 'Строка ' + IntToStr(Error.StrNum + 1) + ': ' + ErrText[Error.ErrType]);

   exit;

end;

 

outResultInFiles;

 

writeln;

writeln('Done');

end;

end;

 

end.

 

Модуль Assembler.

interface

 

uses

AVLTree, SysUtils, macroGen;

 

type

TComLine = record

SymbName,

MOpCode,

Opd1, Opd2: string;

end;

 

type

TOpCode = record

Name,

Code: string;

Len: byte;

IsDir: boolean;

Opd1, Opd2: byte;

end;

 

type

TErrTypes = (eNoErr, eSTART_MISSING, eEND_MISSING, eINCORRECT_OPCODE,

          eDUP_SYMB_NAME, eINCORRECT_OPD, eSYMB_NAME_NOT_FOUND,

          eTWO_MEM_OPD, eBAD_MARK_NAME);

 

type

TError = record

ErrType: TErrTypes;

StrNum: byte;

end;

 

const

NumOps   = 8;

NumReg   = 8;

MaxLines = 256;

MaxSymbNames = 256;

 

BytesPerBYTE = 1;

BytesPerWORD = 3;

 

oNONE    = 1;

oREG     = 2;

oVALUE   = 4;

oEX_VALUE = 8;

oSYMB_NAME = 16;

oSTRING  = 32;

 

MaxByteVal = $FF;

MaxWordVal = $FFFFFF;

MaxResBVal = $FF;

MaxResWVal = $55;

 

ErrText: array [TErrTypes] of string = ('',

                                     'Не найдена точка входа START',

                                     'Не найден конец программы END',

                                     'Неверный код операции',

                                     'Дублирование символического имени',

                                     'Некорректный операнд',

                                     'Символическое имя не найдено',

                                     'Оба операнда - символические имена',

                                     'Неверное имя метки');

 

RegName: array [0..NumReg - 1] of string = ('R1', 'R2', 'R3', 'R4', 'R5', 'R6', 'R7', 'R8');

 

var

OpCodeTable: array [0..NumOps - 1] of TOpCode = ((Name:'ADD'; Code:'01'; Len:3; IsDir:false; Opd1: oREG or oSYMB_NAME; Opd2: oREG or oSYMB_NAME or oVALUE),

                                              (Name:'JUMP'; Code:'02'; Len:4; IsDir:false; Opd1: oSYMB_NAME;      Opd2: oNONE),

                                              (Name:'NOP'; Code:'03'; Len:1; IsDir:false; Opd1: oNONE;           Opd2: oNONE),

                                              (Name:'BYTE'; Code:'04'; Len:0; IsDir:true; Opd1: oEX_VALUE or oSTRING; Opd2: oNONE),

                                              (Name:'WORD'; Code:'05'; Len:0; IsDir:true; Opd1: oEX_VALUE;       Opd2: oNONE),

                                              (Name:'START'; Code:'08'; Len:0; IsDir:true; Opd1: oVALUE;          Opd2: oNONE),

                                              (Name:'END'; Code:'09'; Len:0; IsDir:true; Opd1: oNONE or oVALUE; Opd2: oNONE),

                                              (Name:'MOV'; Code:'0A'; Len:3; IsDir:false; Opd1: oREG or oSYMB_NAME; Opd2: oREG or oSYMB_NAME or oVALUE));

 

InputTable, TempTable: array [0..MaxLines - 1] of TComLine;

Output: array [0..MaxLines - 1] of string;

SymbNameTree: TAVLTree;

 

NumSymbNames,

NumLines: byte;

 

ProgLen: cardinal;

 

procedure FirstParse(InputTable: array of TComLine; var TempTable: array of TComLine;

SymbNameTree: TAVLTree; var NumSymbNames: byte; var Error: TError; NumComLines: byte;

var ProgLen: cardinal; var Header: string);

 

procedure SecondParse(TempTable: array of TComLine; var Output: array of string;

var Error: TError; SymbNameTree: TAVLTree; NumSymbNames: byte; NumComLines: byte);

 

implementation

 

function IsHexNum(Str: string): boolean;

var

i: byte;

begin

result:= true;

 

if (Str <> '') then

begin

for i:= 1 to Length(Str) do

begin

if (not ((Str[i] >= '0') and (Str[i] <= '9')) or ((Str[i] >= 'A') and (Str[i] <= 'F'))) then

begin

   result:= false;

   exit;

end;

end;

end else

begin

result:= false;

exit;

end;

end;

 

function HexAddDec(Hex: string; Dec: cardinal; MaxDig: byte): string;

begin

if (Hex = '') then

Hex:= '0';

Result:= IntToHex(StrToInt('$' + Hex) + Dec, MaxDig);

end;

 

function HexMulDec(Hex: string; Dec: cardinal; MaxDig: byte): string;

begin

if (Hex = '') then

Hex:= '0';

Result:= IntToHex(StrToInt('$' + Hex) * Dec, MaxDig);

end;

 

function IsRegName(Name: string; var RegId: byte): boolean;

var

i: byte;

begin

Result:= false;

for i:= 0 to NumReg - 1 do

begin

if (Name = RegName[i]) then

begin

Result:= true;

RegId:= i + 1;

break;

end;

end;

end;

 

procedure FirstParse(InputTable: array of TComLine; var TempTable: array of TComLine;

SymbNameTree: TAVLTree; var NumSymbNames: byte; var Error: TError; NumComLines: byte;

var ProgLen: cardinal; var Header: string);

var

AddrCnt: cardinal;

i, j,

FoundIdx: byte;

IsFound,

IsStartFound, IsEndFound: boolean;

Len: word;

val: integer;

begin

Error.ErrType:= eNoErr;

 

if (not tryStrToInt('$' + InputTable[i].Opd1, val)) then

begin

error.ErrType:= eINCORRECT_OPD;

exit;

end;

 

AddrCnt:= StrToInt('$' + InputTable[0].Opd1);

 

IsStartFound:= false;

IsEndFound:= false;

 

for i:= 0 to NumComLines - 1 do

begin

if ((i > 0) and (InputTable[i].SymbName <> '')) then

begin

if (SymbNameTree.FindNode(InputTable[i].SymbName) = nil) then

begin

  { if (not isCorrectName(inputTable[i].SymbName, ASM_MARK_SYMBOL, ASM_MARK_FORBIDDEN_SYMBOLS)) then

   begin

     Error.ErrType:= eBAD_MARK_NAME;

     Error.StrNum:= i;

     exit;

   end; }

   SymbNameTree.AddNode(InputTable[i].SymbName, IntToHex(AddrCnt, 2 * BytesPerWORD));

end else

begin

   Error.ErrType:= eDUP_SYMB_NAME;

   Error.StrNum:= i;

   exit;

end;

end;

IsFound:= false;

for j:= 0 to NumOps - 1 do

begin

if (InputTable[i].MOpCode = OpCodeTable[j].Name) then

begin

   IsFound:= true;

   FoundIdx:= j;

   break;

end;

end;

if (IsFound) then

begin

if (OpCodeTable[FoundIdx].IsDir) then

begin

   if (OpCodeTable[FoundIdx].Name = 'BYTE') then

   begin

     if (InputTable[i].Opd1[1] = 'c') then

       Len:= Length(InputTable[i].Opd1) - 3

     else

       Len:= BytesPerBYTE;

   end else

   if (OpCodeTable[FoundIdx].Name = 'WORD') then

     Len:= BytesPerWORD

   else

     if (OpCodeTable[FoundIdx].Name = 'RESB') then

     begin

       if (not tryStrToInt('$' + InputTable[i].Opd1, val)) then

       begin

         Error.ErrType:= eINCORRECT_OPD;

         Error.StrNum:= i;

         exit;

       end;

       Len:= BytesPerByte * StrToInt('$' + InputTable[i].Opd1);

     end else

       if (OpCodeTable[FoundIdx].Name = 'RESW') then

       begin

         if (not tryStrToInt('$' + InputTable[i].Opd1, val)) then

         begin

           Error.ErrType:= eINCORRECT_OPD;

           Error.StrNum:= i;

           exit;

         end;

         Len:= BytesPerWord * StrToInt('$' + InputTable[i].Opd1);

       end else

       if (OpCodeTable[FoundIdx].Name = 'START') then

       begin

         IsStartFound:= true;

         Len:= 0;

       end else

       if (OpCodeTable[FoundIdx].Name = 'END') then

       begin

         IsEndFound:= true;

         Len:= 0;

       end;

end else

   Len:= OpCodeTable[FoundIdx].Len;

TempTable[i].SymbName:= IntToHex(AddrCnt, 2 * BytesPerWORD);

TempTable[i].MOpCode:= OpCodeTable[FoundIdx].Code;

TempTable[i].Opd1:= InputTable[i].Opd1;

TempTable[i].Opd2:= InputTable[i].Opd2;

AddrCnt:= AddrCnt + Len;

if (IsEndFound) then

   break;

end else

begin

Error.ErrType:= eINCORRECT_OPCODE;

Error.StrNum:= i;

exit;

end;

end;

if (not IsStartFound) then

begin

Error.ErrType:= eSTART_MISSING;

Error.StrNum:= i;

exit;

end;

if (not IsEndFound) then

begin

Error.ErrType:= eEND_MISSING;

Error.StrNum:= i;

exit;

end else

begin

ProgLen:= AddrCnt - StrToInt('$' + InputTable[0].Opd1);

Header:= 'H ' + InputTable[0].SymbName + ' ' + InputTable[0].Opd1 + ' ' + IntToHex(ProgLen, 6);

end;

end;

 

function GetOpDesc(OpCode: string): TOpCode;

var

i: byte;

begin

Result.Name:= '';

for i:= 0 to NumOps - 1 do

begin

if (OpCodeTable[i].Code = OpCode) then

begin

Result:= OpCodeTable[i];

break;

end;

end;

end;

 

function IsOpName(Name: string; var OpId: byte): boolean;

var

i: byte;

begin

Result:= false;

for i:= 0 to NumOps - 1 do

begin

if (Name = OpCodeTable[i].Name) then

begin

Result:= true;

OpId:= i;

break;

end;

end;

end;

 

procedure SecondParse(TempTable: array of TComLine; var Output: array of string;

var Error: TError; SymbNameTree: TAVLTree; NumSymbNames: byte; NumComLines: byte);

label

Skip;

var

CurrOpd: string;

OutputOpd: array [0..1] of string;

CurrOpDesc: TOpCode;

i, j, k,

PrevOpdType,

CurrOpdType,

NumQuot,

AddrMethod,

RegId, OpId,

Add: byte;

IsCorrect: boolean;

pSymbNameNode: TPNode;

Value: integer;

begin

for i:= 1 to NumComLines - 1 do

begin

Error.StrNum:= i;

PrevOpdType:= oNONE;

AddrMethod:= 0;

CurrOpDesc:= GetOpDesc(TempTable[i].MOpCode);

for j:= 0 to 1 do

begin

OutputOpd[j]:= '';

if (j = 0) then

begin

   CurrOpd:= TempTable[i].Opd1;

   CurrOpdType:= CurrOpDesc.Opd1;

end else

begin

   CurrOpd:= TempTable[i].Opd2;

   CurrOpdType:= CurrOpDesc.Opd2;

end;

IsCorrect:= false;

if (CurrOpdType and oREG <> 0) then

begin

   if (IsRegName(CurrOpd, RegId)) then

   begin

     IsCorrect:= true;

     if (PrevOpdType = oREG) then

     begin

       OutputOpd[0][1]:= OutputOpd[0][2];

       OutputOpd[0][2]:= HexAddDec(OutputOpd[j], RegId, 2)[2];

     end else

       OutputOpd[j]:= HexAddDec(OutputOpd[j], RegId, 2);

     PrevOpdType:= oREG;

     goto Skip;

   end;

end else

begin

   if (IsRegName(CurrOpd, RegId)) then

   begin

     Error.ErrType:= eINCORRECT_OPD;

     exit;

   end;

end;

if (CurrOpdType and oSYMB_NAME <> 0) and (currOpd <> '') and (CurrOpd[1] = ASM_MARK_SYMBOL) then

begin

   pSymbNameNode:= SymbNameTree.FindNode(CurrOpd);

   if (pSymbNameNode <> nil) then

   begin

     if (prevOpdType = oSYMB_NAME) then

     begin

       error.ErrType:= eTWO_MEM_OPD;

       exit;

     end;

     OutputOpd[j]:= pSymbNameNode^.Inf;

     AddrMethod:= 1;

     IsCorrect:= true;

     PrevOpdType:= oSYMB_NAME;

     goto Skip;

   end else

   begin

     Error.ErrType:= eSYMB_NAME_NOT_FOUND;

     exit;

   end;

end else

begin

   pSymbNameNode:= SymbNameTree.FindNode(CurrOpd);

   if (pSymbNameNode <> nil) then

   begin

     Error.ErrType:= eINCORRECT_OPD;

     exit;

   end;

end;

if (currOpd <> '') and (CurrOpdType and (oVALUE or oEX_VALUE) <> 0) then

begin

   IsOpName('BYTE', OpId);

   if (TempTable[i].MOpCode = IntToHex(OpId + 1, 2)) then

   begin

     if ((TryStrToInt('$' + CurrOpd, Value)) and (Value >= 0) and (Value <= MaxByteVal)) then

     begin

       OutputOpd[j]:= IntToHex(Value, 2 * BytesPerBYTE);

       IsCorrect:= true;

       goto Skip;

     end else

     begin

       Error.ErrType:= eINCORRECT_OPD;

       exit;

       if ((Value <> 0) and (CurrOpd[1] <> 'c')) then     //???

         goto Skip;

     end;

   end else

   begin

     IsOpName('WORD', OpId);

     if (TempTable[i].MOpCode = IntToHex(OpId + 1, 2)) then

     begin

       if ((TryStrToInt('$' + CurrOpd, Value)) and (Value >= 0) and (Value <= MaxWordVal)) then

       begin

         OutputOpd[j]:= IntToHex(Value, 2 * BytesPerWORD);

         IsCorrect:= true;

         goto Skip;

       end else

       begin

         Error.ErrType:= eINCORRECT_OPD;

         exit;

         if (Value <> 0) then

           goto Skip;

       end;

     end else

     begin

       IsOpName('RESB', OpId);

       if (TempTable[i].MOpCode = IntToHex(OpId + 1, 2)) then

       begin

         if ((TryStrToInt('$' + CurrOpd, Value)) and (Value > 0) and (Value <= MaxResBVal)) then

         begin

           OutputOpd[j]:= IntToHex(0, Value * 2 * BytesPerBYTE);

           IsCorrect:= true;

           goto Skip;

         end else

         begin

           Error.ErrType:= eINCORRECT_OPD;

           exit;

         end;

       end else

       begin

         IsOpName('RESW', OpId);

         if (TempTable[i].MOpCode = IntToHex(OpId + 1, 2)) then

         begin

           if ((TryStrToInt('$' + CurrOpd, Value)) and (Value > 0) and (Value <= MaxResWVal)) then

           begin

               OutputOpd[j]:= IntToHex(0, Value * 2 * BytesPerWORD);

             IsCorrect:= true;

             goto Skip;

           end else

           begin

             Error.ErrType:= eINCORRECT_OPD;

             exit;

           end;

         end else

         begin

           if ((TryStrToInt('$' + CurrOpd, Value)) and (Value <= MaxWordVal)) then

           begin

             OutputOpd[j]:= CurrOpd;

             IsCorrect:= true;

             goto Skip;

           end else

           begin

             if (CurrOpdType and oEX_VALUE = 0) then

             begin

               Error.ErrType:= eINCORRECT_OPD;

               exit;

             end;

           end;

         end;

       end;

     end;

   end;

end else

begin

   if (TryStrToInt(CurrOpd, Value)) then

   begin

     Error.ErrType:= eINCORRECT_OPD;

     exit;

   end;

end;

if (CurrOpdType and oEX_VALUE <> 0) then

begin

   if (CurrOpd = '?') then

   begin

     if (TempTable[i].MOpCode = '09') then // BYTE dir.

       OutputOpd[j]:= IntToHex(0, 2 * BytesPerBYTE)

     else

       if (TempTable[i].MOpCode = '0A') then // WORD dir.

         OutputOpd[j]:= IntToHex(0, 2 * BytesPerWORD)

       else

         OutputOpd[j]:= IntToHex(0, 2 * BytesPerWord);

     IsCorrect:= true;

     goto Skip;

   end else

   begin

     Error.ErrType:= eINCORRECT_OPD;

     exit;

   end;

end else

begin

   if (CurrOpd = '?') then

   begin

     Error.ErrType:= eINCORRECT_OPD;

     exit;

   end;

end;

if (CurrOpdType and oSTRING <> 0) then

begin

   NumQuot:= 0;

   for k:= 2 to Length(CurrOpd) do

   begin

     if (CurrOpd[k] = '"') then

       inc(NumQuot);

   end;

   if ((NumQuot = 2) and (CurrOpd[2] = '"') and (CurrOpd[Length(CurrOpd)] = '"')) then

   begin

     for k:= 3 to Length(CurrOpd) - 1 do

     begin

       OutputOpd[j]:= OutputOpd[j] + IntToHex(ord(CurrOpd[k]), 2);

       if (k < Length(CurrOpd) - 1) then

         OutputOpd[j]:= OutputOpd[j];

     end;

     IsCorrect:= true;

   end else

   begin

     Error.ErrType:= eINCORRECT_OPD;

     exit;

   end;

end;

if (CurrOpdType and oNONE <> 0) then

begin

   if (CurrOpd = '') then

     IsCorrect:= true

   else begin

     Error.ErrType:= eINCORRECT_OPD;

     exit;

   end;

end;

Skip:

if (not IsCorrect) then

begin

   Error.ErrType:= eINCORRECT_OPD;

   exit;

end;

end;

 

Output[i]:= 'T ' + TempTable[i].SymbName + ' ';                                               // Address

 

if (not GetOpDesc(TempTable[i].MOpCode).IsDir) then

Add:= 2

else

Add:= 0;

 

Output[i]:= Output[i] + IntToHex(Length(OutputOpd[0]) + Length(OutputOpd[1]) + Add, 2) + ' '; // Num. symbs.

if (not GetOpDesc(TempTable[i].MOpCode).IsDir) then

Output[i]:= Output[i] + HexAddDec(HexMulDec(TempTable[i].MOpCode, 4, 2), AddrMethod, 2) + ' '; // Opcode

Output[i]:= Output[i] + OutputOpd[0];                                                         // Operand 1

if (OutputOpd[1] <> '') then

  Output[i]:= Output[i] + ' ' + OutputOpd[1];                                                // Operand 2

end;

 

Output[NumComLines - 1]:= 'E ' + TempTable[0].Opd1;

end;

 

end.

 

 

Модуль Main.

 

unit Main;

 

interface

 

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, MacroGen, Grids, ExtCtrls, Buttons, Expr;

 

type

TForm1 = class(TForm)

firstStepButton: TButton;

Shape2: TShape;

errorsMemo: TMemo;

Shape4: TShape;

secondStepButton: TButton;

marksGrid: TStringGrid;

Shape6: TShape;

localsGrid: TStringGrid;

Shape8: TShape;

stepButton: TButton;

outputGrid: TStringGrid;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Shape1: TShape;

Shape3: TShape;

MDefNameGrid: TStringGrid;

Label5: TLabel;

Label6: TLabel;

exitButton: TButton;

Shape5: TShape;

macroDefGrid: TStringGrid;

Label7: TLabel;

stepModeCheckbox: TCheckBox;

srcCodeMemo: TMemo;

loadButton: TButton;

OpenDialog1: TOpenDialog;

procedure firstStepButtonClick(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure secondStepButtonClick(Sender: TObject);

procedure stepButtonClick(Sender: TObject);

procedure exitButtonClick(Sender: TObject);

procedure stepModeCheckboxClick(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure loadButtonClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

 

const

TMO_FILE_NAME = 'TMO.txt';

TIM_FILE_NAME = 'TIM.txt';

 

var

Form1: TForm1;

 

inputFileName: string = 'input.txt';

outputFileName: string = 'output.txt';

 

numSrcStr: integer;

 

srcCode: array [0..MAX_SRC_LEN - 1] of string;

 

function loadSrcCode(fileName: string): integer;

procedure outResultInFiles;

 

implementation

 

{$R *.dfm}

 

function loadSrcCode(fileName: string): integer;

var

i : integer;

srcFile: text;

begin

assignFile(srcFile, fileName);

reset(srcFile);

 

i:= 0;

while (not eof(srcFile)) do

begin

readln(srcFile, srcCode[i]);

inc(i);

end;

result:= i;

 

for i:= 0 to result - 1 do

begin

srcCode[i]:= ansiUpperCase(srcCode[i]);

end;

 

closeFile(srcFile);

end;

 

procedure outErrors(result: TResult);

begin

if (result.code = NORM_RESULT) then

form1.errorsMemo.Lines.SetText('Ошибок не найдено')

else

form1.errorsMemo.Lines.SetText(PAnsiChar(ERR_DESC[result.code - 1] + ': ' + result.additionalInfo));

end;

 

procedure clearOutputs;

var

i: integer;

begin

for i:= 0 to form1.macroDefGrid.RowCount - 1 do

form1.macroDefGrid.Rows[i].Clear;

for i:= 0 to form1.outputGrid.RowCount - 1 do

form1.outputGrid.Rows[i].Clear;

for i:= 0 to form1.marksGrid.RowCount - 1 do

form1.marksGrid.Rows[i].Clear;

for i:= 0 to form1.localsGrid.RowCount - 1 do

form1.localsGrid.Rows[i].Clear;

form1.errorsMemo.Clear;

end;

 

procedure outResultInFiles;

var

outputFile   : textFile; interface

 

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Grids, ExtCtrls, StdCtrls, AVLTree, Assembler, macroGen, strings;

 

type

TForm1 = class(TForm)

Panel1: TPanel;

Panel2: TPanel;

InputGrid: TStringGrid;

Label1: TLabel;

Panel3: TPanel;

Label2: TLabel;

OpCodeGrid: TStringGrid;

Label3: TLabel;

TempGrid: TStringGrid;

Label4: TLabel;

SymbNameGrid: TStringGrid;

Label7: TLabel;

OutputMemo: TMemo;

FirstParseButton: TButton;

SecondParseButton: TButton;

errMemo: TMemo;

Label5: TLabel;

firstStepButton: TButton;

secondStepButton: TButton;

srcCodeMemo: TMemo;

macroDefGrid: TStringGrid;

marksGrid: TStringGrid;

localsGrid: TStringGrid;

MDefNameGrid: TStringGrid;

stepModeCheckBox: TCheckBox;

stepButton: TButton;

Label6: TLabel;

Label8: TLabel;

Label9: TLabel;

Label10: TLabel;

Label11: TLabel;

Button1: TButton;

Button2: TButton;

OpenDialog1: TOpenDialog;

procedure FirstParseButtonClick(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure FormDestroy(Sender: TObject);

procedure SecondParseButtonClick(Sender: TObject);

procedure InputGridSetEditText(Sender: TObject; ACol, ARow: Integer;

const Value: String);

procedure OpCodeGridSetEditText(Sender: TObject; ACol, ARow: Integer;

const Value: String);

procedure TempGridSetEditText(Sender: TObject; ACol, ARow: Integer;

const Value: String);

procedure firstStepButtonClick(Sender: TObject);

procedure secondStepButtonClick(Sender: TObject);

procedure stepButtonClick(Sender: TObject);

procedure stepModeCheckBoxClick(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

 

const

TMO_FILE_NAME = 'TMO.txt';

TIM_FILE_NAME = 'TIM.txt';

 

var

Form1: TForm1;

 

inputFileName : string = 'input.txt';

macroOutputFileName: string = 'macroOutput.txt';

asmOutputFileName: string = 'asmOutput.txt';

 

numSrcStr: integer;

 

srcCode: array [0..MAX_SRC_LEN - 1] of string;

 

function loadSrcCode(fileName: string): integer;

procedure outResultInFiles;

 

implementation

 

{$R *.dfm}

 

procedure outResultInFiles;

var

outputFile   : textFile;

i            : integer;

 

numCurrOutputStr,

numCurrMacroDefStr,

numCurrMacroDesc: integer;

 

currOutput   : array [0..MAX_OUTPUT_LEN - 1] of string;

currMacroDef : array [0..MAX_MACRO_DEF_STR - 1] of TMacroDefStr;

currMacroDesc: array [0..MAX_MACRO_DESC - 1] of TMacroDesc;

begin

assignFile(outputFile, macroOutputFileName);

rewrite(outputFile);

 

getCurrOutput(currOutput, numCurrOutputStr);

 

for i:= 0 to numCurrOutputStr - 1 do

begin

writeln(outputFile, currOutput[i]);

end;

 

closeFile(outputFile);

 

assignFile(outputFile, asmOutputFileName);

rewrite(outputFile);

 

for i:= 0 to numLines - 1 do

begin

writeln(outputFile, Output[i]);

end;

 

closeFile(outputFile);

 

assignFile(outputFile, TMO_FILE_NAME);

rewrite(outputFile);

 

getCurrMacroDef(currMacroDef, numCurrMacroDefStr);

for i:= 0 to numCurrMacroDefStr - 1 do

begin

writeln(outputFile, intToStr(i) + ' ' + currMacroDef[i].str);

end;

 

closeFile(outputFile);

 

assignFile(outputFile, TIM_FILE_NAME);

rewrite(outputFile);

 

getCurrMacroDesc(currMacroDesc, numCurrMacroDesc);

for i:= 0 to numCurrMacroDesc - 1 do

begin

writeln(outputFile, currMacroDesc[i].name + ' ' + intToStr(currMacroDesc[i].startAddr) + ' ' +

       intToStr(currMacroDesc[i].endAddr));

end;

 

closeFile(outputFile);

end;

 

function loadSrcCode(fileName: string): integer;

var

i : integer;

srcFile: text;

begin

assignFile(srcFile, fileName);

reset(srcFile);

 

i:= 0;

while (not eof(srcFile)) do

begin

readln(srcFile, srcCode[i]);

inc(i);

end;

result:= i;

 

for i:= 0 to result - 1 do

begin

srcCode[i]:= ansiUpperCase(srcCode[i]);

end;

 

closeFile(srcFile);

end;

 

procedure outErrors(result: TResult);

begin

if (result.code = NORM_RESULT) then

form1.errMemo.Lines.SetText('Ошибок не найдено')

  else

form1.errMemo.Lines.SetText(PAnsiChar(ERR_DESC[result.code - 1] + ': ' + result.additionalInfo));

end;

 

procedure clearOutputs;

var

i: integer;

begin

for i:= 0 to form1.macroDefGrid.RowCount - 1 do

form1.macroDefGrid.Rows[i].Clear;

for i:= 0 to form1.marksGrid.RowCount - 1 do

form1.marksGrid.Rows[i].Clear;

for i:= 0 to form1.localsGrid.RowCount - 1 do

form1.localsGrid.Rows[i].Clear;

form1.errMemo.Clear;

end;

 

procedure updateOutputs;

var

selRect      : TGridRect;

outputFile   : textFile;

 

i,

currStrNum,

numCurrMacroMarks,

numCurrLocals,

numCurrOutputStr,

numCurrMacroDefStr,

numCurrMacroDesc: integer;

 

currMacroMarks: array [0..MAX_MARKS - 1] of TMacroMark;

currLocals   : array [0..MAX_LOCALS - 1] of TParamPair;

currOutput   : array [0..MAX_OUTPUT_LEN - 1] of string;

currMacroDef : array [0..MAX_MACRO_DEF_STR - 1] of TMacroDefStr;

currMacroDesc: array [0..MAX_MACRO_DESC - 1] of TMacroDesc;

begin

getCurrMacroMarks(currMacroMarks, numCurrMacroMarks);

 

form1.marksGrid.RowCount:= numCurrMacroMarks;

for i:= 0 to numCurrMacroMarks - 1 do

begin

form1.marksGrid.Cells[0, i]:= currMacroMarks[i].name;

form1.marksGrid.Cells[1, i]:= intToStr(currMacroMarks[i].addr);

end;

 

getCurrLocals(currLocals, numCurrLocals);

 

form1.localsGrid.RowCount:= numCurrLocals;

for i:= 0 to numCurrLocals - 1 do

begin

form1.localsGrid.Cells[0, i]:= currLocals[i].name;

form1.localsGrid.Cells[1, i]:= currLocals[i].val;

end;

 

getCurrMacroDef(currMacroDef, numCurrMacroDefStr);

 

form1.macroDefGrid.RowCount:= numCurrMacroDefStr;

for i:= 0 to numCurrMacroDefStr - 1 do

begin

form1.macroDefGrid.Cells[0, i]:= intToStr(i);

form1.macroDefGrid.Cells[1, i]:= currMacroDef[i].str;

end;

 

getCurrMacroDesc(currMacroDesc, numCurrMacroDesc);

 

form1.MDefNameGrid.RowCount:= numCurrMacroDesc;

for i:= 0 to numCurrMacroDesc - 1 do

begin

form1.MDefNameGrid.Cells[0, i]:= currMacroDesc[i].name;

form1.MDefNameGrid.Cells[1, i]:= intToStr(currMacroDesc[i].startAddr);

form1.MDefNameGrid.Cells[2, i]:= intToStr(currMacroDesc[i].endAddr);

end;

 

currStrNum:= getCurrStrNum;

 

if (not inMacroCall) then

begin

form1.srcCodeMemo.SelStart:= form1.srcCodeMemo.Perform(EM_LINEINDEX, currStrNum, 0);

form1.srcCodeMemo.SelLength:= length(form1.srcCodeMemo.Lines[currStrNum]);

form1.srcCodeMemo.SetFocus;

end else

begin

selRect.Left:= 0;

selRect.Right:= 0;

selRect.Top:= currStrNum;

selRect.Bottom:= currStrNum;

form1.macroDefGrid.Selection:= selRect;

end;

{

assignFile(outputFile, outputFileName);

rewrite(outputFile);

 

getCurrOutput(currOutput, numCurrOutputStr);

for i:= 0 to numCurrOutputStr - 1 do

begin

writeln(outputFile, currOutput[i]);

end;

 

closeFile(outputFile); }

end;

 

procedure TForm1.FormCreate(Sender: TObject);

var

i: byte;

begin

InputGrid.ColWidths[0]:= 20;

for i:= 1 to InputGrid.RowCount - 1 do

InputGrid.Cells[0, i]:= IntToStr(i);

 

InputGrid.Cells[1, 0]:='MARK';

InputGrid.Cells[2, 0]:='MOPCODE';

InputGrid.Cells[3, 0]:='OPD1';

InputGrid.Cells[4, 0]:='OPD2';

 

OpCodeGrid.DefaultColWidth:= OpCodeGrid.Width div 4 - 2;

OpCodeGrid.Cells[0, 0]:= 'NAME';

OpCodeGrid.Cells[1, 0]:= 'CODE';

OpCodeGrid.Cells[2, 0]:= 'LEN';

OpCodeGrid.Cells[3, 0]:= 'DIR';

 

TempGrid.ColWidths[0]:= 20;

for i:= 1 to TempGrid.RowCount - 1 do

TempGrid.Cells[0, i]:= IntToStr(i);

 

TempGrid.Cells[1, 0]:='ADDR';

TempGrid.Cells[2, 0]:='OPCODE';

TempGrid.Cells[3, 0]:='OPD1';

TempGrid.Cells[4, 0]:='OPD2';

 

SymbNameGrid.DefaultColWidth:= SymbNameGrid.Width div 2 - 2;

SymbNameGrid.Cells[0, 0]:= 'NAME';

SymbNameGrid.Cells[1, 0]:= 'ADDR';

 

for i:= 0 to NumOps - 1 do

begin

OpCodeGrid.Cells[0, i + 1]:= OpCodeTable[i].Name;

OpCodeGrid.Cells[1, i + 1]:= OpCodeTable[i].Code;

OpCodeGrid.Cells[2, i + 1]:= IntToStr(OpCodeTable[i].Len);

if (OpCodeTable[i].IsDir) then

OpCodeGrid.Cells[3, i + 1]:= '1'

else

OpCodeGrid.Cells[3, i + 1]:= '0';

end;

 

ErrMemo.Lines.Clear;

ErrMemo.Lines.Clear;

 

form1.macroDefGrid.ColWidths[0]:= 20;

form1.macroDefGrid.ColWidths[1]:= form1.macroDefGrid.Width - 25;

form1.marksGrid.DefaultColWidth:= form1.marksGrid.Width div 2;

form1.localsGrid.DefaultColWidth:= form1.localsGrid.Width div 2;

form1.MDefNameGrid.DefaultColWidth:= form1.MDefNameGrid.Width div 3;

 

numSrcStr:= loadSrcCode(inputFileName);

 

form1.srcCodeMemo.Clear;

for i:= 0 to numSrcStr - 1 do

begin

form1.srcCodeMemo.Lines.Add(srcCode[i]);

end;

 

setSuspendable(form1.stepModeCheckbox.Checked);

end;

 

procedure TForm1.FormDestroy(Sender: TObject);

begin

SymbNameTree.Destroy;

end;

 

var

Index: byte;

 

procedure FillSymbNameTable(CurrNode: TPNode);

begin

if (CurrNode <> nil) then

begin

Form1.SymbNameGrid.Cells[0, Index + 1]:= CurrNode.Key;

Form1.SymbNameGrid.Cells[1, Index + 1]:= CurrNode.Inf;

inc(Index);

if (CurrNode^.Left <> nil) then

FillSymbNameTable(CurrNode^.Left);

if (CurrNode^.Right <> nil) then

FillSymbNameTable(CurrNode^.Right);

end;

end;

 

procedure TForm1.FirstParseButtonClick(Sender: TObject);

var

i: byte;

Header: string;

Error: TError;

begin

SymbNameTree.RemoveAll;

 

FirstParse(InputTable, TempTable, SymbNameTree, NumSymbNames, Error, NumLines, ProgLen, Header);

for i:= 0 to MaxLines - 1 do

Output[i]:= '';

Output[0]:= Header;

 

ErrMemo.Lines.Clear;

ErrMemo.Lines.Clear;

if (Error.ErrType <> eNoErr) then

begin

ErrMemo.Lines.Add('Строка ' + IntToStr(Error.StrNum + 1) + ': ' + ErrText[Error.ErrType]);

SecondParseButton.Enabled:= false;

end else

begin

ErrMemo.Lines[0]:= 'Ошибок не найдено';

SecondParseButton.Enabled:= true;

end;

 

for i:= 1 to NumLines - 2 do

begin

TempGrid.Cells[1, i + 1]:= TempTable[i].SymbName;

TempGrid.Cells[2, i + 1]:= TempTable[i].MOpCode;

TempGrid.Cells[3, i + 1]:= TempTable[i].Opd1;

TempGrid.Cells[4, i + 1]:= TempTable[i].Opd2;

end;

 

Index:= 0;

symbNameGrid.RowCount:= 100;

FillSymbNameTable(SymbNameTree.GetRoot);

end;

 

procedure TForm1.SecondParseButtonClick(Sender: TObject);

var

i: byte;

Error: TError;

begin

SecondParse(TempTable, Output, Error, SymbNameTree, NumSymbNames, NumLines);

 

ErrMemo.Lines.Clear;

if (Error.ErrType <> eNoErr) then

ErrMemo.Lines.Add('Строка ' + IntToStr(error.StrNum + 1) + ': ' + ErrText[Error.ErrType])

else

ErrMemo.Lines[0]:= 'Ошибок не найдено';

 

secondStepButton.Enabled:= false;

firstParseButton.Enabled:= false;

secondParseButton.Enabled:= false;

 

OutputMemo.Lines.Clear;

for i:= 0 to NumLines - 1 do

OutputMemo.Lines.Add(Output[i]);

   

Index:= 0;

FillSymbNameTable(SymbNameTree.GetRoot);

 

outResultInFiles;

end;

 

procedure TForm1.InputGridSetEditText(Sender: TObject; ACol, ARow: Integer;

const Value: String);

begin

case (ACol) of

1: InputTable[ARow - 1].SymbName:= Value;

2: InputTable[ARow - 1].MOpCode:= Value;

3: InputTable[ARow - 1].Opd1:= Value;

4: InputTable[ARow - 1].Opd2:= Value;

end;

end;

 

procedure TForm1.OpCodeGridSetEditText(Sender: TObject; ACol,

ARow: Integer; const Value: String);

begin

case (ACol) of

0: OpCodeTable[ARow - 1].Name:= Value;

1: OpCodeTable[ARow - 1].Code:= Value;

2: OpCodeTable[ARow - 1].Len:= StrToInt(Value);

3: if (Value = '1') then

    OpCodeTable[ARow - 1].IsDir:= true

  else

    OpCodeTable[ARow - 1].IsDir:= false;

4: OpCodeTable[ARow - 1].Opd1:= StrToInt(Value);

5: OpCodeTable[ARow - 1].Opd2:= StrToInt(Value);

end;

end;

 

procedure TForm1.TempGridSetEditText(Sender: TObject; ACol, ARow: Integer;

const Value: String);

begin

case (ACol) of

1: TempTable[ARow - 1].SymbName:= Value;

2: TempTable[ARow - 1].MOpCode:= Value;

3: TempTable[ARow - 1].Opd1:= Value;

 4: TempTable[ARow - 1].Opd2:= Value;

end;

end;

 

procedure TForm1.firstStepButtonClick(Sender: TObject);

var

result: TResult;

i: integer;

begin

clearOutputs;

 

secondStepButton.Enabled:= false;

firstParseButton.Enabled:= false;

secondParseButton.Enabled:= false;

 

for i:= 0 to srcCodeMemo.Lines.Count - 1 do

begin

srcCode[i]:= srcCodeMemo.Lines.Strings[i];

end;

numSrcStr:= srcCodeMemo.Lines.Count;

 

form1.stepButton.Enabled:= true;

 

result:= doFirstStep(srcCode, numSrcStr);

 

if (result.code = NORM_RESULT) then

secondStepButton.Enabled:= true;

 

updateOutputs;

outErrors(result);

 

form1.stepButton.Enabled:= false;

end;

 

procedure TForm1.secondStepButtonClick(Sender: TObject);

var

i, charPos: integer;

currLexem: string;

result: TResult;

 

numCurrOutputStr: integer;

 

currOutput   : array [0..MAX_OUTPUT_LEN - 1] of string;

begin

form1.stepButton.Enabled:= true;

 

result:= doSecondStep(srcCode, numSrcStr);

 

if (result.code = NORM_RESULT) then

firstParseButton.Enabled:= true

else

secondStepButton.Enabled:= false;

 

updateOutputs;

outErrors(result);

 

form1.firstStepButton.Enabled:= true;

form1.stepButton.Enabled:= false;

 

getCurrOutput(currOutput, numCurrOutputStr);

numLines:= numCurrOutputStr;

 

for i:= 0 to numLines - 1 do

begin

InputTable[i].SymbName:= '';

InputTable[i].MOpCode:= '';

InputTable[i].Opd1:= '';

InputTable[i].Opd2:= '';

end;

 

for i:= 0 to numLines - 1 do

begin

charPos:= 1;

currLexem:= getNextLexem(currOutput[i], charPos, COMMON_SEPARATOR);

if ((currLexem <> '') and (currLexem[1] = ASM_MARK_SYMBOL)) then

begin

InputTable[i].SymbName:= currLexem;

   InputTable[i].MOpCode:= ansiUpperCase(getNextLexem(currOutput[i], charPos, COMMON_SEPARATOR));

end else

InputTable[i].MOpCode:= ansiUpperCase(currLexem);

InputTable[i].Opd1:= getNextLexem(currOutput[i], charPos, COMMON_SEPARATOR);

InputTable[i].Opd2:= trim(getNextLexem(currOutput[i], charPos, ''));

   

InputGrid.Cells[1, i + 1]:= InputTable[i].SymbName;

InputGrid.Cells[2, i + 1]:= InputTable[i].MOpCode;

InputGrid.Cells[3, i + 1]:= InputTable[i].Opd1;

InputGrid.Cells[4, i + 1]:= InputTable[i].Opd2;

end;

 

if (numLines > 0) then

begin

InputGrid.RowCount:= numLines + 1;

TempGrid.RowCount:= numLines + 1;

for i:= 1 to InputGrid.RowCount - 1 do

InputGrid.Cells[0, i]:= IntToStr(i);

end;

 

for i:= 1 to TempGrid.RowCount - 1 do

begin

TempGrid.Cells[0, i]:= IntToStr(i);

TempGrid.Cells[1, i]:= '';

TempGrid.Cells[2, i]:= '';

TempGrid.Cells[3, i]:= '';

TempGrid.Cells[4, i]:= '';

end;

end;

 

procedure TForm1.stepButtonClick(Sender: TObject);

begin

resume;

updateOutputs;

end;

 

procedure TForm1.stepModeCheckBoxClick(Sender: TObject);

begin

setSuspendable(form1.stepModeCheckbox.Checked);

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

breakProcess;

application.Terminate;

end;

 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

breakProcess;

end;

 

procedure TForm1.Button2Click(Sender: TObject);

var

i: integer;

begin

if (openDialog1.Execute) then

begin

numSrcStr:= loadSrcCode(openDialog1.FileName);

 

form1.srcCodeMemo.Clear;

for i:= 0 to numSrcStr - 1 do

begin

form1.srcCodeMemo.Lines.Add(srcCode[i]);

end;

end;

end;

 

end.

Модуль MacroGen.

 

interface

 

uses

Expr, Strings, SysUtils, Forms, Windows;

 

const

MAX_MACRO_DESC      = 32;

MAX_MACRO_DEF_STR   = 1024;

MAX_MARKS           = $FF;

MAX_STR_ARRAY_LEN   = $FF;

MAX_LOCALS          = 32;

MAX_SRC_LEN         = 1024;

MAX_OUTPUT_LEN      = $FFFF;

MAX_JUMPS           = $FF;

MAX_LEVEL           = $FF;

MAX_CONFIGS         = 4096;

LOCAL_MAX_VAL       = 4095;

LOCAL_MIN_VAL       = -4096;

 

NUM_ERR_TYPES       = 46;

NUM_ASM_COM              = 8;

NUM_MACRO_COM       = 8;

NUM_PARAM_SEPARATORS = 10;

 

BAD_INDEX           = -1;

NORM_RESULT         = 0;

 

ERR_END_NOT_FOUND   = 1;

ERR_DUP_MDEF_NAME   = 2;

ERR_BAD_MDEF_NAME   = 3;

ERR_UNCLOSED_MDEF   = 4;

ERR_BAD_ACTUAL_PARAMS = 5;

ERR_BAD_FORMAL_PARAMS = 6;

ERR_DUP_MARK_NAME   = 7;

ERR_LOCAL_NOT_FOUND = 8;

ERR_MACRO_DEF_NOT_FOUND = 9;

ERR_BAD_ASM_MARK_NAME = 10;

ERR_BAD_PARAM_NAME  = 11;

ERR_PARAM_VAL_NOT_SET = 12;

ERR_PARAMS_MISMATCH = 13;

ERR_NOT_ENOUGH_PARAMS = 14;

ERR_OPERANDS_MISMATCH = 15;

ERR_LOCAL_AFTER_COM = 16;

ERR_LOCAL_HAS_MACRO_MARK = 17;

ERR_BAD_SET_SYNTAX  = 18;

ERR_ASM_MARK_IN_MACRO = 19;

ERR_INFINITE_LOOP_FOUND = 20;

ERR_ENDW_NOT_EXPECTED = 21;

ERR_COMMON_SYNTAX   = 22;

ERR_TOO_DEEP_LEVEL  = 23;

ERR_BAD_IF_SYNTAX   = 24;

ERR_BAD_WHILE_SYNTAX = 25;

ERR_BAD_AIF_SYNTAX  = 26;

ERR_LOCAL_OUT_OF_RANGE = 27;

ERR_BAD_MACRO_MARK_NAME = 28;

ERR_TOO_BIG_PROGRAMM = 29;

ERR_TOO_MANY_MARKS  = 30;

ERR_TOO_MANY_PARAMS = 31;

ERR_MACRO_MARK_NOT_FOUND = 32;

ERR_ASM_MARK_NOT_FOUND = 33;

ERR_MEND_NOT_EXPECTED = 34;

ERR_DUP_LOCALS      = 35;

ERR_TOO_MANY_JUMPS  = 36;

ERR_MACROSTUFF_OUTSIDE = 37;

ERR_TOO_MANY_CONFIGS = 38;

ERR_MACRO_CALL_IN_MACRO = 39;

ERR_ASM_MARK_IN_LOOP = 40;

 

ERR_DESC: array [0..NUM_ERR_TYPES - 1] of string =

('Директива END не найдена',

'Дублирование имен макросов',

'Неверно задано имя макроса',

'Незавершенное макроопределение',

'Неверно заданы фактические параметры макровызова',

'Неверно заданы формальные параметры макроопределения',

'Дублирование имён меток',

'Локальная переменная не определена',

'Макроопределение не найдено',

'Неверно задано имя ассемблерной метки',

'Неверно задано имя параметра',

'Значение параметра не задано',

'Несоответствие фактических и формальных параметров',

'Недостаточно фактических параметров',

'Неверное количество операндов у оператора',

'Команда LOCAL должна располагаться в начале макроопределения',

'Команда LOCAL не может иметь макрометки',

'Неверный синтаксис оператора SET',

'Обнаружена ассемблерная метка внутри макроса',

'Обнаружен бесконечный цикл',

'Оператор ENDW не является ожидаемым',

'Неверный синтасис команды',

'Превышен предел уровня вложенности управляющих команд',

'Неверный синтаксис в операторе IF',

'Неве


Поделиться с друзьями:

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

1.451 с.