Ejemplo n.º 1
0
        public override SemanticCheckResult VisitDivision(ASTDivideNode Divide)
        {
            var left  = Divide.Left.Accept(this);
            var right = Divide.Right.Accept(this);

            Divide.SemanticCheckResult.Ensure(left, left.Type == CompilationUnit.TypeEnvironment.Int,
                                              new Lazy <Error>(() => new Error("Left Expresion must have type Int", ErrorKind.TypeError, Divide.DivToken.Line, Divide.DivToken.Column)));
            Divide.SemanticCheckResult.Ensure(right, right.Type == CompilationUnit.TypeEnvironment.Int,
                                              new Lazy <Error>(() => new Error("Right Expresion must have type Int", ErrorKind.TypeError, Divide.DivToken.Line, Divide.DivToken.Column)));
            Divide.SemanticCheckResult.EnsureReturnType(CompilationUnit.TypeEnvironment.Int);
            return(Divide.SemanticCheckResult);
        }
Ejemplo n.º 2
0
        public ASTCILNode VisitDivision(ASTDivideNode Division)
        {
            var ifLabel = labelIlGenerator.GenerateIf();

            return(new ASTCILDivideTwoVariablesNode((ASTCILExpressionNode)Division.Left.Accept(this),
                                                    new ASTCILIfNode(
                                                        (ASTCILExpressionNode) new ASTEqualNode
            {
                Left = Division.Right,
                Right = new ASTIntConstantNode {
                    Value = 0, SymbolTable = Division.SymbolTable
                },
                SymbolTable = Division.SymbolTable
            }.Accept(this),
                                                        new ASTCILBlockNode(new ASTCILExpressionNode[] {
                new ASTCILRuntimeErrorNode(RuntimeErrors.DivisionBy0), new ASTCILGotoNode(ifLabel.end)
            }),
                                                        (ASTCILExpressionNode)Division.Right.Accept(this), ifLabel)));
        }
 public virtual T VisitDivision(ASTDivideNode Division)
 {
     Division.Left.Accept(this);
     Division.Right.Accept(this);
     return(default(T));
 }