词法分析器问题,差一步就实现,急!
求救!词法分析的程序,编译能过,运行时候就出现scan.exe中access violation错误
初次编这个程序,找不出错在哪儿,急!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_CODE 1000
#define MAX_SYMBOL 32
int i=0,j,k,sign,number,flag;
char ch;
char words[MAX_SYMBOL]={" "};
char program[MAX_CODE]={" "};
int scan(char program[])
{
char *keywords[]={"if","int","for","while","do","return","break","continue"};
number=0;
flag=0;
j=0;
ch=program[i++];
while((ch==' ')||(ch=='\n')||(ch=='\t')||(ch=='\r'))
{ch=program[i++];}
if((ch>='a')&&(ch<='z')||(ch>='A')&&(ch<='Z')||ch=='_')
{
while(((ch>='a')&&(ch<='z'))||((ch>='A')&&(ch<='Z'))||((ch>='0')||(ch<='9'))||ch=='_')
{
words[j++]=ch;
ch=program[i++];
}
words[j++]='\0';
for(k=0;k<32;k++)
if(strcmp(words,keywords[k])==0)
{
sign=1;
flag=1;
}
if(flag==0)
{
i--;
sign=2;
}
}
else if((ch>='0')&&(ch<='9'))
{
number=0;
sign=-1;
while((ch>='0')&&(ch<='9'))
{
number=number*10+(ch-'0');
ch=program[i++];
}
if(((ch>='a')&&(ch<='z'))||((ch>='A')&&(ch<='Z'))||ch=='_')
{
sign=-1;
do
{
ch=program[i++];
}while(((ch>='a')&&(ch<='z'))||((ch>='A')&&(ch<='Z'))||((ch>='0')||(ch<='9'))||ch=='_');
i--;
return sign;
}
sign=3;
i--;
}
else switch(ch)
{
case'=':
words[j++]=ch;
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
sign=4;
}
else
{
i--;
sign=4;
}
break;
case'>':
words[j++]=ch;
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
sign=4;
}
else
{
i--;
sign=4;
}
break;
case'<':
words[j++]=ch;
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
sign=4;
}
else
{
i--;
sign=4;
}
break;
case'!':
words[j++]=ch;
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
sign=4;
}
else
{
i--;
sign=4;
}
break;
case'+':
words[j++]=ch;
sign=4;
break;
case'-':
words[j++]=ch;
sign=4;
break;
case'*':
words[j++]=ch;
sign=4;
break;
case'/':
words[j++]=ch;
sign=4;
break;
case',':
words[j++]=ch;
sign=5;
break;
case';':
words[j++]=ch;
sign=5;
break;
case'(':
words[j++]=ch;
sign=5;
break;
case')':
words[j++]=ch;
sign=5;
break;
case'{':
words[j++]=ch;
sign=5;
break;
case'}':
words[j++]=ch;
sign=5;
break;
default:
sign=-1;
}
words[j]='\0';
if(program[i]=='\0')
sign=0;
return sign;
return number;
}
int main(void)
{
FILE *fp;
char filename[20];
printf("input the direction of the program and its name:\n");
scanf("%s",filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("can't open file\n");
exit(0);
}
i=0;
do
{
ch=fgetc(fp);
program[i++]=ch;
}while(!feof(fp));
program[i]='\0';
fclose(fp);
i=0;
printf("....begin translate.......\n\n\n");
if((fp=fopen("token2.txt","w"))==NULL)
{
printf("can't creat file 'token2'\n");
exit(0);
}
do
{
sign=scan(program);
switch(sign)
{
case 1:
printf("(%d,%s)\n",sign,words);
fprintf(fp,"(%d,%s)\n",sign,words);
break;
case 2:
printf("(%d,%s)",sign,words);
fprintf(fp,"(%d,%s)\n",sign,words);
break;
case 3:
printf("(%d,%d)",sign,number);
fprintf(fp,"(%d,%d)\n",sign,number);
break;
case 4:
printf("(%d,%s)",sign,words);
fprintf(fp,"(%d,%s)\n",sign,words);
break;
case 5:
printf("(%d,%s)",sign,words);
fprintf(fp,"(%d,%s)\n",sign,words);
break;
case -1:
printf("error!");
fprintf(fp,"error");
break;
default: break;
}
}while(sign!=0);
fclose(fp);
printf("\n\n\n.....translate end.......\n\n");
return 0;
}
[解决办法]
#define MAX_CODE 10000 #define MAX_SYMBOL 32 int i=0,j,k,sign,number,flag; char ch; char words[MAX_SYMBOL]={0}; char program[MAX_CODE]={0};//这样就不会访问出错了
[解决办法]
在我这里顺利编译,并运行,最后对我所输入的文件,输出一个error.
#define MAX_CODE 10000
这个看清楚没有?