<section>
  <title>Java JMS Selector Syntax</title>
  <para>The AMQP Java JMS Messaging Client supports the following syntax for JMS selectors.</para>

<programlisting><![CDATA[
Comments:

  LINE_COMMENT: "--" (~["\n","\r"])* EOL
  EOL: "\n"|"\r"|"\r\n"
  BLOCK_COMMENT: "/*" (~["*"])* "*" ("*" | (~["*","/"] (~["*"])* "*"))* "/"

Reserved Words (case insensitive):

  NOT:     "NOT"
  AND:     "AND"
  OR:      "OR"
  BETWEEN: "BETWEEN"
  LIKE:    "LIKE"
  ESCAPE:  "ESCAPE"
  IN:      "IN"
  IS:      "IS"
  TRUE:    "TRUE"
  FALSE:   "FALSE"
  NULL:    "NULL"

Literals (case insensitive):

  DECIMAL_LITERAL:        ["1"-"9"] (["0"-"9"])* (["l","L"])?
  HEX_LITERAL:            "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+
  OCTAL_LITERAL:          "0" (["0"-"7"])*
  FLOATING_POINT_LITERAL: (   (["0"-"9"])+ "." (["0"-"9"])* (<EXPONENT>)? // matches: 5.5 or 5. or 5.5E10 or 5.E10
                            | "." (["0"-"9"])+ (<EXPONENT>)?              // matches: .5 or .5E10
                            | (["0"-"9"])+ <EXPONENT> )                   // matches: 5E10
  EXPONENT:               "E" (["+","-"])? (["0"-"9"])+
  STRING_LITERAL:         "'" ( ("''") | ~["'"] )*  "'"

Identifiers (case insensitive):

  ID : ["a"-"z", "_", "$"] (["a"-"z","0"-"9","_", "$"])*
  QUOTED_ID : "\"" ( ("\"\"") | ~["\""] )*  "\""

Grammar:

  JmsSelector          := orExpression
  orExpression         := ( andExpression ( <OR> andExpression )* )
  andExpression        := ( equalityExpression ( <AND> equalityExpression )* )
  equalityExpression   := ( comparisonExpression (   "=" comparisonExpression
                                                   | "<>" comparisonExpression
                                                   | <IS> <NULL>
                                                   | <IS> <NOT> <NULL> )* )
  comparisonExpression := ( addExpression (   ">" addExpression
                                            | ">=" addExpression
                                            | "<" addExpression
                                            | "<=" addExpression
                                            | <LIKE> stringLitteral ( <ESCAPE> stringLitteral )?
                                            | <NOT> <LIKE> <STRING_LITERAL> ( <ESCAPE> <STRING_LITERAL> )?
                                            | <BETWEEN> addExpression <AND> addExpression
                                            | <NOT> <BETWEEN> addExpression <AND> addExpression
                                            | <IN> "(" <STRING_LITERAL> ( "," <STRING_LITERAL> )* ")"
                                            | <NOT> <IN> "(" <STRING_LITERAL> ( "," <STRING_LITERAL> )* ")" )* )
  addExpression        := multExpr ( ( "+" multExpr | "-" multExpr ) )*
  multExpr             := unaryExpr ( "*" unaryExpr | "/" unaryExpr | "%" unaryExpr )*
  unaryExpr            := ( "+" unaryExpr | "-" unaryExpr | <NOT> unaryExpr | primaryExpr )
  primaryExpr          := ( literal | variable | "(" orExpression ")" )
  literal              := (   <STRING_LITERAL>
                            | <DECIMAL_LITERAL>
                            | <HEX_LITERAL>
                            | <OCTAL_LITERAL>
                            | <FLOATING_POINT_LITERAL>
                            | <TRUE>
                            | <FALSE>
                            | <NULL> )
  variable             := ( <ID> | <QUOTED_ID> )
]]></programlisting>

</section>