Skip to content

Commit 6a5f79f

Browse files
authored
Merge pull request #8 from sillydan1/implication-operator
Add implication (=>) operator
2 parents 5b5d820 + f941004 commit 6a5f79f

File tree

11 files changed

+30
-2
lines changed

11 files changed

+30
-2
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2121
# SOFTWARE.
2222
cmake_minimum_required(VERSION 3.21)
23-
project(expr VERSION 1.4.0)
23+
project(expr VERSION 1.5.0)
2424
include(cmake/CPM.cmake)
2525
configure_file(src/config.h.in config.h)
2626
set(CMAKE_CXX_STANDARD 20)

include/drivers/interpreter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ namespace expr {
4747
auto _and(const symbol_value_t &a, const symbol_value_t &b) -> symbol_value_t override { return and_(a,b); }
4848
auto _or(const symbol_value_t &a, const symbol_value_t &b) -> symbol_value_t override { return or_(a,b); }
4949
auto _xor(const symbol_value_t &a, const symbol_value_t &b) -> symbol_value_t override { return xor_(a,b); }
50+
auto _implies(const symbol_value_t &a, const symbol_value_t &b) -> symbol_value_t override { return implies_(a,b); }
5051

5152
auto gt(const symbol_value_t &a, const symbol_value_t &b) -> symbol_value_t override { return gt_(a,b); }
5253
auto ge(const symbol_value_t &a, const symbol_value_t &b) -> symbol_value_t override { return ge_(a,b); }

include/symbol_table.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ namespace expr {
8080

8181
enum class operator_type_t {
8282
minus, plus, star, slash, percent, hat,
83-
_and, _or, _xor, _not,
83+
_and, _or, _xor, _not, _implies,
8484
gt, ge, ne, ee, le, lt,
8585
parentheses
8686
};

src/drivers/interpreter.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ namespace expr {
8484
case operator_type_t::_or: v = boolean._or(eval_wrapper(tree.children[0]), eval_wrapper(tree.children[1])); break;
8585
case operator_type_t::_xor: v = boolean._xor(eval_wrapper(tree.children[0]), eval_wrapper(tree.children[1])); break;
8686
case operator_type_t::_not: v = boolean._not(eval_wrapper(tree.children[0])); break;
87+
case operator_type_t::_implies: v = boolean._implies(eval_wrapper(tree.children[0]), eval_wrapper(tree.children[1])); break;
8788
case operator_type_t::gt: v = comparator.gt(eval_wrapper(tree.children[0]), eval_wrapper(tree.children[1])); break;
8889
case operator_type_t::ge: v = comparator.ge(eval_wrapper(tree.children[0]), eval_wrapper(tree.children[1])); break;
8990
case operator_type_t::ne: v = comparator.ne(eval_wrapper(tree.children[0]), eval_wrapper(tree.children[1])); break;

src/drivers/z3_driver.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ namespace expr {
157157
case operator_type_t::_or: v = as_z3_expression(tree.children[0]) || as_z3_expression(tree.children[1]); break;
158158
case operator_type_t::_xor: v = as_z3_expression(tree.children[0]) xor as_z3_expression(tree.children[1]); break;
159159
case operator_type_t::_not: v =!as_z3_expression(tree.children[0]); break;
160+
case operator_type_t::_implies: v = implies(as_z3_expression(tree.children[0]),as_z3_expression(tree.children[1])); break;
160161
case operator_type_t::gt: v = (as_z3_expression(tree.children[0]) > as_z3_expression(tree.children[1])); break;
161162
case operator_type_t::ge: v = (as_z3_expression(tree.children[0]) >= as_z3_expression(tree.children[1])); break;
162163
case operator_type_t::ne: v = (as_z3_expression(tree.children[0]) != as_z3_expression(tree.children[1])); break;

src/operations.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ namespace expr {
4444
virtual auto _and(const symbol_value_t &a, const symbol_value_t &b) -> symbol_value_t = 0;
4545
virtual auto _or(const symbol_value_t &a, const symbol_value_t &b) -> symbol_value_t = 0;
4646
virtual auto _xor(const symbol_value_t &a, const symbol_value_t &b) -> symbol_value_t = 0;
47+
virtual auto _implies(const symbol_value_t& a, const symbol_value_t& b) -> symbol_value_t = 0;
4748
};
4849
struct compare_operator {
4950
virtual auto gt(const symbol_value_t &a, const symbol_value_t &b) -> symbol_value_t = 0;

src/operations/boolean.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,13 @@ auto t_lt(const T1&, const T2&) {
9595
throw std::domain_error(ss.str());
9696
return nullptr; // Must return something
9797
}
98+
template<typename T1, typename T2>
99+
auto t_implies(const T1&, const T2&) {
100+
std::ostringstream ss{};
101+
ss << "Unable to imply (=>) types " << typeid(T1).name() << " and " << typeid(T2).name();
102+
throw std::domain_error(ss.str());
103+
return nullptr; // Must return something
104+
}
98105

99106
template<>
100107
auto t_and(const bool& a, const bool& b) {
@@ -112,6 +119,11 @@ template<>
112119
auto t_not(const bool& a) {
113120
return !a;
114121
}
122+
template<>
123+
auto t_implies(const bool& a, const bool& b) {
124+
if(a) return b;
125+
return true;
126+
}
115127

116128
auto t_gt(const int& a, const int& b) {return a > b;}
117129
auto t_gt(const int& a, const float& b) {return a > b;}
@@ -206,3 +218,8 @@ symbol_value_t lt_(const symbol_value_t& a, const symbol_value_t& b) {
206218
FUNC_IMPL(a, t_lt, b, res);
207219
return res;
208220
}
221+
symbol_value_t implies_(const symbol_value_t& a, const symbol_value_t& b) {
222+
symbol_value_t res{};
223+
FUNC_IMPL(a, t_implies, b, res);
224+
return res;
225+
}

src/operations/boolean.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ expr::symbol_value_t ee_(const expr::symbol_value_t& a, const expr::symbol_value
3333
expr::symbol_value_t ne_(const expr::symbol_value_t& a, const expr::symbol_value_t& b);
3434
expr::symbol_value_t le_(const expr::symbol_value_t& a, const expr::symbol_value_t& b);
3535
expr::symbol_value_t lt_(const expr::symbol_value_t& a, const expr::symbol_value_t& b);
36+
expr::symbol_value_t implies_(const expr::symbol_value_t& a, const expr::symbol_value_t& b);
3637
// TODO: These operators are ambiguous with symbol_value_t && std::false_type / std::true_type for some reason.
3738
//symbol_value_t operator&&(const symbol_value_t& a, const symbol_value_t& b);
3839
//symbol_value_t operator||(const symbol_value_t& a, const symbol_value_t& b);

src/parser/parser.y

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
AND "&&"
6767
OR "||"
6868
XOR "^^"
69+
IMPLIES "=>"
6970
GT ">"
7071
GE ">="
7172
EE "=="
@@ -96,6 +97,7 @@
9697
%left AND
9798
%left GT GE EE NE LE LT
9899
%left PLUS MINUS STAR SLASH PERCENT HAT
100+
%left IMPLIES
99101
%precedence LPAREN NOT
100102
%%
101103
%start unit;
@@ -138,6 +140,7 @@ bin_op:
138140
| exp LT exp { $$ = expr::syntax_tree_t{expr::operator_t{expr::operator_type_t::lt}}.concat($1).concat($3); }
139141
| exp OR exp { $$ = expr::syntax_tree_t{expr::operator_t{expr::operator_type_t::_or}}.concat($1).concat($3); }
140142
| exp XOR exp { $$ = expr::syntax_tree_t{expr::operator_t{expr::operator_type_t::_xor}}.concat($1).concat($3); }
143+
| exp IMPLIES exp { $$ = expr::syntax_tree_t{expr::operator_t{expr::operator_type_t::_implies}}.concat($1).concat($3); }
141144
| exp AND exp { $$ = expr::syntax_tree_t{expr::operator_t{expr::operator_type_t::_and}}.concat($1).concat($3); }
142145
;
143146

src/parser/scanner.l

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ type int|long|float|double|string|bool|var|auto
147147
"&&" return yy::parser::make_AND (loc);
148148
"||" return yy::parser::make_OR (loc);
149149
"^^" return yy::parser::make_XOR (loc);
150+
"=>" return yy::parser::make_IMPLIES(loc);
150151
">" return yy::parser::make_GT (loc);
151152
">=" return yy::parser::make_GE (loc);
152153
"==" return yy::parser::make_EE (loc);

0 commit comments

Comments
 (0)