示例#1
0
        private static void AnalyseWhileStatement()
        {
            Tokenizer.ExpectToken(TokenType.While);

            var brStart = SymbolManager.AddInstruction(new Instruction(InstructionType.Br, 0));

            SymbolManager.EnterWhile(brStart);

            var condition = ExpressionAnalyser.AnalyseExpression();

            if (condition.ValueType != ValueType.Int)
            {
                throw new Exception("invalid condition expression");
            }
            SymbolManager.AddInstruction(new Instruction(InstructionType.BrTrue, 1));
            var brForward = SymbolManager.AddInstruction(new Instruction(InstructionType.Br, 0));

            AnalyseBlockStatement(true);

            var brBack = SymbolManager.AddInstruction(new Instruction(InstructionType.Br, 0));

            brBack.SetParam(SymbolManager.GetInstructionOffset(brBack, brStart));
            brForward.SetParam(SymbolManager.GetInstructionOffset(brForward, brBack) + 1);

            SymbolManager.LeaveWhile();
        }
示例#2
0
        private static void AnalyseLetStatement()
        {
            Tokenizer.ExpectToken(TokenType.Let);
            var ident = Tokenizer.ExpectToken(TokenType.Identifier);

            Tokenizer.ExpectToken(TokenType.Colon);
            var type     = Tokenizer.ExpectToken(TokenType.Identifier);
            var variable = SymbolManager.NewVariable((string)ident.Value, type.ToValueType(), false);

            if (Tokenizer.PeekToken().Is(TokenType.Assign))
            {
                Tokenizer.ExpectToken(TokenType.Assign);

                // load symbol address
                SymbolManager.AddLoadAddressInstruction(variable);

                var e = ExpressionAnalyser.AnalyseExpression();

                if (variable.ValueType != e.ValueType)
                {
                    throw new Exception("value type not match");
                }

                SymbolManager.CurFunction.AddInstruction(new Instruction(InstructionType.Store64));
                variable.Initial();
            }

            Tokenizer.ExpectToken(TokenType.Semicolon);
        }
示例#3
0
        private static void AnalyseReturnStatement()
        {
            Tokenizer.ExpectToken(TokenType.Return);
            if (SymbolManager.CurFunction.ReturnType != ValueType.Void)
            {
                var symbol = SymbolManager.FindSymbol("return()");
                SymbolManager.AddLoadAddressInstruction(symbol);
            }

            var e = ExpressionAnalyser.AnalyseExpression();

            if (e.ValueType != SymbolManager.CurFunction.ReturnType)
            {
                throw new Exception("unexpected return value");
            }

            if (e.ValueType != ValueType.Void)
            {
                SymbolManager.AddInstruction(new Instruction(InstructionType.Store64));
            }
            Tokenizer.ExpectToken(TokenType.Semicolon);
            SymbolManager.AddInstruction(new Instruction(InstructionType.Ret));
        }
示例#4
0
        private static void AnalyseIfStatement()
        {
            Tokenizer.ExpectToken(TokenType.If);
            var condition = ExpressionAnalyser.AnalyseExpression();

            if (condition.ValueType != ValueType.Int)
            {
                throw new Exception("invalid condition expression");
            }

            SymbolManager.AddInstruction(new Instruction(InstructionType.BrTrue, 1));
            var iThrough = SymbolManager.AddInstruction(new Instruction(InstructionType.Br, 0));

            AnalyseBlockStatement(true);

            // iThrough should jump to here
            iThrough.SetParam(SymbolManager.GetInstructionOffset(iThrough) + 1);

            if (Tokenizer.PeekToken().Is(TokenType.Else))
            {
                var iInnerThrough = SymbolManager.AddInstruction(new Instruction(InstructionType.Br, 0));
                Tokenizer.ExpectToken(TokenType.Else);
                if (Tokenizer.PeekToken().Is(TokenType.LBrace))
                {
                    AnalyseBlockStatement(true);
                }
                else
                {
                    AnalyseIfStatement();
                }

                // iThrough should jump to here
                iInnerThrough.SetParam(SymbolManager.GetInstructionOffset(iInnerThrough) + 1);
            }

            SymbolManager.AddInstruction(new Instruction(InstructionType.Br, 0));
        }
示例#5
0
 private static void AnalyseExpressionStatement()
 {
     ExpressionAnalyser.AnalyseExpression();
     Tokenizer.ExpectToken(TokenType.Semicolon);
 }
        public void HasBeenSaved <TU>(Expression <Func <TU, bool> > assertions) where TU : TableEntity, new()
        {
            var exactResults = GetList <TU>();

            ExpressionAnalyser.CheckMessagesMatch(exactResults, assertions);
        }
        public void HasBeenDeleted <TU>(Expression <Func <TU, bool> > assertions) where TU : TableEntity, new()
        {
            var results = GetList <TU>();

            ExpressionAnalyser.CheckMessagesDoNotMatch(results, assertions);
        }