diff options
| author | Mistivia <i@mistivia.com> | 2025-07-22 15:34:57 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2025-07-22 15:35:11 +0800 |
| commit | ea5c15cbd628953e7b9d17b45ea685006a582cd4 (patch) | |
| tree | 0440a31d4fb2f73cd150fa11f19ac08fd23562f9 /parser.h | |
| parent | d64a599af8c6b52223b20f727d76a59a562abb75 (diff) | |
change dir structure
Diffstat (limited to 'parser.h')
| -rw-r--r-- | parser.h | 66 |
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 + |
