[Pharo-project] learning rewrite rules

Stéphane Ducasse stephane.ducasse at inria.fr
Thu Nov 4 09:49:48 CET 2010


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
> 





More information about the Pharo-project mailing list