#ifndef BU_PARSER_HG #define BU_PARSER_HG #include #include #include #include "tree.h" /* PRODUCTION RULES ::= | | "(" ")" | ::= "*" | "+" ::= "!" ::= r#[a-z] */ enum parser_state { PARSER_ERR = -1, PARSER_READY = 0, PARSER_ACCEPT, }; enum token_id { TOKEN_INVALID = 0, TOKEN_BINARY_OPERATOR, TOKEN_UNARY_OPERATOR, TOKEN_VARIABLE, TOKEN_OPEN_PAREN, TOKEN_CLOSE_PAREN, 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); void expr_parser_debug_print(FILE *stream, struct expr_parser *ep); #endif // BU_PARSER_HG