//============================================================================== ExpressionASTNode* ExpressionParser::ParseUnaryExpression_(CallerType& caller) { Token token = WaitForTokenReady_(caller); if (IsUnaryOperator(token.type) || token == OP_INC || token == OP_DEC) { ExpressionASTNode* node = new ExpressionASTNode(token); ExpressionASTNode* root = node; token = WaitForTokenReady_(caller); while (IsUnaryOperator(token.type) || token == OP_INC || token == OP_DEC) { node->SetLeft(new ExpressionASTNode(token)); node = node->GetLeft(); token = WaitForTokenReady_(caller); } tokenStack_.push_back(token); node->SetLeft(ParsePostfixExpression_(caller)); return root; } else { tokenStack_.push_back(token); return ParsePostfixExpression_(caller); } }
ASTUnaryOp* ParseUnaryOperation(MemoryArena* arena, Lexer* lex) { assert(IsUnaryOperator(lex->token)); lex->nextToken(); auto expr = ParseExpr(arena, lex); auto op = TokenToUnaryOp(lex->token); auto unaryOperation = arena->alloc<ASTUnaryOp>(op, expr); return unaryOperation; }