34 typedef typename parser_t::settings_store settings_t;
36 symbol_table_t symbol_table;
38 expression_t expression;
39 expression.register_symbol_table(symbol_table);
41 static const std::size_t compile_options =
42 settings_t::e_replacer +
43 settings_t::e_joiner +
44 settings_t::e_numeric_check +
45 settings_t::e_bracket_check +
46 settings_t::e_sequence_check +
47 settings_t::e_strength_reduction +
48 settings_t::e_disable_usr_on_rsrvd;
50 parser_t parser(settings_t(compile_options)
51 .disable_all_base_functions ()
52 .disable_all_control_structures());
54 parser.enable_unknown_symbol_resolver();
56 parser.dec().collect_variables() =
true;
57 parser.dec().collect_functions() =
true;
59 if (!parser.compile(boolean_expression,expression))
61 printf(
"Error: %s\tExpression: %s\n",
62 parser.error().c_str(),
63 boolean_expression.c_str());
65 for (std::size_t i = 0; i < parser.error_count(); ++i)
67 err_t error = parser.get_error(i);
69 printf(
"Error: %02d Position: %02d "
74 static_cast<int>(error.token.position),
76 error.diagnostic.c_str(),
77 boolean_expression.c_str());
81 printf(
"Error[%02d] at line: %d column: %d\n",
83 static_cast<int>(error.line_no),
84 static_cast<int>(error.column_no));
90 typedef typename parser_t::dependent_entity_collector::symbol_t dec_symbol_t;
92 std::deque<dec_symbol_t> symbol_list;
94 parser.dec().symbols(symbol_list);
96 if (symbol_list.empty())
98 printf(
"Error: No variables found to build truth table.\n");
102 for (std::size_t i = 0; i < symbol_list.size(); ++i)
106 symbol_list.erase(symbol_list.begin() + i);
108 if (i >= symbol_list.size())
112 if (parser_t::e_st_function == symbol_list[i].second)
114 printf(
"Error: call to function '%s' not allowed.\n",symbol_list[i].first.c_str());
119 if (symbol_list.size() > 32)
121 printf(
"Error: no more than 32 unique variables allowed.\n");
125 unsigned int upper_bound = 1 << symbol_list.size();
127 const int index_width =
static_cast<int>(std::ceil(std::log10(upper_bound)));
130 printf(
" #%s ",std::string(index_width - 1,
' ').c_str());
132 for (std::size_t i = 0; i < symbol_list.size(); ++i)
134 printf(
"| %s ",symbol_list[i].first.c_str());
137 printf(
"| %s \n",boolean_expression.c_str());
139 for (std::size_t i = 0; i < upper_bound; ++i)
141 for (std::size_t j = 0; j < symbol_list.size(); ++j)
143 symbol_table.get_variable(symbol_list[j].first)->ref() = T((i & (1 << (symbol_list.size() - j - 1))) ? 0 : 1);
146 const std::size_t result =
static_cast<std::size_t
>(expression.value());
148 printf(
" %*d ", index_width,
static_cast<int>(i));
150 for (std::size_t j = 0; j < symbol_list.size(); ++j)
152 printf(
"| %d ",
static_cast<int>(symbol_table.get_variable(symbol_list[j].first)->value()));
155 printf(
"| %d \n",
static_cast<int>(result));