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
|
||||
|
||||
all: $(TARGET)
|
||||
all: init $(TARGET)
|
||||
|
||||
init:
|
||||
mkdir -p $(BUILD_DIR)
|
||||
|
||||
$(TARGET): $(OBJ)
|
||||
$(CC) $(CFLAGS) -o $(BUILD_DIR)/$(TARGET) $(OBJ)
|
||||
|
||||
@@ -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;
|
||||
@@ -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>
|
||||
|
||||
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
|
||||
*/
|
||||
Reference in New Issue
Block a user