options { MULTI=true; NODE_DEFAULT_VOID=true; STATIC=false; } PARSER_BEGIN(QLParser) package org.apache.ode.ql.jcc; import java.io.*; class QLParser { } PARSER_END(QLParser) SKIP : { " " | "\t" | "\n" | "\r" } TOKEN : { < LESS: "<" > | < GREATER: ">" > | < LE: "<=" > | < GE: ">=" > | < IN: "in" > | < LIKE: "like" > | < AND: "and" > | < OR: "or" > | < EQUAL: "=" > | < ORDER_BY: "order" ()+ "by" ()+ > | < ORDER_TYPE: "asc" | "desc" > | < PARAMETER_CHAR: "?" > | < LIMIT: "limit" ()+ > | < NUMBER: (["0"-"9"])+ > | < PROPERTY: ("$")("{""}")?() > | < #NAMESPACE: ( | )* > | < #QNAME_NAME: ( | )* > | < FIELD: ( | )* > | < VALUE: "\"" (~["\""])* "\"" > | < #LETTER: ["_","-",".","a"-"z","A"-"Z"] > | < #SPEC_CHAR: ["*","&","?",":","%"] > | < #DIGIT: ["0","1","2","3","4","5","6","7","8","9"] > | < #WHITESPACE: [" ", "\t", "\n", "\r"] > } ASTStart start() #Start : {} { Query() { return jjtThis; } } void Query() : {} { [LogicExpression()] [OrderByExpression()] [Limit()] } void Limit() #Limit : { Token t; } { () ( t= { jjtn000.setNumber(t.image); } ) } void LogicExpression() : {} { ORExpression() } void OrderByExpression() #OrderBy : {} { OrderByField() ("," OrderByField())* } void OrderByField() #OrderByField : {} { Field() (OrderType())? } void OrderType() #OrderType : { Token t; } { t= { jjtn000.setValue(t.image); } } void ORExpression() : {} { ( ANDExpression() ( ANDExpression())* )#Or(>1) } void ANDExpression() : {} { ( CompareExpression() ( CompareExpression())* )#And(>1) } void CompareExpression() : {} { Identifier() ( Equal() | LessExpression() | GreaterExpression() | LEExpression() | GEExpression() | InExpression() | Like() ) | "(" LogicExpression() ")" } void Equal() #Equal(2) : {} { Value() } void Like() #Like(2) : {} { Value() } void LessExpression() #Less(2) : {} { Value() } void GreaterExpression() #Greater(2) : {} { Value() } void LEExpression() #LE(2) : {} { Value() } void GEExpression() #GE(2) : {} { Value() } void InExpression() #In(2) : {} { InValuesExpression() } void InValuesExpression() #InValues : {} { "(" [(Value() ("," Value())*)] ")" } void Identifier() : {} { Field() | Property() } void Field() #Field : { Token t; } { t= { jjtn000.setName(t.image); } } void Property() #Property : { Token t; } { t={ jjtn000.setName(t.image); } } void Value() #Value : { Token t; } { t= { jjtn000.setValue(t.image); } | }