Wiki

Ticket #341: spaceWrap.patch

File spaceWrap.patch, 2.4 KB (added by hopscc, 11 years ago)
  • CobraTokenizer.cobra

     
    217217            r'CARET             s   ^', 
    218218            r'TILDE             s   ~', 
    219219 
    220             r'EQ                s   ==', 
     220            r'EQ                s   ==', 
    221221            r'NE                s   <>', 
    222222            r'LT                s   <', 
    223223            r'GT                s   >', 
     
    239239            r'DOUBLE_LT_EQUALS      s   <<=', 
    240240            r'DOUBLE_GT_EQUALS      s   >>=', 
    241241 
     242#           r'QUESTION_DOT      s   ?.', 
    242243            r'QUESTION_EQUALS   s   ?=', 
    243244            r'BANG_EQUALS       s   !=', 
    244245        ] 
     
    259260        return tokens 
    260261 
    261262    ## popular single chars 
    262      
     263/#   
    263264    def makeASSIGN(definition as String) as TokenDef? 
    264265        return CharTokenDef('ASSIGN', c'=') 
    265266     
     
    282283        return CharTokenDef('RBRACKET', c']') 
    283284     
    284285    ## end popular single chars 
    285      
     286#/   
    286287    ## popular strings 
    287288     
    288289    def makeDOTDOT(definition as String) as TokenDef? 
     
    494495        .throwError('Ambiguous comment at /#. For an end-of-line comment, put a space between / and #. For an inline comment, end it with #/. For a block comment, put /# at the beginning of a line.') 
    495496        return .commentToken(tok) 
    496497 
     498    var _lastSpaceToken as IToken? # keep to detect spaces between tokens 
     499             
    497500    def onSPACE(tok as IToken) as IToken? 
    498501        # eat these 
     502        _lastSpaceToken = tok 
    499503        return nil 
    500504 
    501505    def onAT_ID(tok as IToken) as IToken? 
     
    733737        tok.value = s 
    734738        return tok 
    735739 
     740    var _parenDepth = 0 
    736741 
     742    def onLPAREN(tok as IToken) as IToken? 
     743        _parenDepth += 1 
     744        return tok 
     745         
     746    def onRPAREN(tok as IToken) as IToken? 
     747        if _parenDepth >0, _parenDepth -= 1 
     748        return tok 
     749     
     750    # enforcing formatting for space wrapped operators 
     751    def onASSIGN(tok as IToken) as IToken? 
     752        return _chkSpaceWrap(tok) 
     753 
     754    def onEQ(tok as IToken) as IToken? 
     755        return _chkSpaceWrap(tok) 
     756             
     757    def _chkSpaceWrap(tok as IToken) as IToken? 
     758        c = _sourceLine[0] 
     759        #I think this is less annoying if only ops outside enclosing () are forced space wrapped  
     760        # e.g ASSIGN: name = (t0=foo).bar  
     761        if _parenDepth == 0 and (not (.lastToken.charNum < _lastSpaceToken.charNum) or not (c == c' ' or c == c'\t')) 
     762            .recordError('Need at least one whitespace character around the operator ("[tok.text]" ([tok.which])).') 
     763        else 
     764            return tok 
     765        return nil 
     766         
    737767    ## 
    738768    ## String substitution handling 
    739769    ## 
     
    13081338        assert state == 3 or state == 4 
    13091339        return TokenMatch(input) 
    13101340 
    1311  
    13121341class SpaceTokenDef inherits TokenDef 
    13131342     
    13141343    test