Транслятор на языке Си для перевода текста программы с языка Паскаль на язык Си (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();
}
}
<