C++ 这个代码调试有问题 求高手指点
代码微长,不过容易理解,关于编译原理词法分析的,可是我调试的时候出现 “程序产生一个访问违例 段异常”,不知怎么回事?求大牛指点一下,感激不尽!!
#include <iostream>
#include <cstdio>
#include <string>
#define SIZE 211
#define SHIFT 4
using namespace std;
static int hash ( char* key )
{ int temp = 0;
int i = 0;
while (key[i] != '\0')
{ temp = ((temp << SHIFT) + key[i]) % SIZE;
++i;
}
return temp;
}
typedef struct List
{
char* name; //标识符名
int data;
List * next;
} * linklist,lnode;
static linklist ListHash[SIZE]={NULL};
//哈希表插入
void List_insert(char* name, int data)
{
int h = hash(name);
List *l;
l = new List;
l->name = name;
l->data = data;
l->next = ListHash[h];//每条链表的最后一个节点的next指针总为空
ListHash[h]=l; // ListHash[h]指针指向l指针所指向的节点
}
struct key
{
char name[20];
int number;
}kword[]={{"begin",1},{"if",2},{"then",3},{"while",4},{"do",5},{"end",6},{"+",13},{"-",14},{"*",15},{"/",16},{":",17},{":=",18},
{"<",20},{"<>",21},{"<=",22},{">",23},{">=",24},{"=",25},{";",26},{"(",27},{")",28},{"#",0}};/*定义一个静态表*/
void analyse(FILE *fp)
{
char string[100];
linklist H,p,r;
char a[20];
char ch;
int i,j=0,k=0,f=0,n=0,t=0;
H=new lnode;
H->next=NULL;
r=H;
while(fgets(string,100,fp)!=NULL)
{
i=0;n++;
ch=string[i];
while(ch==' '||ch=='\t'||ch=='\n') //过滤空格
{
i++;
ch=string[i];
}
while(string[i]!='\0'&&string[i]!='\t'&&string[i]!='\n'&&string[i]!=' ')
{
p=new lnode;
if(ch>='a'&&ch<='z')
//标识符匹配
{
a[j]=ch;
j++;
i++;
ch=string[i];
while(ch!='+'&&ch!='-'&&ch!='*'&&ch!='/'&&ch!=';'&&ch!='('&&ch!=')'&&ch!='<'&&ch!='>'&&ch!='='&&ch!=':'&&ch!='#'&&ch!=' '&&ch!='\n'&&ch!='\0')
{ a[j]=ch;
j++;
i++;
ch=string[i]; }
a[j]='\0';
strcpy(p->name,a);
j=0;k=0;
while(k<22&&(strcmp(p->name,kword[k].name)!=0))
k=k+1;
if(k==22)
p->data=10;
else
p->data=kword[k].number;
cout<<"("<<p->data<<","<<p->name<<")"<<endl;
List_insert(p->name,p->data);
while(ch==' '||ch=='\t'||ch=='\n') //过滤空格
{
i++;
ch=string[i];
}
}
else
if(ch>='0'&&ch<='9')
{
a[j]=ch;
j++;
i++;
ch=string[i];
while(ch>='0'&&ch<='9')
{
a[j]=ch;
j++;
i++;
ch=string[i];
}
a[j]='\0';
strcpy(p->name,a);
j=0;
p->data=11;
cout<<"("<<p->data<<","<<p->name<<")"<<endl;
List_insert(p->name,p->data);
while(ch==' '||ch=='\t'||ch=='\n') //过滤空格
{
i++;
ch=string[i];
}
}
else
if(ch=='>'||ch=='='||ch=='<')
{
a[j]=ch;
j++;
i++;
ch=string[i];
if(ch=='='||ch=='>')
{
a[j]=ch;
j++;
a[j]='\0';
i++;
ch=string[i];
}
else
a[j]='\0';
strcpy(p->name,a);
j=0;k=0;
while(k<22&&strcmp(p->name,kword[k].name)!=0)
k=k+1;
p->data=kword[k].number;
cout<<"("<<p->data<<","<<p->name<<")"<<endl;
List_insert(p->name,p->data);
while(ch==' '||ch=='\t'||ch=='\n') //过滤空格
{
i++;
ch=string[i];
}
}
else
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch==';'||ch=='('||ch==')'||ch==':'||ch=='#')
{
a[j]=ch;
j++;
i++;
ch=string[i];
if(ch=='=')
{
a[j]=ch;
j++;
i++;
a[j]='\0';
ch=string[i];
}
else
a[j]='\0';
strcpy(p->name,a);
j=0;
k=0;
while(k<22&&(strcmp(p->name,kword[k].name)!=0))
k=k+1;
p->data=kword[k].number;
cout<<"("<<p->data<<","<<p->name<<")"<<endl;
List_insert(p->name,p->data);
// i++;
// ch=string[i];
while(ch==' '||ch=='\t'||ch=='\n') //过滤空格
{
i++;
ch=string[i];
}
}
}
}
}
int main(int argc, char *argv[])
{
FILE *fileP;
fileP = fopen("test.txt", "r");
cout << "------词法分析如下------" << endl;
analyse(fileP);
system("pause");
return 0;}