Транслятор для перевода программ с языка Паскаль в текст программы на языке Си

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование

нг программы

#include

#include

#include

#include *file1, *file2;int buflen = 10000;int KWn = 13;* KWs[KWn] =

{

"begin", "end", "var", "boolean",

"false", "true", "while", "do",

"and", "or", "assign", "read",

"reset"

};// Словарь ключевых слов

#define key_wrd_begin 1

#define key_wrd_end 2

#define key_wrd_var 3

#define key_wrd_boolean 4

#define key_wrd_false 5

#define key_wrd_true 6

#define key_wrd_while 7

#define key_wrd_do 8

#define key_wrd_and 9

#define key_wrd_or 10

#define key_wrd_assign 11

#define key_wrd_read 12

#define key_wrd_reset 13

#define t_t_int 1

#define t_t_bool 2

#define t_t_file 3

// идентификаторы возможных типов слов

#define w_w_err 0 // Идентификатор ошибочного оператора

#define w_w_sp 1 // Идентификатор символа пробела

#define w_w_str 2 // Идентификатор строки

#define w_w_n 3 // Идентификатор числа

#define w_w_c 4 // Любые символы разделители, такие как \n \t и тд

//собственно это наши входные и выходные большие строки, в эти большие

//строки записываются также символы конца строки '\n', что и используется в дальнейшем для формирования выходного теста построчно

char insource[buflen],[buflen];inlen,outspos,inspos; ;//текущие позиции op_f_in,op_f_out,ker; ;//эти переменные iитают количество операторов во входном, выходном файле и кол-во ошибок

int wlen; //длина "слова"

int wt_type; //тип "слова"

int wnumf; //0 - целое число, 1 - дробное

int dt; //размер отступа (от начала строки)

typedef struct var{s[64];tp;* next;

};struct types{s[64];tid;* next;

};*vlst, *lvlst; ; //списки переменных* typeslist;fle();addvar(int globalID){*np, *p;(globalID) p = vlst; else p = lvlst;(p) {(strlen(p->s)==wlen&&

!memcmp(p->s,&insource[inspos],wlen)) return 0;= p->next;

}= new var;(np->s,&insource[inspos],wlen);>s[wlen]=0;>tp = -1;(globalID) {>next = vlst;= np;

} else {>next = lvlst;= np;

}1;

}settype(int globalID, int type){*p;(globalID) p = vlst; else p = lvlst;(p) {(p->tp==-1) p->tp = type;= p->next;

}

}gettype(){* p;= lvlst;(p) {(strlen(p->s)==wlen&&

!memcmp(p->s,&insource[inspos],wlen)) return p->tp;= p->next;

}= vlst;(p) {(strlen(p->s)==wlen&&

!memcmp(p->s,&insource[inspos],wlen)) return p->tp;= p->next;

}0;

}clearl(int globalID){*p, *pp;= lvlst;(p) {= p;= p->next;pp;

}= NULL;(globalID) {= vlst;(p) {= p;= p->next;pp;

}= NULL;

}

}getsymbol()

{st = 0;c;= 0;(wlen+inspos='*' || c<='/' ||=='\''

)

{ wlen = 1; return wt_type = w_w_c; }{ wlen = 0; return wt_type = w_w_err; };1:(c==' ' || c=='\t' || c=='\n') wlen++;return wt_type = w_w_sp;;2:(

(c>='A' && c<='Z') ||

(c>='a' && c<='z') ||

(c>='0' && c<='9') ||=='_'

) wlen++;return wt_type = w_w_str;;3:(c>='0' && c<='9') wlen++; else(c=='.'&& insource[inspos+wlen+1]!='.') {++;= 5;

}{= 0;wt_type = w_w_n;

};5:(c>='0' && c<='9') wlen++; else {= 1;wt_type = w_w_n;

}

}

}= 0;0;

}putsrt(char * s){l = strlen(s);(&outsource[outspos],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){[outspos] = c;++;

}wcopy(){(&outsource[outspos],&insource[inspos],wlen);+= wlen;+= wlen;

}wequ(char * s){(!scmp(&insource[inspos],s,wlen));

}wskip(){+= wlen;

}wstr(char * s){(s,&insource[inspos],wlen);

}analyseWord(){();(wt_type==w_w_sp) {();();

}wt_type;

}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);(s);

}

}frfile(char * s1)

{((file1 = fopen(s1, "rt")) == NULL){0;

}(file1, 0, SEEK_END);= ftell(file1);(file1, 0, SEEK_SET);(inlen>buflen) inlen = buflen;= fread(insource,1,inlen,file1);[inlen] = 0;= 0;= 0;1;

}tofl(char * s2)

{((file2 = fopen(s2, "wt")) == NULL){0;

}(outsource,outspos,1,file2);1;

}ErrOp()

