Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Структура программы и описание функций и операторов




 

Назначение подпрограмм:

main - главная программа, запускающая остальные подпрограммы

var - подпрограмма обработки переменных, запускает подпрограмму обработки типов, в которой обрабатываются целочисленные и логические типы.- подпрограмма обработки блока type, работает с подпрограммой record, которая запускается из type

fprocedure - подпрограмма обработки процедуры, использует в качестве подпрограммы var и по мере надобности остальные подпрограммы операторов, которые встречаются в теле процедуры. Т.е. из под себя запускает функцию main.- подпрограмма обрабатывающая структуру repeat…until LE, тем самым запускает подпрограммы обработки логического выражения, а так же подпрограмму обработки операторов.

assign - подпрограмма обработки операции присваивания, заменяет знаки, и может запускать подпрограммы обработки арифметических выражений.- подпрограмма обработки комментария. Запускает подпрограмму fcommend - обработка конца комментария (для упрощения схемы здесь данная подпрограмма упущена из виду.)- «интеллектуальная» подпрограмма использующаяся повсеместно. Обрабатывает текст, останавливает курсор на начале слова, возвращает длину слова (при этом не захватывает символы-разделители, лишь алфавит).

err_or - подпрограмма обработки ошибок.

Таблицы с идентификаторами:

 

Таблица 4.1 - Таблица с ключевыми словами

Ключевое слово Номер
bеgin 1
еnd 2
Var 3
boolean 4
falsе 5
true 6
repeat 7
until 8
procedure 9
typе 10
rеcord 11
and 12
оr 13

 

Таблица 4.2 - Таблица с типами переменных

Тип Идентификационный номер
Целочисленный 1
Логический 3

Таблица 4.3 - Таблица с типамиwслов

Тип слова Идентификационный номер
Ошибочный оператоp 0
Знак пpопуска 1
Стрoка 2
Числo 3
Симвoл 4

 

Листинг программы

 

#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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...