lean4-htt/src/frontends/lean/token_table.cpp
Leonardo de Moura bf9f7560f7 feat(frontends/lean): (Type u) can't be a proposition
(Type u)  is the old (Type (u+1))
(PType u) is the old (Type u)
Type*     is the old (Type (_+1))
PType*    is the old Type*

The stdlib can be compiled, but we still have > 70 broken tests

See discussion at #1341
2017-01-30 11:54:00 -08:00

169 lines
7.3 KiB
C++

/*
Copyright (c) 2014 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Leonardo de Moura
*/
#include <limits>
#include <utility>
#include "util/pair.h"
#include "library/attribute_manager.h"
#include "frontends/lean/token_table.h"
namespace lean {
static unsigned g_arrow_prec = 25;
static unsigned g_max_prec = 1024;
static unsigned g_Max_prec = 1024*1024;
static unsigned g_plus_prec = 65;
unsigned get_max_prec() { return g_max_prec; }
unsigned get_Max_prec() { return g_Max_prec; }
unsigned get_arrow_prec() { return g_arrow_prec; }
static token_table update(token_table const & s, char const * token, char const * val,
optional<unsigned> expr_prec, optional<unsigned> tac_prec) {
lean_assert(expr_prec || tac_prec);
token_info info(token, val, 0, 0);
if (token_info const * old_info = find(s, token)) {
info = info.update_expr_precedence(old_info->expr_precedence());
info = info.update_tactic_precedence(old_info->tactic_precedence());
}
if (expr_prec)
info = info.update_expr_precedence(*expr_prec);
if (tac_prec)
info = info.update_tactic_precedence(*tac_prec);
return insert(s, token, info);
}
token_table add_command_token(token_table const & s, char const * token) {
return insert(s, token, token_info(token));
}
token_table add_command_token(token_table const & s, char const * token, char const * val) {
return insert(s, token, token_info(token, val));
}
token_table add_token(token_table const & s, char const * token, unsigned prec) {
return update(s, token, token, optional<unsigned>(prec), optional<unsigned>());
}
token_table add_token(token_table const & s, char const * token, char const * val, unsigned prec) {
return update(s, token, val, optional<unsigned>(prec), optional<unsigned>());
}
token_table add_tactic_token(token_table const & s, char const * token, unsigned prec) {
return update(s, token, token, optional<unsigned>(), optional<unsigned>(prec));
}
token_table add_tactic_token(token_table const & s, char const * token, char const * val, unsigned prec) {
return update(s, token, val, optional<unsigned>(), optional<unsigned>(prec));
}
token_table const * find(token_table const & s, char c) {
return s.find(c);
}
token_info const * value_of(token_table const & s) {
return s.value();
}
optional<unsigned> get_expr_precedence(token_table const & s, char const * token) {
auto it = find(s, token);
return it ? optional<unsigned>(it->expr_precedence()) : optional<unsigned>();
}
optional<unsigned> get_tactic_precedence(token_table const & s, char const * token) {
auto it = find(s, token);
return it ? optional<unsigned>(it->tactic_precedence()) : optional<unsigned>();
}
bool is_token(token_table const & s, char const * token) {
return static_cast<bool>(find(s, token));
}
void for_each(token_table const & s, std::function<void(char const *, token_info const &)> const & fn) {
s.for_each([&](unsigned num, char const * keys, token_info const & info) {
buffer<char> str;
str.append(num, keys);
str.push_back(0);
fn(str.data(), info);
});
}
void init_token_table(token_table & t) {
pair<char const *, unsigned> builtin[] =
{{"fun", 0}, {"Pi", 0}, {"let", 0}, {"in", 0}, {"at", 0},
{"have", 0}, {"suppose", 0}, {"show", 0}, {"suffices", 0}, {"obtain", 0},
{"do", 0}, {"if", 0}, {"then", 0}, {"else", 0}, {"by", 0}, {"hiding", 0}, {"replacing", 0}, {"renaming", 0},
{"from", 0}, {"(", g_max_prec}, {"`(", g_max_prec}, {"`[", g_max_prec}, {"`", g_max_prec},
{"%%", g_max_prec}, {"()", g_max_prec}, {")", 0}, {"'", 0},
{"{", g_max_prec}, {"}", 0}, {"_", g_max_prec},
{"[", g_max_prec}, {"]", 0}, {"", g_max_prec}, {"", 0}, {".{", 0},
{"Type", g_max_prec}, {"Type*", g_max_prec}, {"PType", g_max_prec}, {"PType*", g_max_prec},
{"(:", g_max_prec}, {":)", 0},
{"", 0}, {"", g_max_prec}, {"", 0}, {"^", 0}, {"", 0}, {"", 0},
{"//", 0}, {"|", 0}, {"!", g_max_prec}, {"?", 0}, {"with", 0}, {"without", 0}, {"...", 0}, {",", 0},
{".", 0}, {":", 0}, {"::", 0}, {"calc", 0}, {"as", 0}, {":=", 0}, {"--", 0}, {"#", g_max_prec},
{"(*", 0}, {"/-", 0}, {"/--", 0}, {"/-!", 0}, {"begin", g_max_prec}, {"using", 0},
{"@@", g_max_prec}, {"@", g_max_prec},
{"sorry", g_max_prec}, {"+", g_plus_prec}, {"->", g_arrow_prec}, {"<-", 0},
{"?(", g_max_prec}, {"", g_max_prec}, {"", 0}, {"match", 0},
{"~>", g_max_prec+1},
{".1", g_max_prec+1}, {".2", g_max_prec+1}, {".3", g_max_prec+1}, {".4", g_max_prec+1}, {".5", g_max_prec+1}, {".6", g_max_prec+1},
{".7", g_max_prec+1}, {".8", g_max_prec+1}, {".9", g_max_prec+1},
{"renaming", 0}, {"extends", 0}, {nullptr, 0}};
char const * commands[] =
{"theorem", "axiom", "axioms", "variable", "protected", "private",
"definition", "meta", "mutual", "example", "coercion", "noncomputable",
"variables", "parameter", "parameters", "constant", "constants",
"evaluate", "check", "eval", "vm_eval", "using_well_founded", "[whnf]",
"print", "end", "namespace", "section", "prelude", "help",
"import", "inductive", "structure", "class", "universe", "universes", "local",
"precedence", "reserve", "infixl", "infixr", "infix", "postfix", "prefix", "notation",
"exit", "set_option", "open", "export", "override", "@[",
"attribute", "persistent", "instance", "include", "omit", "init_quotient",
"init_hits", "declare_trace", "run_command", "add_key_equivalence",
"#compile", "#unify", nullptr};
pair<char const *, char const *> aliases[] =
{{"λ", "fun"}, {"assume", "fun"}, {"take", "fun"}, {"forall", "Pi"},
{"", "Pi"}, {"Π", "Pi"}, {"(|", ""}, {"|)", ""}, {nullptr, nullptr}};
pair<char const *, char const *> cmd_aliases[] =
{{"lemma", "theorem"}, {"def", "definition"}, {"proposition", "theorem"}, {"premise", "variable"}, {"premises", "variables"},
{"corollary", "theorem"}, {"hypothesis", "parameter"}, {"conjecture", "parameter"},
{"record", "structure"}, {nullptr, nullptr}};
auto it = builtin;
while (it->first) {
t = add_token(t, it->first, it->second);
it++;
}
auto it2 = commands;
while (*it2) {
t = add_command_token(t, *it2);
++it2;
}
auto it3 = aliases;
while (it3->first) {
t = add_token(t, it3->first, it3->second, 0);
it3++;
}
t = add_token(t, "", "->", get_arrow_prec());
t = add_token(t, "", "~>", get_max_prec()+1);
t = add_token(t, "^.", "~>", get_max_prec()+1);
t = add_token(t, "", "<-", 0);
auto it4 = cmd_aliases;
while (it4->first) {
t = add_command_token(t, it4->first, it4->second);
++it4;
}
}
static token_table * g_default_token_table = nullptr;
token_table mk_default_token_table() {
return *g_default_token_table;
}
void initialize_token_table() {
g_default_token_table = new token_table();
init_token_table(*g_default_token_table);
}
void finalize_token_table() {
delete g_default_token_table;
}
token_table mk_token_table() { return token_table(); }
}