22 void error(
const std::string &msg,
Location loc = Location::NonPrintable()) {
23 if (reporter.has_value()) {
24 reporter->get().immediate_error(msg, loc);
28 void diag(
const std::string &msg,
Location loc = Location::NonPrintable()) {
29 if (reporter.has_value()) {
30 reporter->get().immediate_diag(msg, loc);
35 template <
class T>
using p = std::pair<std::unique_ptr<T>, ParserError>;
36 template <
class T>
using u = std::unique_ptr<T>;
37 std::optional<std::reference_wrapper<Reporter>> reporter;
38 std::shared_ptr<TokenStream> tokStream;
39 [[nodiscard]]
auto ParseProgram() -> u<ProgramAST>;
42 [[nodiscard]]
auto ParseDefinition() -> p<DefinitionAST>;
43 [[nodiscard]]
auto ParsePrototype() -> p<PrototypeAST>;
44 [[nodiscard]]
auto ParseFuncDef() -> p<DefinitionAST>;
46 [[nodiscard]]
auto ParseRecordDef() -> p<DefinitionAST>;
49 [[nodiscard]]
auto ParseTypedVar() -> p<TypedVarAST>;
52 [[nodiscard]]
auto ParseExpr() -> p<ExprAST>;
53 [[nodiscard]]
auto ParsePrimaryExpr() -> p<ExprAST>;
54 [[nodiscard]]
auto ParseBinaryExpr(
int prededence, u<ExprAST> LHS)
56 [[nodiscard]]
auto ParseBoolExpr() -> p<ExprAST>;
58 [[nodiscard]]
auto ParseCallExpr() -> p<ExprAST>;
59 [[nodiscard]]
auto ParseReturnExpr() -> p<ExprAST>;
60 [[nodiscard]]
auto ParseArguments()
61 -> std::pair<std::vector<u<ExprAST>>, ParserError>;
62 [[nodiscard]]
auto ParseParenExpr() -> p<ExprAST>;
63 [[nodiscard]]
auto ParseIfExpr() -> p<ExprAST>;
64 [[nodiscard]]
auto ParseNumberExpr() -> p<ExprAST>;
65 [[nodiscard]]
auto ParseStringExpr() -> p<ExprAST>;
66 [[nodiscard]]
auto ParseVariableExpr() -> p<ExprAST>;
69 [[nodiscard]]
auto ParseBlock() -> p<BlockAST>;
72 [[nodiscard]]
auto ParseParams()
73 -> std::pair<std::vector<u<TypedVarAST>>, ParserError>;
76 [[nodiscard]]
auto expect(TokenType tokType,
bool exhausts =
false,
77 TokenType until = TokenType::TokEOF,
78 const std::string &message =
"")
79 -> std::shared_ptr<Token>;
82 std::optional<std::reference_wrapper<Reporter>> reporter = std::nullopt)
83 : reporter(reporter) {}
85 std::shared_ptr<TokenStream> tokStream,
86 std::optional<std::reference_wrapper<Reporter>> reporter = std::nullopt)
87 : reporter(reporter), tokStream(tokStream) {}
89 [[nodiscard]]
auto Parse() -> u<ProgramAST>;