免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3496 | 回复: 3
打印 上一主题 下一主题

很奇怪的lcc编译器,表达式分析代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-11 17:27 |只看该作者 |倒序浏览
本帖最后由 yangnas 于 2010-08-11 17:32 编辑

最近在分析LCC编译的表达式语法分析部分代码时,看到分析primary-expression的代码
函数如下(注意下面函数中的加红色部分):

static Tree primary(void) {
        Tree p;

        assert(t != '(');
        switch (t) {
        case ICON:
        case FCON: p = tree(CNST + ttob(tsym->type), tsym->type, NULL, NULL);
                   p->u.v = tsym->u.c.v;
break;
        case SCON: tsym->u.c.v.p = stringn(tsym->u.c.v.p, tsym->type->size);
                   tsym = constant(tsym->type, tsym->u.c.v);
                   if (tsym->u.c.loc == NULL)
                           tsym->u.c.loc = genident(STATIC, tsym->type, GLOBAL);
                   p = idtree(tsym->u.c.loc); break;
        case ID:   if (tsym == NULL)
                           {
                                Symbol q = install(token, &identifiers, level, level < LOCAL ? PERM : FUNC);
                                q->src = src;
                                t = gettok();
                                if (t == '(') {
                                        Symbol r;
                                        q->sclass = EXTERN;
                                        q->type = func(inttype, NULL, 1);
                                        if (Aflag >= 1)
                                                warning("missing prototype\n");
                                        (*IR->defsymbol)(q);
                                         if ((r = lookup(q->name, externals)) != NULL) {
                                                q->defined = r->defined;
                                                q->temporary = r->temporary;
                                                q->generated = r->generated;
                                                q->computed = r->computed;
                                                q->addressed = r->addressed;
                                        } else {
                                                r = install(q->name, &externals, GLOBAL, PERM);
                                                r->src = q->src;
                                                r->type = q->type;
                                                r->sclass = EXTERN;
                                        }
                                } else {
                                        error("undeclared identifier `%s'\n", q->name);
                                        q->sclass = AUTO;
                                        q->type = inttype;
                                        if (q->scope == GLOBAL)
                                                (*IR->defsymbol)(q);
                                        else
                                                addlocal(q);
                                }
                                if (xref)
                                        use(q, src);
                                return idtree(q);
                        }
                   if (xref)
                           use(tsym, src);
                   if (tsym->sclass == ENUM)
                           p = consttree(tsym->u.value, inttype);
                   else {
                           if (tsym->sclass == TYPEDEF)
                                   error("illegal use of type name `%s'\n", tsym->name);
                           p = idtree(tsym);
                   } break;
        default:
                error("illegal expression\n");
                p = consttree(0, inttype);
        }
        t = gettok();
        return p;
}

因为primary-expression的文法如下:
primary-expression:
   identifier
   constant
   string-literal
   '(' expression ')'
我猜想,primary()函数里应该有判断 t == ‘(' 的代码才对啊(此处的t为超前扫描的token),为什么在程序的一开头就来一个assert(t != '(' )
百思不得其解。。。

论坛徽章:
0
2 [报告]
发表于 2010-08-11 17:42 |只看该作者
当我第一眼看到,primary-expression的文法时
想到,肯定有判断 t == ‘('的代码,怎么我看lcc的代码怎么一上来就assert(t != '(' )

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
3 [报告]
发表于 2010-08-11 18:21 |只看该作者
大体看了下,猜测如下:

primary()是由unary()调用的,在unary()中,当t为'('时,会先作处理。只有当t不为'('时,才会调用postfix(primary()),所以,这个时候的primary expression就没有 '(' expression ')' 这样的情况了。

论坛徽章:
0
4 [报告]
发表于 2010-08-12 00:24 |只看该作者
谢谢,楼上!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP