/* ?: */ Expr *Term2(void) { Expr *expr, *l; expr = Term3(); while(token == OP_QUESTION) { l = expr; expr = ExprNew(); expr->fn = eval_ternary; expr->l = l; token = GetToken(); expr->r = ExprNew(); expr->r->l = Term2(); if(token == OP_COLON) { token = GetToken(); expr->r->r = Term2(); } else { ErrUnknown(token, ":", "expression syntax"); } } return expr; }
void CParser::Term() { Term2(); while (true) { switch (mLookahead) { case '/': Match('/'); Term2(); AddToken(opDiv); break; case '*': Match('*'); Term2(); AddToken(opMul); break; default: return; } } } // CParser::Term
/* =, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>= */ Expr *Term1(void) { int op; Expr *l, *expr; expr = Term2(); while((op = token) == OP_ASSIGN) { if((expr == NULL) || (expr->fn != eval_lvalue)) { LogError("expression syntax: Variable expected on left side of %s.", token_buffer); PrintFileAndLineNumber(); } l = expr; expr = ExprNew(); expr->l = l; token = GetToken(); expr->r = Term1(); switch(op) { case OP_ASSIGN: expr->fn = eval_assign; CheckRValue(expr->r, "="); break; default: expr->fn = eval_assign; CheckRValue(expr->r, "="); break; } } return expr; }