文档库 最新最全的文档下载
当前位置:文档库 › 编译方法.txt

编译方法.txt

#include
#include
#include
#include/*VC++使用该文件*/
#define lenth 15/*保留字长度*/
#define lenth2 17/*运算符、界限符表长度*/
struct {char name[21];int type ;int addr;}
indent[1000];/*为标识符表*/
struct st
{char name[21];int code;} sym;
int lenth =0;/*为标识符表长*/
FILE *f1,*f2;/*f1为输入文件指针,f2输出文件指针*/
int line = 1 ,row = 1 ,val ;/line,row/*分别为当前输入文件的位置*/
void getsym();
char getchr();
void error(int);
main(iny argc, char*argv[])
{/*argc表示参数的个数、argv[0]、argv[1]、argv[2]…… 表示运行程序时输入的字符串,包括执行文件名,调试时其参数设置,VC++6.0在Project下的子菜单Settings中的Debug选项卡下Program argument输入对话框中,设置Turbo C 2.0 在Options菜单下的子菜单Options中,输入对话框中设置*
char ft[12],*fc
if(f1 = fopen(argv[1],"r")) == null
{printf("connot open the file\n");
exit(0);
/*如不能打开输入文件,显示出信息退出*/
}
/*当参数个数小于等于2时,用户没有指出输出文件。此时,生成一个与输入文件名相同而后缀名不同的输出文件名;否则用户已输入输出文件名直接使用*/
if(argc<=2)
{strcpy(ft,argv[1]);
if((fc=strchr(ft,'.'))!=NULL)
strcpy(fc,".mid");
else
strcat(ft,".mid");
}
else
strcpy(ft,argv[2]);
if ((f2=fopen(ft,"w"))==NULL)/*打开输出文件*/
{PRINTF("connot open the file\n");
exit(0);
}
WHILE (!FEOF(F1))/*输入源文件不为空,取单词输出*/
{getsym();
printf("%s%d\n",https://www.wendangku.net/doc/8b1355551.html,,sym.code);
fprintf("%s%d\n",https://www.wendangku.net/doc/8b1355551.html,,sym.code);
}
fclose(f1);fclose(f2);
}
void getsym()
{static char a[lenth][10] = {"program","const","var","integer","long ","procedure","if","then","while ","do","read","write","begin","end","odd"
},
/*保留字表*/
d[length2][3]={"+","-","*","/","=","<>","<","<=",">",">=",".",",",";",":",":=","(",")"},
/*运算符、界限符表*/
str[21],ch='';
int i,n;
while (isspace(ch))/**
ch = getchr();
if (isalpha(ch))
{n=0;
while (isalpha(ch)||isalnnum(ch))
{if(isalpha(ch))
ch=tolower(ch);
if(n<20)
str[n++]=ch;
ch=getchr();
}
str[n]='\0';
for(i=0;iif(!strcmp(str,a[i]))break;
if(i{strcpy(syn,name ,a[i]);
sym.code=i+1;
}
else/*否者为标识符并检查标识符表中否已登记该表示符,若没有登记则填表*/
{for(i=0;iif(!strcmp(str,indent[i].name ))break;
if(i==lenth)
strcpy(indent[i].name , str);
strcpy(str,indent[i].name );
sym.code=34;
}
}
else if (isalnum(ch))
{val=0;n=0;
while(isalnum(ch))
{val=val*10+ch-'0';
https://www.wendangku.net/doc/8b1355551.html,[n++]=ch;
ch=getchr();
}
sym

.name[n]='\0';
sym.code=33;
}
else/*若为单字符类,直接查表*/
{if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='.'||ch==','||ch==';'||ch=='('||ch==')')
{str[0]=ch;str[1]='\0';
ch=getchr();
for(i=0;iif(!strcpy(str,d[i]))
{strcpy(https://www.wendangku.net/doc/8b1355551.html,,str);
sym.code=i+16;
}
}
else {n=0;
/*若为有可能组成复合单词的判断后面的字符是否组成复合单词,并查表*/
if (ch=='>'||cj==':')
{str[n++]=ch;
if((ch=getchr())=='=')
{str[n++]=ch;ch=getchr();
}
}
else
if(ch=='<')
{str[n++]=ch;ch=getchr();
if(ch=='='||ch=='>')
{str[n++]=ch;ch=getchr();
}
}
else if (ch=-1)
{strcpy(https://www.wendangku.net/doc/8b1355551.html,,"");
sym.code=35;
}
else
error(1);
}
str[n]='\0';
for(i=0;iif(!strcmp(str,d[i]))
{strcpy(https://www.wendangku.net/doc/8b1355551.html, ,str);
sym.code=i+16;
}
}
}
char getchr()/*取字符列加1,当取到回车时,置行加1,列为1*/
{char ch = fgetc(f1);
if(ch=='\n')
{
row=1;
line++;
}
else
if (ch!=''&&ch!='\t')
row++;
return(ch);
}
void error(int n)
{printf("There are %d-error\n",n);
exit(0);
}

相关文档
相关文档 最新文档