Changeset 920:6090c7799c51 in livinglogic.java.ul4

Show
Ignore:
Timestamp:
12/23/13 09:52:10 (4 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

Implement if expressions.

Files:
1 added
4 modified

Legend:

Unmodified
Added
Removed
  • pom.xml

    r916 r920  
    44    <groupId>com.livinglogic</groupId> 
    55    <artifactId>ul4</artifactId> 
    6     <version>0.91</version> 
     6    <version>0.92</version> 
    77    <packaging>jar</packaging> 
    88    <name>UL4</name> 
  • src/main/antlr3/com/livinglogic/ul4/UL4.g

    r910 r920  
    245245    | 
    246246        open='[' {$node = new com.livinglogic.ul4.List(location, getStart($open), -1); } 
    247         e1=expr_or { $node.append($e1.node); } 
     247        e1=expr_if { $node.append($e1.node); } 
    248248        ( 
    249249            ',' 
    250             e2=expr_or { $node.append($e2.node); } 
     250            e2=expr_if { $node.append($e2.node); } 
    251251        )* 
    252252        ','? 
     
    261261    : 
    262262        open='[' 
    263         item=expr_or 
     263        item=expr_if 
    264264        'for' 
    265265        n=nestedlvalue 
    266266        'in' 
    267         container=expr_or 
     267        container=expr_if 
    268268        ( 
    269269            'if' 
    270             condition=expr_or { _condition = $condition.node; } 
     270            condition=expr_if { _condition = $condition.node; } 
    271271        )? 
    272272        close=']' { $node = new ListComprehension(location, getStart($open), getEnd($close), $item.node, $n.lvalue, $container.node, _condition); } 
     
    277277dictitem returns [DictItem node] 
    278278    : 
    279         k=expr_or 
     279        k=expr_if 
    280280        ':' 
    281         v=expr_or { $node = new DictItemKeyValue($k.node, $v.node); } 
     281        v=expr_if { $node = new DictItemKeyValue($k.node, $v.node); } 
    282282    | 
    283283        '**' 
    284         d=expr_or { $node = new DictItemDict($d.node); } 
     284        d=expr_if { $node = new DictItemDict($d.node); } 
    285285    ; 
    286286 
     
    307307    : 
    308308        open='{' 
    309         key=expr_or 
     309        key=expr_if 
    310310        ':' 
    311         value=expr_or 
     311        value=expr_if 
    312312        'for' 
    313313        n=nestedlvalue 
    314314        'in' 
    315         container=expr_or 
     315        container=expr_if 
    316316        ( 
    317317            'if' 
    318             condition=expr_or { _condition = $condition.node; } 
     318            condition=expr_if { _condition = $condition.node; } 
    319319        )? 
    320320        close='}' { $node = new DictComprehension(location, getStart($open), getEnd($close), $key.node, $value.node, $n.lvalue, $container.node, _condition); } 
     
    328328    } 
    329329    : 
    330         item=expr_or 
     330        item=expr_if 
    331331        'for' 
    332332        n=nestedlvalue 
    333333        'in' 
    334         container=expr_or { _end = $container.node.getEnd(); } 
     334        container=expr_if { _end = $container.node.getEnd(); } 
    335335        ( 
    336336            'if' 
    337             condition=expr_or { _condition = $condition.node; _end = $condition.node.getEnd(); } 
     337            condition=expr_if { _condition = $condition.node; _end = $condition.node.getEnd(); } 
    338338        )? { $node = new GeneratorExpression(location, $item.node.getStart(), _end, $item.node, $n.lvalue, $container.node, _condition); } 
    339339    ; 
     
    346346    | e_dictcomp=dictcomprehension { $node = $e_dictcomp.node; } 
    347347    | open='(' e_genexpr=generatorexpression close=')' { $node = $e_genexpr.node; $node.setStart(getStart($open)); $node.setEnd(getEnd($close)); } 
    348     | open='(' e_bracket=expr_or close=')' { $node = $e_bracket.node; $node.setStart(getStart($open)); $node.setEnd(getEnd($close)); } 
     348    | open='(' e_bracket=expr_if close=')' { $node = $e_bracket.node; $node.setStart(getStart($open)); $node.setEnd(getEnd($close)); } 
    349349    ; 
    350350 
     
    444444                ':' 
    445445                ( 
    446                     e2=expr_or { index2 = $e2.node; } 
     446                    e2=expr_if { index2 = $e2.node; } 
    447447                )? { $node = Slice.make(location, $e1.node.getStart(), -1, $node, null, index2); } 
    448448            | 
    449                 e2=expr_or { index1 = $e2.node; } 
     449                e2=expr_if { index1 = $e2.node; } 
    450450                ( 
    451451                    ':' { slice = true; } 
    452452                    ( 
    453                         e3=expr_or { index2 = $e3.node; } 
     453                        e3=expr_if { index2 = $e3.node; } 
    454454                    )? 
    455455                )? { $node = slice ? Slice.make(location, $e1.node.getStart(), -1, $node, index1, index2) : Item.make(location, $e1.node.getStart(), -1, $node, index1); } 
     
    579579    ; 
    580580 
     581/* If expression operator */ 
     582expr_if returns [AST node] 
     583    : 
     584        e1=expr_or { $node = $e1.node; } 
     585        ( 
     586            'if' 
     587            e2=expr_or 
     588            'else' 
     589            e3=expr_or { $node = IfExpression.make(location, $e1.node.getStart(), $e3.node.getEnd(), $e1.node, $e2.node, $e3.node); } 
     590        )? 
     591    ; 
     592 
    581593exprarg returns [AST node] 
    582594    : ege=generatorexpression { $node = $ege.node; } 
    583     | e1=expr_or { $node = $e1.node; } 
     595    | e1=expr_if { $node = $e1.node; } 
    584596    ; 
    585597 
    586598expression returns [AST node] 
    587599    : ege=generatorexpression EOF { $node = $ege.node; } 
    588     | e=expr_or EOF { $node = $e.node; } 
     600    | e=expr_if EOF { $node = $e.node; } 
    589601    ; 
    590602 
     
    596608        n=nestedlvalue 
    597609        'in' 
    598         e=expr_or { $node = new For(location, location.getStartCode(), $e.node.getEnd(), $n.lvalue, $e.node); } 
     610        e=expr_if { $node = new For(location, location.getStartCode(), $e.node.getEnd(), $n.lvalue, $e.node); } 
    599611        EOF 
    600612    ; 
     
    604616 
    605617stmt returns [AST node] 
    606     : nn=nestedlvalue '=' e=expr_or EOF { $node = new SetVar(location, location.getStartCode(), $e.node.getEnd(), $nn.lvalue, $e.node); } 
    607     | n=expr_subscript '+=' e=expr_or EOF { if ($n.node instanceof LValue) $node = new AddVar(location, location.getStartCode(), $e.node.getEnd(), (LValue)$n.node, $e.node); else throw new RuntimeException("lvalue required"); } 
    608     | n=expr_subscript '-=' e=expr_or EOF { if ($n.node instanceof LValue) $node = new SubVar(location, location.getStartCode(), $e.node.getEnd(), (LValue)$n.node, $e.node); else throw new RuntimeException("lvalue required"); } 
    609     | n=expr_subscript '*=' e=expr_or EOF { if ($n.node instanceof LValue) $node = new MulVar(location, location.getStartCode(), $e.node.getEnd(), (LValue)$n.node, $e.node); else throw new RuntimeException("lvalue required"); } 
    610     | n=expr_subscript '//=' e=expr_or EOF { if ($n.node instanceof LValue) $node = new FloorDivVar(location, location.getStartCode(), $e.node.getEnd(), (LValue)$n.node, $e.node); else throw new RuntimeException("lvalue required"); } 
    611     | n=expr_subscript '/=' e=expr_or EOF { if ($n.node instanceof LValue) $node = new TrueDivVar(location, location.getStartCode(), $e.node.getEnd(), (LValue)$n.node, $e.node); else throw new RuntimeException("lvalue required"); } 
    612     | n=expr_subscript '%=' e=expr_or EOF { if ($n.node instanceof LValue) $node = new ModVar(location, location.getStartCode(), $e.node.getEnd(), (LValue)$n.node, $e.node); else throw new RuntimeException("lvalue required"); } 
     618    : nn=nestedlvalue '=' e=expr_if EOF { $node = new SetVar(location, location.getStartCode(), $e.node.getEnd(), $nn.lvalue, $e.node); } 
     619    | n=expr_subscript '+=' e=expr_if EOF { if ($n.node instanceof LValue) $node = new AddVar(location, location.getStartCode(), $e.node.getEnd(), (LValue)$n.node, $e.node); else throw new RuntimeException("lvalue required"); } 
     620    | n=expr_subscript '-=' e=expr_if EOF { if ($n.node instanceof LValue) $node = new SubVar(location, location.getStartCode(), $e.node.getEnd(), (LValue)$n.node, $e.node); else throw new RuntimeException("lvalue required"); } 
     621    | n=expr_subscript '*=' e=expr_if EOF { if ($n.node instanceof LValue) $node = new MulVar(location, location.getStartCode(), $e.node.getEnd(), (LValue)$n.node, $e.node); else throw new RuntimeException("lvalue required"); } 
     622    | n=expr_subscript '//=' e=expr_if EOF { if ($n.node instanceof LValue) $node = new FloorDivVar(location, location.getStartCode(), $e.node.getEnd(), (LValue)$n.node, $e.node); else throw new RuntimeException("lvalue required"); } 
     623    | n=expr_subscript '/=' e=expr_if EOF { if ($n.node instanceof LValue) $node = new TrueDivVar(location, location.getStartCode(), $e.node.getEnd(), (LValue)$n.node, $e.node); else throw new RuntimeException("lvalue required"); } 
     624    | n=expr_subscript '%=' e=expr_if EOF { if ($n.node instanceof LValue) $node = new ModVar(location, location.getStartCode(), $e.node.getEnd(), (LValue)$n.node, $e.node); else throw new RuntimeException("lvalue required"); } 
    613625    | e=expression EOF { $node = $e.node; } 
    614626    ; 
  • src/main/java/com/livinglogic/ul4/InterpretedTemplate.java

    r910 r920  
    726726        Utils.register("de.livinglogic.ul4.slice", new ObjectFactory(){ public UL4ONSerializable create() { return new com.livinglogic.ul4.Slice(null, -1, -1, null, null, null); }}); 
    727727        Utils.register("de.livinglogic.ul4.not", new ObjectFactory(){ public UL4ONSerializable create() { return new com.livinglogic.ul4.Not(null, -1, -1, null); }}); 
     728        Utils.register("de.livinglogic.ul4.ifexpr", new ObjectFactory(){ public UL4ONSerializable create() { return new com.livinglogic.ul4.IfExpression(null, -1, -1, null, null, null); }}); 
    728729        Utils.register("de.livinglogic.ul4.neg", new ObjectFactory(){ public UL4ONSerializable create() { return new com.livinglogic.ul4.Neg(null, -1, -1, null); }}); 
    729730        Utils.register("de.livinglogic.ul4.print", new ObjectFactory(){ public UL4ONSerializable create() { return new com.livinglogic.ul4.Print(null, -1, -1, null); }}); 
  • src/test/java/tests/UL4Test.java

    r912 r920  
    990990        checkTemplateOutput("True", source, "x", false); 
    991991        checkTemplateOutput("False", source, "x", 42); 
     992    } 
     993 
     994    @Test 
     995    public void expression_if() 
     996    { 
     997        String source = "<?print x if y else z?>"; 
     998 
     999        checkTemplateOutput("23", source, "x", 17, "y", false, "z", 23); 
     1000        checkTemplateOutput("17", source, "x", 17, "y", true, "z", 23); 
    9921001    } 
    9931002