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. В выражениях должны содержаться только объявленные переменные и литералы (отсутсвует различие в интерпретации литералов и переменных)