- 論壇徽章:
- 0
|
最近在看LCC的源代碼在看到分析表達(dá)式一節(jié)中時(shí)遇到一個(gè)函數(shù),代碼如下:
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;
}
這個(gè)函數(shù)是下面賦值表達(dá)式文法的轉(zhuǎn)換函數(shù),文法如下:
assignment-expression:
conditional-expression
unary-expression assign-operator assignment-expression
可是令我不解的是,為什么這個(gè)expr1函數(shù),一進(jìn)來(lái)就先調(diào)用expr2呢?(expr2是條件表達(dá)式的分析函數(shù))
我一開(kāi)始的想法是,既然assignment-expression的文法,產(chǎn)生式右端的兩項(xiàng)是“或”的關(guān)系,理論上應(yīng)該翻譯成:
if( t 屬于 condition-expression )
expr2();
else (t 屬于 unary-expression assign-operator assignment-expression )
other();
才對(duì)呀?
是不是我哪里想錯(cuò)了? |
|