aboutsummaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
authors-over-42023-07-07 20:56:29 -0400
committers-over-42023-07-07 20:56:29 -0400
commit5b37568baac046ac6b21453bbe037e0eeec16e89 (patch)
tree3a7a3de8c14cea25b4e2cd05cd55fbc7f3239137 /src/parser.c
parente850a08fa7a763140b9c86308cfdff9bae421c2e (diff)
expectf
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c94
1 files changed, 92 insertions, 2 deletions
diff --git a/src/parser.c b/src/parser.c
index d2720b7..ae6f615 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -3,8 +3,8 @@
#include <string.h>
#include "include/token.h"
-#include "include/tree.h"
#include "include/util.h"
+#include "include/tree.h"
#include "include/lexer.h"
#include "include/parser.h"
@@ -20,7 +20,17 @@ parser_t* parser_init(lexer_t* lexer) {
void parser_destroy(parser_t* parser) { free(parser); }
-void parser_token_expect(parser_t* parser, int (*expected_token)(token_t*)) {
+void parser_token_expect(parser_t* parser, token_t* token) {
+ if (token == parser->token) {
+ die(
+ "unexpected token!\n\ttype: [%s]\n\tvalue: [%s]",
+ token_get_type(parser->token->type),
+ parser->token->value
+ );
+ }
+}
+
+void parser_token_expectf(parser_t* parser, int (*expected_token)(token_t*)) {
expected_token(parser->token)?
parser->token = lexer_get_next_token(parser->lexer):
die(
@@ -53,3 +63,83 @@ tree_t* parser_parse_statements(parser_t* parser) {
return comp;
}
+
+tree_t* parser_parse_statement(parser_t* parser) {
+
+}
+
+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* tree;
+
+ tree->type = TREE_DEF;
+ tree->data.def.name = parser->token->value;
+
+ lexer_next(parser->lexer);
+
+ tree->data.def.mutability = strcmp(parser->token->value, "mut");
+
+ // collect other tags
+ // check for arguments
+ // wait for DEF_SET
+ // return value as parse_statement (could be just one or block)
+
+ return tree;
+}
+
+tree_t* parser_parse_call(parser_t* parser) {
+ tree_t* tree;
+
+ tree->type = TREE_CALL;
+ tree->data.call.target = parser->token->value;
+
+ lexer_next(parser->lexer);
+
+ if (parser->token->type == TOKEN_FN_APPLY) {
+
+ lexer_next(parser->lexer);
+
+ tree->data.call.args = realloc(tree->data.call.args, sizeof(tree->data.call.args) + sizeof(parser->token->value));
+ tree->data.call.args_size += sizeof(parser->token->value);
+
+
+ lexer_next(parser->lexer);
+
+ while (parser->token->type == TOKEN_LIST_DELIM) {
+ lexer_next(parser->lexer);
+ tree->data.call.args = realloc(tree->data.call.args, sizeof(tree->data.call.args) + sizeof(parser->token->value));
+ tree->data.call.args_size += sizeof(parser->token->value);
+ lexer_next(parser->lexer);
+ }
+
+ return tree;
+ } else {
+ return tree;
+ }
+}
+
+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;
+}
+