A hard challenge anyone?
Phil Davis
revdev at pdslabs.net
Sat Feb 3 13:28:56 EST 2007
Hi David,
Your problem is more of a mind-bender than I have time for right now; so my
purpose in this reply is not to solve it, but to maybe introduce another way of
looking at it.
But I just set the script of a button to your initial one-line code example:
put aFunction(bFunction(1)) + cFunction(dFunction(eFunction(fFunction(2))))
... and ran it through this code (residing in another button):
on mouseUp
put the script of btn 1 into tScript
repeat with x = 1 to the number of tokens in tScript
put token x of tScript & cr after tData
end repeat
put tData
end mouseUp
... and got this output:
put
aFunction
(
bFunction
(
1
)
)
+
cFunction
(
dFunction
(
eFunction
(
fFunction
(
2
)
)
)
)
To me this looks easier to deal with than the one-line version of same.
FWIW -
Phil Davis
David Bovill wrote:
> This is an example of a general nesting problem. take a line of Revolution
> code which contains a few nested functions:
>
> put aFunction(bFunction(1)) + cFunction(dFunction(eFunction(fFunction(2))))
>
> The function I would like to write ("extractFunctionCallsOfLine") is one
> which takes a line or Rev code like the one above and returns the names of
> the four function calls:
>
> aFunction
> bFunction
> cFunction
> dFunction
> eFunction
> fFunction
>
> I have come across this "design pattern" a few times and never been able to
> successfully deal with it - which is strange as it is fairly common /
> basic?
> It is the basic situation where you need to "parse" a nested piece of
> marked
> up text. It comes up with XML - but we can use Revs externals to help - but
> it also comes up in other situations.
>
> The problems is that the script has to figure out if what an actual node is
> - that is it needs to ignore and nested nodes and grab till the end of the
> node. In the past I have written functions which use offset to count
> forwards for opening and closing brackets - while they start simple these
> functions grow to monsters that never quite work 100% Then I tried regular
> expressions, but not quite got the hang of greedy - non-greedy etc and any
> way i am not sure they are able to figure out exactly what a "node" is and
> extract it by themselves.
>
> Well here is an the function that I have at the moment:
>
> on script_ExtractFunctionCallOfLine scriptLine, @fName, @bracketedStuff
> -- could test recursively for nested functions here
> put word 2 to -1 of scriptLine into scriptLine
> put "(.+)[^\(]*(\(.*\)).*" into regularExpression
> if matchText(scriptLine, regularExpression, fName, bracketedStuff) is
> true then
> put word -1 of fName into fName # there is a space bug in regex
> if script_DictionaryTerm(fName) is true then
> return false
> else if fName is "(" then
> return false
> else
> return true
> end if
> else
> put empty into fName
> put empty into bracketedStuff
> return false
> end if
> end script_ExtractFunctionCallOfLine
>
> The idea is to look for a function call in a script - and if so extract the
> name of the function and the stuff inside the brackets. It seems that
> providing we have already stripped out any comments and quoted text - see
> function below:
>
> on script_CleanForCalls @someScript
> script_ExtractAndStripMultiLineComments someScript, mulitLineComment
> put text_Strip(someScript, "\", space) into someScript
> put text_StripQuoted(someScript, "•••") into someScript
>
> replace "(" with " ( " in someScript
> replace ")" with " ) " in someScript
> end script_CleanForCalls
>
> ... we can know there is a function by looking for "(....)" and getting the
> word before the brackets as the function name. This seems to work with a
> few
> other checks on the function name returned.
>
> The problem is when the Rev gurus start writing nested function calls like:
>
> put someFunction(anotherFunction("Test"))
>
> So how do i extract one "node" - that is everything inside the first
> topLevel brakets - this technique would then allow the construction of a
> recursive function to extract all the function names however many nested
> levels there were - perhaps there is another way?
More information about the use-livecode
mailing list