feat(frontends/lean): add 'prelude' command, and init directory
This commit is contained in:
parent
7dc055cfc9
commit
8dfd22e66c
7 changed files with 66 additions and 29 deletions
7
library/init/default.lean
Normal file
7
library/init/default.lean
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
/-
|
||||||
|
Copyright (c) 2014 Microsoft Corporation. All rights reserved.
|
||||||
|
Released under Apache 2.0 license as described in the file LICENSE.
|
||||||
|
|
||||||
|
Authors: Leonardo de Moura
|
||||||
|
-/
|
||||||
|
prelude
|
|
@ -8,7 +8,7 @@
|
||||||
(require 'rx)
|
(require 'rx)
|
||||||
|
|
||||||
(defconst lean-keywords
|
(defconst lean-keywords
|
||||||
'("import" "reducible" "irreducible" "tactic_hint" "protected" "private" "opaque" "definition" "renaming"
|
'("import" "prelude" "reducible" "irreducible" "tactic_hint" "protected" "private" "opaque" "definition" "renaming"
|
||||||
"hiding" "exposing" "parameter" "parameters" "begin" "proof" "qed" "conjecture" "constant" "constants"
|
"hiding" "exposing" "parameter" "parameters" "begin" "proof" "qed" "conjecture" "constant" "constants"
|
||||||
"hypothesis" "lemma" "corollary" "variable" "variables" "print" "theorem" "example"
|
"hypothesis" "lemma" "corollary" "variable" "variables" "print" "theorem" "example"
|
||||||
"context" "open" "as" "export" "axiom" "inductive" "with" "structure" "record" "universe" "universes"
|
"context" "open" "as" "export" "axiom" "inductive" "with" "structure" "record" "universe" "universes"
|
||||||
|
|
|
@ -12,8 +12,11 @@ Author: Leonardo de Moura
|
||||||
#include "frontends/lean/scanner.h"
|
#include "frontends/lean/scanner.h"
|
||||||
|
|
||||||
namespace lean {
|
namespace lean {
|
||||||
|
|
||||||
|
|
||||||
bool display_deps(environment const & env, std::ostream & out, std::ostream & err, char const * fname) {
|
bool display_deps(environment const & env, std::ostream & out, std::ostream & err, char const * fname) {
|
||||||
name import("import");
|
name import("import");
|
||||||
|
name prelude("prelude");
|
||||||
name period(".");
|
name period(".");
|
||||||
std::ifstream in(fname);
|
std::ifstream in(fname);
|
||||||
if (in.bad() || in.fail()) {
|
if (in.bad() || in.fail()) {
|
||||||
|
@ -26,6 +29,25 @@ bool display_deps(environment const & env, std::ostream & out, std::ostream & er
|
||||||
bool import_prefix = false;
|
bool import_prefix = false;
|
||||||
bool import_args = false;
|
bool import_args = false;
|
||||||
bool ok = true;
|
bool ok = true;
|
||||||
|
bool is_prelude = false;
|
||||||
|
auto display_dep = [&](optional<unsigned> const & k, name const & f) {
|
||||||
|
import_args = true;
|
||||||
|
try {
|
||||||
|
std::string m_name = find_file(base, k, name_to_file(f), {".lean", ".olean", ".lua"});
|
||||||
|
int last_idx = m_name.find_last_of(".");
|
||||||
|
std::string rawname = m_name.substr(0, last_idx);
|
||||||
|
std::string ext = m_name.substr(last_idx);
|
||||||
|
if (ext == ".lean")
|
||||||
|
m_name = rawname + ".olean";
|
||||||
|
display_path(out, m_name);
|
||||||
|
import_prefix = true;
|
||||||
|
out << "\n";
|
||||||
|
} catch (exception & new_ex) {
|
||||||
|
err << "error: file '" << name_to_file(s.get_name_val()) << "' not found in the LEAN_PATH" << std::endl;
|
||||||
|
ok = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
scanner::token_kind t = scanner::token_kind::Identifier;
|
scanner::token_kind t = scanner::token_kind::Identifier;
|
||||||
try {
|
try {
|
||||||
|
@ -34,7 +56,11 @@ bool display_deps(environment const & env, std::ostream & out, std::ostream & er
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (t == scanner::token_kind::Eof) {
|
if (t == scanner::token_kind::Eof) {
|
||||||
|
if (!is_prelude)
|
||||||
|
display_dep(optional<unsigned>(), name("init"));
|
||||||
return ok;
|
return ok;
|
||||||
|
} else if (t == scanner::token_kind::CommandKeyword && s.get_token_info().value() == prelude) {
|
||||||
|
is_prelude = true;
|
||||||
} else if (t == scanner::token_kind::CommandKeyword && s.get_token_info().value() == import) {
|
} else if (t == scanner::token_kind::CommandKeyword && s.get_token_info().value() == import) {
|
||||||
k = optional<unsigned>();
|
k = optional<unsigned>();
|
||||||
import_prefix = true;
|
import_prefix = true;
|
||||||
|
@ -44,22 +70,8 @@ bool display_deps(environment const & env, std::ostream & out, std::ostream & er
|
||||||
else
|
else
|
||||||
k = *k + 1;
|
k = *k + 1;
|
||||||
} else if ((import_prefix || import_args) && t == scanner::token_kind::Identifier) {
|
} else if ((import_prefix || import_args) && t == scanner::token_kind::Identifier) {
|
||||||
import_args = true;
|
display_dep(k, s.get_name_val());
|
||||||
try {
|
k = optional<unsigned>();
|
||||||
std::string m_name = find_file(base, k, name_to_file(s.get_name_val()), {".lean", ".olean", ".lua"});
|
|
||||||
int last_idx = m_name.find_last_of(".");
|
|
||||||
std::string rawname = m_name.substr(0, last_idx);
|
|
||||||
std::string ext = m_name.substr(last_idx);
|
|
||||||
if (ext == ".lean")
|
|
||||||
m_name = rawname + ".olean";
|
|
||||||
display_path(out, m_name);
|
|
||||||
k = optional<unsigned>();
|
|
||||||
import_prefix = true;
|
|
||||||
out << "\n";
|
|
||||||
} catch (exception & new_ex) {
|
|
||||||
err << "error: file '" << name_to_file(s.get_name_val()) << "' not found in the LEAN_PATH" << std::endl;
|
|
||||||
ok = false;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
import_args = false;
|
import_args = false;
|
||||||
import_prefix = false;
|
import_prefix = false;
|
||||||
|
|
|
@ -1304,8 +1304,30 @@ static void lua_module_reader(deserializer & d, module_idx, shared_environment &
|
||||||
void parser::parse_imports() {
|
void parser::parse_imports() {
|
||||||
buffer<module_name> olean_files;
|
buffer<module_name> olean_files;
|
||||||
buffer<name> lua_files;
|
buffer<name> lua_files;
|
||||||
|
bool prelude = false;
|
||||||
std::string base = dirname(get_stream_name().c_str());
|
std::string base = dirname(get_stream_name().c_str());
|
||||||
bool imported = false;
|
bool imported = false;
|
||||||
|
if (curr_is_token(get_prelude_tk())) {
|
||||||
|
next();
|
||||||
|
prelude = true;
|
||||||
|
}
|
||||||
|
auto import_olean = [&](optional<unsigned> const & k, name const & f) {
|
||||||
|
if (auto it = try_file(base, k, f, ".olean")) {
|
||||||
|
olean_files.push_back(module_name(k, f));
|
||||||
|
} else {
|
||||||
|
m_found_errors = true;
|
||||||
|
if (!m_use_exceptions && m_show_errors) {
|
||||||
|
flycheck_error err(regular_stream());
|
||||||
|
display_error_pos(pos());
|
||||||
|
regular_stream() << " invalid import, unknown module '" << f << "'" << endl;
|
||||||
|
}
|
||||||
|
if (m_use_exceptions)
|
||||||
|
throw parser_error(sstream() << "invalid import, unknown module '" << f << "'", pos());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if (!prelude) {
|
||||||
|
import_olean(optional<unsigned>(), "init");
|
||||||
|
}
|
||||||
while (curr_is_token(get_import_tk())) {
|
while (curr_is_token(get_import_tk())) {
|
||||||
imported = true;
|
imported = true;
|
||||||
m_last_cmd_pos = pos();
|
m_last_cmd_pos = pos();
|
||||||
|
@ -1327,17 +1349,8 @@ void parser::parse_imports() {
|
||||||
throw parser_error(sstream() << "invalid import, failed to import '" << f
|
throw parser_error(sstream() << "invalid import, failed to import '" << f
|
||||||
<< "', relative paths are not supported for .lua files", pos());
|
<< "', relative paths are not supported for .lua files", pos());
|
||||||
lua_files.push_back(f);
|
lua_files.push_back(f);
|
||||||
} else if (auto it = try_file(base, k, f, ".olean")) {
|
|
||||||
olean_files.push_back(module_name(k, f));
|
|
||||||
} else {
|
} else {
|
||||||
m_found_errors = true;
|
import_olean(k, f);
|
||||||
if (!m_use_exceptions && m_show_errors) {
|
|
||||||
flycheck_error err(regular_stream());
|
|
||||||
display_error_pos(pos());
|
|
||||||
regular_stream() << " invalid import, unknown module '" << f << "'" << endl;
|
|
||||||
}
|
|
||||||
if (m_use_exceptions)
|
|
||||||
throw parser_error(sstream() << "invalid import, unknown module '" << f << "'", pos());
|
|
||||||
}
|
}
|
||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,8 +82,8 @@ void init_token_table(token_table & t) {
|
||||||
{"theorem", "axiom", "variable", "protected", "private", "opaque", "definition", "example", "coercion",
|
{"theorem", "axiom", "variable", "protected", "private", "opaque", "definition", "example", "coercion",
|
||||||
"variables", "parameter", "parameters", "constant", "constants", "[persistent]", "[visible]", "[instance]",
|
"variables", "parameter", "parameters", "constant", "constants", "[persistent]", "[visible]", "[instance]",
|
||||||
"[off]", "[on]", "[none]", "[class]", "[coercion]", "[reducible]", "[parsing-only]", "reducible", "irreducible",
|
"[off]", "[on]", "[none]", "[class]", "[coercion]", "[reducible]", "[parsing-only]", "reducible", "irreducible",
|
||||||
"evaluate", "check", "eval", "[whnf]", "[strict]", "[local]", "[priority", "print", "end", "namespace", "section", "import",
|
"evaluate", "check", "eval", "[whnf]", "[strict]", "[local]", "[priority", "print", "end", "namespace", "section", "prelude",
|
||||||
"inductive", "record", "structure", "module", "universe", "universes",
|
"import", "inductive", "record", "structure", "module", "universe", "universes",
|
||||||
"precedence", "reserve", "infixl", "infixr", "infix", "postfix", "prefix", "notation", "context",
|
"precedence", "reserve", "infixl", "infixr", "infix", "postfix", "prefix", "notation", "context",
|
||||||
"exit", "set_option", "open", "export", "calc_subst", "calc_refl", "calc_trans", "calc_symm", "tactic_hint",
|
"exit", "set_option", "open", "export", "calc_subst", "calc_refl", "calc_trans", "calc_symm", "tactic_hint",
|
||||||
"add_begin_end_tactic", "set_begin_end_tactic", "instance", "class", "find_decl",
|
"add_begin_end_tactic", "set_begin_end_tactic", "instance", "class", "find_decl",
|
||||||
|
|
|
@ -27,6 +27,7 @@ static name * g_max = nullptr;
|
||||||
static name * g_imax = nullptr;
|
static name * g_imax = nullptr;
|
||||||
static name * g_cup = nullptr;
|
static name * g_cup = nullptr;
|
||||||
static name * g_import = nullptr;
|
static name * g_import = nullptr;
|
||||||
|
static name * g_prelude = nullptr;
|
||||||
static name * g_show = nullptr;
|
static name * g_show = nullptr;
|
||||||
static name * g_have = nullptr;
|
static name * g_have = nullptr;
|
||||||
static name * g_assume = nullptr;
|
static name * g_assume = nullptr;
|
||||||
|
@ -118,6 +119,7 @@ void initialize_tokens() {
|
||||||
g_imax = new name("imax");
|
g_imax = new name("imax");
|
||||||
g_cup = new name("\u2294");
|
g_cup = new name("\u2294");
|
||||||
g_import = new name("import");
|
g_import = new name("import");
|
||||||
|
g_prelude = new name("prelude");
|
||||||
g_show = new name("show");
|
g_show = new name("show");
|
||||||
g_have = new name("have");
|
g_have = new name("have");
|
||||||
g_assume = new name("assume");
|
g_assume = new name("assume");
|
||||||
|
@ -260,6 +262,7 @@ void finalize_tokens() {
|
||||||
delete g_have;
|
delete g_have;
|
||||||
delete g_show;
|
delete g_show;
|
||||||
delete g_import;
|
delete g_import;
|
||||||
|
delete g_prelude;
|
||||||
delete g_cup;
|
delete g_cup;
|
||||||
delete g_imax;
|
delete g_imax;
|
||||||
delete g_max;
|
delete g_max;
|
||||||
|
@ -301,6 +304,7 @@ name const & get_max_tk() { return *g_max; }
|
||||||
name const & get_imax_tk() { return *g_imax; }
|
name const & get_imax_tk() { return *g_imax; }
|
||||||
name const & get_cup_tk() { return *g_cup; }
|
name const & get_cup_tk() { return *g_cup; }
|
||||||
name const & get_import_tk() { return *g_import; }
|
name const & get_import_tk() { return *g_import; }
|
||||||
|
name const & get_prelude_tk() { return *g_prelude; }
|
||||||
name const & get_show_tk() { return *g_show; }
|
name const & get_show_tk() { return *g_show; }
|
||||||
name const & get_have_tk() { return *g_have; }
|
name const & get_have_tk() { return *g_have; }
|
||||||
name const & get_assume_tk() { return *g_assume; }
|
name const & get_assume_tk() { return *g_assume; }
|
||||||
|
|
|
@ -29,6 +29,7 @@ name const & get_max_tk();
|
||||||
name const & get_imax_tk();
|
name const & get_imax_tk();
|
||||||
name const & get_cup_tk();
|
name const & get_cup_tk();
|
||||||
name const & get_import_tk();
|
name const & get_import_tk();
|
||||||
|
name const & get_prelude_tk();
|
||||||
name const & get_show_tk();
|
name const & get_show_tk();
|
||||||
name const & get_have_tk();
|
name const & get_have_tk();
|
||||||
name const & get_assume_tk();
|
name const & get_assume_tk();
|
||||||
|
|
Loading…
Reference in a new issue