From 5a2f6687f681fa0ceff19a42ec9ddce479e67c48 Mon Sep 17 00:00:00 2001 From: Pedro Souza Date: Thu, 4 Apr 2024 01:52:22 -0300 Subject: added truth table and expression evaluator --- main.c | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) (limited to 'main.c') diff --git a/main.c b/main.c index 0477bae..a596202 100644 --- a/main.c +++ b/main.c @@ -1,11 +1,14 @@ #include +#include #include "tree.h" #include "bu-parser.h" +#include "truth_table.h" struct lex_str_data { const char *str; size_t slen; size_t needle; + uint32_t lttr_bitfield; }; struct chartoken lex_str(void *v) { @@ -17,7 +20,11 @@ struct chartoken lex_str(void *v) { do { token.c = d->str[d->needle++]; enum token_id id = TOKEN_INVALID; - if (token.c >= 'a' && token.c <= 'z') { token.id = TOKEN_VARIABLE; } + if (token.c >= 'a' && token.c <= 'z') { + token.id = TOKEN_VARIABLE; + int alph_pos = token.c - 'a'; + d->lttr_bitfield |= 1 << alph_pos; + } else { switch (token.c) { case '!': token.id = TOKEN_UNARY_OPERATOR; break; @@ -36,24 +43,35 @@ int main(){ char str[100]; printf("type in your tree(no spaces please): "); scanf("%[^\n]", str); - char str2[100]; - strncpy(str2, str, 100); - node *exp = parse(str2); - printTree(exp,0); - free_node(exp); - - struct lex_str_data lxd; - lxd.str = str; - lxd.slen = strlen(str); - lxd.needle = 0; + + struct lex_str_data lxd = { + .str = str, + .slen = strlen(str), + .needle = 0, + .lttr_bitfield = 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); + return 1; } + + struct truth_table *tt = + truth_table_create(ep.stack[0].expr, lxd.lttr_bitfield); + + printf( + "%zu : %d : %s\n", + tt->letters_count, + tt->lines_count, + tt->letters + ); + + truth_table_fprint(stdout, tt); + + truth_table_destroy(tt); expr_parser_finish(&ep); - return 0; } -- cgit v1.2.3