On Mon, Aug 29, 2011 at 10:18 AM, Claus Ibsen <claus.ib...@gmail.com> wrote: > Hi > > The current Simple language in camel-core has reached its potential in > terms of maintenance and how easy it would be, for example to add new > functions and operators. Likewise the current error reporting is not > precise to point out where in the expression String the problem is. > > The implementation is using regular expressions, and that is one of > the key problems. I think we have grown to the limit how it is to > maintain. > > So I have experimented this weekend to build a prototype based on the > principle of a recursive descent parser > http://en.wikipedia.org/wiki/Recursive_descent_parser > > I at first looked into using a parser framework such as JavaCC and > ANTLR. The former would be able to parse the input, but building the > AST nodes would require to use its tree compiler, which was not maven > exposed. Likewise JavaCC is not really maintained anymore. People on > stackoverflow recommended ANTLR. It has more bells ans whistles, but > as far as I could see ANTLR requires JAR files in the runtime. > > And frankly I just wanted a fairly simple code, that anybody, would be > able to look into and help with. > > So I cracked up some prototype code based on the principle from that > wikipedia article above. > > So far I got a working prototype that is much better at parsing and > reporting exactly where the problem is. > For example suppose you do a predicate in a content based router, such as: > > <simple>${header.high} = true</simple> > > Notice how I have mistyped the == operator, as there is only one = sign. > > In the old code, the reg exp parser would not catch this problem, and > the predicate would be evaluated to true, at runtime. There is two > reasons for that. The old parser is not good at detecting errors and > being able to pin point the problem. The grammer is not really defined > that well, as its based on a somewhat complicated regular expression. > The 2nd issues is the old parser would evaluate both predicates and > expressions, as expressions first, and then convert the expression to > a predicate. So in that given example above, it would be rendered as > "someHeaderValue = true" as an expression. And when converted to a > predicate it would be true, as the expression is not empty. > > The new parser in the prototype is improved as it > - runs in two modes: predicate or expression > - has a grammer and is able to parse the input, and report precisely > where the problem is. > > So for example what you see now is > > org.apache.camel.language.simple.SimpleIllegalSyntaxException: > unexpected character symbol at location 15 > ${header.high} = true > * > > And then there is a * sign below where the problem is. Now if you > would show above text using monospaced font, you would see the star > below the = sign. > > The exception message can be improved even more, as we could say > something about an unknown operator, etc. > > Likewise I decided to let the new simple language be more restrictive > in terms of function placeholders. I decided that you now must always > use ${ } placeholders, as it makes the parsing easier, as well as for > end users, there is no confusion. > > header.high == true > Should be written as > ${header.high} == true > > > The prototype is currently in my github at > https://github.com/davsclaus/camel-simple2 > > > There is still some work to do > - implement the remainder binary operators (basically copy code from > old and adjust a little bit)
All the existing binary operators is now implemented and unit test from camel-core passes. > - add support for "and" and "or" grouping operators, I am inclined to > rename them to "&&" and "||" which is the operators you would use in The logical operators and|or have been added, but named && and || to be more inline with other languages. > Java code etc. > - add support for "++" and "--" unary operators, so people for example > can use that to increment a counter in XML DSL without using any java > code Unary operators ++ and -- have been implemented. You can also use them in expressions so you can auto inc a header counter etc. <setHeader headerName="counter"> <simple>${header.counter}++</simple> </setHeader> Which have been requested in the community. > - possible add support for ( ) groups so you can define precedences > - possible add support for math operators if they would make sense > - refine error messages just a tad > - the parser is currently not thread safe, so we may want to refine > this (it stores some state during parsing) > - after parsing there is a bit logic to prepare the AST before we turn > it into Camel expression/predicates. Especially due to blocks and > binary operators. We may relax this as the binary operators could > potential "whirl through" the whitespace noise and be able to detect > its right and left hand side expressions. Currently I am removing any > in between noise, so the right/left hand side is exactly next-to the > operator. > > > So if anyone wanna help out, or have ideas for improvements, or have > any grief with the old simple language, that we can fix in the new > code, then fell free to help out. > > > > > -- > Claus Ibsen > ----------------- > FuseSource > Email: cib...@fusesource.com > Web: http://fusesource.com > Twitter: davsclaus, fusenews > Blog: http://davsclaus.blogspot.com/ > Author of Camel in Action: http://www.manning.com/ibsen/ > -- Claus Ibsen ----------------- FuseSource Email: cib...@fusesource.com Web: http://fusesource.com Twitter: davsclaus, fusenews Blog: http://davsclaus.blogspot.com/ Author of Camel in Action: http://www.manning.com/ibsen/