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
my fix :
18910 MNU: OrderedCollection>>parent: when trying to rewrite a tree with
RBParseTreeRewriter
the error my fix introduced :-) :
19445 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)-expressions1@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):
` 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/