Пример #1
0
        private Node Obj()
        {
            Token <TokenType> t = PeekNextToken();

            switch (t.TokenType)
            {
            case TokenType.Array:
                return(Array());

            case TokenType.Hash:
                return(Hash());

            case TokenType.Regex:
                return(Regex());

            case TokenType.New:
                return(New());

            case TokenType.Left_Parenthesis:
                GetNextToken();
                Node node = Value();
                Token <TokenType> rightToken = GetNextToken();
                if (rightToken.TokenType != TokenType.Right_Parenthesis)
                {
                    ExceptionHelper.ThrowExpectToken(TokenType.Right_Parenthesis, t.Position);
                }
                return(node);

            case TokenType.ID:
                Token <TokenType> idToken = GetNextToken();
                Token <TokenType> next    = PeekNextToken();
                if (next.TokenType == TokenType.ClassQualifier)
                {
                    List <string> strList = new List <string>();
                    strList.Add(idToken.TokenValue);
                    while (next.TokenType == TokenType.ClassQualifier)
                    {
                        GetNextToken();    //Note:Get the :: operator
                        idToken = GetNextToken();
                        if (idToken.TokenType != TokenType.ID)
                        {
                            ExceptionHelper.ThrowExpectToken(TokenType.ID, idToken.Position);
                        }
                        strList.Add(idToken.TokenValue);
                        next = PeekNextToken();
                    }
                    return(new ClassQualifierNode(strList));
                }
                else
                {
                    return(new SimpleNode(idToken));
                }

            case TokenType.String:
            case TokenType.Long:
            case TokenType.Decimal:
            case TokenType.Boolean:
                Token <TokenType> valToken = GetNextToken();
                return(new SimpleNode(valToken));

            default:
                ExceptionHelper.ThrowParseError(t.Position);
                return(null);
            }
        }
Пример #2
0
        private Node Factor()
        {
            Node node           = Obj();
            Token <TokenType> t = PeekNextToken();

            while (!t.End)
            {
                if (t.TokenType == TokenType.Dot)
                {
                    GetNextToken();
                    Token <TokenType> idToken = GetNextToken();
                    if (idToken.TokenType != TokenType.ID)
                    {
                        ExceptionHelper.ThrowExpectToken(TokenType.ID, idToken.Position);
                    }
                    if (PeekNextToken().TokenType == TokenType.Left_Parenthesis)//Note:Method Call
                    {
                        GetNextToken();
                        ParamListNode     method_param_node = ValueList();
                        Token <TokenType> rightToken        = GetNextToken();
                        if (rightToken.TokenType != TokenType.Right_Parenthesis)
                        {
                            ExceptionHelper.ThrowExpectToken(TokenType.Right_Parenthesis, rightToken.Position);
                        }

                        MethodNode methodNode = new MethodNode(node, new SimpleNode(idToken), method_param_node);
                        node = methodNode;

                        t = PeekNextToken();
                        continue;
                    }
                    else//Note:Property
                    {
                        PropertyNode propNode = new PropertyNode(node, new SimpleNode(idToken));
                        node = propNode;
                    }
                }
                else if (t.TokenType == TokenType.Left_Square_Bracket)
                {
                    GetNextToken();
                    ParamListNode     index_param_node = ValueList();
                    Token <TokenType> rightToken       = GetNextToken();
                    if (rightToken.TokenType != TokenType.Right_Square_Bracket)
                    {
                        ExceptionHelper.ThrowExpectToken(TokenType.Right_Square_Bracket, rightToken.Position);
                    }

                    IndexerNode indexerNode = new IndexerNode(node, index_param_node);
                    node = indexerNode;
                }
                else if (t.TokenType == TokenType.Left_Parenthesis)
                {
                    GetNextToken();
                    ParamListNode     static_method_param_node = ValueList();
                    Token <TokenType> rightToken = GetNextToken();
                    if (rightToken.TokenType != TokenType.Right_Parenthesis)
                    {
                        ExceptionHelper.ThrowExpectToken(TokenType.Right_Parenthesis, t.Position);
                    }

                    MethodNode staticMethodNode = new MethodNode(null, node, static_method_param_node);
                    node = staticMethodNode;
                }
                else
                {
                    break;
                }

                t = PeekNextToken();
            }
            return(node);
        }