Changeset 5326:c2604b2d5f08 in livinglogic.python.xist

Show
Ignore:
Timestamp:
02/08/13 20:07:01 (6 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

Reintroduce constant folding.

Location:
src/ll
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • src/ll/UL4.g

    r5313 r5326  
    421421            $node = $e.node; 
    422422            for i in range(count): 
    423                 $node = ul4c.Neg($node); 
     423                $node = ul4c.Neg.make($node); 
    424424        } 
    425425    ; 
     
    439439                '%' { cls = ul4c.Mod; } 
    440440            ) 
    441             e2=expr8 { $node = cls($node, $e2.node) } 
     441            e2=expr8 { $node = cls.make($node, $e2.node) } 
    442442        )* 
    443443    ; 
     
    453453                '-' { cls = ul4c.Sub; } 
    454454            ) 
    455             e2=expr7 { $node = cls($node, $e2.node) } 
     455            e2=expr7 { $node = cls.make($node, $e2.node) } 
    456456        )* 
    457457    ; 
     
    475475                '>=' { cls = ul4c.GE; } 
    476476            ) 
    477             e2=expr6 { $node = cls($node, $e2.node) } 
     477            e2=expr6 { $node = cls.make($node, $e2.node) } 
    478478        )* 
    479479    ; 
     
    489489            )? 
    490490            'in' 
    491             e2=expr5 { $node = cls($node, $e2.node) } 
     491            e2=expr5 { $node = cls.make($node, $e2.node) } 
    492492        )? 
    493493    ; 
     
    497497    : 
    498498        'not' 
    499         e=expr4 { $node = ul4c.Not($e.node) } 
     499        e=expr4 { $node = ul4c.Not.make($e.node) } 
    500500    | 
    501501        e=expr4 { $node = $e.node; } 
  • src/ll/UL4Lexer.py

    r5313 r5326  
    1 # $ANTLR 3.4 src/ll/UL4.g 2013-02-06 18:06:39 
     1# $ANTLR 3.4 src/ll/UL4.g 2013-02-08 19:57:09 
    22 
    33import sys 
  • src/ll/UL4Parser.py

    r5313 r5326  
    1 # $ANTLR 3.4 src/ll/UL4.g 2013-02-06 18:06:38 
     1# $ANTLR 3.4 src/ll/UL4.g 2013-02-08 19:57:08 
    22 
    33import sys 
     
    24432443                    node =  e 
    24442444                    for i in range(count): 
    2445                         node =  ul4c.Neg(node) 
     2445                        node =  ul4c.Neg.make(node) 
    24462446                             
    24472447 
     
    25802580                        if self._state.backtracking == 0: 
    25812581                            pass 
    2582                             node = cls(node, e2)  
     2582                            node = cls.make(node, e2)  
    25832583 
    25842584 
     
    26942694                        if self._state.backtracking == 0: 
    26952695                            pass 
    2696                             node = cls(node, e2)  
     2696                            node = cls.make(node, e2)  
    26972697 
    26982698 
     
    28632863                        if self._state.backtracking == 0: 
    28642864                            pass 
    2865                             node = cls(node, e2)  
     2865                            node = cls.make(node, e2)  
    28662866 
    28672867 
     
    29582958                    if self._state.backtracking == 0: 
    29592959                        pass 
    2960                         node = cls(node, e2)  
     2960                        node = cls.make(node, e2)  
    29612961 
    29622962 
     
    30213021                    if self._state.backtracking == 0: 
    30223022                        pass 
    3023                         node = ul4c.Not(e)  
     3023                        node = ul4c.Not.make(e)  
    30243024 
    30253025 
  • src/ll/ul4c.py

    r5322 r5326  
    12341234        self.obj = decoder.load() 
    12351235 
     1236    def eval(self, keepws, vars): 
     1237        obj = (yield from self.obj.eval(keepws, vars)) 
     1238        return self.evalfold(obj) 
     1239 
     1240    @classmethod 
     1241    def make(cls, obj): 
     1242        if isinstance(obj, Const): 
     1243            result = cls.evalfold(obj.value) 
     1244            if not isinstance(result, Undefined): 
     1245                return Const(result) 
     1246        return cls(obj) 
     1247 
    12361248 
    12371249@register("not") 
     
    12471259        yield from self._formatop(self.obj) 
    12481260 
    1249     def eval(self, keepws, vars): 
    1250         return not (yield from self.obj.eval(keepws, vars)) 
     1261    @classmethod 
     1262    def evalfold(cls, obj): 
     1263        return not obj 
    12511264 
    12521265 
     
    12631276        yield from self._formatop(self.obj) 
    12641277 
    1265     def eval(self, keepws, vars): 
    1266         return -(yield from self.obj.eval(keepws, vars)) 
     1278    @classmethod 
     1279    def evalfold(cls, obj): 
     1280        return -obj 
    12671281 
    12681282 
     
    13791393        self.obj2 = decoder.load() 
    13801394 
     1395    def eval(self, keepws, vars): 
     1396        obj1 = (yield from self.obj1.eval(keepws, vars)) 
     1397        obj2 = (yield from self.obj2.eval(keepws, vars)) 
     1398        return self.evalfold(obj1, obj2) 
     1399 
     1400    @classmethod 
     1401    def make(cls, obj1, obj2): 
     1402        if isinstance(obj1, Const) and isinstance(obj2, Const): 
     1403            result = cls.evalfold(obj1.value, obj2.value) 
     1404            if not isinstance(result, Undefined): 
     1405                return Const(result) 
     1406        return cls(obj1, obj2) 
     1407 
    13811408 
    13821409@register("getitem") 
     
    14021429        yield "]" 
    14031430 
    1404     def eval(self, keepws, vars): 
    1405         obj1 = (yield from self.obj1.eval(keepws, vars)) 
    1406         obj2 = (yield from self.obj2.eval(keepws, vars)) 
     1431    @classmethod 
     1432    def evalfold(cls, obj1, obj2): 
    14071433        try: 
    14081434            return obj1[obj2] 
     
    14271453        yield from self._formatop(self.obj2) 
    14281454 
    1429     def eval(self, keepws, vars): 
    1430         obj1 = (yield from self.obj1.eval(keepws, vars)) 
    1431         obj2 = (yield from self.obj2.eval(keepws, vars)) 
     1455    @classmethod 
     1456    def evalfold(cls, obj1, obj2): 
    14321457        return obj1 == obj2 
    14331458 
     
    14471472        yield from self._formatop(self.obj2) 
    14481473 
    1449     def eval(self, keepws, vars): 
    1450         obj1 = (yield from self.obj1.eval(keepws, vars)) 
    1451         obj2 = (yield from self.obj2.eval(keepws, vars)) 
     1474    @classmethod 
     1475    def evalfold(cls, obj1, obj2): 
    14521476        return obj1 != obj2 
    14531477 
     
    14671491        yield from self._formatop(self.obj2) 
    14681492 
    1469     def eval(self, keepws, vars): 
    1470         obj1 = (yield from self.obj1.eval(keepws, vars)) 
    1471         obj2 = (yield from self.obj2.eval(keepws, vars)) 
     1493    @classmethod 
     1494    def evalfold(cls, obj1, obj2): 
    14721495        return obj1 < obj2 
    14731496 
     
    14871510        yield from self._formatop(self.obj2) 
    14881511 
    1489     def eval(self, keepws, vars): 
    1490         obj1 = (yield from self.obj1.eval(keepws, vars)) 
    1491         obj2 = (yield from self.obj2.eval(keepws, vars)) 
     1512    @classmethod 
     1513    def evalfold(cls, obj1, obj2): 
    14921514        return obj1 <= obj2 
    14931515 
     
    15071529        yield from self._formatop(self.obj2) 
    15081530 
    1509     def eval(self, keepws, vars): 
    1510         obj1 = (yield from self.obj1.eval(keepws, vars)) 
    1511         obj2 = (yield from self.obj2.eval(keepws, vars)) 
     1531    @classmethod 
     1532    def evalfold(cls, obj1, obj2): 
    15121533        return obj1 > obj2 
    15131534 
     
    15271548        yield from self._formatop(self.obj2) 
    15281549 
    1529     def eval(self, keepws, vars): 
    1530         obj1 = (yield from self.obj1.eval(keepws, vars)) 
    1531         obj2 = (yield from self.obj2.eval(keepws, vars)) 
     1550    @classmethod 
     1551    def evalfold(cls, obj1, obj2): 
    15321552        return obj1 >= obj2 
    15331553 
     
    15511571        yield from self._formatop(self.obj2) 
    15521572 
    1553     def eval(self, keepws, vars): 
    1554         obj1 = (yield from self.obj1.eval(keepws, vars)) 
    1555         obj2 = (yield from self.obj2.eval(keepws, vars)) 
     1573    @classmethod 
     1574    def evalfold(cls, obj1, obj2): 
    15561575        return obj1 in obj2 
    15571576 
     
    15751594        yield from self._formatop(self.obj2) 
    15761595 
    1577     def eval(self, keepws, vars): 
    1578         obj1 = (yield from self.obj1.eval(keepws, vars)) 
    1579         obj2 = (yield from self.obj2.eval(keepws, vars)) 
     1596    @classmethod 
     1597    def evalfold(cls, obj1, obj2): 
    15801598        return obj1 not in obj2 
    15811599 
     
    15941612        yield from self._formatop(self.obj2) 
    15951613 
    1596     def eval(self, keepws, vars): 
    1597         obj1 = (yield from self.obj1.eval(keepws, vars)) 
    1598         obj2 = (yield from self.obj2.eval(keepws, vars)) 
     1614    @classmethod 
     1615    def evalfold(cls, obj1, obj2): 
    15991616        return obj1 + obj2 
    16001617 
     
    16141631        yield from self._formatop(self.obj2) 
    16151632 
    1616     def eval(self, keepws, vars): 
    1617         obj1 = (yield from self.obj1.eval(keepws, vars)) 
    1618         obj2 = (yield from self.obj2.eval(keepws, vars)) 
     1633    @classmethod 
     1634    def evalfold(cls, obj1, obj2): 
    16191635        return obj1 - obj2 
    16201636 
     
    16331649        yield from self._formatop(self.obj2) 
    16341650 
    1635     def eval(self, keepws, vars): 
    1636         obj1 = (yield from self.obj1.eval(keepws, vars)) 
    1637         obj2 = (yield from self.obj2.eval(keepws, vars)) 
     1651    @classmethod 
     1652    def evalfold(cls, obj1, obj2): 
    16381653        return obj1 * obj2 
    16391654 
     
    16531668        yield from self._formatop(self.obj2) 
    16541669 
    1655     def eval(self, keepws, vars): 
    1656         obj1 = (yield from self.obj1.eval(keepws, vars)) 
    1657         obj2 = (yield from self.obj2.eval(keepws, vars)) 
     1670    @classmethod 
     1671    def evalfold(cls, obj1, obj2): 
    16581672        return obj1 // obj2 
    16591673 
     
    16731687        yield from self._formatop(self.obj2) 
    16741688 
    1675     def eval(self, keepws, vars): 
    1676         obj1 = (yield from self.obj1.eval(keepws, vars)) 
    1677         obj2 = (yield from self.obj2.eval(keepws, vars)) 
     1689    @classmethod 
     1690    def evalfold(cls, obj1, obj2): 
    16781691        return obj1 / obj2 
    16791692 
     
    16911704        yield " and " 
    16921705        yield from self._formatop(self.obj2) 
     1706 
     1707    @classmethod 
     1708    def evalfold(cls, obj1, obj2): 
     1709        return obj1 and obj2 
    16931710 
    16941711    def eval(self, keepws, vars): 
     
    17131730        yield from self._formatop(self.obj2) 
    17141731 
     1732    @classmethod 
     1733    def evalfold(cls, obj1, obj2): 
     1734        return obj1 or obj2 
     1735 
    17151736    def eval(self, keepws, vars): 
    17161737        obj1 = (yield from self.obj1.eval(keepws, vars)) 
     
    17341755        yield from self._formatop(self.obj2) 
    17351756 
    1736     def eval(self, keepws, vars): 
    1737         obj1 = (yield from self.obj1.eval(keepws, vars)) 
    1738         obj2 = (yield from self.obj2.eval(keepws, vars)) 
     1757    @classmethod 
     1758    def evalfold(cls, obj1, obj2): 
    17391759        return obj1 % obj2 
    17401760