//==============================================================================
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);
  }
}
示例#2
0
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;
}