From 3682559a564c510977e2f0243e971065269dcdfc Mon Sep 17 00:00:00 2001 From: yenru0 Date: Mon, 17 Nov 2025 15:49:06 +0900 Subject: [PATCH] minor declr parser --- include/globals.h | 15 +++++++++++++-- include/parse.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ src/parse.c | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+), 2 deletions(-) diff --git a/include/globals.h b/include/globals.h index 17a95d3..db5c8ec 100644 --- a/include/globals.h +++ b/include/globals.h @@ -1,7 +1,10 @@ #pragma once -#include #include +#include +/** + * Token Definitions + */ typedef enum { LBRACK, RBRACK, @@ -33,7 +36,7 @@ typedef enum { typedef struct { size_t len; - char* string; + char *string; } TokenString; typedef struct { @@ -42,3 +45,11 @@ typedef struct { TokenString data; } Token; +/** + * AST Node Definitions + */ +typedef struct ASTNode { + Token token; + struct ASTNode **children; + size_t child_count; +} ASTNode; \ No newline at end of file diff --git a/include/parse.h b/include/parse.h index e69de29..4d276e1 100644 --- a/include/parse.h +++ b/include/parse.h @@ -0,0 +1,45 @@ +#pragma once +#include + +#include "globals.h" +#include "lex.h" + +typedef struct Parser { + Lexer *lexer; + + Token current; + Token peek; + + int flag_error; +} Parser; + +Parser *parser_new(Lexer *lexer); + +void parser_free(Parser *parser); + +static void parser_next(Parser *parser); + +static void parser_expect(Parser *parser, TokenType type); + +/* + PARSER PARSE FUNCTIONS +*/ +ASTNode *parser_parse_program(Parser *parser); + +ASTNode *parser_parse_defn(Parser *parser); + +ASTNode *parser_parse_type(Parser *parser); + +ASTNode *parser_parse_expr(Parser *parser); + +ASTNode *parser_parse_atom(Parser *parser); + +ASTNode *parser_parse_stmt(Parser *parser); + +ASTNode *parser_parse_block(Parser *parser); + +ASTNode *parser_parse_lambda(Parser *parser); + +ASTNode *parser_parse_compound(Parser *parser); + +ASTNode *parser_parse_params(Parser *parser); \ No newline at end of file diff --git a/src/parse.c b/src/parse.c index 6bca26c..726a158 100644 --- a/src/parse.c +++ b/src/parse.c @@ -2,3 +2,37 @@ #include +Parser *parser_new(Lexer *lexer) { + Parser *parser = malloc(sizeof(Parser)); + if (parser == NULL) { + return NULL; + } + parser->lexer = lexer; + parser->flag_error = 0; + + parser_next(parser); + parser_next(parser); + + return parser; +} + +void parser_free(Parser *parser) { + free(parser); +} + +static void parser_next(Parser *parser) { + parser->current = parser->peek; + parser->peek = lexer_next_token(parser->lexer); +} + +static void parser_expect(Parser *parser, TokenType type) { + if (parser->current.type == type) { + parser_next(parser); + } else { + parser->flag_error = 1; + } +} + +/* + IMPL. PARSER PARSE FUNCTIONS +*/ \ No newline at end of file