minor declr parser
This commit is contained in:
@@ -1,7 +1,10 @@
|
||||
#pragma once
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
/**
|
||||
* Token Definitions
|
||||
*/
|
||||
typedef enum {
|
||||
LBRACK,
|
||||
RBRACK,
|
||||
@@ -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