David Costanzo created JEXL-346:
-----------------------------------
Summary: namespace function syntax leads to strange error for
"common case" of ternary operator
Key: JEXL-346
URL: https://issues.apache.org/jira/browse/JEXL-346
Project: Commons JEXL
Issue Type: Improvement
Affects Versions: 3.1
Reporter: David Costanzo
The "namespace function call" syntax has precedence over the "ternary operator"
syntax, which leads to a strange error message for something that should
intuitively work:
{code:java}
x != null ? x : myfunc(y){code}
Here, {{x}} and {{y}} are String objects and {{myfunc}} is a registered library
function that is implemented in JEXL. In JEXL 3.1 this results in the error:
{{myfile.jexl:211@1:25 parsing error in ''}}
With the source code that's currently in github the error is a little better
but still confusing:
{{myfile.jexl:211@1:25 parsing error in ')'}}
The error is because the expression is parsed as:
{code:java}
x != null ? (x:myfunc(y)){code}
That is, the function name is taken to be {{x:myfunc}} despite the spaces and
despite the fact that my application doesn't support namespaces. This swallows
up the colon, leaving the ternary operation incomplete when the end of the
expression is reached.
This function name is parsed as {{x:myfunc}} because of the first rule in
FunctionCallLookahead in Parser.jjt.
{code:java}
void FunctionCallLookahead() #void : {}
{
LOOKAHEAD(4) <IDENTIFIER> <COLON> <IDENTIFIER> <LPAREN>
|
LOOKAHEAD(2) <IDENTIFIER> <LPAREN>
|
LOOKAHEAD(2) <REGISTER> <LPAREN>
}{code}
There are many ways to adjust the expression so that it parses as intended. The
hard part is for the JEXL programmer to understand what's going on.
I'd prefer for my application to treat the above JEXL expression as a ternary
operation, perhaps by requiring that there is no whitespace between the
namespace and the function name, or perhaps by disabling the "namespace
function" parsing as a JexlFeature. Failing that, it'd be nice to have a
somewhat clearer error message like "unable to locate the : in ternary
operation". With a stronger error message, a web search might explain the
problem.
h4. Impact
This was encountered by one of our application's JEXL programmers. She was
mystified and reported it to a member of the application's development team.
After an hour of trial-and-error, he worked out a solution by extra parens and
then reported this to me. After several hour of stepping through the JEXL
internals, I finally figured out what was going on. That JavaCC-generated code
takes some patience!
The JEXL programmer is not a purist and doesn't care that she had to add some
extra parens to get it to work. Mostly, I would like to save my other JEXL
programmers from a similar frustration and associated support cost.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)