168 lines
3.0 KiB
C
168 lines
3.0 KiB
C
|
#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
|