{_char('\n');("= inlen) {();;

};();

}++;

}flabel(int globalID);IsComment(){(insource[inspos]=='{' ||[inspos]=='(' ||insource[inspos+1]=='*');

}CommEnd(){(insource[inspos]=='{'){[outspos] = '/';[outspos+1] = '*';++;+= 2;(insource[inspos]!='}' && inspos=inlen) return;[outspos] = insource[inspos];++;++;

}[outspos] = '*';[outspos+1] = '/';++;+= 2;

}{[outspos] = '/';[outspos+1] = '*';+= 2;+= 2;(!(insource[inspos]=='*' && insource[inspos+1]==')')

&& inspos=inlen) return;[outspos] = insource[inspos];++;++;

}[outspos] = '*';[outspos+1] = '/';+= 2;+= 2;

}_char('\n');

}fkW(){(int i=0; i<KWn; i++){(!scmp(&insource[inspos],KWs[i],wlen))i+1;

}0;

}fIntRealBoolAr(int svar, int globalID){s[256];label;sp = 0;();(1){(wt_type!=w_w_str||fkW()|| globalID>0&&gettype() ) return 0;(globalID);(svar) {[sp] = '&';[sp+1] = ' ';+= 2;

}(&s[sp],&insource[inspos],wlen);+= wlen;+= wlen;();(insource[inspos]==','){[sp]=',';++;++;

} else break;();

}(insource[inspos]==':'){++;();(wt_type!=w_w_str) return 0;(!scmp(&insource[inspos],"boolean",wlen)){(globalID,t_t_bool);("int ");();(&outsource[outspos],&s[0],sp);+= sp;

}(!scmp(&insource[inspos],"integer",wlen)){(globalID,t_t_int);("int ");();(&outsource[outspos],&s[0],sp);+= sp;

}(wequ("file"))

{();();(!wequ("of")) return 0;();();("FILE *");(&outsource[outspos],&s[0],sp);+= sp;();(globalID,t_t_file);

}

}return 0;1;

}fvar(int globalID){+= wlen;();{_f_in++;(IsComment()){();_f_out++;;

}_dt();(!fIntRealBoolAr(0,globalID)) ErrOp();op_f_out++;();(insource[inspos]!=';')0;();(";\n");();(wt_type!=w_w_str || fkW())1;

}while(1);

}

fvardescr(){+= wlen;k,svar;();{= fkW();= k==key_wrd_var;(svar) {();();

}(!fIntRealBoolAr(svar,0)) return 0;();(insource[inspos]!=';') return 1;();(", ");();= fkW();(wt_type!=w_w_str || k&&k!=key_wrd_var) return 0;

}while(1);

}fbegin(int k);fprocedure(){();("\nvoid ");();(wt_type!=w_w_str||gettype()) return 0;(1);(1,10);();();(insource[inspos]!='(') return 0;_char('(');(!fvardescr()) return 0;();(insource[inspos]!=')') return 0;();();(insource[inspos]!=';') return 0;();("\n{\n");_dt();b;{= 1;();(!scmp(&insource[inspos],"var",wlen)){_f_in++;(!fvar(0)) return 0;

}(!scmp(&insource[inspos],"begin",wlen)){(!fbegin(2)) return 0;= 0;

}(IsComment()) CommEnd();return 0;

} while (b==1);(0);++;1;

}freset()

{();(insource[inspos]!='(') return 0;++;();();(insource[inspos]!=')') return 0;++;(insource[inspos]!=';') return 0;++;1;

}fassign()

{t;();(insource[inspos]!='(') return 0;++;();(t = gettype())

{(t==t_t_file)

{_dt();();(" = fopen(\"");(insource[inspos]!=',') return 0;+=2;(insource[inspos]!= '\'')

{[outspos] = insource[inspos];++;++;

}++;("\"");(",\"w\"");();(insource[inspos]!=')') return 0;++;(")");(insource[inspos]!=';') return 0;++;(";\n");1;

}

}1;

}fread(int ln){s[256];sp;t;();_dt();();(insource[inspos]!='(') return 0;++;();(t = gettype())

{(t==t_t_file)

{("fscanf(");();(insource[inspos]!=',') return 0;++;(",");(insource[inspos]!= ')')

{[outspos] = insource[inspos];++;++;

}();(insource[inspos]!=')') return 0;++;(")");(insource[inspos]!=';') return 0;++;(";\n");1;

}

}("scanf");("(\"");=0;(1) {();(wt_type!=w_w_str) return 0;= gettype();(t==t_t_int) putsrt("%d");return 0;[sp] = '&';+= wlen;();(&s[sp],&insource[inspos],wlen);+= wlen;+= wlen;();(insource[inspos]!=',') break;[sp] = insource[inspos];++;++;

}("\",");(&outsource[outspos],s,sp);+= sp;();(insource[inspos]!=')') return 0;++;_char(')');();(insource[inspos]!=';') return 0;++