aboutsummaryrefslogtreecommitdiff
path: root/src/parser.h
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2025-06-18 20:55:54 +0800
committerMistivia <i@mistivia.com>2025-06-18 20:55:54 +0800
commit0b335dc24e76cace44e748e62d5cbbc40c4355f5 (patch)
tree5fa2ef69b88908a8ddb6c78624919d967fcba875 /src/parser.h
parent6f1cfbda4a519ad8a232d126539a2732ab43c671 (diff)
finish parser
Diffstat (limited to 'src/parser.h')
-rw-r--r--src/parser.h60
1 files changed, 43 insertions, 17 deletions
diff --git a/src/parser.h b/src/parser.h
index 3f159b8..cefc946 100644
--- a/src/parser.h
+++ b/src/parser.h
@@ -3,33 +3,59 @@
#include <stdbool.h>
+#include "interp.h"
#include "sexp.h"
-typedef struct {
+typedef enum {
+ kParseString,
+ kParseFile,
+} ParseType;
+typedef struct {
+ Interp *ctx;
+ char *errmsg_buf;
+ char *token_buf;
+
+ ParseType parse_type;
+ union {
+ struct {
+ const char *string;
+ const char *str_cursor;
+ };
+ FILE *fp;
+ };
} 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);
+
typedef struct {
SExpRef val;
const char *errmsg;
} ParseResult;
-int parser_getchar(Parser *ctx);
-int parser_peek(Parser *ctx);
-
-ParseResult parse_sexp(Parser *ctx);
-ParseResult parse_list(Parser *ctx);
-ParseResult parse_quote(Parser *ctx);
-ParseResult parse_unquote(Parser *ctx);
-ParseResult parse_slicing_unquote(Parser *ctx);
-ParseResult parse_quasi(Parser *ctx);
-ParseResult parse_atom(Parser *ctx);
-ParseResult parse_number(Parser *ctx);
-ParseResult parse_integer(Parser *ctx);
-ParseResult parse_real(Parser *ctx);
-ParseResult parse_symbol(Parser *ctx);
-ParseResult parse_string(Parser *ctx);
-ParseResult parse_char(Parser *ctx);
+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