Hello Gisela, On 21 août 2013, at 15:43, Gisela Decuzzi wrote:
Hello, I'm trying to understand how to define a correct pattern and I'm lost with the cases where I use a method pattern and the desired code is inside a block. In the case where we search (methods) with metavariables and the code is inside a block.
An Example:
This pattern `a: `aa `b: `bb | `@temps | ``@.Stats. ``@.some size ``@.more. ``@.Stats2.
Putting a dot after the @ means that you want to match statements. So '``@.some size' cannot match: 'arg1 size'.
Does not match with: insideABlock: arg1 part2: arg2 |temp1 temp3| [arg1 size]. temp1 := arg2 + 3. ^arg2
Then even if you remove the extra dots, the rule won't match the method you give. This is because this method has no statements matching '``@some size' (even if it has a block that has a statement that can). So here is a rule that can match your method: `a: `aa `b: `bb | `@temps | `@.stms1. [ `@rcv size ]. `@.stms2.
After looking while I realize that is not matching with part1: arg1 part2: arg2 |temp1 temp2 temp3| arg1 size. temp1 := arg2 + 3. ^arg2
This one however can be matched by your rule (without the extra dots). I think that you should try to parse expressions instead of full methods (RBParseTreeSearcher>>#matches:do: instead of RBParseTreeSearcher>>#matchesMethod:do:). You could just try to match '`@rcv size': it would succeed in both methods.
Until I understand: ``@.some size ``@.more. This should mean: anything that sends the message size, doesn't matter if we have something before or after, I think that this expression should match both cases.
But maybe I'm missunderstanding the patterns (again).
It should work like that (modulo bugs) ` denotes a metavariable adding @ means you're looking for a list of elements ex: `receiver `@msg: `@arg matches every message adding a . means you're looking for a statement (or a list of statement if you combine it with @) adding # means you're looking for a literal adding another ` means that the pattern will be searched recursively in each subexpressions even if the top one already matched it sometimes leads to infinite loops, but I don't remember exactly when ex: in 'foo bar bar' : if you search for '`rcv bar' you'll find one match ('foo bar bar') if you search for '``rcv bar' you'll find two matches ('foo bar' and 'foo bar bar'). and I think it's all
Any help with this will be really welcome!