51#ifndef DOXYGEN_SHOULD_SKIP_THIS
61 is_error(is_error), line(line), column(0), msg(msg), filename(
""), code(
"") {}
63 ParseError::ParseError(
bool is_error,
64 const std::string& msg,
65 const std::string& filename,
68 is_error(is_error), line(line), column(col), msg(msg), filename(filename), code(
"") {}
70 ParseError::ParseError(
bool is_error,
71 const std::string& msg,
72 const std::string& filename,
73 const std::string& code,
76 is_error(is_error), line(line), column(col), msg(msg), filename(filename), code(code) {}
78 ParseError::ParseError(
const ParseError& err) {
79 is_error = err.is_error;
83 filename = err.filename;
87 ParseError ParseError::operator=(
const ParseError& err) {
89 is_error = err.is_error;
93 filename = err.filename;
101 std::string ParseError::toString()
const {
102 std::ostringstream s;
104 if (!filename.empty()) s << filename <<
":";
106 if (line > 0) s << line <<
": ";
108 if (column > 0) s << column <<
" : ";
110 s << (is_error ?
"error" :
"warning") <<
" : " << msg;
116 std::string ParseError::toElegantString()
const {
118 std::ifstream ifs(filename.c_str());
120 for (Idx i = 0; i < line; i++)
121 std::getline(ifs, code);
124 std::ostringstream s;
126 s << toString() << std::endl << code << std::endl;
128 if (column > 0) s << std::string(column - 1,
' ') <<
"^";
133 ParseError ErrorsContainer::error(Idx i)
const {
134 if (count() > i)
return errors[i];
138 ParseError ErrorsContainer::last()
const {
139 if (count() > 0)
return errors[count() - 1];
143 ErrorsContainer::ErrorsContainer() {
148 ErrorsContainer::ErrorsContainer(
const ErrorsContainer& cont) {
149 error_count = cont.error_count;
150 warning_count = cont.warning_count;
152 errors = cont.errors;
155 ErrorsContainer ErrorsContainer::operator+(
const ErrorsContainer& cont)
const {
156 ErrorsContainer newCont;
158 newCont.error_count = this->error_count + cont.error_count;
159 newCont.warning_count = this->warning_count + cont.warning_count;
160 std::copy(this->errors.begin(), this->errors.end(), newCont.errors.begin());
161 std::copy(cont.errors.begin(), cont.errors.end(), newCont.errors.end());
166 ErrorsContainer ErrorsContainer::operator=(
const ErrorsContainer& cont) {
167 error_count = cont.error_count;
168 warning_count = cont.warning_count;
170 errors = cont.errors;
175 ErrorsContainer ErrorsContainer::operator+=(
const ErrorsContainer& cont) {
176 error_count += cont.error_count;
177 warning_count += cont.warning_count;
179 for (Idx i = 0; i < cont.count(); i++)
180 errors.push_back(cont.error(i));
185 void ErrorsContainer::simpleErrors(std::ostream& o)
const {
186 if (count() == 0)
return;
188 for (Idx i = 0; i < count(); i++) {
189 if (error(i).is_error) o << error(i).toString() << std::endl;
193 void ErrorsContainer::simpleErrorsAndWarnings(std::ostream& o)
const {
194 if (count() == 0)
return;
196 for (Idx i = 0; i < count(); i++)
197 o << error(i).toString() << std::endl;
200 void ErrorsContainer::elegantErrors(std::ostream& o)
const {
201 if (count() == 0)
return;
203 for (Idx i = 0; i < count(); i++) {
204 if (error(i).is_error) {
205 o << error(i).toElegantString();
211 void ErrorsContainer::elegantErrorsAndWarnings(std::ostream& o)
const {
212 if (count() == 0)
return;
214 for (Idx i = 0; i < count(); i++) {
215 o << error(i).toElegantString();
Exception : out of bound.
ParseError(bool is_error, const std::string &msg, Idx line)
Class constructor.
Errors container (at least) for parser.
Inlined implementation of the basic methods of ErrorsContainer.
#define GUM_ERROR(type, msg)
Size Idx
Type for indexes.
gum is the global namespace for all aGrUM entities