23#include "../ast/ast.h"
24#include "../c_libs/memory/memory.h"
25#include "../helper/help.h"
26#include "../lexer/lexer.h"
32#define CURRENT_TOKEN_LENGTH(parser) ((int)p_current(parser).length)
38#define CURRENT_TOKEN_VALUE(parser) (p_current(parser).value)
80static const LiteralType PRIMARY_LITERAL_TYPE_MAP[] = {
90static const BinaryOp TOKEN_TO_BINOP_MAP[] = {
106static const UnaryOp TOKEN_TO_UNOP_MAP[] = {
138 const char *msg,
int line,
int col,
int tk_length);
215 bool takes_ownership);
217 bool is_static,
bool returns_ownership,
bool takes_ownership);
LiteralType
Definition ast.h:85
@ LITERAL_IDENT
Definition ast.h:86
@ LITERAL_INT
Definition ast.h:87
@ LITERAL_BOOL
Definition ast.h:92
@ LITERAL_STRING
Definition ast.h:90
@ LITERAL_CHAR
Definition ast.h:91
@ LITERAL_FLOAT
Definition ast.h:88
BinaryOp
Definition ast.h:97
@ BINOP_AND
Definition ast.h:110
@ BINOP_GE
Definition ast.h:109
@ BINOP_BIT_XOR
Definition ast.h:114
@ BINOP_LT
Definition ast.h:106
@ BINOP_LE
Definition ast.h:107
@ BINOP_MOD
Definition ast.h:102
@ BINOP_BIT_OR
Definition ast.h:113
@ BINOP_SUB
Definition ast.h:99
@ BINOP_DIV
Definition ast.h:101
@ BINOP_GT
Definition ast.h:108
@ BINOP_RANGE
Definition ast.h:117
@ BINOP_EQ
Definition ast.h:104
@ BINOP_SHR
Definition ast.h:116
@ BINOP_BIT_AND
Definition ast.h:112
@ BINOP_MUL
Definition ast.h:100
@ BINOP_SHL
Definition ast.h:115
@ BINOP_OR
Definition ast.h:111
@ BINOP_NE
Definition ast.h:105
@ BINOP_ADD
Definition ast.h:98
UnaryOp
Definition ast.h:121
@ UNOP_POS
Definition ast.h:124
@ UNOP_PRE_INC
Definition ast.h:126
@ UNOP_NEG
Definition ast.h:123
@ UNOP_NOT
Definition ast.h:122
@ UNOP_BIT_NOT
Definition ast.h:125
@ UNOP_PRE_DEC
Definition ast.h:127
LumaTokenType
Enumeration of all possible token types recognized by the lexer.
Definition lexer.h:19
@ TOK_SHIFT_RIGHT
Definition lexer.h:122
@ TOK_LE
Definition lexer.h:105
@ TOK_IDENTIFIER
Definition lexer.h:22
@ TOK_SLASH
Definition lexer.h:102
@ TOK_GT
Definition lexer.h:104
@ TOK_PLUS
Definition lexer.h:99
@ TOK_EQEQ
Definition lexer.h:107
@ TOK_MINUSMINUS
Definition lexer.h:120
@ TOK_SHIFT_LEFT
Definition lexer.h:121
@ TOK_GE
Definition lexer.h:106
@ TOK_STRING
Definition lexer.h:26
@ TOK_FALSE
Definition lexer.h:52
@ TOK_OR
Definition lexer.h:114
@ TOK_TRUE
Definition lexer.h:51
@ TOK_PIPE
Definition lexer.h:110
@ TOK_LT
Definition lexer.h:103
@ TOK_BANG
Definition lexer.h:117
@ TOK_CHAR_LITERAL
Definition lexer.h:27
@ TOK_TILDE
Definition lexer.h:112
@ TOK_RANGE
Definition lexer.h:123
@ TOK_NUM_FLOAT
Definition lexer.h:25
@ TOK_MODL
Definition lexer.h:127
@ TOK_NEQ
Definition lexer.h:108
@ TOK_CARET
Definition lexer.h:111
@ TOK_NUMBER
Definition lexer.h:24
@ TOK_MINUS
Definition lexer.h:100
@ TOK_STAR
Definition lexer.h:101
@ TOK_AND
Definition lexer.h:113
@ TOK_PLUSPLUS
Definition lexer.h:119
@ TOK_AMP
Definition lexer.h:109
Stmt * struct_stmt(Parser *parser, const char *name, bool is_public)
Parses a structure declaration statement.
Definition stmt.c:528
Stmt * loop_stmt(Parser *parser)
Parses loop statements (infinite, while, or for loops)
Definition stmt.c:1148
Token p_peek(Parser *psr, size_t offset)
Peeks at a token at the specified offset from current position.
Definition parser_utils.c:72
Token p_consume(Parser *psr, LumaTokenType type, const char *error_msg)
Consumes a token of the expected type or reports an error.
Definition parser_utils.c:157
Type * parse_type(Parser *parser)
Parses a type annotation.
Definition parser.c:673
Expr * grouping(Parser *parser)
Definition expr.c:109
Stmt * switch_stmt(Parser *parser)
Definition stmt.c:1316
Stmt * expr_stmt(Parser *parser)
Parses an expression statement.
Definition stmt.c:50
Expr * parse_expr(Parser *parser, BindingPower bp)
Parses an expression using the Pratt parsing algorithm.
Definition parser.c:431
Stmt * impl_stmt(Parser *parser)
Definition stmt.c:1458
Expr * deref_expr(Parser *parser)
Definition expr.c:573
Stmt * for_loop_stmt(Parser *parser, int line, int col)
Parses a for loop statement.
Definition stmt.c:1049
Stmt * fn_stmt(Parser *parser, const char *name, bool is_public, bool is_static, bool returns_ownership, bool takes_ownership)
Parses a function declaration statement.
Definition stmt.c:313
Stmt * block_stmt(Parser *parser)
Parses a block statement.
Definition stmt.c:796
Expr * nud(Parser *parser)
Null Denotation - handles prefix expressions and primary expressions.
Definition parser.c:297
Type * pointer(Parser *parser)
Definition type.c:7
Expr * primary(Parser *parser)
Definition expr.c:38
Stmt * defer_stmt(Parser *parser)
Definition stmt.c:1301
Type * tnud(Parser *parser)
Definition type.c:188
Expr * unary(Parser *parser)
Definition expr.c:87
Type * array_type(Parser *parser)
Definition type.c:22
Stmt * if_stmt(Parser *parser)
Parses if/elif/else conditional statements.
Definition stmt.c:862
Stmt * print_stmt(Parser *parser, bool ln)
Parses print/println statements.
Definition stmt.c:1220
Type * function_type(Parser *parser, Type *return_type)
Definition type.c:129
Stmt * return_stmt(Parser *parser)
Parses a return statement.
Definition stmt.c:764
Expr * assign_expr(Parser *parser, Expr *left, BindingPower bp)
Definition expr.c:178
Expr * prefix_expr(Parser *parser, Expr *left, BindingPower bp)
Definition expr.c:202
BindingPower tget_bp(Parser *parser, LumaTokenType kind)
Stmt * infinite_loop_stmt(Parser *parser, int line, int col)
Parses an infinite loop statement.
Definition stmt.c:987
Stmt * var_stmt(Parser *parser, bool is_public)
Parses a variable declaration statement.
Definition stmt.c:717
Expr * call_expr(Parser *parser, Expr *left, BindingPower bp)
Definition expr.c:138
Expr * free_expr(Parser *parser)
Definition expr.c:609
Expr * system_expr(Parser *parser)
Definition expr.c:678
Token p_current(Parser *psr)
Gets the current token without advancing the parser position.
Definition parser_utils.c:96
char * get_name(Parser *psr)
Extracts and duplicates the current token's string value.
Definition parser_utils.c:203
Stmt * link_stmt(Parser *parser)
Definition stmt.c:186
Stmt * os_stmt(Parser *parser)
Definition stmt.c:84
Expr * cast_expr(Parser *parser)
Definition expr.c:624
void parser_error(Parser *psr, const char *error_type, const char *file, const char *msg, int line, int col, int tk_length)
Report a parser error with detailed location info.
Definition parser.c:48
Stmt * use_stmt(Parser *parser)
Definition stmt.c:62
Expr * alloc_expr(Parser *parser)
Definition expr.c:594
char * collect_doc_comments(Parser *parser)
Collects consecutive documentation comments before a declaration.
Definition parser_utils.c:300
Stmt * parse_stmt(Parser *parser)
Parses a single statement.
Definition parser.c:464
Expr * binary(Parser *parser, Expr *left, BindingPower bp)
Definition expr.c:119
Token p_advance(Parser *psr)
Advances to the next token and returns the current token.
Definition parser_utils.c:123
Expr * input_expr(Parser *parser)
Definition expr.c:652
Stmt * break_continue_stmt(Parser *parser, bool is_continue)
Parses break and continue statements.
Definition stmt.c:1288
Stmt * parse(GrowableArray *tks, ArenaAllocator *arena, BuildConfig *config)
Parses a full program from tokens into an AST of statements.
Definition parser.c:94
void consume_doc_comments(Parser *parser)
Definition parser_utils.c:365
Expr * sizeof_expr(Parser *parser)
Definition expr.c:744
Type * tled(Parser *parser, Type *left, BindingPower bp)
Definition type.c:233
bool init_parser_arrays(Parser *parser, GrowableArray *stmts, GrowableArray *modules)
Definition parser_utils.c:212
Expr * addr_expr(Parser *parser)
Definition expr.c:583
bool p_has_tokens(Parser *psr)
Checks if there are more tokens available for parsing.
Definition parser_utils.c:47
Expr * led(Parser *parser, Expr *left, BindingPower bp)
Pratt parser function for left denotation (infix/postfix parsing).
Definition parser.c:370
Expr * array_expr(Parser *parser)
Definition expr.c:262
const char * parse_module_declaration(Parser *parser, char **out_module_doc)
Definition parser_utils.c:223
Stmt * enum_stmt(Parser *parser, const char *name, bool is_public)
Parses an enumeration declaration statement.
Definition stmt.c:448
Expr * named_struct_expr(Parser *parser, Expr *left, BindingPower bp)
Definition expr.c:424
Expr * struct_expr(Parser *parser)
Definition expr.c:306
Expr * index_expr(Parser *parser)
Expr * syscall_expr(Parser *parser)
Definition expr.c:692
BindingPower get_bp(LumaTokenType kind)
Gets the binding power (precedence) for a given token type.
Definition parser.c:207
Stmt * const_stmt(Parser *parser, bool is_public, bool returns_ownership, bool takes_ownership)
Parses a constant declaration statement.
Definition stmt.c:232
BindingPower
Binding power (precedence) levels for expression parsing.
Definition parser.h:53
@ BP_SUM
Definition parser.h:67
@ BP_RANGE
Definition parser.h:65
@ BP_TERNARY
Definition parser.h:57
@ BP_UNARY
Definition parser.h:70
@ BP_PRODUCT
Definition parser.h:68
@ BP_LOGICAL_AND
Definition parser.h:59
@ BP_POSTFIX
Definition parser.h:71
@ BP_EXPONENT
Definition parser.h:69
@ BP_LOGICAL_OR
Definition parser.h:58
@ BP_LOWEST
Definition parser.h:55
@ BP_CALL
Definition parser.h:72
@ BP_BITWISE_OR
Definition parser.h:60
@ BP_PRIMARY
Definition parser.h:73
@ BP_BITWISE_XOR
Definition parser.h:61
@ BP_SHIFT
Definition parser.h:66
@ BP_ASSIGN
Definition parser.h:56
@ BP_BITWISE_AND
Definition parser.h:62
@ BP_NONE
Definition parser.h:54
@ BP_EQUALITY
Definition parser.h:63
@ BP_RELATIONAL
Definition parser.h:64
Arena allocator structure.
Definition memory.h:101
Configuration structure to hold build options parsed from CLI.
Definition help.h:48
Growable array backed by an arena allocator.
Definition memory.h:112
Parser state holding token stream and current position.
Definition parser.h:116
size_t capacity
Definition parser.h:121
ArenaAllocator * arena
Definition parser.h:118
size_t tk_count
Definition parser.h:120
char * pending_doc_comment
Definition parser.h:123
size_t pos
Definition parser.h:122
const char * file_path
Definition parser.h:117
Token * tks
Definition parser.h:119
Represents a single token extracted by the lexer.
Definition lexer.h:151