Ejemplo n.º 1
0
VisitResult ExpressionVisitor::Visit(MemberAccessNode* node)
{
  node->Walk(this, false);
  ValueNode* valNode = static_cast<ValueNode*>(node->mLeft.get());

  switch(node->mOperator.mEnumTokenType)
  {
    case TokenType::Dot:
    {
      if(valNode->mResolvedType->mMode != TypeMode::Class)
      {
        ErrorInvalidMemberAccess(node);
      }
      break;
    }
    case TokenType::Arrow:
    {
      if(valNode->mResolvedType->mMode != TypeMode::Pointer)
      {
        ErrorInvalidMemberAccess(node);
      }
      break;
    }
    default:
      ErrorInvalidMemberAccess(node);

  }

  std::string leftExpression(valNode->mToken.mText, valNode->mToken.mLength);
  std::string rightExpression(node->mName.mText, node->mName.mLength);
  Variable* leftSide = static_cast<Variable*>(find_symbol_by_name(leftExpression, dependencies_, library_, symbol_stack_));
  Variable* rightSide = nullptr;// = ;//find_symbol_by_name(rightExpression, dependencies_, library_, symbol_stack_);
  Type* lefttype = resolvePointers(leftSide->mType);
  auto rightIt = lefttype->mMembersByName.find(rightExpression);
  if(rightIt != lefttype->mMembersByName.end())
  {
    rightSide = static_cast<Variable*>(rightIt->second);
  }
  
  node->mResolvedMember = rightSide;
  node->mResolvedType = rightSide->mType;
  
  
  return VisitResult::Stop;

}
Ejemplo n.º 2
0
AST* Parser::expression(int pri, Scope* ps)
{
    Position begin = lex_->peek().range_.begin_;

    if (pri > 11)
    {
        if (expect("delete")
                || expect("++")
                || expect("--"))
        {
            Token op = lex_->get();
            AST* expr = leftExpression(ps);
            Position end = lex_->peek().range_.begin_;
            auto ret = new UniExpression(PositionRange(begin, end), op, expr);
            ret->scope_ = ps;
            return ret;
        }
        else if (expect("void")
                 || expect("typeof")
                 || expect("+")
                 || expect("-")
                 || expect("~")
                 || expect("!"))
        {
            Token op = lex_->get();
            AST* expr = expression(pri, ps);
            Position end = lex_->peek().range_.begin_;
            auto ret = new UniExpression(PositionRange(begin, end), op, expr);
            ret->scope_ = ps;
            return ret;
        }
        else
        {
            AST* expr = leftExpression(ps);
            if (expect("++") || expect("--"))
            {
                Token op = lex_->get();
                Position end = lex_->peek().range_.begin_;
                auto ret = new UniExpression(PositionRange(begin, end), expr, op);
                ret->scope_ = ps;
                return ret;
            }
            return expr;
        }
    }

    AST* left = expression(pri+1, ps);

    if (!expectOperator(pri))
    {
        return left;
    }

    Token op = lex_->get();

    if (pri == 1)
    {
        AST* first = expression(pri, ps);
        match(":");
        AST* second = expression(pri, ps);
        Position end = lex_->peek().range_.begin_;
        auto ret = new TriExpression(PositionRange(begin, end), left, first, second);
        ret->scope_ = ps;
        return ret;
    }

    AST* right = expression(pri, ps);

    Position end = lex_->peek().range_.begin_;

    AST* ret = new BiExpression(PositionRange(begin, end), left, op, right);
    ret->scope_ = ps;

    while (expectOperator(pri))
    {
        op = lex_->get();
        right = expression(pri+1, ps);
        ret = new BiExpression(PositionRange(begin, end), left, op, right);
        ret->scope_ = ps;
    }

    return ret;
}