summaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
authorPedro Souza <pedro@masba.net>2024-04-04 01:52:22 -0300
committerPedro Souza <pedro@masba.net>2024-04-04 01:52:22 -0300
commit5a2f6687f681fa0ceff19a42ec9ddce479e67c48 (patch)
tree97fbf0acee446c267c2a71e243b239c4b61c8632 /main.c
parentc5921aec313cefa8bd6e8f4c70f057c137133028 (diff)
added truth table and expression evaluatorHEADmaster
Diffstat (limited to 'main.c')
-rw-r--r--main.c42
1 files changed, 30 insertions, 12 deletions
diff --git a/main.c b/main.c
index 0477bae..a596202 100644
--- a/main.c
+++ b/main.c
@@ -1,11 +1,14 @@
#include <stdio.h>
+#include <stdint.h>
#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;
}