Разработка конвертора на языке Си для перевода программ на языке Паскаль в текст программы на языке Си
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
подпрограммы Konvektor:
Начало
Анализ данных AnalizS
Проверка на ключевое слово fkW
Начало блока переменных
Проверка на ошибки ключевых слов
Блок описания типов
Начало блока операторов fbegin
Проверка на наличие комментарий IsComment / CommEnd
Точка в конце программы Конец
Описание подпрограммы AnalizS
Начало
Анализ длинны слова
Проверка символов
Если буква или цифра то увеличивает счетчик
Если знак препинания то возвращает что это символ
Если конец строки или пробел то возвращает, что этот символ пробел
Проверка на дробное число Конец
6. Кодирование аллгоритма программы транслятора на языке Си++
Оставленный нами текст программы на языке Си++ будет иметь вид:
#include "stdafx.h"
#include
#include
#include
#include *file1, *file2;int buob_logichn = 10000;int KS = 16;* KS1[KS] =
{
"begin", "end", "var", "write",
"writeln", "false", "true", "do",
"read", "readln", "function","type", "record", "and", "or",
"for" };
#define kw_begin 1
#define kw_end 2
#define kw_var 3
#define kw_write 4
#define kw_writeln 5
#define kw_false 6
#define kw_true 7
#define kw_do 8
#define kw_read 9
#define kw_readln 10
#define kw_function 11
#define kw_type 12
#define kw_record 13
#define kw_and 14
#define kw_or 15
#define kw_for 16
#define t_Int 1
#define t_Bool 3
#define t_Label 5int cuservars = 6;uvars;
#define w_error 0
#define w_space 1
#define w_str 2
#define w_numb 3
#define w_char 4instr[buob_logichn],[buob_logichn];inlen,outlen,inpos;kol1,kol2,ker;slen;stype;snumf;dt;struct var{s[64];tp;* next;
};struct types{s[64];tid;* next;
};*vars, *lvars;* typeslist;ob_logich();ob_arif();asign();dobatitvar(int gl){*np, *p;(gl) p = vars; else p = lvars;(p) {(strlen(p->s)==slen&&
!memcmp(p->s,&instr[inpos],slen)) return 0;= p->next;
}= new var;(np->s,&instr[inpos],slen);>s[slen]=0;>tp = -1;(gl) {>next = vars;= np;
} else {>next = lvars;= np;
}1;
}addnestype()
{*head=typeslist, *ntype;(head) {(strlen(head->s)==slen&&
!memcmp(head->s,&instr[inpos],slen)) return 0;= head->next;
}= new types;(ntype->s,&instr[inpos],slen);>s[slen]=0;>tid = uvars;++;>next = typeslist;= ntype;1;
}uvart()
{*head=typeslist;(head)
{(strlen(head->s)==slen&&
!memcmp(head->s,&instr[inpos],slen)) return head->tid;= head->next;
}0;
}* utname(int number)
{*head=typeslist;(head)
{(head->tid==number) return head->s; // то вернуть тип переменной= head->next;
}0;
}newtypew(int gl, int type){*p;(gl) p = vars; else p = lvars;(p) {(p->tp==-1) p->tp = type;= p->next;
}
}vartype(){* p;= lvars;(p) {(strlen(p->s)==slen&&
!memcmp(p->s,&instr[inpos],slen)) return p->tp;= p->next;
}= vars;(p) {(strlen(p->s)==slen&&
!memcmp(p->s,&instr[inpos],slen)) return p->tp;= p->next;
}0;
}* usertype()
{* p;= typeslist;(p) {(strlen(p->s)==slen&&
!memcmp(p->s,&instr[inpos],slen)) return p->s;= p->next;
}
}osvobw(int gl){*p, *pp;= lvars;(p) {= p;= p->next;pp;
}= NULL;(gl) {= vars;(p) {= p;= p->next;pp;
}= NULL;
}
}Analiz()
{st = 0;c;= 0;(slen+inpos='*' || c<='/' ||=='\''
)
{ slen = 1; return stype = w_char; }{ slen = 0; return stype = w_error; };1:(c==' ' || c=='\t' || c=='\n') slen++;return stype = w_space;;2:(
(c>='A' && c<='Z') ||
(c>='a' && c<='z') ||
(c>='0' && c<='9') ||=='_'
) slen++;return stype = w_str;;3:(c>='0' && c<='9') slen++; else(c=='.'&& instr[inpos+slen+1]!='.') {++;= 5;
}{= 0;stype = w_numb;
};5:(c>='0' && c<='9') slen++; else {= 1;stype = w_numb;
}
}
}= 0;0;
}put_str(char * s){l = strlen(s);(&outstr[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;++;
}wcopy(){(&outstr[outlen],&instr[inpos],slen);+= slen;+= slen;
}wequ(char * s){(!scmp(&instr[inpos],s,slen));
}wskip(){+= slen;
}wstr(char * s){(s,&instr[inpos],slen);
}AnalizS(){();(stype==w_space) {();();
}stype;
}inc_dt()
{+= 2;
}dec_dt()
{-= 2;
}put_dt()
{(int i=0; i<dt; i++) put_char(' ');
}put_dt11()
{s[10];(int i=0; i<dt; i++) {(s,"%d",i/2);_str(s);
}
}openText(char * s1)
{((file1 = fopen(s1, "rt")) == NULL){0;
}(file1, 0, SEEK_END);= ftell(file1);(file1, 0, SEEK_SET);(inlen>buob_logichn) inlen = buob_logichn;= fread(instr,1,inlen,file1);[inlen] = 0;= 0;= 0;1;
}vvodText(char * s2)
{((file2 = fopen(s2, "wt")) == NULL){0;
}(outstr,outlen,1,file2);1;
}Oshibka()
{_char('\n');_str("= inlen) {();;
};();
}++;
}IsComment(){(instr[inpos]=='{' ||[inpos]=='(' ||instr[inpos+1]=='*');
}CommEnd(){(instr[inpos]=='{'){[outlen] = '/';[outlen+1] = '*';++;+= 2;(instr[inpos]!='}' && inpos=inlen) return;[outlen] = instr[inpos];++;++;
}[outlen] = '*';[outlen+1] = '/';++;+= 2;
}{[outlen] = '/';[outlen+1] = '*';+= 2;+= 2;(!(instr[inpos]=='*' && instr[inpos+1]==')')
&& inpos=inlen) return;[outlen] = instr[inpos];++;++;
}[outlen] = '*';[outlen+1] = '/';+= 2;+= 2;
}_char('\n');
}fkW(){(int i=0; i<KS; i++){(!scmp(&instr[inpos],KS1[i],slen))i+1;
}0;
}fIntRealBoolAr(int svar, int gl){s[256];label;sp = 0;();(1){(stype!=w_str||fkW()|| gl>0&&vartype() ) return 0;(gl);(svar) {[sp] = '&';[sp+1] = ' ';+= 2;
}(&s[sp],&instr[inpos],slen);+= slen;+= slen;();(instr[inpos]==','){[sp]=',';++;++;
} else break;();
}(instr[inpos]==':'){++;();((stype!=w_str)&&(stype!=w_char)) return 0;(!scmp(&instr[inpos],"integer",slen)){(gl,t_Int);_str("int ");();(&outstr[outlen],&s[0],sp);+= sp;
}(!scmp(&instr[inpos],usertype(),slen)){_str(usertype());_str(" ");();(&outstr[outlen],&s[0],sp);+= sp;
}(!scmp(&instr[inpos],"^",slen)){();();(gl,uvart());();_str(" * ");(&outstr[outlen],&s[0],sp);+= sp;
}
}return 0;1;
}fvar(int gl){+= slen;();{++;(IsComment()){();++;;
}_dt();(!fIntRealBoolAr(0,gl)) Oshibka();kol2++;();(instr[inpos]!=';')0;();_str(";\n");();(stype!=w_str || fkW())1;
}while(1);
}fvardescr(){+= slen;k,svar;();{= fkW();= k==kw_var;(svar) {();();
}(!fIntRealBoolAr(svar,0)) return 0;();(instr[inpos]!=';') return 1;();_str(", ");();= fkW();(stype!=w_str || k&&k!=kw_var) return 0;
}while(1);
}fbegin(int k);ffunction(){();_str("\nvoid ");();(stype!=w_str||vartype()) return 0;(1);(1,10);();();(instr[inpos]!='(') return 0;_char('(');(!fvardescr()) return 0;();(instr[inpos]!=')') return 0;();();(instr[inpos]!=';') return 0;();_str("\n{\n");_dt();b;{= 1;();(!scmp(&instr[inpos],"var",slen)){++;(!fvar(0)) return 0;
}(!scmp(&instr[inpos],"begin",slen)){(!fbegin(2)) return 0;= 0;
}(IsComment()) CommEnd();return 0;
} while (b==1);(0);++;1;
}frecord(){();_str("struct ");();(stype!=w_str || fkW()) return 0;();();();(instr[inpos]!='=') return 0;();();(!wequ("record")) return 0;_str("\n{\n");_dt();(!fvar(-1)) return 0;_dt();();(!wequ("end")) return 0;();_char('}');();(instr[inpos]!=';') return 0;();_str("\n\n");+= slen;1;
}ffor()
{tvar[32],*tint;tdt=dt;();();(tvar,&instr[inpos],slen);[slen] = 0;_dt();= 0;_str("for(");(!asign()) return 0;_str(";");(wequ("to")) tint = "++)";(wequ("downto")) tint = "--)";();_str(tvar);();_str("<=");(!ob_logich()) {_str(tvar);();
}_str(";");();_str(tvar);_str(tint);_str(&qu