- 论坛徽章:
- 0
|
最近在看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();
才对呀?
是不是我哪里想错了? |
|