Compare commits
3 Commits
2abfa54890
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 3682559a56 | |||
| 1e15ec36d2 | |||
| 9d1a9147b7 |
5
Makefile
5
Makefile
@@ -11,7 +11,10 @@ TARGET := cval.out
|
|||||||
|
|
||||||
.PHONY: all clean
|
.PHONY: all clean
|
||||||
|
|
||||||
all: $(TARGET)
|
all: init $(TARGET)
|
||||||
|
|
||||||
|
init:
|
||||||
|
mkdir -p $(BUILD_DIR)
|
||||||
|
|
||||||
$(TARGET): $(OBJ)
|
$(TARGET): $(OBJ)
|
||||||
$(CC) $(CFLAGS) -o $(BUILD_DIR)/$(TARGET) $(OBJ)
|
$(CC) $(CFLAGS) -o $(BUILD_DIR)/$(TARGET) $(OBJ)
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <stdint.h>
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Token Definitions
|
||||||
|
*/
|
||||||
typedef enum {
|
typedef enum {
|
||||||
LBRACK,
|
LBRACK,
|
||||||
RBRACK,
|
RBRACK,
|
||||||
@@ -42,3 +45,11 @@ typedef struct {
|
|||||||
TokenString data;
|
TokenString data;
|
||||||
} Token;
|
} Token;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AST Node Definitions
|
||||||
|
*/
|
||||||
|
typedef struct ASTNode {
|
||||||
|
Token token;
|
||||||
|
struct ASTNode **children;
|
||||||
|
size_t child_count;
|
||||||
|
} ASTNode;
|
||||||
@@ -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);
|
||||||
34
src/parse.c
34
src/parse.c
@@ -2,3 +2,37 @@
|
|||||||
|
|
||||||
#include <stdlib.h>
|
#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
|
||||||
|
*/
|
||||||
@@ -4,7 +4,9 @@ val [int->int] fib (int n) {
|
|||||||
return if eq n 0 {
|
return if eq n 0 {
|
||||||
1
|
1
|
||||||
} else {
|
} 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 * {
|
return * {
|
||||||
add s index
|
add s index
|
||||||
};
|
};
|
||||||
}
|
};
|
||||||
Reference in New Issue
Block a user