forked from lix-project/lix
simplify parse error reporting
since nix doesn't use the bison `error` terminal anywhere any invocation of yyerror will immediately cause a failure. since we're *already* leaking tons of memory whatever little bit bison allocates internally doesn't much matter any more, and we'll be replacing the parser soon anyway. coincidentally this now also matches the error behavior of URIs when they are disabled or ~/ paths in pure eval mode, duplicate attr detection etc.
This commit is contained in:
parent
f07388bf98
commit
e8d9de967f
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
#include <variant>
|
#include <variant>
|
||||||
|
|
||||||
|
#include "finally.hh"
|
||||||
#include "util.hh"
|
#include "util.hh"
|
||||||
#include "users.hh"
|
#include "users.hh"
|
||||||
|
|
||||||
|
@ -60,7 +61,6 @@ namespace nix {
|
||||||
Expr * result;
|
Expr * result;
|
||||||
SourcePath basePath;
|
SourcePath basePath;
|
||||||
PosTable::Origin origin;
|
PosTable::Origin origin;
|
||||||
std::optional<ErrorInfo> error;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -315,10 +315,10 @@ static inline PosIdx makeCurPos(const YYLTYPE & loc, ParseData * data)
|
||||||
|
|
||||||
void yyerror(YYLTYPE * loc, yyscan_t scanner, ParseData * data, const char * error)
|
void yyerror(YYLTYPE * loc, yyscan_t scanner, ParseData * data, const char * error)
|
||||||
{
|
{
|
||||||
data->error = {
|
throw ParseError({
|
||||||
.msg = hintfmt(error),
|
.msg = hintfmt(error),
|
||||||
.errPos = data->state.positions[makeCurPos(*loc, data)]
|
.errPos = data->state.positions[makeCurPos(*loc, data)]
|
||||||
};
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -689,11 +689,10 @@ Expr * EvalState::parse(
|
||||||
};
|
};
|
||||||
|
|
||||||
yylex_init(&scanner);
|
yylex_init(&scanner);
|
||||||
yy_scan_buffer(text, length, scanner);
|
Finally _destroy([&] { yylex_destroy(scanner); });
|
||||||
int res = yyparse(scanner, &data);
|
|
||||||
yylex_destroy(scanner);
|
|
||||||
|
|
||||||
if (res) throw ParseError(data.error.value());
|
yy_scan_buffer(text, length, scanner);
|
||||||
|
yyparse(scanner, &data);
|
||||||
|
|
||||||
data.result->bindVars(*this, staticEnv);
|
data.result->bindVars(*this, staticEnv);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue