看过LCC源码的高人进,重温一下这段代码的意思。。。

发布于 2022-09-05 06:44:58 字数 2212 浏览 8 评论 4

最近在看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();

才对呀?

是不是我哪里想错了?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

我纯我任性 2022-09-19 00:30:31

明白了,原来是因为虽然赋值表达式的文法如下所示:
assignment-expression:
    conditional-expression
    unary-expression assign-operator assignment-expression
但第一个产生式被去掉,然后第二个产生式被修改。
最后新的产生式,实际上是
assignment-expression:
    conditional-expression assign-operator assignment-expression
因为conditional-expression包含unary-expression,这样以来,只要等分析返回时通过语义分析就可判定出那些不合法的产生式。这样就实现了更强的出错处理能力了。

完美的未来在梦里 2022-09-17 19:38:17

有点明白了。。。
原来是assignment-expression的翻译,没完全遵照文法,为的是有"强大"的错误处理能力。。。书上这么说的。

满天都是小星星 2022-09-12 08:17:33

谢谢,EricFisher 。:emn1:

饭团 2022-09-07 16:30:35

书上说,a = b = c这样的多重赋值语句,解释为a = (b = c),赋值操作为右结合。

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文