编译系统实验二 语义分析

实验任务

  • 利用实验一生成的语法分析树,完成语义分析
  • 参考源码

实验步骤一、符号表建立

  • 收集词法分析中识别出的所有标识

  • 进行排序、去重,赋予每个标识符唯一索引号

  • 后续使用二分查找进行符号表的检索

    /* symbol table crater */
    SNode* getAllSymbol(Node* node); // 遍历语法树
    void insertSymbol(char* symbol); // 插入符号到集合中
    void getUnqSymbol(); // 符号去重
    void sortSymbols(); // 符号排序
    int cmp(const void *s1, const void *s2); // 按字母序排序
    
    /* symbol table searcher */
    int getSymbolIndex(char* name); // 二分查找符号对应的索引值
    

实验步骤二、确定语义分析方式

  • 在递归先序遍历语法树的过程中完成语义分析

  • 通过语法树节点的元素标识、子节点表示等信息确定当前产生式,并进行相应语义语义动作

  • 整体框架如:

    void analysisTree(Node* node, SNode* snode) {
         
        int i;
        for (i = 0; i < node->cnt; i++) {
         
            if (node->ch[i] !=  NULL) {
          // 先序遍历
                analysisTree(node->ch[i], snode->ch[i]);
            }
        }
        switch (node->elem) {
         
            case Extdef : /* code */
            case Specifier :  /* code */
            case TYPE : /* code */
            /* other cases */
        }
    }
    

实验步骤三、符号表填充

  • 对于声明语句,将符号对应的属性信息填充至符号表中

  • 对于全局符号:变量名、函数名、结构体名,在Extdef顶层产生式中进行插入,如

    case Extdef :
                if (node->ch[1]->elem == ExtDecList) {
         
                    fillSymbols(snode->ch[0]
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值