aboutsummaryrefslogtreecommitdiff
path: root/interpreter/syntax.h
diff options
context:
space:
mode:
Diffstat (limited to 'interpreter/syntax.h')
-rw-r--r--interpreter/syntax.h80
1 files changed, 80 insertions, 0 deletions
diff --git a/interpreter/syntax.h b/interpreter/syntax.h
new file mode 100644
index 0000000..05f09c7
--- /dev/null
+++ b/interpreter/syntax.h
@@ -0,0 +1,80 @@
+#ifndef _H_SYNTAX
+#define _H_SYNTAX
+
+/* TOKENS */
+
+typedef enum {
+ TOKEN_SEMICOLON, /* ; */
+ TOKEN_EQUALS, /* = */
+ TOKEN_OPEN_SQ, /* [ */
+ TOKEN_CLOSE_SQ, /* ] */
+ TOKEN_OPEN_P, /* ( */
+ TOKEN_CLOSE_P, /* ) */
+ TOKEN_COMMA, /* , */
+ TOKEN_COLON, /* : */
+ TOKEN_NAME,
+ TOKEN_INT
+} token_kind;
+
+typedef struct {
+ token_kind kind;
+ void* var;
+} token;
+
+typedef struct token_list {
+ token elem;
+ struct token_list* rest;
+} token_list;
+
+void free_token(token*);
+void free_token_list(token_list*);
+
+/* ELEMENTS */
+
+typedef enum {
+ EXPR_INT,
+ EXPR_NAME,
+ EXPR_LIST,
+ EXPR_TUPLE,
+ EXPR_APP
+} expr_kind;
+
+typedef struct {
+ expr_kind kind;
+ void* var1;
+ void* var2;
+} expression;
+
+typedef struct arg_list {
+ expression elem;
+ struct arg_list* rest;
+} arg_list;
+
+typedef struct {
+ char* name;
+ arg_list* args;
+ expression rhs;
+} rewrite_rule;
+
+typedef struct fuspel {
+ rewrite_rule rule;
+ struct fuspel* rest;
+} fuspel;
+
+unsigned empty_args_list(arg_list*);
+
+void cpy_expression(expression* dst, expression* src);
+unsigned eq_expression(expression*, expression*);
+expression** flatten_app_args(expression*);
+
+void concat_fuspel(fuspel* start, fuspel* end);
+fuspel* push_fuspel(fuspel*);
+fuspel* pop_fuspel(fuspel*);
+fuspel* popn_fuspel(fuspel*, unsigned char);
+
+void free_expression(expression*);
+void free_arg_list(arg_list*);
+void free_rewrite_rule(rewrite_rule*);
+void free_fuspel(fuspel*);
+
+#endif