GithubHelp home page GithubHelp logo

cit's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cit's Issues

3.3.3 变量管理之添加变量对象

相关代码与问题

void SymTab::addVar(Var* var){
    if(varTab.find(var -> getName() == varTab.end())){
        varTab[var -> getName()] = new vector<Var *>; // 创建链表
        varTab[var -> getName()] -> push_back(var); // 添加变量
    }
    else {
        vector<Var *>& list = *varTab[var -> getName()]; // 同名变量列表
        int i;
        for(i = 0; i < list.size(); i++){                   // 判断变量作用域
            if(list[i] -> getPath().back() == var -> getPath().back()){
                break;
            }
        }

        // 书中的原文:前面提到整数和字符常量都保存在 "<int>" 和 "<char>""同名变量列表内,且作用域都为空,
        // 因此会导致索引 i 不等于同名列表的长度,触发语义错误。为了避免这一点,我们添加了对变量名的判断,
        // 即判断名字的第一个字符是否是 '<', 因此标识符名称是不可能以 '<' 开始的.
        
        // 为什么可以排除常量? 难道 <int> 和 <char> 的类型的常量是以 '<' 开始的? 如果是,请举出一个例子,谢谢.
        if( i == list.size() || var -> getName() == '<') {  
            list.push_back(var);
        }
        else {
            SEMERROR(VAR_RE_DEF, var -> getName());     // 变量重定义
            delete var;
            return ;
        }
    }

    if(ir) {
        int flag = ir -> genVarInit(var);       // 变量初始化语句
        if(curFun && flag){
            curFun -> locate(var);              // 计算局部变量栈帧偏移
        }
    }
}

关于测试用例问题

你好,大神,在看书前,能先上多几个测试用例吗,只有一个 test.c,感觉还是不懂怎么用,对于变量赋个初值也会报错

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.