Changeset 3471:7b1eb0fd73fe in livinglogic.python.xist

Show
Ignore:
Timestamp:
07/09/08 13:13:07 (11 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

Implement break and continue tags.

Files:
4 modified

Legend:

Unmodified
Added
Removed
  • docs/UL4.rst

    r3458 r3471  
    205205 
    206206if ``items`` is an iterable containing lists with two elements. 
     207 
     208 
     209``break`` 
     210--------- 
     211 
     212The ``break`` tag can be used to break out of the innermost running loop. 
     213 
     214 
     215``continue`` 
     216------------ 
     217 
     218The ``continue`` tag can be used skip the rest of the loop body of the innermost 
     219running loop. 
    207220 
    208221 
  • src/ll/ul4c.py

    r3470 r3471  
    306306    ``"endfor"``: 
    307307        End the innermost running ``for`` loop. 
     308 
     309    ``"break"``: 
     310        Breaks the innermost running ``for`` loop. 
     311 
     312    ``"continue"``: 
     313        Continues the innermost running ``for`` loop (i.e. jumps back to the 
     314        start of the loop body). 
    308315 
    309316    ``"if"``: 
     
    511518        elif self.code == "endfor": 
    512519            return "endfor" 
     520        elif self.code == "break": 
     521            return "break" 
     522        elif self.code == "continue": 
     523            return "continue" 
    513524        elif self.code == "if": 
    514525            return "if r%r" % self.r1 
     
    596607    returns a generator) or :meth:`renders` (which returns a string). 
    597608    """ 
    598     version = "3" 
     609    version = "4" 
    599610 
    600611    def __init__(self): 
     
    858869                    indent -= 1 
    859870                    _code("# end for") 
     871                elif opcode.code == "break": 
     872                    _code("break") 
     873                elif opcode.code == "continue": 
     874                    _code("continue") 
    860875                elif opcode.code == "not": 
    861876                    _code("reg%d = not reg%d" % (opcode.r1, opcode.r2)) 
     
    10801095        or non-tag text. It will be called by :meth:`_compile` internally. 
    10811096        """ 
    1082         pattern = u"%s(print|code|for|if|elif|else|end|render)(\s*((.|\\n)*?)\s*)?%s" % (re.escape(startdelim), re.escape(enddelim)) 
     1097        pattern = u"%s(print|code|for|if|elif|else|end|break|continue|render)(\s*((.|\\n)*?)\s*)?%s" % (re.escape(startdelim), re.escape(enddelim)) 
    10831098        pos = 0 
    10841099        for match in re.finditer(pattern, source): 
     
    11881203                    parsefor(self) 
    11891204                    stack.append(("for",)) 
     1205                elif location.type == "break": 
     1206                    if not any(entry[0] == "for" for entry in stack): 
     1207                        raise BlockError("break outside of for loop") 
     1208                    self.opcode("break") 
     1209                elif location.type == "continue": 
     1210                    if not any(entry[0] == "for" for entry in stack): 
     1211                        raise BlockError("continue outside of for loop") 
     1212                    self.opcode("continue") 
    11901213                elif location.type == "render": 
    11911214                    parserender(self) 
  • src/ll/xist/ns/ul4.py

    r3424 r3471  
    6969class for_(xsc.ProcInst): 
    7070    xmlname = "for" 
     71 
     72 
     73class break_(xsc.ProcInst): 
     74    xmlname = "break" 
     75 
     76 
     77class continue_(xsc.ProcInst): 
     78    xmlname = "continue" 
  • test/test_ul4.py

    r3469 r3471  
    262262def test_for_nested(): 
    263263    check('[(1)(2)][(3)(4)]', '<?for list in data?>[<?for n in list?>(<?print n?>)<?end for?>]<?end for?>', data=[[1, 2], [3, 4]]) 
     264 
     265 
     266def test_break(): 
     267    check('1, 2, ', '<?for i in [1,2,3]?><?print i?>, <?if i==2?><?break?><?end if?><?end for?>') 
     268 
     269 
     270def test_break_nested(): 
     271    check('1, 1, 2, 1, 2, 3, ', '<?for i in [1,2,3,4]?><?for j in [1,2,3,4]?><?print j?>, <?if j>=i?><?break?><?end if?><?end for?><?if i>=3?><?break?><?end if?><?end for?>') 
     272 
     273 
     274def test_continue(): 
     275    check('1, 3, ', '<?for i in [1,2,3]?><?if i==2?><?continue?><?end if?><?print i?>, <?end for?>') 
     276 
     277 
     278def test_continue_nested(): 
     279    check('1, 3, \n1, 3, \n', '<?for i in [1,2,3]?><?if i==2?><?continue?><?end if?><?for j in [1,2,3]?><?if j==2?><?continue?><?end if?><?print j?>, <?end for?>\n<?end for?>') 
    264280 
    265281