/
vit1251
/
cmm
Обзор
Документация
Войти
/
vit1251
/
cmm
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/parser.h
66 строк
2 KB
Vitold S
Commits added a large set of example and demo programs,
26 июл 2026, 14:31
26 июл 2026, 14:31
8e0776e
Код
Авторство
О чём код?
#pragma once #include "ast.h" #include "lexer.h" #include <string> #include <vector> #include <functional> #include <unordered_set> using ImportCallback = std::function<void(const std::string& path, const SourceLoc& loc, Program& prog)>; class Parser { public: Parser(Lexer& lexer, ImportCallback on_import); Program parse_program(); const ConstantDecl* find_const(const std::string& name) const; private: // Top-level void parse_use(Program& prog); void parse_struct_decl(Program& prog); void parse_impl_block(Program& prog); void parse_fn_decl(Program& prog, bool is_extern, std::string call_conv = ""); // Statements std::unique_ptr<Stmt> parse_stmt(); std::unique_ptr<Stmt> parse_let_stmt(); std::unique_ptr<Stmt> parse_if_stmt(); std::unique_ptr<Stmt> parse_for_stmt(); std::unique_ptr<Block> parse_block(); // Expressions (precedence climbing) std::unique_ptr<Expr> parse_expr(); std::unique_ptr<Expr> parse_logical_or(); std::unique_ptr<Expr> parse_logical_and(); std::unique_ptr<Expr> parse_bitwise_or(); std::unique_ptr<Expr> parse_comparison(); std::unique_ptr<Expr> parse_as_cast(); std::unique_ptr<Expr> parse_range(); std::unique_ptr<Expr> parse_prefix(); std::unique_ptr<Expr> parse_subscript(std::unique_ptr<Expr> lhs); std::unique_ptr<Expr> parse_postfix(std::unique_ptr<Expr> lhs); std::unique_ptr<Expr> parse_primary(); std::vector<std::unique_ptr<Expr>> parse_args(); void parse_const_decl(Program& prog); void parse_extern_block(Program& prog, const std::string& link_lib, const std::string& call_conv); // Helpers std::string parse_type_name(); bool consume(TokenType type); bool check(TokenType type) const; Token peek(size_t n = 1); Token expect(TokenType type, const std::string& msg = ""); std::string error_prefix() const; void error(const std::string& msg); Lexer& lexer_; ImportCallback on_import_; bool has_error_ = false; std::string current_link_; bool current_no_mangle_ = false; Program* prog_ = nullptr; };