Throw a specific error for incomplete parse errors.
`nix-repl` will use this for deciding whether to keep waiting for input or error out right away.
This commit is contained in:
parent
8f71bc33d5
commit
6498adb002
|
@ -195,5 +195,7 @@ or { return OR_KW; }
|
|||
|
||||
}
|
||||
|
||||
<<EOF>> { data->atEnd = true; return 0; }
|
||||
|
||||
%%
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@ namespace nix {
|
|||
|
||||
MakeError(EvalError, Error)
|
||||
MakeError(ParseError, Error)
|
||||
MakeError(IncompleteParseError, ParseError)
|
||||
MakeError(AssertionError, EvalError)
|
||||
MakeError(ThrownError, AssertionError)
|
||||
MakeError(Abort, EvalError)
|
||||
|
|
|
@ -31,10 +31,12 @@ namespace nix {
|
|||
Path basePath;
|
||||
Symbol path;
|
||||
string error;
|
||||
bool atEnd;
|
||||
Symbol sLetBody;
|
||||
ParseData(EvalState & state)
|
||||
: state(state)
|
||||
, symbols(state.symbols)
|
||||
, atEnd(false)
|
||||
, sLetBody(symbols.create("<let-body>"))
|
||||
{ };
|
||||
};
|
||||
|
@ -539,7 +541,12 @@ Expr * EvalState::parse(const char * text,
|
|||
int res = yyparse(scanner, &data);
|
||||
yylex_destroy(scanner);
|
||||
|
||||
if (res) throw ParseError(data.error);
|
||||
if (res) {
|
||||
if (data.atEnd)
|
||||
throw IncompleteParseError(data.error);
|
||||
else
|
||||
throw ParseError(data.error);
|
||||
}
|
||||
|
||||
data.result->bindVars(staticEnv);
|
||||
|
||||
|
|
Loading…
Reference in a new issue