Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КУРСОВАЯ СПО.DOC
Скачиваний:
9
Добавлен:
22.11.2019
Размер:
181.25 Кб
Скачать

4.Процедура gotoToAsm

void gotoToAsm()

{

readUpTo(';');

if(ch!=';')

error(NOT_EXPECTED,lineNumber);

fputs("\tjmp\t",asmFile);

//check is label declared

char name[ID_NAME_SIZE];

int i=0;

while(buf[i]!='\0')

{

name[i]=buf[i];

i++;

};

name[i]='\0';

IdTableElement ie(name,LABEL);

if(!IdTable.find(ie))

error(UNDECLARED_ID, lineNumber);

fputs(name, asmFile);

fputc('\n', asmFile);

}

5.процедура labelToAsm

void labelToAsm()

{

char name[ID_NAME_SIZE];

int i=0;

while(buf[i]!=':')

{

name[i]=buf[i];

i++;

};

name[i]='\0';

IdTableElement ie(name,LABEL);

if(!IdTable.find(ie))

error(UNDECLARED_ID, lineNumber);

i=0;

while (buf[i]!='\0')

{

fwrite(&buf[i], sizeof(char),1,asmFile);

i++;

};

fputc('\n', asmFile);

}

5.Процедура ifToAsm

void ifToAsm()

{

char op1[ID_NAME_SIZE];

char op2[ID_NAME_SIZE];

char unicElseLabel[ID_NAME_SIZE];

char unicNotElseLabel[ID_NAME_SIZE];

bool valid=false,

jg=false,

jl=false,

jne=false,

je=false,

jle=false,

jge=false;

int i=0;

ifCounter++;

readUpTo(' ');

while(buf[i]!='\0')

{

op1[i]=buf[i];

++i;

}

op1[i]='\0';

readUpTo(' ');

if(stringComp(buf,"<="))

{

valid=true;

jg=true;

}

if(stringComp(buf,">="))

{

valid=true;

jl=true;

}

if(stringComp(buf,"="))

{

valid=true;

jne=true;

}

if(stringComp(buf,"<>"))

{

valid=true;

je=true;

}

if(stringComp(buf,">"))

{

valid=true;

jle=true;

}

if(stringComp(buf,"<"))

{

valid=true;

jge=true;

}

if(!valid)

error(INVALID_COMPARE,lineNumber);

readUpTo(' ');

i=0;

while(buf[i]!='\0')

{

op2[i]=buf[i];

++i;

}

op2[i]='\0';

readUpTo(' ');

if(!stringComp(buf,"then"))

error(THEN_EXPECTED,lineNumber);

fputs("\tmov\tax, ",asmFile);

i=0;

while (op1[i]!='\0')

{

fwrite(&op1[i], sizeof(char),1,asmFile);

i++;

}

fputc('\n', asmFile);

fputs("\tmov\tbx, ",asmFile);

i=0;

while (op2[i]!='\0')

{

fwrite(&op2[i], sizeof(char),1,asmFile);

i++;

}

fputc('\n', asmFile);

fputs("\tcmp\tax, bx",asmFile);

fputc('\n', asmFile);

genUnicName("els_",ifCounter,unicElseLabel);

if(jg)

{

fputs("\tjg\t", asmFile);

fputs(unicElseLabel, asmFile);

}

if(jl)

{

fputs("\tjl\t", asmFile);

fputs(unicElseLabel, asmFile);

}

if(jne)

{

fputs("\tjne\t", asmFile);

fputs(unicElseLabel, asmFile);

}

if(je)

{

fputs("\tje\t", asmFile);

fputs(unicElseLabel, asmFile);

}

if(jle)

{

fputs("\tjle\t", asmFile);

fputs(unicElseLabel, asmFile);

}

if(jge)

{

fputs("\tjge\t", asmFile);

fputs(unicElseLabel, asmFile);

}

fputc('\n', asmFile);

reinterpret(recourse, 1); // 1 - reinterpret one operator

fpos_t filepos;

fgetpos(sourceFile, &filepos); //save file pointer

int tmp=lineNumber;//save line number

bool elseFlag=false;

readUpTo(' ');

if (stringComp(buf, "else"))

{

cout<<"\nELSE\n";

genUnicName("nel_",ifCounter,unicNotElseLabel);

fputs("\tjmp\t", asmFile);

fputs(unicNotElseLabel,asmFile);

fputc('\n',asmFile);

elseFlag=true;

}

else

{

fsetpos(sourceFile, &filepos); //restore file pointer and lineNumber

lineNumber=tmp;

}

fputs(unicElseLabel,asmFile);

fputs(":\n",asmFile);

if (elseFlag)

{

reinterpret(recourse, 1);

fputs(unicNotElseLabel,asmFile);

fputs(":\n",asmFile);

}

}

Документация для пользователя

Правила пользования:

1. создать файл "prog.pas" и поместить в каталог, где находиться Compiler.exe

2. Запустить Compiler.exe при успешной компиляции будет cоздан файл "program.asm"

3. Поместить файл 'program.asm' в каталог ASM и запустить Build.bat

при отсутствии ошибок будет создан файл Program.exe

4. Запустить program.exe

Все выводимые данные записаны в 16-ричной СС.

Требования к входной программе:

1. Програма должна начинаться с ключевого слова var

2. В ключевых словах не должны использоваться заглавные буквы

3. В операторе IF при указании операции сравнения пробелы между операндами и этой операцией сравнения обязательны

4. В именах переменных могут использоваться строчные буквы a...z и цифры 0...9 но первый символ обязательно буква

5. В объявлении типа a:integer вокруг символа ':' не должно быть пробелов

6. В выражениях должны содержаться только объявленные переменные и литералы (отсутсвует различие в интерпретации литералов и переменных)