From 00ec031cb2ac7b9afda1cda97c91187a7a47e23a Mon Sep 17 00:00:00 2001 From: Pedro Souza Date: Tue, 2 Apr 2024 21:32:43 -0300 Subject: sync --- bu-parser.h | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 bu-parser.h (limited to 'bu-parser.h') 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 +#include +#include +#include "tree.h" + +/* PRODUCTION RULES + + ::= | | + ::= "*" | "+" + ::= "!" + ::= 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 -- cgit v1.2.3