采用了树,但是树的形状完全没管,根节点那里还是有点问题,对于函数,是应该每个函数,在root那里,开一个子节点的,先写入root的变量(函数名变量),然后再给root加上不同的函数子节点,这个时候应该引入一个全局变量,判断此变量名是否为函数名,是否为函数名是在ID后面有“(”来体现的,现在还不确定要如何加函数名
---------------------------------------------------------------------------------------------------------------
目前的想法,那我好像可以用“(”,在变量为global时,我记录上一个ID,如果出现了"(",那说明上一个ID是函数,但是对于宏定义。。。。。。行,先记录一下吧,以下是代码
----------------------------------------------------------------------------------------------------------------
写代码的时候遇到了一些坑,关于node的root判断,你要先判断一下root,要不在最后一直用searchnode->parent->child的时候会有空指针丢失情况,会报错。
对于左右括号,以及int,float有对全局变量的修改。
//一些全局的设置,还有我的节点
int isglobal=0;//判断是不是全局
int tablenum=0; //符号表里的符号总数
int offset=0;
int place=0; //这个是指我找到的符号,在符号表里的数组下标,主要是因为写在ID内部她报错,所以写成了全局变量
int symbol_level=0;//作用域等级,0为最高,下一等级可以调用这一等级,现在还不管宏定义
string now_type="";//记录变量的类型
int isdeclaration=0;//记录是不是定义,在int 和float里置1 加入符号表后置0
struct vartable
{
char* name;//变量名
string type;//变量类型
};
class symbolnode{
public:
symbolnode*parent;
//一个作用域下先写10个作用域
symbolnode*child[10];
struct vartable table_var[100];
int sym_num;//符号个数
int child_num;//孩子节点个数
symbolnode(){
parent=NULL;
for(int i=0;i<10;i++)
child[i]=NULL;
sym_num=0;
child_num=1;
}
void setparent(symbolnode*node){
parent=node;
}
void setchild(){
child[child_num]=new symbolnode();
child_num++;
}
//给小括号准备的
void setfirstchild(){
child[0]=new symbolnode();
//child_num++;
}
void insert(vartable symbol){
table_var[sym_num].name=(char*)malloc(50*sizeof(char));
strcpy(table_var[sym_num].name,symbol.name);
table_var[sym_num].type=symbol.type;
sym_num++;
}
//变量名+类型判断
//返回在符号表里的index
int isin(char *name){
// int flag=1
//type,再次使用现在也没发判断用的那个,所以只用变量名判断
// printf("%d\n",sym_num);
if(sym_num==0){
return -1;
}
// printf("%s\n",name);
for(int i=sym_num-1;i>=0;i--){
// printf("%s\n",table_var[i].name);
// printf("%d\n",strcmp(name,table_var[i].name));
int flag=0;
flag=strcmp(name,table_var[i].name);
if(!flag){
// printf("place%d\n",i);
return i;
}
}
//int a=-1;
//不存在的return不确定对不对
// printf("fanhui%d\n",a);
return -1;
}
};
//是根节点,存全局变量
symbolnode *nownode=new symbolnode();
symbolnode *root=new symbolnode();
{ID} {
int flag=0;
symbolnode *searchnode=new symbolnode();
// //search走,nownode会不会跟着走
searchnode=nownode;
// while(searchnode!=NULL){
// printf("%d\n",searchnode->sym_num);
// searchnode=searchnode->parent;
// }
//根节点判断
//看看是不是要定义的
if(isdeclaration==1){
struct vartable newsym;
newsym.type=now_type;
newsym.name=(char*)malloc(50*sizeof(char));
strcpy(newsym.name,yytext);
//printf("%s",newsym.name);
searchnode=nownode;
nownode->table_var[nownode->sym_num].name=(char*)malloc(50*sizeof(char));
strcpy(nownode->table_var[nownode->sym_num].name,yytext);
nownode->table_var[nownode->sym_num].type=now_type;
//nownode->table_var[nownode->sym_num]=newsym;
nownode->sym_num++;
// nownode->insert(newsym);
place=nownode->sym_num-1;
flag=1;
isdeclaration=0;
}
//不是新定义的,就去树中找
else
{
while(searchnode!=NULL){
if(searchnode==root){
place=searchnode->isin(yytext);
if(place>=0){
flag=1;
break;
}
else{
flag=0;
break;
}
}
//在当前作用域找到了
// printf("zhaoroot\n");
place=searchnode->isin(yytext);
// if(searchnode!=root)
// printf("palce%d shuliang%d\n",place,searchnode->parent->child[0]->sym_num!=0);
// printf("%d\n",place);
if(place>=0){
flag=1;
break;
}
//去第一个孩子找找看有没,也就是小括号里面有没
else if(searchnode->parent->child[0]->sym_num!=0){
// printf("zou2\n");
// printf("当前node所在域%s\n",searchnode->table_var[0].name);
searchnode=searchnode->parent->child[0];
// printf("当前node所在域%s\n",searchnode->table_var[0].name);
//string str="我要找了";
// printf("%s %d\n",str.c_str(),searchnode->sym_num);
place=searchnode->isin(yytext);
// printf("%d\n",place);
//在第一个孩子里找到了
if(place>=0){
flag=1;
break;
}
else
searchnode=searchnode->parent;
}
//在当前作用域没找到
else
{
searchnode=searchnode->parent;
// printf("孩子数量 %d 当前node符号表第一个 %s\n",searchnode->child_num,searchnode->table_var[0].name);
// if(searchnode==NULL)
// printf("weikong");
// printf("zou3\n");
}
}
// //在树中没找到
if(flag==0){
// struct vartable newsym;
// newsym.type=now_type;
// newsym.name=(char*)malloc(50*sizeof(char));
// strcpy(newsym.name,yytext);
// //printf("%s",newsym.name);
// searchnode=nownode;
// nownode->table_var[nownode->sym_num].name=(char*)malloc(50*sizeof(char));
// strcpy(nownode->table_var[nownode->sym_num].name,yytext);
// nownode->table_var[nownode->sym_num].type=now_type;
// //nownode->table_var[nownode->sym_num]=newsym;
// nownode->sym_num++;
// // nownode->insert(newsym);
// place=nownode->sym_num-1;
//那说明没定义,就用了,这个输出没定义吧
}
}
// printf("%s %d\n",yytext,flag);
string address="";
if(flag==1)
address="0x"+dec2hex((long long int)(void*)searchnode->table_var[place].name);
//printf("%s\n",address.c_str());
#ifdef ONLY_FOR_LEX
string s="";
if(flag==1)
s="ID\t"+string(yytext)+"\t"+to_string(yylineno)+"\t"+to_string(offset-yyleng)+"\t"+address;
else
s="ID\t"+string(yytext)+"\t"+to_string(yylineno)+"\t"+to_string(offset-yyleng)+"\t"+"未定义";
DEBUG_FOR_LAB4(s);
#else
return ID;
#endif
}