aboutsummaryrefslogtreecommitdiff
path: root/src/ast.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/ast.h')
-rw-r--r--src/ast.h245
1 files changed, 245 insertions, 0 deletions
diff --git a/src/ast.h b/src/ast.h
new file mode 100644
index 0000000..074c9b2
--- /dev/null
+++ b/src/ast.h
@@ -0,0 +1,245 @@
+#pragma once
+
+#include <stddef.h>
+#include <stdint.h>
+#include <stdbool.h>
+
+#include "lexer.h"
+
+enum StoreSize
+{
+ STORE_SIZE_NONE,
+ STORE_SIZE_BYTE,
+ STORE_SIZE_WORD,
+ STORE_SIZE_DWORD,
+ STORE_SIZE_QWORD,
+};
+
+struct ConstDecl
+{
+ struct Token name;
+ struct Expr* value;
+};
+
+struct DataDecl
+{
+ struct Token name;
+ struct Token value;
+};
+
+struct EnumDecl
+{
+ struct Token name;
+ struct Token* members;
+ size_t member_count;
+ size_t member_capacity;
+};
+
+struct StructField
+{
+ struct Token name;
+ enum StoreSize size;
+};
+
+struct StructDecl
+{
+ struct Token name;
+ struct StructField* fields;
+ size_t field_count;
+ size_t field_capacity;
+};
+
+struct Param
+{
+ struct Token name;
+ struct Token reg;
+};
+
+enum ExprKind
+{
+ EXPR_PRIMARY,
+ EXPR_UNARY,
+ EXPR_BINARY,
+ EXPR_MEMBER,
+ EXPR_DEREF,
+};
+
+struct PrimaryExpr
+{
+ struct Token token;
+};
+
+struct UnaryExpr
+{
+ struct Token op;
+ struct Expr* operand;
+};
+
+struct BinaryExpr
+{
+ struct Expr* left;
+ struct Token op;
+ struct Expr* right;
+};
+
+struct MemberExpr
+{
+ struct Expr* object;
+ struct Token member;
+};
+
+struct DerefExpr
+{
+ bool is_signed;
+ enum StoreSize size;
+ struct Expr* address;
+};
+
+struct Expr
+{
+ enum ExprKind kind;
+ union
+ {
+ struct PrimaryExpr primary;
+ struct UnaryExpr unary;
+ struct BinaryExpr binary;
+ struct MemberExpr member;
+ struct DerefExpr deref;
+ };
+};
+
+enum StatementKind
+{
+ STATEMENT_ASSIGN,
+ STATEMENT_LABEL,
+ STATEMENT_GOTO,
+ STATEMENT_SYSCALL,
+ STATEMENT_IF,
+ STATEMENT_CALL,
+ STATEMENT_STACK,
+};
+
+struct AssignStatement
+{
+ bool target_deref;
+ enum StoreSize store_size;
+ struct Token target;
+ struct Token op;
+ struct Expr* value;
+};
+
+struct LabelStatement
+{
+ struct Token name;
+};
+
+struct GotoStatement
+{
+ struct Token label;
+};
+
+struct IfStatement
+{
+ struct Expr* left;
+ struct Token comparison;
+ struct Expr* right;
+ struct Statement* body;
+ size_t body_count;
+ struct Statement* else_body;
+ size_t else_count;
+};
+
+struct CallStatement
+{
+ struct Token name;
+ struct Expr** args;
+ size_t arg_count;
+ size_t arg_capacity;
+};
+
+struct StackStatement
+{
+ struct Token name;
+ struct Expr* size;
+};
+
+struct Statement
+{
+ enum StatementKind kind;
+ union
+ {
+ struct AssignStatement assign;
+ struct LabelStatement label;
+ struct GotoStatement jump;
+ struct IfStatement branch;
+ struct CallStatement call;
+ struct StackStatement stack;
+ };
+};
+
+struct ProcDecl
+{
+ struct Token name;
+ struct Param* params;
+ size_t param_count;
+ size_t param_capacity;
+
+ struct Statement* body;
+ size_t body_count;
+ size_t body_capacity;
+};
+
+struct Config
+{
+ uint32_t bits;
+ bool has_entry;
+ struct Token entry;
+ bool logical_registers;
+};
+
+struct Program
+{
+ struct Config config;
+
+ struct ConstDecl* consts;
+ size_t const_count;
+ size_t const_capacity;
+
+ struct DataDecl* data_decls;
+ size_t data_count;
+ size_t data_capacity;
+
+ struct EnumDecl* enums;
+ size_t enum_count;
+ size_t enum_capacity;
+
+ struct StructDecl* structs;
+ size_t struct_count;
+ size_t struct_capacity;
+
+ struct ProcDecl* procs;
+ size_t proc_count;
+ size_t proc_capacity;
+};
+
+struct Program create_program(void);
+void free_program(struct Program* program);
+void add_const(struct Program* program, struct ConstDecl decl);
+void add_data(struct Program* program, struct DataDecl decl);
+
+struct EnumDecl create_enum(void);
+void add_enum_member(struct EnumDecl* decl, struct Token member);
+void add_enum(struct Program* program, struct EnumDecl decl);
+
+struct StructDecl create_struct(void);
+void add_struct_field(struct StructDecl* decl, struct StructField field);
+void add_struct(struct Program* program, struct StructDecl decl);
+
+struct ProcDecl create_proc(void);
+void free_proc(struct ProcDecl* proc);
+void add_param(struct ProcDecl* proc, struct Param param);
+void add_statement(struct ProcDecl* proc, struct Statement statement);
+void add_proc(struct Program* program, struct ProcDecl decl);
+
+void free_expr(struct Expr* expr);
+void free_statement(struct Statement* statement);