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,
65 std::string_view filename,
68 is_error(is_error), line(line), column(col), msg(msg), filename(filename), code(
"") {}
70 ParseError::ParseError(
bool is_error,
72 std::string_view filename,
73 std::string_view 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 {
104 if (!filename.empty()) s += filename +
":";
106 if (line > 0) s += std::format(
"{}: ", line);
108 if (column > 0) s += std::format(
"{} : ", column);
110 s += std::format(
"{} : {}", (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::string s = toString() +
'\n' + code +
'\n';
126 if (column > 0) s += std::string(column - 1,
' ') +
'^';
131 ParseError ErrorsContainer::error(Idx i)
const {
132 if (count() > i)
return errors[i];
136 ParseError ErrorsContainer::last()
const {
137 if (count() > 0)
return errors[count() - 1];
141 ErrorsContainer::ErrorsContainer() {
146 ErrorsContainer::ErrorsContainer(
const ErrorsContainer& cont) {
147 error_count = cont.error_count;
148 warning_count = cont.warning_count;
150 errors = cont.errors;
153 ErrorsContainer ErrorsContainer::operator+(
const ErrorsContainer& cont)
const {
154 ErrorsContainer newCont;
156 newCont.error_count = this->error_count + cont.error_count;
157 newCont.warning_count = this->warning_count + cont.warning_count;
158 std::copy(this->errors.begin(), this->errors.end(), newCont.errors.begin());
159 std::copy(cont.errors.begin(), cont.errors.end(), newCont.errors.end());
164 ErrorsContainer ErrorsContainer::operator=(
const ErrorsContainer& cont) {
165 error_count = cont.error_count;
166 warning_count = cont.warning_count;
168 errors = cont.errors;
173 ErrorsContainer ErrorsContainer::operator+=(
const ErrorsContainer& cont) {
174 error_count += cont.error_count;
175 warning_count += cont.warning_count;
177 for (Idx i = 0; i < cont.count(); i++)
178 errors.push_back(cont.error(i));
183 void ErrorsContainer::simpleErrors(std::ostream& o)
const {
184 if (count() == 0)
return;
186 for (Idx i = 0; i < count(); i++) {
187 if (error(i).is_error) o << error(i).toString() << std::endl;
191 void ErrorsContainer::simpleErrorsAndWarnings(std::ostream& o)
const {
192 if (count() == 0)
return;
194 for (Idx i = 0; i < count(); i++)
195 o << error(i).toString() << std::endl;
198 void ErrorsContainer::elegantErrors(std::ostream& o)
const {
199 if (count() == 0)
return;
201 for (Idx i = 0; i < count(); i++) {
202 if (error(i).is_error) {
203 o << error(i).toElegantString();
209 void ErrorsContainer::elegantErrorsAndWarnings(std::ostream& o)
const {
210 if (count() == 0)
return;
212 for (Idx i = 0; i < count(); i++) {
213 o << error(i).toElegantString();
Exception : out of bound.
ParseError(bool is_error, std::string_view 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