Changeset 5347:da430915bf69 in livinglogic.python.xist for src/ll/UL4.g

Show
Ignore:
Timestamp:
02/13/13 18:18:43 (7 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

Store source code start/end offsets for all AST nodes.

This simplifies str output of most nodes, as they can simply output the
appropriate slice of the original source code.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/ll/UL4.g

    r5336 r5347  
    2929def recoverFromMismatchedSet(self, input, e, follow): 
    3030    raise e 
     31 
     32def start(self, token): 
     33   return self.location.startcode + token.start 
     34 
     35def end(self, token): 
     36   return self.location.startcode + token.stop + 1 
    3137} 
    3238 
     
    137143    ; 
    138144 
    139  
    140145/* Rules common to all tags */ 
    141146 
    142147none returns [node] 
    143     : NONE { $node = ul4c.Const(self.location, None) } 
     148    : NONE { $node = ul4c.Const(self.location, self.start($NONE), self.end($NONE), None) } 
    144149    ; 
    145150 
    146151true_ returns [node] 
    147     : TRUE { $node = ul4c.Const(self.location, True) } 
     152    : TRUE { $node = ul4c.Const(self.location, self.start($TRUE), self.end($TRUE), True) } 
    148153    ; 
    149154 
    150155false_ returns [node] 
    151     : FALSE { $node = ul4c.Const(self.location, False) } 
     156    : FALSE { $node = ul4c.Const(self.location, self.start($FALSE), self.end($FALSE), False) } 
    152157    ; 
    153158 
    154159int_ returns [node] 
    155     : INT { $node = ul4c.Const(self.location, int($INT.text, 0)) } 
     160    : INT { $node = ul4c.Const(self.location, self.start($INT), self.end($INT), int($INT.text, 0)) } 
    156161    ; 
    157162 
    158163float_ returns [node] 
    159     : FLOAT { $node = ul4c.Const(self.location, float($FLOAT.text)) } 
     164    : FLOAT { $node = ul4c.Const(self.location, self.start($FLOAT), self.end($FLOAT), float($FLOAT.text)) } 
    160165    ; 
    161166 
    162167string returns [node] 
    163     : STRING { $node = ul4c.Const(self.location, ast.literal_eval($STRING.text)) } 
     168    : STRING { $node = ul4c.Const(self.location, self.start($STRING), self.end($STRING), ast.literal_eval($STRING.text)) } 
    164169    ; 
    165170 
    166171date returns [node] 
    167     : DATE { $node = ul4c.Const(self.location, datetime.datetime(*map(int, [f for f in ul4c.datesplitter.split($DATE.text[2:-1]) if f]))) } 
     172    : DATE { $node = ul4c.Const(self.location, self.start($DATE), self.end($DATE), datetime.datetime(*map(int, [f for f in ul4c.datesplitter.split($DATE.text[2:-1]) if f]))) } 
    168173    ; 
    169174 
    170175color returns [node] 
    171     : COLOR { $node = ul4c.Const(self.location, color.Color.fromrepr($COLOR.text)) } 
     176    : COLOR { $node = ul4c.Const(self.location, self.start($COLOR), self.end($COLOR), color.Color.fromrepr($COLOR.text)) } 
    172177    ; 
    173178 
    174179name returns [node] 
    175     : NAME { $node = ul4c.Var(self.location, $NAME.text) } 
     180    : NAME { $node = ul4c.Var(self.location, self.start($NAME), self.end($NAME), $NAME.text) } 
    176181    ; 
    177182 
     
    191196list returns [node] 
    192197    : 
    193         '[' 
    194         ']' { $node = ul4c.List(self.location) } 
     198        bracket_open='[' 
     199        bracket_close=']' { $node = ul4c.List(self.location, self.start($bracket_open), self.end($bracket_close)) } 
    195200    | 
    196         '[' {$node = ul4c.List(self.location) } 
     201        bracket_open='[' {$node = ul4c.List(self.location, self.start($bracket_open), None) } 
    197202        e1=expr1 { $node.items.append($e1.node) } 
    198203        ( 
     
    201206        )* 
    202207        ','? 
    203         ']' 
     208        bracket_close=']' { $node.end = self.end($bracket_close) } 
    204209    ; 
    205210 
     
    210215    } 
    211216    : 
    212         '[' 
     217        bracket_open='[' 
    213218        item=expr1 
    214219        'for' 
     
    220225            condition=expr1 { _condition = $condition.node; } 
    221226        )? 
    222         ']' { $node = ul4c.ListComp(self.location, $item.node, $n.varname, $container.node, _condition) } 
     227        bracket_close=']' { $node = ul4c.ListComp(self.location, self.start($bracket_open), self.end($bracket_close), $item.node, $n.varname, $container.node, _condition) } 
    223228    ; 
    224229 
     
    234239dict returns [node] 
    235240    : 
    236         '{' 
    237         '}' { $node = ul4c.Dict(self.location) } 
     241        brace_open='{' 
     242        brace_close='}' { $node = ul4c.Dict(self.location, self.start($brace_open), self.end($brace_close)) } 
    238243    | 
    239         '{' { $node = ul4c.Dict(self.location) } 
     244        brace_open='{' { $node = ul4c.Dict(self.location, self.start($brace_open), None) } 
    240245        i1=dictitem { $node.items.append($i1.node) } 
    241246        ( 
     
    244249        )* 
    245250        ','? 
    246         '}' 
     251        brace_close='}' { $node.end = self.end($brace_close) } 
    247252    ; 
    248253 
     
    253258    } 
    254259    : 
    255         '{' 
     260        brace_open='{' 
    256261        key=expr1 
    257262        ':' 
     
    265270            condition=expr1 { _condition = $condition.node; } 
    266271        )? 
    267         '}' { $node = ul4c.DictComp(self.location, $key.node, $value.node, $n.varname, $container.node, _condition) } 
     272        brace_close='}' { $node = ul4c.DictComp(self.location, self.start($brace_open), self.end($brace_close), $key.node, $value.node, $n.varname, $container.node, _condition) } 
    268273    ; 
    269274 
     
    271276    @init 
    272277    { 
    273         _condition = None; 
     278        _condition = None 
     279        _end = None 
    274280    } 
    275281    : 
    276         item=expr1 
     282        item=expr1 { _start = $item.node.start } 
    277283        'for' 
    278284        n=nestedname 
    279285        'in' 
    280         container=expr1 
     286        container=expr1 { _end = $container.node.end } 
    281287        ( 
    282288            'if' 
    283             condition=expr1 { _condition = $condition.node; } 
    284         )? { $node = ul4c.GenExpr(self.location, $item.node, $n.varname, $container.node, _condition) } 
     289            condition=expr1 { _condition = $condition.node; _end = $condition.node.end } 
     290        )? { $node = ul4c.GenExpr(self.location, $item.node.start, _end, $item.node, $n.varname, $container.node, _condition) } 
    285291    ; 
    286292 
     
    328334            /* Attribute access */ 
    329335            '.' 
    330             n=name { $node = ul4c.GetAttr(self.location, $node, $n.text) } 
     336            n=name { $node = ul4c.GetAttr(self.location, $node.start, self.end($n.stop), $node, $n.text) } 
    331337        | 
    332338            /* Function/method call */ 
    333             '(' { $node = ul4c.CallMeth(self.location, $node.obj, $node.attrname) if isinstance($node, ul4c.GetAttr) else ul4c.CallFunc(self.location, $node) } 
     339            '(' { $node = ul4c.CallMeth(self.location, $node.start, None, $node.obj, $node.attrname) if isinstance($node, ul4c.GetAttr) else ul4c.CallFunc(self.location, $node.start, None, $node) } 
    334340            ( 
    335341                /* No arguments */ 
     
    383389                ','? 
    384390            ) 
    385             ')' 
     391            paren_close=')' { $node.end = self.end($paren_close) } 
    386392        | 
    387393            /* Item/slice access */ 
     
    391397                ( 
    392398                    e2=expr1 { index2 = $e2.node; } 
    393                 )? { $node = ul4c.GetSlice(self.location, $node, None, index2) } 
     399                )? { $node = ul4c.GetSlice(self.location, $node.start, None, $node, None, index2) } 
    394400            | 
    395401                e2=expr1 { index1 = $e2.node; } 
     
    399405                        e3=expr1 { index2 = $e3.node; } 
    400406                    )? 
    401                 )? { $node = ul4c.GetSlice(self.location, $node, index1, index2) if slice else ul4c.GetItem(self.location, $node, index1) } 
     407                )? { $node = ul4c.GetSlice(self.location, $node.start, None, $node, index1, index2) if slice else ul4c.GetItem(self.location, $e1.node.start, None, $node, index1) } 
    402408            ) 
    403             ']' 
     409            bracket_close=']' { $node.end = self.end($bracket_close) } 
    404410        )* 
    405411    ; 
     
    407413/* Negation */ 
    408414expr8 returns [node] 
    409     @init 
    410     { 
    411         count = 0; 
    412     } 
    413     : 
    414         ( 
    415             '-' { count += 1; } 
    416         )* 
    417         e=expr9 { 
    418             $node = $e.node; 
    419             for i in range(count): 
    420                 $node = ul4c.Neg.make(self.location, $node); 
    421         } 
     415    : 
     416        e1=expr9 { $node = $e1.node; } 
     417    | 
     418        minus='-' e2=expr8 { $node = ul4c.Neg.make(self.location, self.start($minus), $e2.node.end, $e2.node) } 
    422419    ; 
    423420 
     
    436433                '%' { cls = ul4c.Mod; } 
    437434            ) 
    438             e2=expr8 { $node = cls.make(self.location, $node, $e2.node) } 
     435            e2=expr8 { $node = cls.make(self.location, $node.start, $e2.node.end, $node, $e2.node) } 
    439436        )* 
    440437    ; 
     
    450447                '-' { cls = ul4c.Sub; } 
    451448            ) 
    452             e2=expr7 { $node = cls.make(self.location, $node, $e2.node) } 
     449            e2=expr7 { $node = cls.make(self.location, $node.start, $e2.node.end, $node, $e2.node) } 
    453450        )* 
    454451    ; 
     
    472469                '>=' { cls = ul4c.GE; } 
    473470            ) 
    474             e2=expr6 { $node = cls.make(self.location, $node, $e2.node) } 
     471            e2=expr6 { $node = cls.make(self.location, $node.start, $e2.node.end, $node, $e2.node) } 
    475472        )* 
    476473    ; 
     
    479476expr4 returns [node] 
    480477    : 
    481         e1=expr5 { $node = $e1.node; } 
    482         ( 
    483             { cls = ul4c.Contains; } 
     478        e1=expr5 { $node = $e1.node } 
     479        ( 
     480            { cls = ul4c.Contains } 
    484481            ( 
    485                 'not' { cls = ul4c.NotContains; } 
     482                'not' { cls = ul4c.NotContains } 
    486483            )? 
    487484            'in' 
    488             e2=expr5 { $node = cls.make(self.location, $node, $e2.node) } 
     485            e2=expr5 { $node = cls.make(self.location, $node.start, $e2.node.end, $node, $e2.node) } 
    489486        )? 
    490487    ; 
     
    493490expr3 returns [node] 
    494491    : 
    495         'not' 
    496         e=expr4 { $node = ul4c.Not.make(self.location, $e.node) } 
     492        e1=expr4 { $node = $e1.node; } 
    497493    | 
    498         e=expr4 { $node = $e.node; } 
     494        n='not' e2=expr3 { $node = ul4c.Not.make(self.location, self.start($n), $e2.node.end, $e2.node) } 
    499495    ; 
    500496 
     
    506502        ( 
    507503            'and' 
    508             e2=expr3 { $node = ul4c.And(self.location, $node, $e2.node) } 
     504            e2=expr3 { $node = ul4c.And(self.location, $node.start, $e2.node.end, $node, $e2.node) } 
    509505        )* 
    510506    ; 
     
    516512        ( 
    517513            'or' 
    518             e2=expr2 { $node = ul4c.Or(self.location, $node, $e2.node) } 
     514            e2=expr2 { $node = ul4c.Or(self.location, $node.start, $e2.node.end, $node, $e2.node) } 
    519515        )* 
    520516    ; 
     
    537533        n=nestedname 
    538534        'in' 
    539         e=expr1 { $node = ul4c.For(self.location, $n.varname, $e.node) } 
     535        e=expr1 { $node = ul4c.For(self.location, self.start($n.start), $e.node.end, $n.varname, $e.node) } 
    540536        EOF 
    541537    ; 
     
    545541 
    546542statement returns [node] 
    547     : nn=nestedname '=' e=expr1 EOF { $node = ul4c.StoreVar(self.location, $nn.varname, $e.node) } 
    548     | n=name '+=' e=expr1 EOF { $node = ul4c.AddVar(self.location, $n.text, $e.node) } 
    549     | n=name '-=' e=expr1 EOF { $node = ul4c.SubVar(self.location, $n.text, $e.node) } 
    550     | n=name '*=' e=expr1 EOF { $node = ul4c.MulVar(self.location, $n.text, $e.node) } 
    551     | n=name '/=' e=expr1 EOF { $node = ul4c.TrueDivVar(self.location, $n.text, $e.node) } 
    552     | n=name '//=' e=expr1 EOF { $node = ul4c.FloorDivVar(self.location, $n.text, $e.node) } 
    553     | n=name '%=' e=expr1 EOF { $node = ul4c.ModVar(self.location, $n.text, $e.node) } 
     543    : nn=nestedname '=' e=expr1 EOF { $node = ul4c.StoreVar(self.location, self.start($nn.start), $e.node.end, $nn.varname, $e.node) } 
     544    | n=name '+=' e=expr1 EOF { $node = ul4c.AddVar(self.location, self.start($n.start), $e.node.end, $n.text, $e.node) } 
     545    | n=name '-=' e=expr1 EOF { $node = ul4c.SubVar(self.location, self.start($n.start), $e.node.end, $n.text, $e.node) } 
     546    | n=name '*=' e=expr1 EOF { $node = ul4c.MulVar(self.location, self.start($n.start), $e.node.end, $n.text, $e.node) } 
     547    | n=name '/=' e=expr1 EOF { $node = ul4c.TrueDivVar(self.location, self.start($n.start), $e.node.end, $n.text, $e.node) } 
     548    | n=name '//=' e=expr1 EOF { $node = ul4c.FloorDivVar(self.location, self.start($n.start), $e.node.end, $n.text, $e.node) } 
     549    | n=name '%=' e=expr1 EOF { $node = ul4c.ModVar(self.location, self.start($n.start), $e.node.end, $n.text, $e.node) } 
    554550    | e=expression EOF { $node = $e.node } 
    555551    ;