The D compiler has an interesting variation. If errors happen, the AST has "error" nodes that replace the buggy ones, and so are ignored by subsequent operations. Over the years, it has proved itself to be very satisfactory.