Транслятор на языке Си для перевода текста программы с языка Паскаль на язык Си (integer, repeat тАж until, procedure, type, record (для type))

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

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

ot;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=='') {

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

}

}

<