summaryrefslogtreecommitdiff
path: root/bu-parser.h
diff options
context:
space:
mode:
Diffstat (limited to 'bu-parser.h')
-rw-r--r--bu-parser.h77
1 files changed, 77 insertions, 0 deletions
diff --git a/bu-parser.h b/bu-parser.h
new file mode 100644
index 0000000..0aff194
--- /dev/null
+++ b/bu-parser.h
@@ -0,0 +1,77 @@
+#ifndef BU_PARSER_HG
+#define BU_PARSER_HG
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "tree.h"
+
+/* PRODUCTION RULES
+
+ <expr> ::= <expr> <binary_op> <expr> | <unary_op> <expr> | <var>
+ <binary_op> ::= "*" | "+"
+ <unary_op> ::= "!"
+ <var> ::= r#[a-z]
+
+ */
+
+/* POSSIBILITIES
+ a-z => var
+
+ */
+
+enum parser_state {
+ PARSER_ERR = -1,
+ PARSER_READY = 0,
+ PARSER_OR_OP,
+ PARSER_AND_OP,
+ PARSER_NOT_OP,
+ PARSER_OK,
+};
+
+enum token_id {
+ TOKEN_INVALID = 0,
+ TOKEN_BINARY_OPERATOR,
+ TOKEN_UNARY_OPERATOR,
+ TOKEN_VARIABLE,
+ TOKEN_EOS,
+ TOKEN_OOB,
+ TOKEN_MAX,
+};
+
+enum stackmember_id {
+ // all token ids
+ STACKMEMBER_INVALID = TOKEN_INVALID,
+ // ...
+ STACKMEMBER_EXPR = TOKEN_MAX + 1,
+ STACKMEMBER_MAX,
+};
+
+struct chartoken { enum token_id id; char c; };
+typedef struct chartoken(*lexer_fn)(void*);
+
+struct stackmember {
+ enum stackmember_id id;
+ union {
+ char terminal;
+ node *expr;
+ };
+};
+
+struct expr_parser {
+ lexer_fn lex;
+ void *lex_data;
+ // since tokens are 1-to-1 maps to chars,
+ // we're fine making this type assumption
+ struct chartoken lahead;
+ enum parser_state st;
+ // (and 1024 oughta be enough, FIXME if not)
+ struct stackmember stack[1024];
+ size_t stack_idx;
+};
+
+struct expr_parser expr_parser_init(lexer_fn src, void* lex_data);
+void expr_parser_finish(struct expr_parser *ep);
+int expr_parser_run(struct expr_parser *ep);
+
+#endif // BU_PARSER_HG