#include #include "tree.h" #include "bu-parser.h" struct lex_str_data { const char *str; size_t slen; size_t needle; }; struct chartoken lex_str(void *v) { struct lex_str_data *d = v; if (d->needle >= d->slen) { return (struct chartoken){.id = TOKEN_EOS, .c = '\0' }; } struct chartoken token; do { token.c = d->str[d->needle++]; enum token_id id = TOKEN_INVALID; if (token.c >= 'a' && token.c <= 'z') { token.id = TOKEN_VARIABLE; } else { switch (token.c) { case '!': token.id = TOKEN_UNARY_OPERATOR; break; case '*': case '+': token.id = TOKEN_BINARY_OPERATOR; break; default: break; } } } while (token.c == ' '); return token; } int main(){ char str[100]; printf("type in your tree(no spaces please): "); scanf("%[^\n]", str); char str2[100]; strncpy(str2, str, 100); printTree(parse(str2),0); struct lex_str_data lxd; lxd.str = str; lxd.slen = strlen(str); lxd.needle = 0; struct expr_parser ep = expr_parser_init(lex_str, &lxd); enum parser_state s = expr_parser_run(&ep); if (s == PARSER_ACCEPT) { printTree(ep.stack[0].expr, 0); } else { expr_parser_debug_print(stderr, &ep); } expr_parser_finish(&ep); return 0; }