Esempio n. 1
0
 private static AstNode ParseTerm(Parser.Parser parser)
 {
     if (parser.MatchToken(TokenType.Number))
     {
         return(new NumberNode(Convert.ToDouble(parser.ExpectToken(TokenType.Number).Value)));
     }
     else if (parser.AcceptToken(TokenType.Parentheses, "("))
     {
         AstNode statement = ExpressionNode.Parse(parser);
         parser.ExpectToken(TokenType.Parentheses, ")");
         return(statement);
     }
     else if (parser.AcceptToken(TokenType.Bracket, "["))
     {
         AstNode statement = ArrayInitializerNode.Parse(parser);
         parser.ExpectToken(TokenType.Bracket, "]");
         return(statement);
     }
     else if (parser.MatchToken(TokenType.String))
     {
         return(new StringNode(parser.ExpectToken(TokenType.String).Value.ToString()));
     }
     else if (parser.MatchToken(TokenType.Identifier))
     {
         return(new IdentifierNode(parser.ExpectToken(TokenType.Identifier).Value.ToString()));
     }
     else
     {
         throw new Exception("Unexpected in Parser: " + parser.CurrentToken().Value);
     }
 }
Esempio n. 2
0
 private static AstNode ParseFunctionCall(Parser.Parser parser, AstNode left)
 {
     if (parser.AcceptToken(TokenType.Parentheses, "("))
     {
         return(ParseFunctionCall(parser, new FunctionCallNode(left, ArgListNode.Parse(parser))));
     }
     else if (parser.AcceptToken(TokenType.Bracket, "["))
     {
         return(ParseFunctionCall(parser, new ArrayGetNode(left, ArrayIndexerNode.Parse(parser))));
     }
     else
     {
         return(left);
     }
 }
Esempio n. 3
0
        private static AstNode ParseAdditive(Parser.Parser parser)
        {
            AstNode left = ParseMultiplicative(parser);

            if (parser.AcceptToken(TokenType.Operation, "+"))
            {
                AstNode right = ParseAdditive(parser);
                return(new BinOpNode(BinaryOperation.Addition, left, right));
            }
            else if (parser.AcceptToken(TokenType.Operation, "-"))
            {
                AstNode right = ParseAdditive(parser);
                return(new BinOpNode(BinaryOperation.Subtraction, left, right));
            }
            else
            {
                return(left);
            }
        }
Esempio n. 4
0
 private static AstNode ParseUnary(Parser.Parser parser)
 {
     if (parser.AcceptToken(TokenType.UnaryOperation, "!"))
     {
         return(new UnaryOpNode(UnaryOperation.Not, ParseUnary(parser)));
     }
     else if (parser.AcceptToken(TokenType.Operation, "-"))
     {
         return(new UnaryOpNode(UnaryOperation.Negate, ParseUnary(parser)));
     }
     else if (parser.AcceptToken(TokenType.UnaryOperation, "~"))
     {
         return(new UnaryOpNode(UnaryOperation.Complement, ParseUnary(parser)));
     }
     else
     {
         return(ParseFunctionCall(parser));
     }
 }
Esempio n. 5
0
        private static AstNode ParseAssignment(Parser.Parser parser)
        {
            AstNode left = ParseEquality(parser);

            if (parser.AcceptToken(TokenType.Assignment))
            {
                AstNode right = ParseAssignment(parser);
                return(new BinOpNode(BinaryOperation.Assignment, left, right));
            }
            else if (parser.AcceptToken(TokenType.OpAssign))
            {
                var assigntype = GetBinaryOp(parser.PreviousToken().Value.ToString());
                var right      = ParseAssignment(parser);
                return(new BinOpNode(BinaryOperation.Assignment, assigntype, left, right));
            }
            else
            {
                return(left);
            }
        }
Esempio n. 6
0
        private static AstNode ParseMultiplicative(Parser.Parser parser)
        {
            AstNode left = ParseUnary(parser);

            if (parser.AcceptToken(TokenType.Operation, "*"))
            {
                AstNode right = ParseMultiplicative(parser);
                return(new BinOpNode(BinaryOperation.Multiplication, left, right));
            }
            else if (parser.AcceptToken(TokenType.Operation, "/"))
            {
                AstNode right = ParseMultiplicative(parser);
                return(new BinOpNode(BinaryOperation.Division, left, right));
            }
            else if (parser.AcceptToken(TokenType.Operation, "%"))
            {
                AstNode right = ParseMultiplicative(parser);
                return(new BinOpNode(BinaryOperation.Modulus, left, right));
            }
            else
            {
                return(left);
            }
        }
Esempio n. 7
0
        public static AstNode Parse(Parser.Parser parser)
        {
            parser.ExpectToken(TokenType.Identifier, "try");
            AstNode tryBody = StatementNode.Parse(parser);

            parser.ExpectToken(TokenType.Identifier, "catch");
            AstNode catchBody = StatementNode.Parse(parser);

            if (parser.AcceptToken(TokenType.Identifier, "finally"))
            {
                AstNode finallyBody = StatementNode.Parse(parser);
                return(new TryNode(tryBody, catchBody, finallyBody));
            }

            return(new TryNode(tryBody, catchBody));
        }
