示例#1
0
文件: Parser.cs 项目: Szune/EGScript
 private ASTAssignment GetASTAssignment(ASTAssignment.AssignmentType type, string variable,
                                        ASTExpressionBase expression, ASTMemberAccess memberAccess)
 {
     if (!_insideClass)
     {
         if (memberAccess != null)
         {
             // assigning a member variable from outside the class
             return(new ASTMemberAssignmentInstance(type, variable, expression, memberAccess.InstanceName));
         }
         else
         {
             // assigning a local variable
             return(new ASTAssignment(type, variable, expression));
         }
     }
     else
     {
         // assigning a member variable from inside the class
         return(new ASTMemberAssignment(type, variable, expression));
     }
 }
示例#2
0
文件: Parser.cs 项目: Szune/EGScript
        /// <summary>
        /// <para>Handles *identifier* "[" *tableKey* "]"</para>
        /// <para>*identifier* "(" *argumentList* ")"</para>
        /// <para>*identifier* -> *identifier* "(" *argumentList* ")"</para>
        /// </summary>
        /// <returns></returns>
        private ASTExpressionBase ParseExpression9()
        {
            ASTExpressionBase expression = ParseExpression10();

            while (Match(TokenType.LEFT_PARENTHESIS) || Match(TokenType.ARROW) || Match(TokenType.LEFT_BRACKET))
            {
                switch (_buffer[0].Type)
                {
                case TokenType.LEFT_BRACKET:
                {
                    Consume();
                    if (expression.Type != ExpressionType.IDENTIFIER)
                    {
                        throw new ParserException($"Table expected.", _lexer.Line, _lexer.Character);
                    }

                    var indexes = new List <ASTExpressionBase>();
                    while (!Match(TokenType.RIGHT_BRACKET))
                    {
                        indexes.Add(ParseExpression1());

                        if (Match(TokenType.COMMA))
                        {
                            Consume();
                        }
                    }
                    Require(TokenType.RIGHT_BRACKET);
                    expression = new ASTTableGet(expression, indexes);
                }
                break;

                case TokenType.LEFT_PARENTHESIS:
                {
                    Consume();
                    if (expression.Type != ExpressionType.IDENTIFIER)
                    {
                        throw new ParserException($"Function call expected.", _lexer.Line, _lexer.Character);
                    }

                    List <ASTExpressionBase> arguments = new List <ASTExpressionBase>();

                    while (!Match(TokenType.RIGHT_PARENTHESIS))
                    {
                        arguments.Add(ParseExpression1());

                        if (Match(TokenType.COMMA))
                        {
                            Consume();
                        }
                    }

                    Require(TokenType.RIGHT_PARENTHESIS);

                    expression = new ASTGlobalFunctionCall((expression as ASTIdentifier).Name, arguments);
                }
                break;

                case TokenType.ARROW:
                {
                    Consume();
                    if (expression.Type != ExpressionType.IDENTIFIER)
                    {
                        throw new ParserException($"class object expected.", _lexer.Line, _lexer.Character);
                    }

                    string memberName = Require(TokenType.IDENTIFIER).Text;

                    if (!Match(TokenType.LEFT_PARENTHESIS))
                    {
                        // return class variable
                        expression = new ASTMemberAccess(memberName, (expression as ASTIdentifier).Name);
                        break;
                    }

                    Require(TokenType.LEFT_PARENTHESIS);
                    List <ASTExpressionBase> arguments = new List <ASTExpressionBase>();

                    while (!Match(TokenType.RIGHT_PARENTHESIS))
                    {
                        arguments.Add(ParseExpression1());

                        if (Match(TokenType.COMMA))
                        {
                            Consume();
                        }
                    }

                    Require(TokenType.RIGHT_PARENTHESIS);

                    expression = new ASTMemberFunctionCall(memberName, (expression as ASTIdentifier).Name, arguments);
                }
                break;
                }
            }

            return(expression);
        }