14#define THORIN_KEY(m) \
15 m(K_module, ".module") \
16 m(K_import, ".import") \
17 m(K_plugin, ".plugin") \
24 m(K_extern, ".extern") \
25 m(K_Sigma, ".Sigma" ) \
51#define CODE(t, str) + size_t(1)
55#define THORIN_TOK(m) \
56 m(EoF, "<end of file>") \
58 m(L_s, "<signed integer literal>") \
59 m(L_u, "<integer literal>" ) \
60 m(L_i, "<index literal>" ) \
61 m(L_f, "<floating-point literal>") \
62 m(L_c, "<char literal>" ) \
64 m(M_id, "<identifier>") \
65 m(M_anx, "<annex name>") \
66 m(M_str, "<string>" ) \
89 m(T_colon_colon,"::") \
98#define THORIN_SUBST(m) \
102 m(".insert", K_ins ) \
104#define THORIN_PREC(m) \
108 m(Lam, Arrow, Arrow ) \
111 m(App, App, Extract ) \
112 m(Extract, Extract, Lit ) \
120#define CODE(l, p, r) p,
125 static constexpr std::array<Prec, 2>
prec(
Prec p) {
127#define CODE(l, p, r) \
128 case Prec::p: return {Prec::l, Prec::r};
129 default: fe::unreachable();
141#define CODE(t, str) t,
167 , u_(
std::bit_cast<
u64>(s)) {}
171 , u_(
std::bit_cast<
u64>(f)) {}
180 assert(
tag == Tag::M_id ||
tag == Tag::M_anx ||
tag == Tag::M_str);
186 Loc
loc()
const {
return loc_; }
187 explicit operator bool()
const {
return tag_ != Tag::Nil; }
190 char8_t lit_c()
const { assert(
isa(Tag::L_c));
return c_; }
192 Sym
sym()
const { assert(
isa(Tag::M_anx) ||
isa(Tag::M_id) ||
isa(Tag::M_str));
return sym_; }
Tok(Loc loc, const Lit *i)
friend std::ostream & operator<<(std::ostream &, Tok)
static std::string_view tag2str(Tok::Tag)
static constexpr Tok::Tag delim_l2r(Tag tag)
const Lit * lit_i() const
Tok(Loc loc, Tag tag, Sym sym)
static constexpr std::array< Prec, 2 > prec(Prec p)