init
This commit is contained in:
commit
b5270924ba
6
.clang-format
Normal file
6
.clang-format
Normal file
@ -0,0 +1,6 @@
|
||||
Language: Cpp
|
||||
BasedOnStyle: WebKit
|
||||
IndentWidth: 4
|
||||
ColumnLimit: 80
|
||||
IndentCaseLabels: true
|
||||
|
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
*.o
|
||||
semos
|
||||
|
23
Makefile
Normal file
23
Makefile
Normal file
@ -0,0 +1,23 @@
|
||||
|
||||
OUTPUT = semos
|
||||
|
||||
CFLAGS = -std=c17 -Wall -Wextra -Wpedantic -Wconversion -pedantic -pedantic-errors
|
||||
|
||||
CFILES = \
|
||||
main.c \
|
||||
|
||||
OBJECT_FILES = $(patsubst %.c,%.o,$(CFILES))
|
||||
|
||||
HEADER_FILES = $(wildcard *.h)
|
||||
|
||||
$(OUTPUT): $(OBJECT_FILES)
|
||||
gcc -o $@ $^
|
||||
|
||||
%.o: %.c $(HEADER_FILES)
|
||||
gcc -c -o $@ $(CFLAGS) $<
|
||||
|
||||
.PHONY: clean
|
||||
|
||||
clean:
|
||||
rm -rf *.o $(OUTPUT)
|
||||
|
9
compile_flags.txt
Normal file
9
compile_flags.txt
Normal file
@ -0,0 +1,9 @@
|
||||
-xc
|
||||
-std=c17
|
||||
-Wall
|
||||
-Wextra
|
||||
-Wpedantic
|
||||
-Wconversion
|
||||
-pedantic
|
||||
-pedantic-errors
|
||||
|
3
main.c
Normal file
3
main.c
Normal file
@ -0,0 +1,3 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void) { printf("hello world\n"); }
|
167
parser.h
Normal file
167
parser.h
Normal file
@ -0,0 +1,167 @@
|
||||
#ifndef PARSER_H
|
||||
#define PARSER_H
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
typedef enum {
|
||||
TokenType_Error,
|
||||
TokenType_Id,
|
||||
TokenType_Int,
|
||||
TokenType_Not,
|
||||
TokenType_And,
|
||||
TokenType_Or,
|
||||
TokenType_Loop,
|
||||
TokenType_Fn,
|
||||
TokenType_Break,
|
||||
TokenType_LParen,
|
||||
TokenType_RParen,
|
||||
TokenType_LBrace,
|
||||
TokenType_RBrace,
|
||||
TokenType_LBracket,
|
||||
TokenType_RBracket,
|
||||
TokenType_Comma,
|
||||
TokenType_Semicolon,
|
||||
TokenType_Exclamation,
|
||||
TokenType_Plus,
|
||||
TokenType_Minus,
|
||||
TokenType_Asterisk,
|
||||
TokenType_EE,
|
||||
TokenType_NE,
|
||||
TokenType_LT,
|
||||
TokenType_GT,
|
||||
TokenType_LTE,
|
||||
TokenType_GTE,
|
||||
} TokenType;
|
||||
|
||||
typedef struct {
|
||||
TokenType token;
|
||||
size_t index;
|
||||
size_t length;
|
||||
int line;
|
||||
} Token;
|
||||
|
||||
typedef enum {
|
||||
ASTNodeType_Error,
|
||||
ASTNodeType_Id,
|
||||
ASTNodeType_Int,
|
||||
ASTNodeType_Block,
|
||||
ASTNodeType_If,
|
||||
ASTNodeType_Loop,
|
||||
ASTNodeType_Call,
|
||||
ASTNodeType_Index,
|
||||
ASTNodeType_Unary,
|
||||
ASTNodeType_Binary,
|
||||
ASTNodeType_Assign,
|
||||
ASTNodeType_Let,
|
||||
ASTNodeType_Break,
|
||||
ASTNodeType_Fn,
|
||||
} ASTNodeType;
|
||||
|
||||
typedef struct ASTNode ASTNode;
|
||||
|
||||
typedef struct {
|
||||
ASTNode** data;
|
||||
size_t length;
|
||||
size_t capacity;
|
||||
} ASTNodeVec;
|
||||
|
||||
void ast_node_vec_construct(ASTNodeVec* vec);
|
||||
void ast_node_vec_destroy(ASTNodeVec* vec);
|
||||
void ast_node_vec_push(ASTNodeVec* vec, ASTNode* item);
|
||||
|
||||
typedef struct {
|
||||
ASTNode* condition;
|
||||
ASTNode* truthy;
|
||||
ASTNode* falsy;
|
||||
} ASTIfNode;
|
||||
|
||||
typedef struct {
|
||||
ASTNode* body;
|
||||
} ASTLoopNode;
|
||||
|
||||
typedef struct {
|
||||
ASTNode* subject;
|
||||
ASTNodeVec args;
|
||||
} ASTCallNode;
|
||||
|
||||
typedef struct {
|
||||
ASTNode* subject;
|
||||
ASTNode* value;
|
||||
} ASTIndexNode;
|
||||
|
||||
typedef enum {
|
||||
UnaryType_Not,
|
||||
UnaryType_Negate,
|
||||
} UnaryType;
|
||||
|
||||
typedef struct {
|
||||
UnaryType unary_type;
|
||||
ASTNode* subject;
|
||||
} ASTUnaryNode;
|
||||
|
||||
typedef enum {
|
||||
BinaryType_And,
|
||||
BinaryType_Or,
|
||||
BinaryType_Add,
|
||||
BinaryType_Subtract,
|
||||
BinaryType_Multiply,
|
||||
BinaryType_EE,
|
||||
BinaryType_NE,
|
||||
BinaryType_LT,
|
||||
BinaryType_GT,
|
||||
BinaryType_LTE,
|
||||
BinaryType_GTE,
|
||||
} BinaryType;
|
||||
|
||||
typedef struct {
|
||||
BinaryType binary_type;
|
||||
ASTNode* left;
|
||||
ASTNode* right;
|
||||
} ASTBinaryNode;
|
||||
|
||||
typedef enum {
|
||||
AssignType_Assign,
|
||||
AssignType_Add,
|
||||
AssignType_Subtract,
|
||||
AssignType_Multiply,
|
||||
} AssignType;
|
||||
|
||||
typedef struct {
|
||||
AssignType assign_type;
|
||||
ASTNode* subject;
|
||||
ASTNode* value;
|
||||
} ASTAssignNode;
|
||||
|
||||
typedef struct {
|
||||
char* id;
|
||||
ASTNode* value;
|
||||
} ASTLetNode;
|
||||
|
||||
typedef struct {
|
||||
char* id;
|
||||
ASTNodeVec params;
|
||||
ASTNode* body;
|
||||
} ASTFnNode;
|
||||
|
||||
struct ASTNode {
|
||||
ASTNodeType node_type;
|
||||
int line;
|
||||
union {
|
||||
char* id_value;
|
||||
int int_value;
|
||||
ASTNodeVec statements;
|
||||
ASTIfNode if_node;
|
||||
ASTLoopNode loop_node;
|
||||
ASTCallNode call_node;
|
||||
ASTIndexNode index_node;
|
||||
ASTUnaryNode unary_node;
|
||||
ASTBinaryNode binary_node;
|
||||
ASTAssignNode assign_node;
|
||||
ASTLetNode let_node;
|
||||
ASTFnNode fn_node;
|
||||
};
|
||||
};
|
||||
|
||||
void ast_node_destroy(ASTNode* node);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user