Wiki

Ticket #66: ticket66.patch

File ticket66.patch, 3.3 KB (added by eric.sellon, 15 years ago)
  • Source/CobraParser.cobra

     
    7979    var _typeProvider as ITypeProvider? 
    8080 
    8181    var _parseCommandLineArgs as ParseCommandLineArgsSig? 
     82     
     83    var _startOfLoopFlag as bool 
     84    var _curLoopBlockDepth as int 
    8285 
    8386    cue init 
    8487        base.init 
     
    8790        _codeParts = Stack<of AbstractMethod>() 
    8891        _expectAnonymousMethodExprStack = Stack<of AnonymousMethodExpr>() 
    8992        _references = List<of String>() 
     93        _startOfLoopFlag = false 
     94        _curLoopBlockDepth = 0 
    9095 
    9196    pro typeProvider from var 
    9297 
     
    18761881                s = .branchStmt 
    18771882                expectEOL = false 
    18781883            on 'BREAK' 
     1884                if _curLoopBlockDepth == 0 
     1885                    .recordError(token, 'Cannot use "break" outside of a loop.') 
    18791886                s = .breakStmt 
    18801887            on 'CONTINUE' 
     1888                if _curLoopBlockDepth == 0 
     1889                    .recordError(token, 'Cannot use "continue" outside of a loop.') 
    18811890                s = .continueStmt 
    18821891            on 'EXPECT' 
    18831892                s = .expectStmt 
    18841893                expectEOL = false 
    18851894            on 'FOR' 
     1895                _startOfLoopFlag = true 
    18861896                s = .forStmtBeginning 
    18871897                expectEOL = false 
    18881898#           on 'DEF' 
     
    19071917            on 'PASS' 
    19081918                s = .passStmt 
    19091919            on 'POST' 
     1920                _startOfLoopFlag = true 
    19101921                s = .postWhileStmt 
    19111922                expectEOL = false 
    19121923            on 'PRINT' 
     
    19281939                s = .usingStmt 
    19291940                expectEOL = false 
    19301941            on 'WHILE' 
     1942                _startOfLoopFlag = true 
    19311943                s = .whileStmt 
    19321944                expectEOL = false 
    19331945            on 'YIELD' 
     
    23982410        """ 
    23992411        stmts = List<of Stmt>() 
    24002412        done = false 
     2413        if _startOfLoopFlag 
     2414            _startOfLoopFlag = false 
     2415            _curLoopBlockDepth += 1 
     2416        else if _curLoopBlockDepth > 0 
     2417            _curLoopBlockDepth += 1 
    24012418        if .optional('COMMA') 
    24022419            token = .last 
    24032420            stmt = .stmt 
    24042421            if stmt 
    24052422                stmts.add(stmt) 
     2423                if _curLoopBlockDepth > 0, _curLoopBlockDepth -= 1 
    24062424            else 
    24072425                .throwError('Missing statement after comma.') 
    24082426            done = true 
     
    24132431                stmt = .stmt 
    24142432                if stmt 
    24152433                    stmts.add(stmt) 
     2434                    if _curLoopBlockDepth > 0, _curLoopBlockDepth -= 1 
    24162435                else 
    24172436                    .throwError('Missing statement after colon.') 
    24182437                done = true 
     
    24232442                if stmt 
    24242443                    stmts.add(stmt) 
    24252444                if .peek.which=='DEDENT' 
     2445                    if _curLoopBlockDepth > 0, _curLoopBlockDepth -= 1 
    24262446                    break 
    24272447            if not stmts.count 
    24282448                .throwError('Missing statements in block. Add a real statement or a "pass".') 
  • Tests/820-errors/300-statements/401-continue-break-wrong-places.cobra

     
     1""" 
     2My Test 
     3""" 
     4 
     5class Program 
     6 
     7    def main 
     8        tom as int 
     9        print "hello 1" 
     10        continue # .error. continue 
     11        for tom = 0 .. 2 
     12            print tom 
     13            while true 
     14                branch tom 
     15                    on 1 
     16                        continue 
     17                    else 
     18                        tom = 1 
     19        print "hello 2" 
     20        break # .error. break 
     21        print "hello 3" 
     22        if true 
     23            continue # .error. continue 
     24        else 
     25            break # .error. break 
     26        print "hello 4" 
     27         
     28 No newline at end of file