aboutsummaryrefslogtreecommitdiff
path: root/include/ast.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/ast.h')
-rw-r--r--include/ast.h57
1 files changed, 57 insertions, 0 deletions
diff --git a/include/ast.h b/include/ast.h
new file mode 100644
index 0000000..edbe70f
--- /dev/null
+++ b/include/ast.h
@@ -0,0 +1,57 @@
+#ifndef AMALGAM_AST_H
+#define AMALGAM_AST_H
+
+#include "buffer_view.h"
+#include "buffer.h"
+#include "misc.h"
+
+typedef struct FunctionDecl FunctionDecl;
+typedef struct FunctionCall FunctionCall;
+typedef struct LhsExpr LhsExpr;
+
+typedef union {
+ FunctionDecl *func_decl;
+ FunctionCall *func_call;
+ LhsExpr *lhs_expr;
+} AstValue;
+
+typedef enum {
+ AST_NONE,
+ AST_FUNCTION_DECL,
+ AST_FUNCTION_CALL,
+ AST_LHS
+} AstType;
+
+typedef struct {
+ AstValue value;
+ AstType type;
+} Ast;
+
+struct FunctionDecl {
+ BufferView name;
+ Buffer body;
+};
+
+struct FunctionCall {
+ BufferView name;
+};
+
+struct LhsExpr {
+ int isConst;
+ BufferView var_name;
+ Ast rhs_expr;
+};
+
+Ast ast_none();
+void ast_deinit(Ast *ast);
+
+void funcdecl_init(FunctionDecl *self);
+void funcdecl_deinit(FunctionDecl *self);
+WARN_UNUSED_RESULT int funcdecl_add_to_body(FunctionDecl *self, Ast ast);
+
+void funccall_init(FunctionCall *self, BufferView name);
+
+void lhsexpr_init(LhsExpr *self, int isConst, BufferView var_name);
+void lhsexpr_deinit(LhsExpr *self);
+
+#endif