mrk/src/parser/parser.c

77 lines
1.8 KiB
C
Raw Normal View History

#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;
}