Imported Debian patch 0.13.1-3
[pkg-lisaac.git] / src / external / arithmetic / expr_not.li
blobf94579dc70d47e0e06376528ddd8a664fd2dc898
1 ///////////////////////////////////////////////////////////////////////////////
2 //                             Lisaac Compiler                               //
3 //                                                                           //
4 //                   LSIIT - ULP - CNRS - INRIA - FRANCE                     //
5 //                                                                           //
6 //   This program is free software: you can redistribute it and/or modify    //
7 //   it under the terms of the GNU General Public License as published by    //
8 //   the Free Software Foundation, either version 3 of the License, or       //
9 //   (at your option) any later version.                                     //
10 //                                                                           //
11 //   This program is distributed in the hope that it will be useful,         //
12 //   but WITHOUT ANY WARRANTY; without even the implied warranty of          //
13 //   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           //
14 //   GNU General Public License for more details.                            //
15 //                                                                           //
16 //   You should have received a copy of the GNU General Public License       //
17 //   along with this program.  If not, see <http://www.gnu.org/licenses/>.   //
18 //                                                                           //
19 //                     http://isaacproject.u-strasbg.fr/                     //
20 ///////////////////////////////////////////////////////////////////////////////
21 Section Header
22   
23   + name        := EXPR_NOT;
25   - copyright   := "2003-2007 Benoit Sonntag";
27   
28   - author      := "Sonntag Benoit (bsonntag@loria.fr)";
29   - comment     := "Not unary arithmetic expression.";
30   
31 Section Inherit
32   
33   + parent_expr_unary:Expanded EXPR_UNARY;
34   
35 Section Private  
36   
37   - symbol:CHARACTER <- '~';
38     
39   //
40   // Execute.
41   //
42   
43   - exec_conservator:EXPR <-
44   //-- ~ (~ E1 & ~ E2) -> E1 | E2
45   //-- ~ (~ E1 | ~ E2) -> E1 & E2
46   //-- ~ ~ E -> E
47   ( + or:EXPR_OR;
48     + and:EXPR_AND;
49     + neg1,neg2:EXPR_NOT;
50     + result:EXPR;
51     
52     and ?= right;
53     (and != NULL).if {
54       neg1 ?= and.left;
55       neg2 ?= and.right;
56       ((neg1 != NULL) && {neg2 != NULL}).if {
57         result := EXPR_OR.create position with (neg1.right) and (neg2.right);
58       };
59     } else {
60       or ?= right;
61       (or != NULL).if {
62         neg1 ?= or.left;
63         neg2 ?= or.right;
64         ((neg1 != NULL) && {neg2 != NULL}).if {
65           result := EXPR_AND.create position with (neg1.right) and (neg2.right);
66         };
67       } else {
68         neg1 ?= right;
69         (neg1 != NULL).if {
70           result := neg1.right;
71         };
72       };
73     };
74     result
75   );
76   
77   - exec_right right_cst:INTEGER_CST :EXPR <- 
78   //-- ~ C1 -> C2
79   ( + result:EXPR;
80     (right_cst.is_signed).if {
81       right_cst.set_value (~ right_cst.value);
82       result := right_cst;
83     };
84     result
85   );  
86   
87