Compare commits

..

3 Commits

Author SHA1 Message Date
3682559a56 minor declr parser 2025-11-17 15:49:06 +09:00
1e15ec36d2 fix test.cval 2025-11-17 15:48:51 +09:00
9d1a9147b7 fix makefile 2025-11-17 15:48:37 +09:00
5 changed files with 100 additions and 5 deletions

View File

@@ -11,7 +11,10 @@ TARGET := cval.out
.PHONY: all clean
all: $(TARGET)
all: init $(TARGET)
init:
mkdir -p $(BUILD_DIR)
$(TARGET): $(OBJ)
$(CC) $(CFLAGS) -o $(BUILD_DIR)/$(TARGET) $(OBJ)

View File

@@ -1,7 +1,10 @@
#pragma once
#include <stdint.h>
#include <stddef.h>
#include <stdint.h>
/**
* 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;

View File

@@ -0,0 +1,45 @@
#pragma once
#include <stdint.h>
#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);

View File

@@ -2,3 +2,37 @@
#include <stdlib.h>
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
*/

View File

@@ -4,7 +4,9 @@ val [int->int] fib (int n) {
return if eq n 0 {
1
} else {
mul n fib
mul n {
fib {sub n 1}
}
};
};
@@ -24,4 +26,4 @@ val [char * int->char]get_char_of(char* s int index) {
return * {
add s index
};
}
};