private bool VisitArethetic(ASTBinaryNode node) { if (!Visit(node.Left, node.Right)) { return(false); } var left = node.Left.TypeInfo; var right = node.Right.TypeInfo; if (CanImplecitCast(left, right)) { node.TypeInfo = right; } else if (CanImplecitCast(right, left)) { node.TypeInfo = left; } if (node.TypeInfo is IntegerType || node.TypeInfo is FloatType) { return(true); } Error(node.Position, $"Cannot add {left} and {right}"); return(false); }
private bool VisitAndOr(ASTBinaryNode node) { if (!Visit(node.Left, node.Right)) { return(false); } var left = node.Left.TypeInfo; var right = node.Right.TypeInfo; if (!(left is BooleanType && right is BooleanType)) { Error(node.Position, $"Cannot add {left} and {right}"); return(false); } node.TypeInfo = left; return(true); }
private bool EmitBinary <T>(ASTBinaryNode node) where T : CBinary, new() { if (!Visit(node.Left)) { return(false); } var left = _lastNode; if (!Visit(node.Right)) { return(false); } var right = _lastNode; _lastNode = new T { Left = left, Right = right }; return(true); }