--- /dev/null
+
+options {
+ STATIC = false;
+}
+
+PARSER_BEGIN(FiqlParser)
+package org.opendaylight.controller.northbound.commons.query;
+
+import java.util.regex.*;
+
+/*package*/ class FiqlParser {
+ public static Expression parse(String query) throws ParseException {
+ FiqlParser parser = new FiqlParser(new java.io.StringReader(query));
+ return parser.START();
+ }
+}
+
+PARSER_END(FiqlParser)
+
+/* whitespace */
+SKIP :
+{
+ " " | "\t"
+}
+
+TOKEN : {
+ <#ALPHA : ( ["a"-"z", "A"-"Z", "0"-"9"] )+ >
+}
+
+TOKEN : {
+ <NUM : ("+"|"-")?(["0"-"9"])+"."(["0"-"9"])* >
+ |
+ <LPAREN : "(" >
+ |
+ <RPAREN : ")" >
+}
+
+/* comparision ops */
+TOKEN : {
+ <RE : ("=") >
+ |
+ <EQ : ("==" | "=eq=") >
+ |
+ <NE : ("!=" | "=ne=") >
+ |
+ <LT : ("=lt=" | "<") >
+ |
+ <LE : ("=le=" | "<=") >
+ |
+ <GT : ("=gt=" | ">") >
+ |
+ <GE : ("=ge=" | ">=") >
+}
+
+/* ops */
+TOKEN : {
+ <AND : (";" | "and") >
+ |
+ <OR : ("," | "or") >
+}
+
+/* strings */
+TOKEN : {
+ <STRING : ( ~["\"", "'", "(", ")", ";", ",", "=", "<", ">", "!", "~", " "] )+ >
+ |
+ <DQ_STRING : ( "\"" ( ~["\""] )* "\"" ) >
+ |
+ <SQ_STRING : ( "'" ( ~["'"] )* "'" ) >
+}
+
+/* Root production */
+Expression START() :
+{
+ Expression e;
+}
+{
+ e = EXPR()
+ <EOF>
+ {
+ return e;
+ }
+}
+
+Expression EXPR():
+{
+ ExpressionBuilder builder = new ExpressionBuilder();
+ Expression t;
+}
+{
+ t = TERM() { builder.withTerm(t); }
+ (
+ (<AND> t = TERM()) { builder.withAnd().withTerm(t); }
+ |
+ (<OR> t = TERM() ) { builder.withOr().withTerm(t); }
+ )*
+ {
+ return builder.build();
+ }
+}
+
+Expression TERM() :
+{
+ Token selector, arg;
+ Expression exp;
+ CompareExpression.OP op;
+}
+{
+ selector = <STRING>
+ (
+ ( <EQ> {op=CompareExpression.OP.EQ;} |
+ <RE> {op=CompareExpression.OP.RE;} |
+ <NE> {op=CompareExpression.OP.NE;} |
+ <LT> {op=CompareExpression.OP.LT;} |
+ <LE> {op=CompareExpression.OP.LE;} |
+ <GT> {op=CompareExpression.OP.GT;} |
+ <GE> {op=CompareExpression.OP.GE;}
+ )
+ ( arg = <STRING> | arg = <DQ_STRING> | arg = <SQ_STRING> | arg = <NUM>)
+ ) { return new CompareExpression(op, selector.image, arg.image); }
+ |
+ (
+ <LPAREN> exp = EXPR() <RPAREN>
+ ) { return exp; }
+}