Пример #1
0
        public void TestProcedureDeclarationWithEmptyReturn()
        {
            var programSource = new TokenList()
            {
                { TokenType.KwProcedure },
                { TokenType.Identifier, "proc" },
                { TokenType.LParen },
                { TokenType.Identifier, "par1" },
                { TokenType.Colon },
                { TokenType.Identifier, "real" },
                { TokenType.RParen },
                { TokenType.LineTerm },
                { TokenType.KwBegin },
                { TokenType.KwReturn },
                { TokenType.KwEnd }
            };
            Parser      parser  = new Parser(CreateMockScanner(programSource), new ErrorHandler());
            ProgramNode program = parser.Parse();

            var declr = new ProcedureDeclarationStmt(0, 0);

            declr.Identifier = "proc";
            declr.AddParameter("par1", new SimpleType(0, 0, ExprType.Real), false);
            declr.ProcedureBlock = new BlockStmt(0, 0);
            declr.ProcedureBlock.Statements.Add(new ReturnStmt(0, 0));
            expected.Block.Statements.Add(declr);

            program.ShouldBeEquivalentTo(expected);
        }
Пример #2
0
        public void TestProcedureDeclarationWithoutParameters()
        {
            var programSource = new TokenList()
            {
                { TokenType.KwProcedure },
                { TokenType.Identifier, "proc" },
                { TokenType.LParen },
                { TokenType.RParen },
                { TokenType.LineTerm },
                { TokenType.KwBegin },
                { TokenType.Identifier, "writeln" },
                { TokenType.LParen },
                { TokenType.RParen },
                { TokenType.KwEnd }
            };
            Parser      parser  = new Parser(CreateMockScanner(programSource), new ErrorHandler());
            ProgramNode program = parser.Parse();

            var declr = new ProcedureDeclarationStmt(0, 0);

            declr.Identifier     = "proc";
            declr.ProcedureBlock = new BlockStmt(0, 0);
            var call = new CallStmt(0, 0);

            call.ProcedureId = "writeln";
            declr.ProcedureBlock.Statements.Add(call);
            expected.Block.Statements.Add(declr);

            program.ShouldBeEquivalentTo(expected);
        }
        public void TestEmptyReturnInProcedure()
        {
            var program = new ProgramNode(0, 0);

            program.Block = new BlockStmt(0, 0);
            var procedure = new ProcedureDeclarationStmt(0, 0);

            procedure.Identifier     = "proc";
            procedure.ProcedureBlock = new BlockStmt(0, 0);
            procedure.ProcedureBlock.Statements.Add(new ReturnStmt(0, 0));
            program.Block.Statements.Add(procedure);
            AssertNoErrors(program);
        }
        private ProcedureDeclarationStmt CreateProcedure(string name, BlockStmt block = null)
        {
            var declaration = new ProcedureDeclarationStmt(0, 0);

            declaration.Identifier = name;
            if (block == null)
            {
                declaration.ProcedureBlock = new BlockStmt(0, 0);
            }
            else
            {
                declaration.ProcedureBlock = block;
            }
            declaration.AddParameter("arg1", new SimpleType(0, 0, ExprType.Int), false);
            return(declaration);
        }
        public void TestReturnValueInProcedure()
        {
            var program = new ProgramNode(0, 0);

            program.Block = new BlockStmt(0, 0);
            var declaration = new ProcedureDeclarationStmt(0, 0);

            declaration.Identifier     = "func";
            declaration.ProcedureBlock = new BlockStmt(0, 0);
            var returnStmt = new ReturnStmt(0, 0);

            returnStmt.ReturnExpression = new StringLiteralExpr(0, 0, "asd");
            declaration.ProcedureBlock.Statements.Add(returnStmt);
            program.Block.Statements.Add(declaration);
            AssertErrorContains(program, "Can't return a value in a procedure");
        }
Пример #6
0
        public void TestProcedureDeclarationWithMultipleParameters()
        {
            var programSource = new TokenList()
            {
                { TokenType.KwProcedure },
                { TokenType.Identifier, "proc" },
                { TokenType.LParen },
                { TokenType.Identifier, "par1" },
                { TokenType.Colon },
                { TokenType.Identifier, "real" },
                { TokenType.Comma },
                { TokenType.KwVar },
                { TokenType.Identifier, "par2" },
                { TokenType.Colon },
                { TokenType.Identifier, "string" },
                { TokenType.RParen },
                { TokenType.LineTerm },
                { TokenType.KwBegin },
                { TokenType.Identifier, "writeln" },
                { TokenType.LParen },
                { TokenType.RParen },
                { TokenType.KwEnd }
            };
            Parser      parser  = new Parser(CreateMockScanner(programSource), new ErrorHandler());
            ProgramNode program = parser.Parse();

            var declr = new ProcedureDeclarationStmt(0, 0);

            declr.Identifier = "proc";
            declr.AddParameter("par1", new SimpleType(0, 0, ExprType.Real), false);
            declr.AddParameter("par2", new SimpleType(0, 0, ExprType.String), true);
            declr.ProcedureBlock = new BlockStmt(0, 0);
            var call = new CallStmt(0, 0);

            call.ProcedureId = "writeln";
            declr.ProcedureBlock.Statements.Add(call);
            expected.Block.Statements.Add(declr);

            program.ShouldBeEquivalentTo(expected);
        }