public static Either <ParseException, Pair <List <IToken>, StatementNode> > Parse(List <IToken> tokens, SymT symT, IScopedTable <IEntityType, string> parentTypeTable)
        {
            Console.WriteLine("StatementNode");

            var maybeAssignment = AssignmentNode.Parse(tokens, parentTypeTable);

            if (maybeAssignment.IsRight)
            {
                tokens = maybeAssignment.RightToList()[0].First;
                return(new Pair <List <IToken>, StatementNode>(tokens, new StatementNode(
                                                                   maybeAssignment.RightToList()[0].Second,
                                                                   parentTypeTable)));
            }

            var maybeRoutineCall = RoutineCallNode.Parse(tokens, symT, parentTypeTable);

            if (maybeRoutineCall.IsRight)
            {
                tokens = maybeRoutineCall.RightToList()[0].First;
                return(new Pair <List <IToken>, StatementNode>(tokens, new StatementNode(
                                                                   maybeRoutineCall.RightToList()[0].Second,
                                                                   parentTypeTable)));
            }

            var maybeWhileLoop = WhileLoopNode.Parse(tokens, symT, parentTypeTable);

            if (maybeWhileLoop.IsRight)
            {
                tokens = maybeWhileLoop.RightToList()[0].First;
                return(new Pair <List <IToken>, StatementNode>(tokens, new StatementNode(
                                                                   maybeWhileLoop.RightToList()[0].Second,
                                                                   parentTypeTable)));
            }

            var maybeForLoop = ForLoopNode.Parse(tokens, symT, parentTypeTable);

            if (maybeForLoop.IsRight)
            {
                tokens = maybeForLoop.RightToList()[0].First;
                return(new Pair <List <IToken>, StatementNode>(tokens, new StatementNode(
                                                                   maybeForLoop.RightToList()[0].Second,
                                                                   parentTypeTable)));
            }

            var maybeIfStatement = IfStatementNode.Parse(tokens, symT, parentTypeTable);

            if (maybeIfStatement.IsRight)
            {
                tokens = maybeIfStatement.RightToList()[0].First;
                return(new Pair <List <IToken>, StatementNode>(tokens, new StatementNode(
                                                                   maybeIfStatement.RightToList()[0].Second,
                                                                   parentTypeTable)));
            }

            return(NotAStatementException);
        }
 private StatementNode(ForLoopNode forLoop, IScopedTable <IEntityType, string> parentTypeTable)
 {
     ForLoop         = forLoop;
     ParentTypeTable = parentTypeTable;
 }
示例#3
0
        public static Either <ParseException, Pair <List <IToken>, ForLoopNode> > Parse(List <IToken> tokens, SymT symT, IScopedTable <IEntityType, string> parentTypeTable)
        {
            Console.WriteLine("ForLoopNode");
            SymT NewSymT = new SymT(symT);

            if (tokens.Count < 1)
            {
                return(NotAForLoopException);
            }
            if (!(tokens[0] is ForKeywordToken))
            {
                return(NotAForLoopException);
            }
            tokens = tokens.Skip(1).ToList();

            if (tokens.Count < 1)
            {
                return(NotAForLoopException);
            }
            if (!(tokens[0] is IdentifierToken))
            {
                return(NotAForLoopException);
            }
            IdentifierToken identifier = (IdentifierToken)tokens[0];
            var             typeTable  = new Dictionary <string, IEntityType>();

            typeTable.TryAdd(
                identifier.Lexeme,
                new VariableType(new PrimitiveTypeRepresentation(new IntegerTypeNode()))
                );
            tokens = tokens.Skip(1).ToList();

            var result = new ForLoopNode(
                identifier, null, null, NewSymT, typeTable, parentTypeTable);
            var maybeRange = RangeNode.Parse(tokens, result);

            if (NewSymT.Contain(identifier))
            {
                // TODO: return an exception instead
                Console.WriteLine("Repeating identifier in the same scope");
            }
            else
            {
                NewSymT.Add(identifier);
            }

            if (maybeRange.IsLeft)
            {
                return(maybeRange.LeftToList()[0]);
            }
            RangeNode range = maybeRange.RightToList()[0].Second;

            tokens = maybeRange.RightToList()[0].First;

            if (tokens.Count < 1)
            {
                return(NotAForLoopException);
            }
            if (!(tokens[0] is LoopKeywordToken))
            {
                return(NotAForLoopException);
            }
            tokens = tokens.Skip(1).ToList();

            var maybeBody = BodyNode.Parse(tokens, NewSymT, result);

            if (maybeBody.IsLeft)
            {
                return(maybeBody.LeftToList()[0]);
            }
            BodyNode body = maybeBody.RightToList()[0].Second;

            tokens = maybeBody.RightToList()[0].First;

            if (tokens.Count < 1)
            {
                return(NotAForLoopException);
            }
            if (!(tokens[0] is EndKeywordToken))
            {
                return(NotAForLoopException);
            }
            tokens = tokens.Skip(1).ToList();

            while (tokens.Count > 0)
            {
                if (tokens[0] is NewLineSymbolToken || tokens[0] is CommentToken ||
                    tokens[0] is SemicolonSymbolToken)
                {
                    tokens = tokens.Skip(1).ToList();
                }
                else
                {
                    break;
                }
            }

            result.Range = range;
            result.Body  = body;
            return(new Pair <List <IToken>, ForLoopNode>(tokens, result));
        }