Разработка транслятора для перевода программы, написанной на языке Паскаль, в текст программы на языке Си
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
Генератор кода функционирует аналогичным образом. По полученному фрагменту промежуточного представления он создает соответствующий фрагмент объектного кода. После этого управление возвращается синтаксическому анализатору.
По окончании исходного текста и завершении обработки всех промежуточных данных каждым из блоков лексический анализатор инициирует процесс завершения программы.
4. Структура программы и описание функций и операторов
Назначение подпрограмм:
Main - главная программа, осуществляющая проход синтаксического и лексического анализатора
IsCommen - Подпрограмма обработки комментариев
Var - подпрограмма обработки блока var и определяющие их типы как file или char в соответствии запускаются подпрограммы:
File - подпрограмма обработки файловой переменной
char - подпрограмма обработки символьной переменной
Write - подпрограмма обрабатывающая оператор write и в зависимости от его записи запускает подпрограммы:
toFile - подпрограмма обрабатывающая write при записи в файл
toScreen - обрабатывает write как обычный вывод сообщения на экран
rewrite - подпрограмма обрабатывающая оператор rewrite- подпрограмма обрабатывающая оператор assign(,w)
case - подпрограмма обрабатывающая оператор case. Возможно указание вложенных операторов case, операторных скобок или же их отсутствие.
begin - подпрограмма обработки сложных case функций, может так же обрабатывать любые блоки начинающиеся с begin и заканчивающиеся ключевым словом end- подпрограмма обрабатывающая простые конструкции case
Таблицы идентификаций:
Таблица 1.3 - Таблица ключевых слов
Оператор или ключевое словоНомерbegin1end2var3Char4boolean5False6true7and8or9case10assign11write12rewrite13
Таблица 1.4 - Таблица типов переменных
ТипИдентификационный номерЦелочисленный1Символьный2Логический3Файл4
Таблица 1.5 - Таблица типов слов
Тип словаИдентификационный номерОшибка0Пробел1Строка2Число3Символ4
5. Листинг программы
#include
#include
#include
#include *file1, *file2;int maxLen = 10000;int KWn = 13;* KWs[KWn] =
{
"begin", "end", "var", "char",
"boolean", "false", "true", "and",
"or", "case", "assign", "write",
"rewrite"
};
#define ww_begin 1
#define ww_end 2
#define ww_var 3
#define ww_char 4
#define ww_boolean 5
#define ww_false 6
#define ww_true 7
#define ww_and 8
#define ww_or 9
#define ww_case 10
#define ww_assign 11
#define ww_write 12
#define ww_rewrite 13
#define t_Int 1
#define t_char 2
#define t_Bool 3
#define t_File 5
#define w_error 0
#define w_space 1
#define w_str 2
#define w_numb 3
#define w_char 4pasfile[maxLen],[maxLen];inlen,outlen,paspos;pasop,cop,ker;
int wordLen;wordType;wordNumf;
int dt;struct var{s[64];tp;* next;
};*vars, *lvars;fle();addvar(int isGl){*np, *p;(isGl) p = vars; else p = lvars;(p) {(strlen(p->s)==wordLen&&
!memcmp(p->s,&pasfile[paspos],wordLen)) return 0;= p->next;
}= new var;
memcpy(np->s,&pasfile[paspos],wordLen);>s[wordLen]=0;>tp = -1;
if (isGl) {>next = vars;= np;
} else {>next = lvars;= np;
}1;
}sttov(int isGl, int type){*p;(isGl) p = vars; else p = lvars;(p) {(p->tp==-1) p->tp = type;= p->next;
}
}wivp(){* p;= lvars;(p) {(strlen(p->s)==wordLen&&
!memcmp(p->s,&pasfile[paspos],wordLen)) return p->tp;= p->next;
}= vars;(p) {(strlen(p->s)==wordLen&&
!memcmp(p->s,&pasfile[paspos],wordLen)) return p->tp;= p->next;
}0;
}freevars(int isGl){*p, *pp;= lvars;(p) {= p;= p->next;pp;
}= NULL;(isGl) {= vars;(p) {= p;= p->next;pp;
}= NULL;
}
}takeLex()
{st = 0;c;= 0;(wordLen+paspos='*' || c<='/' ||=='\''
)
{ wordLen = 1; return wordType = w_char; }{ wordLen = 0; return wordType = w_error; };1:(c==' ' || c=='\t' || c=='\n') wordLen++;return wordType = w_space;;2:(
(c>='A' && c<='Z') ||
(c>='a' && c<='z') ||
(c>='0' && c<='9') ||=='_'
) wordLen++;return wordType = w_str;;3:(c>='0' && c<='9') wordLen++; else(c=='.'&& pasfile[paspos+wordLen+1]!='.') {++;= 5;
}{= 0;wordType = w_numb;
};5:(c>='0' && c<='9') wordLen++; else {= 1;wordType = w_numb;
}
}
}= 0;0;
}str_pt(char * s){l = strlen(s);(&cfile[outlen],s,l);+= l;
}scmp(char * m, char * s, int n){l = strlen(s);(n>l) l = n;memicmp(m,s,l);
}put_char(char c){[outlen] = c;++;
}trCpy(){(&cfile[outlen],&pasfile[paspos],wordLen);+= wordLen;+= wordLen;
}trEqu(char * s){(!scmp(&pasfile[paspos],s,wordLen));
}wr_skip(){+= wordLen;
}wstr(char * s){(s,&pasfile[paspos],wordLen);
}IsWrd(){();(wordType==w_space) {_skip();();
}wordType;
}inc_dt()
{+= 2;
}dt_pl()
{-= 2;
}dt_pt()
{(int i=0; i<dt; i++) put_char(' ');
}put_dt11()
{s[10];(int i=0; i<dt; i++) {(s,"%d",i/2);_pt(s);
}
}i_file(char * s1)
{((file1 = fopen(s1, "rt")) == NULL){0;
}(file1, 0, SEEK_END);= ftell(file1);(file1, 0, SEEK_SET);(inlen>maxLen) inlen = maxLen;= fread(pasfile,1,inlen,file1);[inlen] = 0;= 0;= 0;1;
}o_file(char * s2)
{((file2 = fopen(s2, "wt")) == NULL){0;
}(cfile,outlen,1,file2);1;
}op_err()
{_char('\n');_pt("= inlen) {();;
};();
}++;
}f_commen(){(pasfile[paspos]=='{' ||[paspos]=='(' ||pasfile[paspos+1]=='*');
}f_endcommen(){(pasfile[paspos]=='{'){[outlen] = '/';[outlen+1] = '*';++;+= 2;(pasfile[paspos]!='}' && paspos=inlen) return;[outlen] = pasfile[paspos];++;++;
}[outlen] = '*';[outlen+1] = '/';++;+= 2;
}{[outlen] = '/';[outlen+1] = '*';+= 2;+= 2;(!(pasfile[paspos]=='*' && pasfile[paspos+1]==')')
&& paspos=inlen) return;[outlen] = pasfile[paspos];++;++;
}[outlen] = '*';[outlen+1] = '/';+= 2;+= 2;
}_char('\n');
}ifKw(){(int i=0; i<KWn; i++){(!scmp(&pasfile[paspos],KWs[i],wordLen))i+1;
}0;
}varOpT(int svar, int isGl){s[256];label;sp = 0;();(1){(wordType!=w_str||ifKw()|| isGl>0&&wivp()) return 0;(isGl);(svar) {[sp] = '&';[sp+1] = ' ';+= 2;
}(&s[sp],&pasfile[paspos],wordLen);+= wordLen;+= wordLen;();(pasfile[paspos]==','){
s[sp]=',';++;
sp++;
} else break;();
}(pasfile[paspos]==':'){++;();(wordType!=w_str) return 0;(!scmp(&pasfile[paspos],"boolean",wordLen)){(isGl,t_Bool);_pt("int ");_skip();(&cfile[outlen],&s[0],sp);+= sp;
}(!scmp(&pasfile[paspos],"char",wordLen)){(isGl,t_char);_pt("char ");_skip();(&cfile[outlen],&s[0],sp);+= sp;
}(!scmp(&pasfile[paspos],"integer",wordLen)){
sttov(isGl,t_Int);_pt("int ");
wr_skip();(&cfile[outlen],&s[0],sp);+= sp;
}(trEqu("file"))
{_skip();();(!trEqu("of")) return 0;_skip();();_pt("FILE *");(&cfile[outlen],&s[0],sp);+= sp;_skip();(isGl,t_File);
}
}return 0;1;
}fvarBlk(int isGl){+= wordLen;();{