30class Parser :
public fe::Parser<Tok, Tok::Tag, Look_Ahead, Parser> {
31 using Super = fe::Parser<Tok, Tok::Tag, Look_Ahead, Parser>;
39 const File*
import(std::string_view sv,
Tok::Tag tag = Tok::Tag::K_import) {
40 return import({Loc(),
driver().sym(sv)},
false, tag,
nullptr);
45 import(Dbg,
bool is_path,
Tok::Tag tag = Tok::Tag::K_import, std::ostream* md =
nullptr,
bool record =
true);
46 const File*
import(
const fe::Src&, std::ostream* md =
nullptr, Loc = {});
50 const File*
import(std::istream& is, fs::path path, Loc = {}, std::ostream* md =
nullptr);
51 const File*
import_main(std::string_view input, fe::View<std::string> plugins, std::ostream* md =
nullptr);
54 template<
class T,
class... Args>
55 auto ptr(Args&&... args) {
56 return ast_.
ptr<
const T>(std::forward<Args>(args)...);
60 Loc missing()
const {
return curr_.anew_end(); }
61 Lexer& lexer() {
return *lexer_; }
66 Dbg parse_id(fe::Cite ctxt = {});
69 Ptr<Expr> parse_type_ascr(fe::Cite ctxt = {});
72 fs::path curr_dir()
const {
return curr_.src ? curr_.src->path().parent_path() : fs::path(); }
75 Ptr<Expr> path_expr(Dbg dbg) {
return ptr<PathExpr>(path(dbg)); }
78 void parse_list(fe::Cite ctxt,
Tok::Tag delim_l, F f,
Tok::Tag sep = Tok::Tag::T_comma) {
79 expect(delim_l, ctxt);
81 auto _ = this->anchor(delim_r);
84 if (ahead().isa(delim_r))
break;
87 }
while (accept(sep));
88 expect(delim_r,
"closing delimiter of a {}", ctxt);
100 template<
class... Args>
101 Ptr<Expr> parse_expr(fe::cite_string<Args...> fmt, Args&&... args) {
102 return parse_expr(fe::format_cite(fmt, std::forward<Args>(args)...));
106 template<
class... Args>
107 Ptr<Expr> parse_expr(
Prec prec, fe::cite_string<Args...> fmt, Args&&... args) {
108 return parse_expr(fe::format_cite(fmt, std::forward<Args>(args)...), prec);
110 Ptr<Expr> parse_primary_expr(fe::Cite ctxt);
142 bool implicit =
false;
145 Ptr<Ptrn> parse_ptrn(PtrnStyle, fe::Cite ctxt,
Prec = Prec::Bot);
148 template<
class... Args>
149 Ptr<Ptrn> parse_ptrn(PtrnStyle style,
Prec prec, fe::cite_string<Args...> fmt, Args&&... args) {
150 return parse_ptrn(style, fe::format_cite(fmt, std::forward<Args>(args)...), prec);
152 Ptr<Ptrn> parse_ptrn_(PtrnStyle, fe::Cite ctxt,
Prec = Prec::Bot);
156 Ptr<IdPtrn> anon_ptrn(Loc loc,
Ptr<Expr> type) {
return ptr<IdPtrn>(loc, Dbg(loc.anew_begin()), type); }
169 Mods parse_modifiers();
175 void check_no_extern(
const Mods&, fe::Cite entity);
181 std::tuple<Ptr<Expr>, Dbg, Tok, Tok> parse_axm_tail();
193 Lexer* lexer_ =
nullptr;