summaryrefslogtreecommitdiff
path: root/ast.h
diff options
context:
space:
mode:
Diffstat (limited to 'ast.h')
-rw-r--r--ast.h53
1 files changed, 53 insertions, 0 deletions
diff --git a/ast.h b/ast.h
new file mode 100644
index 0000000..46c4b49
--- /dev/null
+++ b/ast.h
@@ -0,0 +1,53 @@
+#pragma once
+
+
+typedef enum ASTtype{
+ AST_LIST,
+ AST_WORD,
+ AST_NUMBER,
+ AST_SYMBOL,
+} ASTtype;
+
+
+typedef struct AST AST;
+
+typedef struct ASTlist{
+ int len;
+ AST **nodes;
+} ASTlist;
+
+typedef struct ASTword{
+ char *word;
+} ASTword;
+
+typedef struct ASTnumber{
+ double num;
+} ASTnumber;
+
+typedef struct ASTsymbol{
+ char *name;
+ int symid;
+ //if you're not the interpreter:
+ // if you just allocated the ASTsymbol yourself, set symid to -1;
+ // else, leave symid alone.
+} ASTsymbol;
+
+struct AST{
+ ASTtype type;
+ union {
+ ASTlist l;
+ ASTword w;
+ ASTnumber n;
+ ASTsymbol s;
+ };
+};
+
+
+void ast_free(AST *ast);
+
+AST* ast_copy(const AST *ast);
+
+AST* ast_list(int len,AST **nodes); //these convenience functions DO NOT copy their arguments
+AST* ast_word(char *word);
+AST* ast_number(double num);
+AST* ast_symbol(char *name);