Транслятор на языке Си для перевода текста программы с языка Паскаль на язык Си (операторы real, case, записи, указатель (на запись))
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
?ания текста- указатель на буфер назначения.
// src - указатель на исходную строку.
// len - максимальное количество копируемых символов
. Листинг программы
#include
#include
#include
#include
#include *file1, *file2;int buflen = 10000;int KWn = 15;* KWs[KWn] =
{ "begin", "end", "var", "real",
"boolean", "false", "true", /* "array", */
"while", "do", "type", "and",
"or", /*"case", */ "assign", /* "read",*/
"write", "rewrite", /*"reset"*/};
#define kw_begin 1
#define kw_end 2
#define kw_var 3
#define kw_real 4
#define kw_boolean 5
#define kw_false 6
#define kw_true 7
/*#define kw_array 8*/
#define kw_while 8
#define kw_do 9
#define kw_type 10
#define kw_and 11
#define kw_or 12
/*#define kw_case 14*/
#define kw_assign 13
/*#define kw_read 16*/
#define kw_write 14
#define kw_rewrite 15
/*#define kw_reset 19*/
#define t_Int 1 //целый
/*#define t_Real 2 //дробный*/
#define t_Bool 2 //логический
/*#define t_Array 4 //массив*/
#define t_File 3int cuservars = 6;uvars;
#define w_error 0 //ошибка
#define w_space 1 //пробелы
#define w_str 2 //строка
#define w_numb 3 //число
#define w_char 4 //символ (разделитель, ...)
char instr[buflen],[buflen];inlen,outlen,inpos;koper1,koper2,ker;wlen; //длина "слова"wtype; //тип "слова"
int wnumf; //0 - целое число, 1 - дробноеdt; //
typedef struct var{s[64];tp;* next; };struct types{s[64];tid;* next;};*vars, *lvars;* typeslist;fle();addvar(int gl){*np, *p;(gl) p = vars; else p = lvars;
// int memcmp(const void *buf1, const void *buf2, size_t count);(p) {(strlen(p->s)==wlen&&
!memcmp(p->s,&instr[inpos],wlen)) return 0;= p->next; }= new var;
// void *memcpy(void *to, const void *from, size_t count);(np->s,&instr[inpos],wlen);>s[wlen]=0;>tp = -1;(gl) {>next = vars;= np;
} else {>next = lvars;= np; }1;}addnewtype()
{types *head=typeslist, *ntype;(head) {(strlen(head->s)==wlen&&
!memcmp(head->s,&instr[inpos],wlen)) return 0;= head->next;}= new types;(ntype->s,&instr[inpos],wlen);>s[wlen]=0;>tid = uvars;++;>next = typeslist;= ntype;1;}settype(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)==wlen&&= p->next; }= vars;(p) {(strlen(p->s)==wlen&&
!memcmp(p->s,&instr[inpos],wlen)) return p->tp;= p->next;}0;}* usertype()
{ types * p;
// обработка локальных переменных= typeslist;
while (p) {(strlen(p->s)==wlen&&
!memcmp(p->s,&instr[inpos],wlen)) return p->s;= p->next;}"0";}freevars(int gl){*p, *pp;= lvars;(p) {= p;= p->next;pp; }= NULL;(gl) {= vars;(p) {= p;= p->next;pp; }= NULL;}}GetWord()
{st = 0;c;= 0;(wlen+inpos='*' || c<='/' ||=='\'' )
{ wlen = 1; return wtype = w_char; }{ wlen = 0; return wtype = w_error; };1:(c==' ' || c=='\t' || c=='\n') wlen++;return wtype = w_space;;2:
((c>='A' && c<='Z') ||
(c>='a' && c<='z') ||
(c>='0' && cl) l = n;
/*int memicmp (buf1, buf2, cnt);memicmp(m,s,l);}put_char(char c){[outlen] = c;++;}wcopy(){(&outstr[outlen],&instr[inpos],wlen);+= wlen;+= wlen;}wequ(char * s){(!scmp(&instr[inpos],s,wlen));}wskip(){+= wlen;}wstr(char * s){
// char *strncpy (char *dst, const char *src, size_t len);(s,&instr[inpos],wlen);}Getwords(){();(wtype==w_space) {();();}wtype;}inc_dt()
{+= 2;}dec_dt()
{ 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); }
}GetText(char * s1)
{((file1 = fopen(s1, "rt")) == NULL){0;}(file1, 0, SEEK_END);= ftell(file1);(file1, 0, SEEK_SET);(inlen>buflen) inlen = buflen;= fread(instr,1,inlen,file1);[inlen] = 0;= 0;= 0;1;}PutText(char * s2)
{((file2 = fopen(s2, "wt")) == NULL){0; }(outstr,outlen,1,file2);1;}ErrOp()
{_char('\n');_str("= inlen) {();;};();}++; }flabel(int gl);
//проверка на комментарий
int IsComment(){
return (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]==')')
&& inpos0&&vartype() ) return 0;(gl);(svar) {[sp] = '&';[sp+1] = ' ';+= 2;}(&s[sp],&instr[inpos],wlen);+= wlen;+= wlen;();(instr[inpos]==','){[sp]=',';++;++;
} else break;();
} // while(1)(instr[inpos]==':'){ //тип переменных++;();(wtype!=w_str) return 0;(!scmp(&instr[inpos],"boolean",wlen)){(gl,t_Bool);_str("int ");();(&outstr[outlen],&s[0],sp);+= sp;}
/*if (!scmp(&instr[inpos],"real",wlen)){(gl,t_Real);_str("float ");();(&outstr[outlen],&s[0],sp);+= sp;}*/(!scmp(&instr[inpos],"integer",wlen)){(gl,t_Int);_str("int ");();(&outstr[outlen],&s[0],sp);+= sp;}(!scmp(&instr[inpos],usertype(),wlen)){_str(usertype());_str(" ");();(&outstr[outlen],&s[0],sp);+= sp;}
/* if (!scmp(&instr[inpos],"array",wlen)){();(gl,t_Array);();(instr[inpos]!='[') return 0;[sp]='[';++;++;(1) {();(instr[inpos]!='1') return 0;();();(instr[inpos]!='.'||instr[inpos+1]!='.')0;+= 2;();(wtype!=w_numb) return 0;(&s[sp],&instr[inpos],wlen);+= wlen;+= wlen;();(instr[inpos]==']'){[sp]=']';++;++;;}
(instr[inpos]==','){++;[sp]=']';++;[sp]='[';++;} }();(wtype!=w_str) return 0;(scmp(&instr[inpos],"of",wlen)) return 0;();();(wtype!=w_str) return 0;(scmp(&instr[inpos],"real",wlen)) return 0;();_str("float ");(&outstr[outlen],&s[0],sp);+= sp;
}*/(wequ("file"))
{();();(!wequ("of")) return 0;();();_str("FILE *");(&outstr[outlen],&s[0],sp);+= sp;();(gl,t_File);}
}return 0;1;}fvar(int gl){+= wlen;();{++;(IsComment()){ //комментарии();++;;}_dt();(!fIntRealBoolAr(0,gl)) ErrOp();koper2++;();(instr[inpos]!=';')0;();_str(";\n");();(wtype!=w_str || fkW())1;
}while(1);
}
fvardescr(){+= wlen;k,svar;();{= fkW();= k==kw_var;(svar) {();();}(!fIntRealBoolAr(svar,0)) return 0;();(instr[inpos]!=';') return 1;();_str(", ");();= fkW();(wtype!=w_str || k&&k!=kw_var) return 0;
}while(1);}fbegin(int k);();_str("\nvoid ");();(wtype!=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;
do{= 1;();(!scmp(&instr[inpos],"var",wlen)){++;(!fvar(0)) return 0; }(!scmp(&instr[inpos],"begin",wlen)){(!fbegin(2)) return 0;= 0; }(IsComment()) CommEnd();return 0;
} while (b==1);
(0);++;1;}frecord(){();_str("struct ");();(wtype!=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");
+= wlen;1;}fgoto()
{();_dt();_str("goto ");();();(instr[inpos]!=';') return 0;_str(";\n");++;
//put_str("\n");1;}fcase()
{beg;();_dt();_str("switch");_str("(");();();_str("){\n");();(!wequ("of")) return 0;();(1)
{();(wequ("end")) {();++;_dt();_dt();_str("}\n&