A simple way to parse/check equations?



Hi
I have s problem and I was wondering that is there an easy
solution to the following problem.

I have some kind of Maxima equation with functions and possible variables.
Now I need to determine that all function calls are correct  and if not 
then display the incorrect function name with call parameters (call
parameters are not mandatory but it would be nice).

For example if we have the equation  sin(ex(x)+1)+2, where the ex() is an
unknown incorrect function, then the right output would be ex(x). Note
that since sin is correct and it has right number of parameters it
should not display sin(ex(x)+1) . Also note that when testing
the validity of these functions, all validity tests must be done with
original parameter set, for example
diff(x,x,1); is valid but
diff(x,1) is not (this is gives an error, but could be any function 
really).

So it is not enough just parse the function names in a list without call
parameters. (The biggest problem with a text parse is that it is difficult 
to say which parentheses closes the function call, since there could be 
quite many parentheses)

This function must be able to work with more complicated logic as
sqrt(log(y)+tan(x))+cos(y+sin(ex(x)+1))
and recursion must go all the way down.


Final thoughts:
Unknown()-function in Maxima is very useful but it is not enough. I need
to form a tree(or something like that) and possible even replace some
functions in order to evaluate these (how to replace functions? String 
parse?). For example in equation sin(ex(x)+1)+2, it is not enough to just 
simply parse the equation into
sin(ex(x)+1)
ex(x)
1
2.

sin(ex(x)+1) is not valid according to unknown() because of
ex()-function. So we need to make some kind of substitution that would
transform sin(ex(x)+1) into sin(z+1) and then use unknown()-function.
(z is some kind of symbol).

Trust me this is not a joke. As a matter a fact I have implemented this
in a clever way but unfortunately it did not meet all the above 
requirements so it was rejected. Any solution to this problem must comply 
with  all the conditions given above(well a small improvement is better 
than nothing). So therefore I am asking your help. Can anyone help me?

I might be able to patch my original code to work if there exist a
Maxima function that is able to say if system has some function. This
function must work with strings. Strings are essential since they are the
only objects that are easily extractable by function
tokens(string,alphacharp), For example to check if system has a function
cos(x) i have the string "cos".