Hi,
this is good that we are discussing these problems as the pattern syntax is
very powerful, but it has some inconsistencies.
Now I’d say that dynamic arrays should work similarly to statements and in '{
`@first . `@second . `@third }’ `@third should not match multiple “statements”
as we have a dot syntax for that.
Regarding your last example '`.head `.@tail' should not parse at all (at leas
according to what I have seen) but it does. It is parsed into a message node
with selector `.@tail and a receiver variable node `.head. It will match well
if you put a dot between statements: '`.head . `.@tail’. But yes, I’d like to
have a parser failure as dot is used for defining statement nodes…
By the way for testing purposes you can inspect something like:
RBPatternParser parseExpression: '`.head `.@tail’
and see that it is parsed into a message node.
Cheers.
Uko
> On 10 Dec 2016, at 10:05, stepharong <[email protected]> wrote:
>
> Hi nicolai
>
> I always thought that I understand and I always find a situation that totally
> confused me.
> This is why I asked some guys expert in transformation to have a look and
> they got confused.
> This is why camille teruel started to work with Mark on Phorms.
> But the effort got stalled.
>
> Stef
>
> Background :
>
> initial question:
> http://forum.world.st/RewriteTool-matching-parts-of-an-array-tp4910482.html
> <http://forum.world.st/RewriteTool-matching-parts-of-an-array-tp4910482.html>
>
> my fix :
> 18910
> <https://pharo.fogbugz.com/f/cases/18910/MNU-OrderedCollection-parent-when-trying-to-rewrite-a-tree-with-RBParseTreeRewriter>
> MNU: OrderedCollection>>parent: when trying to rewrite a tree with
> RBParseTreeRewriter
>
> the error my fix introduced :-) :
> 19445
> <https://pharo.fogbugz.com/f/cases/19445/Pattern-code-ArrayNode-matching-failure>
> Pattern code ArrayNode matching failure
>
> Question : how should a pattern with three variables (first/second/third)
> look like to match the expression
> { (1@2) . Color red . 3} and assign the (sub)-expressions
> 1@2
> Color red
> 3
> to the three variables first/second/third ?
>
> Looking at the initial question "RegisterRewriteTool matching parts of an
> array", I was suprised that
> for the pattern and the dynamic array expression:
> pattern := '{ `@first . `@second . `@third }'
> expression := '{ (1@2) . Color red . 3}'
> the third variable matches all three expressions and the first two are empty:
>
> RBPatternVariableNode(`@first)->an OrderedCollection()
> RBPatternVariableNode(`@second)->an OrderedCollection()
> RBPatternVariableNode(`@third)->an OrderedCollection(RBMessageNode((1 @ 2))
> RBMessageNode(Color red) RBLiteralValueNode(3))
>
> I fixed this in a way, that all three variables gets assigned one
> (sub)expression of the array.
> But the fix was wrong, now a statement-list-pattern-variable cannot be used
> anymore to match
> the array statements:
>
> pattern := '{ `@.stmts }'.
> expression:= RBParser parseExpression:'{ (1@2) . Color red . 3}'.
>
> results in an error during matching but I would expect the result:
> RBPatternVariableNode(`@.stmts)->an OrderedCollection(RBMessageNode((1 @ 2))
> RBMessageNode(Color red) RBLiteralValueNode(3))
>
> Now I am not sure that the pattern { `@first . `@second . `@third }' is
> actually a valid
> pattern for matching the array (sub)-expressions, the array contents
> is a list of three single statemts and @first isn't a statement pattern, but
> a pattern for an
> expression list.
>
> On the other hand, if I try to match *three statements* without the being in
> a dynamic array:
> (Note the missing curly braces)
>
> pattern := '`@first . `@second . `@third '.
> expression : parseExpression: ' (1@2) . Color red . 3'.
>
> The result works as I wanted them for the array pattern:
>
> RBPatternVariableNode(`@first)->RBMessageNode(1 @ 2)
> RBPatternVariableNode(`@second)->RBMessageNode(Color red)
> RBPatternVariableNode(`@third)->RBLiteralValueNode(3)
>
>
> So, is the pattern actually right or is the matching wrong?
> What should I expect by these patterns and expressions:
>
> pattern := '`@first . `@second . `@third '.
> expression : parseExpression: ' (1@2) . Color red . 3'.
>
> pattern := '`.first. `.second. `.third. '.
> expression := ' (1@2) . Color red . 3'.
>
> pattern := '{`.first. `.second. `.third.}'.
> expression := '{ (1@2) . Color red . 3}'.
>
> pattern := '{`@.all}'.
> expression := '{ (1@2) . Color red . 3}'.
>
>
> pattern := '{`@.all}'.
> expression := '{ (1@2) . Color red . 3}'.
>
> pattern := '`.head. `.@tail'.
> expression := '(1@2) . Color red . 3'.
>
> pattern := '{`.head. `.@tail}'.
> expression := '{(1@2) . Color red . 3}'.
>
> I would expect all statement-pattern without the dynamic array, assign the
> variables to the
> subexpressions, and the same way for the pattern with dynamic arrays.
>
> Btw, I don't know why this does not match
> pattern := '`.head `.@tail'.
> expression := '(1@2) . Color red . 3'.
>
> isn't the first variable a statement pattern ?
> From the rewrite-tool documentation
> (http://www.refactory.com/tools/refactoring-browser/rewrite-tool
> <http://www.refactory.com/tools/refactoring-browser/rewrite-tool>):
>
> ` recurse into the thing that is matched looking for more matches
> @ treat the item as a list
> ; used for messages where the message is treated as a list of messages
> in a cascade
> . treat the item as a statement in a sequence node
> # matches literals
>
>
> thanks in advance
>
> nicolai
>
>
>
>
>
>
>
> --
> Using Opera's mail client: http://www.opera.com/mail/
> <http://www.opera.com/mail/>