[Pharo-project] learning rewrite rules

Stéphane Ducasse stephane.ducasse at inria.fr
Thu Nov 4 10:06:28 CET 2010


in the pharo by example git hub repository now I check that there is only an emtpy doc and your paper :).

I hope that I did not throw away what I wrote :(

Stef


On Nov 4, 2010, at 9:56 AM, Lukas Renggli wrote:

> Yeah, where do I find that chapter?
> 
> There is a section on the AST matching/search in my PhD as Helvetia
> builds on top of it. Not on the AST rewriting though, Helvetia uses a
> different mechanism there. Still it might be a good start.
> 
> Lukas
> 
> On 4 November 2010 09:49, Stéphane Ducasse <stephane.ducasse at inria.fr> wrote:
>> lukas
>> 
>> I would love to have a chapter on Rules. I have a starter that I wrote long time ago for the squeak french book
>> but it would be cool if you could add to it.
>> 
>> Stef
>> 
>> On Nov 4, 2010, at 12:55 AM, Lukas Renggli wrote:
>> 
>>>> If I try to match it like:
>>>>  '`@browser showOn: `@target; from: `@origin; using: [ `@browser ``@.statements]'
>>> 
>>> The match expression
>>> 
>>>    `@browser ``@.statements
>>> 
>>> doesn't make sense. Statements (.) cannot be a message selector that
>>> would be expected after a receiver. Also, you cannot have a selector
>>> list (@) if you don't give also an argument list to match. So the
>>> closest valid thing is
>>> 
>>>    `@browser `message
>>> 
>>> which looks for unary message sends (recursive is not necessary here
>>> either, because there is nothing to recurse into), or
>>> 
>>>    `@browser `@message: ``@message
>>> 
>>> which looks for arbitrary message sends and recursively into all arguments.
>>> 
>>>> It seems to only get those appearances which contain a single appearance of browser inside the block.
>>> 
>>> As I wrote in the previous mail you need to do it with nested
>>> rewrites. Inside the block you match for any sequence of statements:
>>> 
>>>    `@.statements
>>> 
>>> And as replacement you use the `{ :context | ... } trick to perform a
>>> new rewrite somehow along the following untested lines:
>>> 
>>>    `{ :context |
>>>        RBParseTreeRewriter new
>>>            " replace whatever matched to `@browser with the variable a "
>>>            replaceTree: (context at: '`@browser') with: (RBParser
>>> parseExpression: 'a');
>>>            " execute on the list of statements "
>>>            executeTree: (context at: '`@.statements');
>>>            " return the rewritten tree "
>>>            tree }
>>> 
>>> Cheers,
>>> Lukas
>>> 
>>> --
>>> Lukas Renggli
>>> www.lukas-renggli.ch
>>> 
>> 
>> 
>> 
> 
> 
> 
> -- 
> Lukas Renggli
> www.lukas-renggli.ch
> 





More information about the Pharo-project mailing list