编译原理----符号表

采用了树,但是树的形状完全没管,根节点那里还是有点问题,对于函数,是应该每个函数,在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
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值