#include<stdio.h>
#include<ctype.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#define MAXVAR 50
FILE *in,*out;
char ch,name[20];
int lineno=1,count=0,varcode[50];
char systable[20][20]={"begin","end","scanf","printf"},
codetable[20][10]={"{","}","in","out"},
varname[50][20];
void open(char *s,char *s1);
void close();
void digit(char ch);
void skipspace();
void search(char ch);
void readfile();
void main(int argc,char *argv[])
{
open(argv[1],argv[2]);
readfile();
close();
}
void open(char *s,char *s1)
{
if ((in=fopen(s,"r"))==NULL)
{ printf("Can not input file");exit(0);}
if ((out=fopen(s1,"w"))==NULL)
{ printf("Can not output file");exit(0);}
}
void error(char *s)
{printf(" Error: %s Line number: %d",s,lineno);exit(0);}
void operat(char ch)
{
if(ch=='('||ch==',') fputc(' ',out);
else fputc(ch,out);
}
void readfile()
{
ch=fgetc(in);
while(ch!=EOF)
{ skipspace();
if(isalpha(ch)) search(ch);
else
if(isdigit(ch)) digit(ch);
else
if(ch=='=') operat(ch);
ch=fgetc(in);
}
}
void close()
{fclose(in);fclose(out);}
void skipspace()
{
while(ch==' '||ch=='\t'||ch=='\n')
{if(ch=='\n') {lineno++;fputc('\n',out);}ch=fgetc(in); }
}
void addvar(char *s)
{
strcpy(varname[++count],s);
varcode[count]=count;
fputs("id",out);fprintf(out,"%d",count);
}
void varsearch(char *s)
{
int i=count,k=0;
while (i>0)
{ if(strcmp(s,varname[i])==0) {k=1;break;} i--; }
if(k==1) {fputs("id",out);fprintf(out,"%d",i);}
else addvar(s);
}
void ioparametr()
{
fputc(' ',out);
char n[50];
int i=0;
ch=fgetc(in);
while(1)
{
while(isalpha(ch))
{ n[i]=ch;ch=fgetc(in);i++;}
n[i]='\0';
if(ch==',') fputc(' ',out);
else
if(ch==')')
{
fputc(' ',out);
if((ch=fgetc(in))==';') break;
else error("; - not");
}
else error("Error");
}
}
void search(char ch)
{
int i=0,k=0;
while(isalpha(ch))
{name[i]=ch;ch=fgetc(in);i++;}
name[i]='\0';
i=0;
while(i<4)
{ if(0==strcmp(name,systable[i]))
{k=1;break;}i++;
}
if (k==1)
{ if (i<2)
{ fputs(codetable[i],out);}
else {fputs(codetable[i],out);
if((ch=fgetc(in))=='(') ioparametr();
else error("( haalt alga");
}
}
else varsearch(name);
}
void digit(char ch)
{
while(isdigit(ch))
{ fputc(ch,out);ch=fgetc(in);}
}
No comments:
Post a Comment