aboutsummaryrefslogtreecommitdiff
path: root/parser.h
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2025-07-22 15:34:57 +0800
committerMistivia <i@mistivia.com>2025-07-22 15:35:11 +0800
commitea5c15cbd628953e7b9d17b45ea685006a582cd4 (patch)
tree0440a31d4fb2f73cd150fa11f19ac08fd23562f9 /parser.h
parentd64a599af8c6b52223b20f727d76a59a562abb75 (diff)
change dir structure
Diffstat (limited to 'parser.h')
-rw-r--r--parser.h66
1 files changed, 66 insertions, 0 deletions
diff --git a/parser.h b/parser.h
new file mode 100644
index 0000000..0721675
--- /dev/null
+++ b/parser.h
@@ -0,0 +1,66 @@
+#ifndef BAMBOO_LISP_PARSER_H_
+#define BAMBOO_LISP_PARSER_H_
+
+#include <stdbool.h>
+
+#include "interp.h"
+#include "sexp.h"
+
+typedef enum {
+ kParseString,
+ kParseFile,
+ kParseReadline,
+} ParseType;
+
+struct parser {
+ Interp *ctx;
+ char *errmsg_buf;
+ char *token_buf;
+
+ ParseType parse_type;
+ union {
+ struct {
+ const char *string;
+ const char *str_cursor;
+ bool readline_eof;
+ };
+ FILE *fp;
+ };
+};
+typedef struct parser Parser;
+
+void Parser_init(Parser *self);
+void Parser_free(Parser *self);
+int Parser_getchar(Parser *self);
+int Parser_peek(Parser *self);
+void Parser_set_string(Parser *parser, const char *str);
+void Parser_set_file(Parser *parser, FILE *fp);
+void Parser_set_readline(Parser *parser);
+bool Parser_is_end(Parser *parser);
+
+typedef struct {
+ SExpRef val;
+ const char *errmsg;
+} ParseResult;
+
+ParseResult ParseOk(SExpRef ref);
+ParseResult ParseErr(Parser *parser, const char *format, ...);
+bool ParseResult_is_err(ParseResult res);
+
+
+ParseResult parse_sexp(Parser *parser);
+ParseResult parse_list(Parser *parser);
+ParseResult parse_quote(Parser *parser);
+ParseResult parse_unquote(Parser *parser);
+ParseResult parse_slicing_unquote(Parser *parser);
+ParseResult parse_quasi(Parser *parser);
+ParseResult parse_atom(Parser *parser);
+ParseResult parse_number(Parser *parser);
+ParseResult parse_integer(Parser *parser);
+ParseResult parse_real(Parser *parser);
+ParseResult parse_symbol(Parser *parser);
+ParseResult parse_string(Parser *parser);
+ParseResult parse_char(Parser *parser);
+
+#endif
+