Esempio n. 8
0
        public static AstNode Parse(Parser.Parser parser)
        {
            parser.ExpectToken(TokenType.Identifier, "if");
            parser.ExpectToken(TokenType.Parentheses, "(");
            AstNode predicate = ExpressionNode.Parse(parser);

            parser.ExpectToken(TokenType.Parentheses, ")");
            AstNode ifBody = StatementNode.Parse(parser);

            if (parser.AcceptToken(TokenType.Identifier, "else"))
            {
                AstNode elseBody = StatementNode.Parse(parser);
                return(new IfNode(predicate, ifBody, elseBody));
            }

            return(new IfNode(predicate, ifBody));
        }
Esempio n. 9
0
        public static ArgListNode Parse(Parser.Parser parser)
        {
            ArgListNode ret = new ArgListNode();

            parser.ExpectToken(TokenType.Parentheses, "(");

            while (!parser.MatchToken(TokenType.Parentheses, ")"))
            {
                ret.Children.Add(ExpressionNode.Parse(parser));
                if (!parser.AcceptToken(TokenType.Comma))
                {
                    break;
                }
            }
            parser.ExpectToken(TokenType.Parentheses, ")");

            return(ret);
        }
Esempio n. 10
0
        public static AstNode Parse(Parser.Parser parser)
        {
            parser.ExpectToken(TokenType.Identifier, "func");
            string name = parser.ExpectToken(TokenType.Identifier).Value.ToString();

            parser.ExpectToken(TokenType.Parentheses, "(");

            List <string> result = new List <string>();

            while (parser.MatchToken(TokenType.Identifier))
            {
                result.Add(parser.ExpectToken(TokenType.Identifier).Value.ToString());
                if (!parser.AcceptToken(TokenType.Comma))
                {
                    break;
                }
            }

            parser.ExpectToken(TokenType.Parentheses, ")");
            AstNode body = StatementNode.Parse(parser);

            return(new FuncNode(name, result, body));
        }
Esempio n. 11
0
        private static AstNode ParseEquality(Parser.Parser parser)
        {
            AstNode left = ParseAdditive(parser);

            if (parser.AcceptToken(TokenType.Comparison, "="))
            {
                var right = ParseEquality(parser);
                return(new BinOpNode(BinaryOperation.Equals, left, right));
            }
            else if (parser.AcceptToken(TokenType.Comparison, "!="))
            {
                var right = ParseEquality(parser);
                return(new BinOpNode(BinaryOperation.NotEqualTo, left, right));
            }
            else if (parser.AcceptToken(TokenType.Comparison, "<"))
            {
                var right = ParseEquality(parser);
                return(new BinOpNode(BinaryOperation.LessThan, left, right));
            }
            else if (parser.AcceptToken(TokenType.Comparison, ">"))
            {
                var right = ParseEquality(parser);
                return(new BinOpNode(BinaryOperation.GreaterThan, left, right));
            }
            else if (parser.AcceptToken(TokenType.Comparison, "<="))
            {
                var right = ParseEquality(parser);
                return(new BinOpNode(BinaryOperation.LesserOrEqual, left, right));
            }
            else if (parser.AcceptToken(TokenType.Comparison, ">="))
            {
                var right = ParseEquality(parser);
                return(new BinOpNode(BinaryOperation.GreaterOrEqual, left, right));
            }
            else if (parser.AcceptToken(TokenType.Comparison, "&&"))
            {
                var right = ParseEquality(parser);
                return(new BinOpNode(BinaryOperation.And, left, right));
            }
            else if (parser.AcceptToken(TokenType.Comparison, "&&"))
            {
                var right = ParseEquality(parser);
                return(new BinOpNode(BinaryOperation.And, left, right));
            }
            else if (parser.AcceptToken(TokenType.Comparison, "||"))
            {
                var right = ParseEquality(parser);
                return(new BinOpNode(BinaryOperation.Or, left, right));
            }
            else if (parser.AcceptToken(TokenType.Operation, "^"))
            {
                var right = ParseEquality(parser);
                return(new BinOpNode(BinaryOperation.Xor, left, right));
            }
            else if (parser.AcceptToken(TokenType.Operation, "<<"))
            {
                var right = ParseEquality(parser);
                return(new BinOpNode(BinaryOperation.BitshiftLeft, left, right));
            }
            else if (parser.AcceptToken(TokenType.Operation, ">>"))
            {
                var right = ParseEquality(parser);
                return(new BinOpNode(BinaryOperation.BitshiftRight, left, right));
            }
            else if (parser.AcceptToken(TokenType.Operation, "&"))
            {
                var right = ParseEquality(parser);
                return(new BinOpNode(BinaryOperation.BitwiseAnd, left, right));
            }
            else if (parser.AcceptToken(TokenType.Operation, "|"))
            {
                var right = ParseEquality(parser);
                return(new BinOpNode(BinaryOperation.BitwiseOr, left, right));
            }
            else
            {
                return(left);
            }
        }