#ifndef PARSER_H #define PARSER_H #include // for size_t // Forward declare typedef struct ExprNode ExprNode; // Node type: atom or list struct ExprNode { char *token; // For atoms: the value ("123", "$0", "add") // For lists: the operator (first token) ExprNode **children; // Array of child nodes (NULL if atom) size_t child_count; // 0 if atom int line; // Source line number (for errors) }; ExprNode *expr_parse(const char *source, size_t source_len); ExprNode* expand_macros(ExprNode* node); ExprNode* expand_lambda(ExprNode* lambda_node); void expr_free(ExprNode *node); void expr_print(ExprNode *node, int indent); void *safe_malloc(size_t size); #endif