Структура программы и описание функций и операторов
Назначение подпрограмм: main - главная программа, запускающая остальные подпрограммы var - подпрограмма обработки переменных, запускает подпрограмму обработки типов, в которой обрабатываются целочисленные и логические типы.- подпрограмма обработки блока type, работает с подпрограммой record, которая запускается из type fprocedure - подпрограмма обработки процедуры, использует в качестве подпрограммы var и по мере надобности остальные подпрограммы операторов, которые встречаются в теле процедуры. Т.е. из под себя запускает функцию main.- подпрограмма обрабатывающая структуру repeat…until LE, тем самым запускает подпрограммы обработки логического выражения, а так же подпрограмму обработки операторов. assign - подпрограмма обработки операции присваивания, заменяет знаки, и может запускать подпрограммы обработки арифметических выражений.- подпрограмма обработки комментария. Запускает подпрограмму fcommend - обработка конца комментария (для упрощения схемы здесь данная подпрограмма упущена из виду.)- «интеллектуальная» подпрограмма использующаяся повсеместно. Обрабатывает текст, останавливает курсор на начале слова, возвращает длину слова (при этом не захватывает символы-разделители, лишь алфавит). err_or - подпрограмма обработки ошибок. Таблицы с идентификаторами:
Таблица 4.1 - Таблица с ключевыми словами
Таблица 4.2 - Таблица с типами переменных
Таблица 4.3 - Таблица с типамиwслов
Листинг программы
#include <conio.h> #include <stdio.h> #include <string.h> #include <locale.h> *spasfl, *ccfl; int memoLen = 10000;int kolvoKw = 13; * kwSList[kolvoKw] = { "begin", "end", "var", "boolean", "false", "true", "repeat", "until", "procedure", "type", "record", "and", "or" };
#define kwqe_begin 1 #define kwqe_end 2 #define kwqe_var 3 #define kwqe_boolean 4 #define kwqe_false 5 #define kwqe_true 6 #define kwqe_repeat 7 #define kwqe_until 8 #define kwqe_procedure 9 #define kwqe_type 10 #define kwqe_record 11 #define kwqe_and 12 #define kwqe_or 13
#define tpe_int 1 #define tpe_bool 2
#define wtpe_error 0 #define wtpe_space 1 #define wtpe_str 2 #define wtpe_numb 3 #define wtpe_char 4 InArray[memoLen], OutArray[memoLen]; InLength,OutLenght,inpointer;firstFl1,secFl2,errFl3; lenW; typeW; numfW; ots; struct var{ char s[64]; int tp; var * next; }; struct types{ char s[64]; int tid; types * next; }; *v_lst, *lv_lst; fle();fae();asign(); add_vr(int globalVar1){ var *np, *p; if (globalVar1) p = v_lst; else p = lv_lst; while (p) { if (strlen(p->s)==lenW&& !memcmp(p->s,&InArray[inpointer],lenW)) return 0; p = p->next; } np = new var; memcpy(np->s,&InArray[inpointer],lenW); np->s[lenW]=0; np->tp = -1; if (globalVar1) { np->next = v_lst; v_lst = np; } else { np->next = lv_lst; lv_lst = np; } return 1; } type_setter(int globalVar1, int type){ var *p; if (globalVar1) p = v_lst; else p = lv_lst; while (p) { if (p->tp==-1) p->tp = type; p = p->next; } } type_reciever(){ var * p;
p = lv_lst; while (p) { if (strlen(p->s)==lenW&& !memcmp(p->s,&InArray[inpointer],lenW)) return p->tp; p = p->next; }
p = v_lst; while (p) { if (strlen(p->s)==lenW&& !memcmp(p->s,&InArray[inpointer],lenW)) return p->tp; p = p->next; } return 0; } list_clearer(int globalVar1){ var *p, *pp; p = lv_lst; while (p) { pp = p; p = p->next; delete pp; } lv_lst = NULL; if (globalVar1) { p = v_lst; while (p) { pp = p; p = p->next; delete pp; } v_lst = NULL; } } getToken() { int st = 0; char c; lenW = 0; while (lenW+inpointer<InLength){ c = InArray[inpointer+lenW]; switch (st){ case 0: if (c==' ' || c=='\t' || c=='\n') st = 1; else if ((c>='A' && c<='Z')||(c>='a' && c<='z')) st = 2; else if (c>='0' && c<='9') st = 3; else if ( c=='.' || c<=',' || c >=':' || c<=';' || c=='+' || c<='-' || c>='*' || c<='/' ||
c=='\'' ) { lenW = 1; return typeW = wtpe_char; } else { lenW = 0; return typeW = wtpe_error; } break; case 1: if (c==' ' || c=='\t' || c=='\n') lenW++; else return typeW = wtpe_space; break; case 2: if ( (c>='A' && c<='Z') || (c>='a' && c<='z') || (c>='0' && c<='9') || c=='_' ) lenW++; else return typeW = wtpe_str; break; case 3: if (c>='0' && c<='9') lenW++; else if (c=='.'&& InArray[inpointer+lenW+1]!='.') { lenW++; st = 5; } else{ numfW = 0; return typeW = wtpe_numb; } break; case 5: if (c>='0' && c<='9') lenW++; else { numfW = 1; return typeW = wtpe_numb; } } } lenW = 0; return 0; }
putSrtw(char * s){ int l = strlen(s); memcpy(&OutArray[OutLenght],s,l); OutLenght += l; } scmp(char * m, char * s, int n){ int l = strlen(s); if (n>l) l = n; return memicmp(m,s,l); } putChrw(char c){ OutArray[OutLenght] = c; OutLenght++; } copyit(){ memcpy(&OutArray[OutLenght],&InArray[inpointer],lenW); inpointer += lenW; OutLenght += lenW; } equit(char * s){ return (!scmp(&InArray[inpointer],s,lenW)); } skipit(){ inpointer += lenW; } wstr(char * s){ strncpy(s,&InArray[inpointer],lenW); } GetTokens(){ getToken(); if (typeW==wtpe_space) { skipit(); getToken(); } return typeW; } inc_dt() { ots += 2; } dec_dt() { ots -= 2; } put_dt() { for (int i=0; i<ots; i++) putChrw(' '); } put_dt11() { char s[10]; for (int i=0; i<ots; i++) { sprintf(s,"%d",i/2); putSrtw(s); } } inTxt(char * s1) { if ((spasfl = fopen(s1, "rt")) == NULL){ return 0; } fseek(spasfl, 0, SEEK_END); InLength = ftell(spasfl); fseek(spasfl, 0, SEEK_SET); if (InLength>memoLen) InLength = memoLen; InLength = fread(InArray,1,InLength,spasfl); InArray[InLength] = 0; inpointer = 0; OutLenght = 0;
return 1; } outTxt(char * s2) { if ((ccfl = fopen(s2, "wt")) == NULL){ return 0; } fwrite(OutArray,OutLenght,1,ccfl); return 1; }err_or() { putChrw('\n'); putSrtw("< Ошибка! > \n"); int k; while (1){ GetTokens(); if (InArray[inpointer]== ';' || inpointer>= InLength) { copyit(); break; }; copyit(); } errFl3++; } fcomment(){ return (InArray[inpointer]=='{' || InArray[inpointer]=='(' ||InArray[inpointer+1]=='*'); } fcommend(){ if (InArray[inpointer]=='{'){ OutArray[OutLenght] = '/'; OutArray[OutLenght+1] = '*'; inpointer++; OutLenght += 2; while (InArray[inpointer]!='}' && inpointer<InLength) { if (inpointer>=InLength) return; OutArray[OutLenght] = InArray[inpointer]; inpointer++; OutLenght++; } OutArray[OutLenght] = '*'; OutArray[OutLenght+1] = '/'; inpointer++; OutLenght += 2; } else{ OutArray[OutLenght] = '/'; OutArray[OutLenght+1] = '*'; inpointer += 2; OutLenght += 2;
while (!(InArray[inpointer]=='*' && InArray[inpointer+1]==')') && inpointer<InLength) { if (inpointer>=InLength) return; OutArray[OutLenght] = InArray[inpointer]; inpointer++; OutLenght++; } OutArray[OutLenght] = '*'; OutArray[OutLenght+1] = '/'; inpointer += 2; OutLenght += 2; } putChrw('\n'); } isthsKWD(){ for (int i=0; i<kolvoKw; i++){ if (!scmp(&InArray[inpointer],kwSList[i],lenW)) return i+1; } return 0; } fvarInt(int svar, int globalVar1){
char s[256]; int label; int sp = 0; GetTokens(); while (1){ if (typeW!=wtpe_str||isthsKWD()|| globalVar1>0&&type_reciever()) return 0; add_vr(globalVar1); if (svar) { s[sp] = '&'; s[sp+1] = ' '; sp += 2; } memcpy(&s[sp],&InArray[inpointer],lenW); inpointer += lenW; sp += lenW;
GetTokens(); if (InArray[inpointer]==','){ s[sp]=','; inpointer++; sp++; } else break; GetTokens(); }
if (InArray[inpointer]==':'){ inpointer++;
GetTokens(); if ((typeW!=wtpe_str)&&(typeW!=wtpe_char)) return 0; if (!scmp(&InArray[inpointer],"boolean",lenW)){ type_setter(globalVar1,tpe_bool); putSrtw("int "); skipit(); memcpy(&OutArray[OutLenght],&s[0],sp); OutLenght += sp; } else if (!scmp(&InArray[inpointer],"integer",lenW)){ type_setter(globalVar1,tpe_int); putSrtw("int "); skipit(); memcpy(&OutArray[OutLenght],&s[0],sp); OutLenght += sp; } } else return 0; return 1; } fvar(int globalVar1){ inpointer += lenW; GetTokens(); do{ firstFl1++; if (fcomment()){ fcommend(); secFl2++; continue; } put_dt(); if (!fvarInt(0,globalVar1)) err_or(); else secFl2++;
GetTokens(); if (InArray[inpointer]!=';') return 0; skipit(); putSrtw(";\n"); GetTokens(); if (typeW!=wtpe_str || isthsKWD()) return 1; }while(1); } fvardescr(){ inpointer += lenW; int k,svar; GetTokens(); do{ k = isthsKWD(); svar = k==kwqe_var; if (svar) { skipit(); GetTokens(); } if (!fvarInt(svar,0)) return 0; GetTokens(); if (InArray[inpointer]!=';') return 1; skipit(); putSrtw(", "); GetTokens(); k= isthsKWD(); if (typeW!=wtpe_str || k&&k!=kwqe_var) return 0; }while(1); } fbegin(int k); fprocedure(){
skipit(); putSrtw("\nvoid ");
GetTokens(); if (typeW!=wtpe_str||type_reciever()) return 0; add_vr(1); type_setter(1,10); copyit();
GetTokens(); if (InArray[inpointer]!='(') return 0; putChrw('(');
if (!fvardescr()) return 0;
GetTokens(); if (InArray[inpointer]!=')') return 0; copyit();
GetTokens(); if (InArray[inpointer]!=';') return 0; skipit();
putSrtw("\n{\n");
inc_dt();
int b; do{ b = 1; GetTokens(); if (!scmp(&InArray[inpointer],"var",lenW)){ firstFl1++; if (!fvar(0)) return 0; } else if (!scmp(&InArray[inpointer],"begin",lenW)){ if (!fbegin(2)) return 0; b = 0; } else if (fcomment()) fcommend(); else return 0;
} while (b==1);
list_clearer(0); inpointer++; return 1; }
frecord(){ skipit(); putSrtw("struct ");
GetTokens(); if (typeW!=wtpe_str || isthsKWD()) return 0; copyit();
GetTokens(); if (InArray[inpointer]!='=') return 0; skipit();
GetTokens(); if (!equit("record")) return 0; putSrtw("\n{\n");
inc_dt(); if (!fvar(-1)) return 0; dec_dt();
GetTokens(); if (!equit("end")) return 0; skipit(); putChrw('}');
GetTokens(); if (InArray[inpointer]!=';') return 0; copyit(); putSrtw("\n\n");
inpointer += lenW; return 1; } fae() {
GetTokens(); if (InArray[inpointer]=='+'){ copyit(); } else if (InArray[inpointer]=='-'){ copyit(); } while (1){ GetTokens(); if (typeW==wtpe_numb) copyit(); else if (typeW==wtpe_str&&type_reciever()==tpe_int) copyit(); else if (InArray[inpointer]=='('){ copyit(); if (!fae()) return 0;
GetTokens(); if (InArray[inpointer]!=')') return 0; inpointer++; putChrw(')'); } else return 0;
GetTokens(); char c = InArray[inpointer]; if (c=='+'||c=='-'||c=='*'||c=='/') copyit(); else return 1; } } ae(){ char c,c1; if (!fae()) return 0;
GetTokens(); c = InArray[inpointer]; c1 = InArray[inpointer+1]; if (c=='<'&&c1=='>') { inpointer += 2; putSrtw("!="); } else if (c=='=') { inpointer++; putSrtw("=="); } else if (c=='>'||c=='<') { if (c1=='='){ inpointer += 2; } else copyit(); }
GetTokens(); if (!fae()) return 0; return 1; } fle() { int k; char c,c1; int arifm, ip,op; while (1){ GetTokens(); k = isthsKWD(); int ip, op; ip = inpointer; op = OutLenght; arifm = 0; if(InArray[inpointer]=='+'|| InArray[inpointer]=='('|| InArray[inpointer]=='-'|| typeW==wtpe_str&&!isthsKWD() || typeW==wtpe_numb) arifm = ae();
if (!arifm){ inpointer = ip; OutLenght = op;
GetTokens(); k = isthsKWD();
if (typeW==wtpe_str&&k==kwqe_true){ skipit(); putChrw('1'); } else if (typeW==wtpe_str&&k==kwqe_false) { skipit(); putChrw('0'); } else if (typeW==wtpe_str&&type_reciever()==tpe_bool) copyit(); else if (InArray[inpointer]=='('){ copyit(); if (!fle()) return 0;
GetTokens(); if (InArray[inpointer]!=')') return 0; inpointer++; putChrw(')'); } else return 0;
}
GetTokens(); k = isthsKWD(); if (k==kwqe_or) putSrtw("||"); else if (k==kwqe_and) putSrtw("&&"); else return 1;
skipit(); } } asign(){ int type = type_reciever(); if (!(type==tpe_bool||type==tpe_int)) return 0;
put_dt(); copyit();
GetTokens(); if (InArray[inpointer]!=':'||InArray[inpointer+1]!='=') return 0; putChrw('='); inpointer += 2;
if (type==tpe_bool) { if (!fle()) return 0; } else if (!fae()) return 0;
GetTokens(); if (InArray[inpointer]!=';') return 0; copyit(); putChrw('\n'); return 1; } frepeat() { skipit(); put_dt(); putSrtw("do {\n"); inc_dt(); return 1; } funtil() { skipit(); dec_dt(); put_dt(); putSrtw("} while ("); if (!fle()) return 0; putChrw(')');
GetTokens(); if (InArray[inpointer]!=';') return 0; inpointer++; putSrtw(";\n"); return 1; } fbegin(int globalVar1){ int rep_n = 0; if(globalVar1!=3) skipit(); if (globalVar1==1) putSrtw("\n\nvoid main()\n"); if ((globalVar1!=2)||(globalVar1!=3)) { put_dt(); putSrtw("{\n"); inc_dt(); }
int b; do{ b = 1; GetTokens(); if (fcomment()){ fcommend(); continue; } switch(isthsKWD()){ case kwqe_begin: firstFl1++; if (!fbegin(0)) return 0; secFl2++; break; case kwqe_repeat: firstFl1++; rep_n++; if (!frepeat()) return 0; break; case kwqe_until: if (rep_n>0){ rep_n--; if (!funtil()) return 0; secFl2++; } else return 0; break; case kwqe_procedure: if (!fprocedure()) return 0; break; case kwqe_end: firstFl1++; if(globalVar1 == 3) return 3; skipit(); dec_dt(); put_dt(); putSrtw("}\n"); GetTokens(); if (globalVar1==1&&InArray[inpointer]=='.' || globalVar1!=1&&InArray[inpointer]==';'){ skipit(); secFl2++; return 1; } else { skipit(); return 0; } case 0: if (!asign()) return 0; break; default: return 0; } } while (b); return 1; } main_prgrm() { int b; int k; firstFl1 = secFl2 = 0; putSrtw("#include <stdio.h>\n\n"); do{ b = 1; GetTokens(); k = isthsKWD(); if (k==kwqe_var){ firstFl1++;
if (!fvar(1)) { err_or(); } else secFl2++; } else if (k==kwqe_type){ firstFl1++; if (!frecord()) { err_or(); } else secFl2++; } else if (k==kwqe_procedure){ if (!fprocedure()) { err_or(); } } else if (k==kwqe_begin){ if (!fbegin(1)) { err_or(); } b = 0; } else if (fcomment()) fcommend(); else { firstFl1++; err_or(); };
} while (b==1);
if (InArray[inpointer]!='.') return 0; inpointer++; return 1; } main() { setlocale(LC_ALL,"Russian"); char s[128]; printf("Выберите файл для трансляции: "); scanf("%s",s); if (!inTxt(s)) { printf("\nПроизошла ошибка при открытии!"); getch(); return; }
v_lst = NULL; lv_lst = NULL; main_prgrm(); list_clearer(1);
printf("\nВведите имя для записи результата:"); scanf("%s",s); if (!outTxt(s)) { printf("\nПроизошла ошибка при создании файла!"); getch(); return; }
printf("\nВо входном файле было %d операторов", firstFl1); printf("\nВ новый файл эквивалентно %d перенесено", secFl2); printf("\n Ошибочных: %d", errFl3); printf("\n\nРезультат в файле: %s",s);
fclose(spasfl); fclose(ccfl); while (!kbhit()); }
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|