#include "mrk/parser_internal.h" void mrk_parser_open(mrk_parser *parser, mrk_lexer *lexer) { parser->lexer = lexer; // Prefill lookahead buffer for (size_t i = 0; i < MRK_PARSER_LOOKAHEAD_BUF_SIZE && !mrk_lexer_done(lexer); i++) { mrk_lexer_next(&parser->lookahead.buf[i], lexer); } } mrk_err mrk_parser_parse(mrk_ast_node **out, mrk_parser *parser) { mrk_ast_node *root; MRK_RES(mrk_ast_node_init(&root)); while (!mrk_lexer_done(parser->lexer)) { mrk_ast_node *block_root; MRK_RES(mrk_parser_parse_block(&block_root, parser)); MRK_RES(mrk_ast_node_child_append(root, block_root)); } *out = root; return mrk_err_ok; } mrk_err mrk_parser_parse_block(mrk_ast_node **out, mrk_parser *parser) { mrk_token t = mrk_parser_peek(parser); mrk_err (*parse_fn)(mrk_ast_node **, mrk_parser *) = NULL; /* switch (t.type) { */ /* case mrk_token_type_pounds: { */ /* parse_fn = mrk_parser_parse_header; */ /* break; */ /* } */ /* } */ if (parse_fn == NULL) { MRK_PARSE_ERR(parser, t, "Unexpected token."); } return parse_fn(out, parser); } /* mrk_err mrk_parser_parse_ */ mrk_err mrk_parser_parse_header(mrk_ast_node **out, mrk_parser *parser) { mrk_token t = mrk_parser_peek(parser); if (mrk_token_len(t) > MRK_MAX_HEADER_LEN) { MRK_PARSE_ERR(parser, t, "Headers can be at most 6 levels deep."); } mrk_parser_advance(parser); mrk_ast_node *header; MRK_RES(mrk_ast_node_init(&header)); header->args[0].num = mrk_token_len(t); // Headers are blocks of their own, so they're delimited by blank lines /* while (!mrk_parser_done(parser) && */ /* (t = mrk_parser_peek(parser)).type != mrk_token_type_blank_line) { */ /* switch (t.type) { /1* case *1/ */ /* } */ /* } */ // Skip blank line mrk_parser_advance(parser); *out = header; return mrk_err_ok; }