aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorc+12023-10-29 17:38:02 -0400
committerc+12023-10-29 17:38:02 -0400
commit88f4ca6ea3cd758faffd7e3e2a70569e365bc707 (patch)
treefd0c9385a76ff0137f199cabeac9d95ea8515ed1
parent10fbc2895df3549d1c31cdd432b16816f76e53e4 (diff)
halk halk halk
-rw-r--r--src/include/parser.h50
-rw-r--r--src/parser.c122
2 files changed, 17 insertions, 155 deletions
diff --git a/src/include/parser.h b/src/include/parser.h
index 7541303..b101485 100644
--- a/src/include/parser.h
+++ b/src/include/parser.h
@@ -1,48 +1,20 @@
#ifndef PARSER_H
#define PARSER_H
-#include "lexer.h"
+#include "util.h"
#include "tree.h"
-
-#include <stdarg.h>
-
-typedef struct PARSER_STRUC {
- lexer_t* lexer; // lexer used by the parser
- token_t* token; // current token
-
- enum {
- DEF,
- CAL
- } state;
-
+#include "token.h"
+
+typedef struct PARSER {
+ /* the token list being parsed */
+ token_t* token;
+
+ /* the abstract syntax tree being generated */
+ tree_t* tree;
} parser_t;
-parser_t* parser_init(lexer_t* lexer);
+parser_t* parser_init(token_t* token);
+/* free parser struct, **but not þe token list ∨ ast** */
void parser_destroy(parser_t* parser);
-// expect tokens, or die
-void parser_token_expect(parser_t* parser, int token_type, ...);
-
-// do the parse
-tree_t* parser_parse(parser_t* parser);
-
-// parse expressions
-// - returns what it evaluates to
-// - can contain other exprs
-tree_t* parser_parse_exprs(parser_t* parser);
-tree_t* parser_parse_expr(parser_t* parser);
-
-// parse blocks
-// - in curly brackets
-// - contains many exprs
-// - returns last expr
-tree_t* parser_parse_blocks(parser_t* parser);
-tree_t* parser_parse_block(parser_t* parser);
-
-tree_t* parser_parse_def(parser_t* parser);
-tree_t* parser_parse_call(parser_t* parser);
-
-tree_t* parser_parse_type_str(parser_t* parser);
-tree_t* parser_parse_type_int(parser_t* parser);
-
#endif
diff --git a/src/parser.c b/src/parser.c
index c32202e..300f3de 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -1,125 +1,15 @@
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "include/token.h"
-#include "include/util.h"
-#include "include/tree.h"
-#include "include/lexer.h"
#include "include/parser.h"
-parser_t* parser_init(lexer_t* lexer) {
+parser_t* parser_init(token_t* token) {
parser_t* parser;
- parser = calloc(1, sizeof(struct PARSER_STRUC));
- parser->lexer = lexer;
- parser->token = lexer_get_next_token(lexer);
+ parser = emalloc(sizeof(struct PARSER));
+ parser->token = token;
+ parser->tree = NULL;
return parser;
}
-void parser_destroy(parser_t* parser) { free(parser); }
-
-void parser_token_expect(parser_t* parser, int tokens, ...) {
- va_list ap;
- va_start(ap, tokens);
- for (int i = 0; i < tokens; ++i) {
- va_arg(ap, int) == parser->token->type?
- parser->token = lexer_get_next_token(parser->lexer):
- die(
- "unexpected token\n\ttype: [%s]\n\tvalue: [%s]",
- token_get_type(parser->token->type),
- parser->token->value
- );
- }
- va_end(ap);
-}
-
-tree_t* parser_parse(parser_t* parser) { return parser_parse_exprs(parser); }
-
-tree_t* parser_parse_expr(parser_t* parser) {
- switch (parser->token->type) {
- case TOKEN_DEF_TAG:
- return parser_parse_def(parser);
- break;
- case TOKEN_KEYWORD:
- return parser_parse_call(parser);
- break;
- default:
- die("BAD TOKEN"); /* TODO: make more informative error msgs */
- }
-
- return NULL; /* unreachable */
- /* hopefully */
-}
-
-tree_t* parser_parse_exprs(parser_t* parser) {
- tree_t* comp;
- tree_t* statement;
-
- comp = tree_init(TREE_COMP);
- comp->data.comp.value = calloc(1, sizeof(struct TREE_STRUC*));
-
- statement = parser_parse_expr(parser);
- comp->data.comp.value[0] = statement;
- while (parser->token->type == TOKEN_STMNT_END) {
- tree_t* statement;
-
- parser_token_expect(parser, TOKEN_STMNT_END);
-
- statement = parser_parse_expr(parser);
- comp->data.comp.size ++;
- comp->data.comp.value = realloc(
- comp->data.comp.value,
- comp->data.comp.size * sizeof(struct TREE_STRUC)
- );
- comp->data.comp.value[comp->data.comp.size - 1] = statement;
- }
-
- return comp;
-}
-
-tree_t* parser_parse_blocks(parser_t* parser) {
-
-}
-
-tree_t* parser_parse_block(parser_t* parser) {
-
-}
-
-tree_t* parser_parse_def(parser_t* parser) {
- tree_t* def;
-
- def->type = TREE_DEF;
-
- while (parser->token->type == TOKEN_DEF_TAG) {
- def->data.def.tags_size ++;
- def->data.def.tags = realloc(
- def->data.def.args,
- def->data.def.args_size + sizeof(parser->token->value)
- );
- }
-
-}
-
-tree_t* parser_parse_call(parser_t* parser) {
+void parser_destroy(parser_t* parser) {
+ free(parser);
}
-
-tree_t* parser_parse_type_str(parser_t* parser) {
- tree_t* tree;
-
- tree->type = TREE_TYPE_STR;
- tree->data.type_str.value = parser->token->value;
-
- return tree;
-}
-
-tree_t* parser_parse_type_int(parser_t* parser) {
- tree_t* tree;
-
- tree->type = TREE_TYPE_INT;
- tree->data.type_int.value = strtol(parser->token->value, NULL, 10);
-
- return tree;
-}
-