Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...
Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...
Топ:
Характеристика АТП и сварочно-жестяницкого участка: Транспорт в настоящее время является одной из важнейших отраслей народного...
Когда производится ограждение поезда, остановившегося на перегоне: Во всех случаях немедленно должно быть ограждено место препятствия для движения поездов на смежном пути двухпутного...
Теоретическая значимость работы: Описание теоретической значимости (ценности) результатов исследования должно присутствовать во введении...
Интересное:
Уполаживание и террасирование склонов: Если глубина оврага более 5 м необходимо устройство берм. Варианты использования оврагов для градостроительных целей...
Искусственное повышение поверхности территории: Варианты искусственного повышения поверхности территории необходимо выбирать на основе анализа следующих характеристик защищаемой территории...
Подходы к решению темы фильма: Существует три основных типа исторического фильма, имеющих между собой много общего...
Дисциплины:
2023-01-01 | 23 |
5.00
из
|
Заказать работу |
|
|
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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!