Транслятор для перевода программ с языка Паскаль в текст программы на языке Си
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
нг программы
#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;++