\r
#define da_append c_da_append\r
#define da_free c_da_free\r
+#define da_shift c_da_shift\r
#define DYNAMIC_ARRAY_INITIAL_CAPACITY c_DYNAMIC_ARRAY_INITIAL_CAPACITY\r
// #define c_DYNAMIC_ARRAY_INITIAL_CAPACITY\r
\r
\r
#define c_ARRAY_LEN(arr) (sizeof(arr) / sizeof(arr[0]))\r
\r
-#define c_pop_front(xs, xsz) (assert(xsz > 0 && "Array is empty"), xsz--, *xs++)\r
-#define c_shift_args c_pop_front\r
+#define c_shift(xs, xsz) (assert(xsz > 0 && "Array is empty"), xsz--, *xs++)\r
+#define c_shift_args c_shift\r
\r
//\r
// Struct pre-decls\r
(da).items[(da).count++] = elm;\\r
} while (0)\r
\r
-#define c_da_pop_front(da) (c_ASSERT(da.count > 0, "Array is empty"), da.count--, *da.items++)\r
-#define c_da_free(da) C_FREE(da.items)\r
+// NOTE: We cant do c_ASSERT() here because it aint one expression...\r
+#define c_da_shift(da) (assert((da).count > 0 && "Array is empty"), (da).count--, *(da).items++)\r
+#define c_da_free(da) C_FREE((da).items)\r
\r
//\r
// OS\r
#include <string.h>\r
#include <errno.h>\r
#include <stdlib.h>\r
+#include <assert.h>\r
\r
// My things implementation:\r
\r
} Lexer;
typedef struct {
- Tokens tokens;
+ Tokens *tokens_ptr;
} Parser;
const char *token_type_as_str(Token_type t) {
free(l->src.data);
}
-Parser make_parser(Tokens tokens) {
+Parser make_parser(Tokens *tokens_ptr) {
return (Parser) {
- .tokens = tokens,
+ .tokens_ptr = tokens_ptr,
};
}
void free_parser(Parser *p) {
- da_free(p->tokens);
+ da_free(*p->tokens_ptr);
}
typedef struct Ast_Node Ast_Node;
};
void parse(Parser *p) {
- info("tokens.count: %zu", p->tokens.count);
- Token t = da_shift(p->tokens);
+ info("tokens.count: %zu", p->tokens_ptr->count);
+ Token t = da_shift(*p->tokens_ptr);
printf("[INFO] ");print_token(stdout, t);
- info("tokens.count: %zu", p->tokens.count);
+ info("tokens.count: %zu", p->tokens_ptr->count);
}
String_view get_src_copy(Lexer *l) {
Tokens tokens = lex(&l);
- Parser p = make_parser(tokens);
-
- parse(&p);
+ Parser p = make_parser(&tokens);
free_parser(&p);
free_lexer(&l);