77 lines
1.8 KiB
C
77 lines
1.8 KiB
C
#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;
|
|
}
|