免费注册 查看新帖 |

Chinaunix

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

看过LCC源码的高人进,重温一下这段代码的意思。。。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-13 01:28 |只看该作者 |倒序浏览
最近在看LCC的源代码在看到分析表达式一节中时遇到一个函数,代码如下:

Tree expr1(int tok) {
        static char stop[] = { IF, ID, 0 };
        Tree p = expr2();

        if (t == '='
        || (prec[t] >=  6 && prec[t] <=  
        || (prec[t] >= 11 && prec[t] <= 13)) {
                int op = t;
                t = gettok();
                if (oper[op] == ASGN)
                        p = asgntree(ASGN, p, value(expr1(0)));
                else
                        {
                                expect('=');
                                p = incr(op, p, expr1(0));
                        }
        }
        if (tok)       
                test(tok, stop);
        return p;
}

这个函数是下面赋值表达式文法的转换函数,文法如下:

assignment-expression:
    conditional-expression
    unary-expression assign-operator assignment-expression

可是令我不解的是,为什么这个expr1函数,一进来就先调用expr2呢?(expr2是条件表达式的分析函数)

我一开始的想法是,既然assignment-expression的文法,产生式右端的两项是“或”的关系,理论上应该翻译成:

if( t 属于 condition-expression )
  expr2();
else (t 属于 unary-expression assign-operator assignment-expression )
other();

才对呀?

是不是我哪里想错了?

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
2 [报告]
发表于 2010-08-13 08:55 |只看该作者
书上说,a = b = c这样的多重赋值语句,解释为a = (b = c),赋值操作为右结合。

所以,对于
assignment-expression:
  unary-expression {assign-operator conditional-expression}

应该先分析conditional-expression,也就是先调用expr2。

论坛徽章:
0
3 [报告]
发表于 2010-08-14 02:20 |只看该作者
谢谢,EricFisher 。:emn1:

论坛徽章:
0
4 [报告]
发表于 2010-08-14 03:22 |只看该作者
有点明白了。。。
原来是assignment-expression的翻译,没完全遵照文法,为的是有"强大"的错误处理能力。。。书上这么说的。

论坛徽章:
0
5 [报告]
发表于 2010-08-16 00:52 |只看该作者
明白了,原来是因为虽然赋值表达式的文法如下所示:
assignment-expression:
    conditional-expression
    unary-expression assign-operator assignment-expression
但第一个产生式被去掉,然后第二个产生式被修改。
最后新的产生式,实际上是
assignment-expression:
    conditional-expression assign-operator assignment-expression
因为conditional-expression包含unary-expression,这样以来,只要等分析返回时通过语义分析就可判定出那些不合法的产生式。这样就实现了更强的出错处理能力了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP