Index: src/Common/SemanticError.cc
===================================================================
--- src/Common/SemanticError.cc	(revision 294647bb36b8887ef83cb50ce4390321fab6d613)
+++ src/Common/SemanticError.cc	(revision 138e29ecafd7b7c16c01bc5bf07aa51231168aa0)
@@ -22,19 +22,24 @@
 #include "SemanticError.h"
 
+#include <unistd.h>
+
+inline const std::string& error_str() {
+	static std::string str = isatty( fileno(stderr) ) ? "\e[31merror:\e[39m " : "error: ";
+	return str;
+}
+
 SemanticError::SemanticError() {
 }
 
 SemanticError::SemanticError( std::string error ) {
-  append( error );
+	append( error );
 }
 
 void SemanticError::append( SemanticError &other ) {
-  errors.splice( errors.end(), other.errors );
+	errors.splice( errors.end(), other.errors );
 }
 
 void SemanticError::append( const std::string & msg ) {
-  using std::to_string;
-  const std::string loc = location.linenumber >= 0 ? "At \"" + to_string(location) + "\" " : "";
-  errors.push_back( loc + "Error: " + msg );
+	errors.emplace_back( error_str() + msg );
 }
 
@@ -44,13 +49,12 @@
 
 void SemanticError::print( std::ostream &os ) {
-	std::copy( errors.begin(), errors.end(), std::ostream_iterator< std::string >( os, "\n" ) );
+	using std::to_string;
+	for(auto err : errors) {
+		os << to_string( err.location ) << err.description << '\n';
+	}
 }
 
 void SemanticError::set_location( const CodeLocation& location ) {
-  this->location = location;
-  using std::to_string;
-  const std::string loc = location.linenumber >= 0 ? "At \"" + to_string(location) + "\" " : "";
-  auto& error = *errors.begin();
-  error.insert( 0, loc.c_str());
+	errors.begin()->maybeSet( location );
 }
 
Index: src/Common/SemanticError.h
===================================================================
--- src/Common/SemanticError.h	(revision 294647bb36b8887ef83cb50ce4390321fab6d613)
+++ src/Common/SemanticError.h	(revision 138e29ecafd7b7c16c01bc5bf07aa51231168aa0)
@@ -25,4 +25,18 @@
 #include "utility.h"
 
+struct error {
+	std::string description;
+	CodeLocation location;
+
+	error() = default;
+	error( const std::string& str ) : description( str ) {}
+
+	void maybeSet( const CodeLocation& location ) {
+		if( this->location.linenumber < 0 ) {
+			this->location = location;
+		}
+	}
+};
+
 class SemanticError : public std::exception {
   public:
@@ -41,6 +55,5 @@
 	// representation of the obj (T must have a print method)
   private:
-	std::list< std::string > errors;
-	CodeLocation location;
+	std::list< error > errors;
 };
 
Index: src/Common/utility.h
===================================================================
--- src/Common/utility.h	(revision 294647bb36b8887ef83cb50ce4390321fab6d613)
+++ src/Common/utility.h	(revision 138e29ecafd7b7c16c01bc5bf07aa51231168aa0)
@@ -320,5 +320,5 @@
 
 inline std::string to_string( const CodeLocation& location ) {
-	return location.filename + ":" + std::to_string(location.linenumber);
+	return location.linenumber >= 0 ? location.filename + ":" + std::to_string(location.linenumber) + " " : "";
 }
 #endif // _UTILITY_H
