C++ 这个代码调试有问题 求高手指点

JANESTAR123 2012-04-07 12:39:21
代码微长,不过容易理解,关于编译原理词法分析的,可是我调试的时候出现 “程序产生一个访问违例 段异常”,不知怎么回事?求大牛指点一下,感激不尽!!

#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;}
...全文
82 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
hen_hao_ji 2012-04-07
  • 打赏
  • 举报
回复
看了你的代码:

char string[100]; 数组名不能用 string吧,string是C++标识符

你的标识符匹配算法有误,我用printf("%s\n", a);打印没有内容,

strcpy(p->name,a);p->name你在list结构里是个指针,用的时候要分配空间才行。
LAST_MAN 2012-04-07
  • 打赏
  • 举报
回复
太长了,都看不下去~~~
xmu_才盛 2012-04-07
  • 打赏
  • 举报
回复
首先你的代码有法看吗? 你自己能看吗? 想想其他人有时间给你看吗?

第二, 你既然能够设计指纹hash函数, 但是却连最简单的关闭文件和释放资源都不会? 哪里抄的代码,还不抄全了。

第三, 全篇没一句关键的注释,至少你自己得读懂了吧?

第四, 你通篇在使用ch=string[i]; 却没有控制 i 要小于 string.length(), 说不定就数组越界了。

第五, 逻辑感觉还清楚, 但是却不了解你把词素存成这样子的结构,你以后能快速检索到吗? 为什么不直接用map存词素, 设计这个复杂的指纹hash函数干嘛? 不过这个函数确实让我学了一招。

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