Example #1
0
        public static ExpressionNode parse(int TokenNumber)
        {
            ExpressionNode node = new ExpressionNode();

            if (Parser.NeededToken(TokenNumber, "type", "int", 0))
            {
                node.ExpressionType = "literal";
                node.IntegerLiteral = Parser.TokensArray[TokenNumber].Value;
                TokenNumber++;
                node.TokenNumber = TokenNumber;
                return(node);
            }
            if (Parser.NeededToken(TokenNumber, "type", "bool", 0))
            {
                node.ExpressionType = "literal";
                node.BooleanLiteral = Parser.TokensArray[TokenNumber].Value;
                TokenNumber++;
                node.TokenNumber = TokenNumber;
                return(node);
            }
            if (Parser.NeededToken(TokenNumber, "type", "float", 0))
            {
                node.ExpressionType = "literal";
                node.FloatLiteral   = Parser.TokensArray[TokenNumber].Value;
                TokenNumber++;
                node.TokenNumber = TokenNumber;
                return(node);
            }
            CallNode cnode = CallParser.parse(TokenNumber);

            if (cnode.BadParsed)
            {
                node.BadParsed = true;
                node.ErrorLine = cnode.ErrorLine;
                return(node);
            }
            node.ExpressionType = "call";
            node.TokenNumber    = cnode.TokenNumber;
            node.SetCall(cnode);
            return(node);
        }
Example #2
0
        public static List <Node> parse(int TokenNumber)
        {
            List <Node> BodyNodes = new List <Node>();

            while (true)
            {
                if (!(Parser.NeededToken(TokenNumber, "type", "name", 0) ||
                      Parser.NeededToken(TokenNumber, "value", "while", 0) ||
                      Parser.NeededToken(TokenNumber, "value", "if", 0) ||
                      Parser.NeededToken(TokenNumber, "value", "return", 0) ||
                      Parser.NeededToken(TokenNumber, "value", "var", 0) ||
                      Parser.NeededToken(TokenNumber, "value", "this", 0)))
                {
                    return(BodyNodes);
                }
                VariableDeclarationNode VariableNode = VariableDeclarationParser.parse(TokenNumber);
                if (!VariableNode.BadParsed)
                {
                    BodyNodes.Add(VariableNode);
                    TokenNumber = VariableNode.TokenNumber;
                    continue;
                }
                AssignmentNode anode = AssignmentParser.parse(TokenNumber);
                if (!anode.BadParsed)
                {
                    BodyNodes.Add(anode);
                    TokenNumber = anode.TokenNumber;
                    continue;
                }
                WhileLoopNode LoopNode = WhileLoopParser.parse(TokenNumber);
                if (!LoopNode.BadParsed)
                {
                    BodyNodes.Add(LoopNode);
                    TokenNumber = LoopNode.TokenNumber;
                    continue;
                }
                IfStatementNode IfNode = IfStatementParser.parse(TokenNumber);
                if (!IfNode.BadParsed)
                {
                    BodyNodes.Add(IfNode);
                    TokenNumber = IfNode.TokenNumber;
                    continue;
                }
                ReturnStatementNode ReturnNode = ReturnStatementParser.parse(TokenNumber);
                if (!ReturnNode.BadParsed)
                {
                    BodyNodes.Add(ReturnNode);
                    TokenNumber = ReturnNode.TokenNumber;
                    continue;
                }
                CallNode cnode = CallParser.parse(TokenNumber);
                if (cnode.BadParsed)
                {
                    Node node = new Node();
                    node.BadParsed = true;
                    node.ErrorLine = Math.Max(Math.Max(VariableNode.ErrorLine, anode.ErrorLine),
                                              Math.Max(LoopNode.ErrorLine, IfNode.ErrorLine));
                    node.ErrorLine = Math.Max(Math.Max(ReturnNode.ErrorLine, cnode.ErrorLine), node.ErrorLine); //deepest parsing error
                    BodyNodes.Add(node);
                    return(BodyNodes);
                }
                BodyNodes.Add(cnode);
                TokenNumber = cnode.TokenNumber;
                if (TokenNumber >= Parser.TokensArray.Length)  //if tokens ended
                {
                    Node node = new Node();
                    node.BadParsed = true;
                    node.ErrorLine = Parser.TokensArray[Parser.TokensArray.Length - 1].Line;
                    return(BodyNodes);
                }
            }
        }
Example #3
0
 public void SetCall(CallNode call)
 {
     this.call = call;
 }
Example #4
0
        public static CallNode parse(int TokenNumber)
        {
            CallNode node = new CallNode();

            if ((Parser.NeededToken(TokenNumber, "type", "name", 0) || Parser.NeededToken(TokenNumber, "value", "this", 0)) &&
                Parser.NeededToken(TokenNumber + 1, "value", ".", 0))
            {
                node.SetCallerName(Parser.TokensArray[TokenNumber].Value);
                TokenNumber += 2;
            }
            while (true)
            {
                string CurrentCallee            = "";
                List <ExpressionNode> arguments = new List <ExpressionNode>();
                if (!Parser.NeededToken(TokenNumber, "type", "name", 0))
                {
                    node.BadParsed = true;
                    node.ErrorLine = Parser.TokensArray[Math.Min(Parser.TokensArray.Length - 1, TokenNumber)].Line;
                    return(node);
                }
                CurrentCallee = Parser.TokensArray[TokenNumber].Value;
                TokenNumber++;
                if (Parser.NeededToken(TokenNumber, "value", "(", 0))
                {
                    TokenNumber++;
                    while (true)
                    {
                        ExpressionNode enode = ExpressionParser.parse(TokenNumber);
                        if (enode.BadParsed)
                        {
                            node.BadParsed = true;
                            node.ErrorLine = enode.ErrorLine;
                            return(node);
                        }
                        TokenNumber = enode.TokenNumber;
                        arguments.Add(enode);
                        if (Parser.NeededToken(TokenNumber, "value", ",", 0))
                        {
                            TokenNumber++;
                            continue;
                        }
                        if (Parser.NeededToken(TokenNumber, "value", ")", 0))
                        {
                            TokenNumber++;
                            break;
                        }
                        node.BadParsed = true;
                        node.ErrorLine = Parser.TokensArray[Math.Min(Parser.TokensArray.Length - 1, TokenNumber)].Line;
                        return(node);
                    }
                }
                node.AddCallee(CurrentCallee, arguments);
                if (Parser.NeededToken(TokenNumber, "value", ".", 0))
                {
                    TokenNumber++;
                    continue;
                }
                break;
            }
            node.TokenNumber = TokenNumber;
            return(node);
        }