fix(frontends/lean/parser): do not generate error when 'exit' command is used

This commit is contained in:
Leonardo de Moura 2014-12-09 10:14:14 -08:00
parent 116e7ff82e
commit d67583df44
3 changed files with 22 additions and 7 deletions

View file

@ -1434,7 +1434,8 @@ bool parser::parse_commands() {
throw_parser_exception("invalid end of module, expecting 'end'", pos()); throw_parser_exception("invalid end of module, expecting 'end'", pos());
} }
} catch (interrupt_parser) { } catch (interrupt_parser) {
display_error("parser has been interrupted", m_last_cmd_pos); while (has_open_scopes(m_env))
m_env = pop_scope_core(m_env);
} }
commit_info(m_scanner.get_line()+1); commit_info(m_scanner.get_line()+1);
for (certified_declaration const & thm : m_theorem_queue.join()) { for (certified_declaration const & thm : m_theorem_queue.join()) {

View file

@ -147,13 +147,10 @@ static void namespace_reader(deserializer & d, module_idx, shared_environment &,
}); });
} }
environment pop_scope(environment const & env, name const & n) { environment pop_scope_core(environment const & env) {
scope_mng_ext ext = get_extension(env); scope_mng_ext ext = get_extension(env);
if (is_nil(ext.m_namespaces)) if (is_nil(ext.m_namespaces))
throw exception("invalid end of scope, there are no open namespaces/sections/contexts"); return env;
if (n != head(ext.m_headers))
throw exception(sstream() << "invalid end of scope, begin/end mistmatch, scope starts with '"
<< head(ext.m_headers) << "', and ends with '" << n << "'");
scope_kind k = head(ext.m_scope_kinds); scope_kind k = head(ext.m_scope_kinds);
ext.m_namespaces = tail(ext.m_namespaces); ext.m_namespaces = tail(ext.m_namespaces);
ext.m_headers = tail(ext.m_headers); ext.m_headers = tail(ext.m_headers);
@ -165,6 +162,16 @@ environment pop_scope(environment const & env, name const & n) {
return r; return r;
} }
environment pop_scope(environment const & env, name const & n) {
scope_mng_ext ext = get_extension(env);
if (is_nil(ext.m_namespaces))
throw exception("invalid end of scope, there are no open namespaces/sections/contexts");
if (n != head(ext.m_headers))
throw exception(sstream() << "invalid end of scope, begin/end mistmatch, scope starts with '"
<< head(ext.m_headers) << "', and ends with '" << n << "'");
return pop_scope_core(env);
}
bool has_open_scopes(environment const & env) { bool has_open_scopes(environment const & env) {
scope_mng_ext ext = get_extension(env); scope_mng_ext ext = get_extension(env);
return !is_nil(ext.m_namespaces); return !is_nil(ext.m_namespaces);

View file

@ -31,8 +31,15 @@ environment export_namespace(environment const & env, io_state const & ios, name
/** \brief Create a new scope, all scoped extensions are notified. */ /** \brief Create a new scope, all scoped extensions are notified. */
environment push_scope(environment const & env, io_state const & ios, scope_kind k, name const & n = name()); environment push_scope(environment const & env, io_state const & ios, scope_kind k, name const & n = name());
/** \brief Delete the most recent scope, all scoped extensions are notified. */ /** \brief Delete the most recent scope, all scoped extensions are notified.
\remark method throws an exception if there are no open scopes, or \c n does not match the name of the open scope
*/
environment pop_scope(environment const & env, name const & n = name()); environment pop_scope(environment const & env, name const & n = name());
/** \brief Similar to \c pop_scope, but it always succeed.
It always pops the current open scope, and does nothing if there are no open scope.
*/
environment pop_scope_core(environment const & env);
/** \brief Return true iff there are open scopes */
bool has_open_scopes(environment const & env); bool has_open_scopes(environment const & env);
/** \brief Add a new namespace (if it does not exist) */ /** \brief Add a new namespace (if it does not exist) */