minor declr parser
This commit is contained in:
@@ -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
|
||||||
|
*/
|
||||||
Reference in New Issue
Block a user