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

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

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



подпрограммы 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