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); }
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)); }