You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rj...@apache.org on 2014/07/10 01:18:58 UTC

svn commit: r1609337 [1/2] - in /lucene/dev/trunk/lucene: ./ expressions/src/java/org/apache/lucene/expressions/ expressions/src/java/org/apache/lucene/expressions/js/ expressions/src/test/org/apache/lucene/expressions/ expressions/src/test/org/apache/...

Author: rjernst
Date: Wed Jul  9 23:18:58 2014
New Revision: 1609337

URL: http://svn.apache.org/r1609337
Log:
LUCENE-5806: Extend expression grammar to allow advanced "variables"

Added:
    lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/VariableContext.java   (with props)
    lucene/dev/trunk/lucene/expressions/src/test/org/apache/lucene/expressions/js/TestVariableContext.java   (with props)
Modified:
    lucene/dev/trunk/lucene/CHANGES.txt
    lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/SimpleBindings.java
    lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/Javascript.g
    lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/Javascript.tokens
    lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptCompiler.java
    lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptLexer.java
    lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptParser.java
    lucene/dev/trunk/lucene/expressions/src/test/org/apache/lucene/expressions/TestDemoExpressions.java
    lucene/dev/trunk/lucene/expressions/src/test/org/apache/lucene/expressions/js/TestJavascriptCompiler.java

Modified: lucene/dev/trunk/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/CHANGES.txt?rev=1609337&r1=1609336&r2=1609337&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/CHANGES.txt (original)
+++ lucene/dev/trunk/lucene/CHANGES.txt Wed Jul  9 23:18:58 2014
@@ -104,6 +104,10 @@ New Features
 * LUCENE-4175, LUCENE-5714, LUCENE-5779: Index and search rectangles with spatial
   BBoxSpatialStrategy using most predicates.  Sort documents by relative overlap
   of query areas or just by indexed shape area. (Ryan McKinley, David Smiley)
+
+* LUCENE-5806: Extend expressions grammar to support array access in variables.
+  Added helper class VariableContext to parse complex variable into pieces.
+  (Ryan Ernst)
   
 API Changes
 

Modified: lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/SimpleBindings.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/SimpleBindings.java?rev=1609337&r1=1609336&r2=1609337&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/SimpleBindings.java (original)
+++ lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/SimpleBindings.java Wed Jul  9 23:18:58 2014
@@ -62,6 +62,11 @@ public final class SimpleBindings extend
   public void add(SortField sortField) {
     map.put(sortField.getField(), sortField);
   }
+
+  /**
+   * Bind a {@link ValueSource} directly to the given name.
+   */
+  public void add(String name, ValueSource source) { map.put(name, source); }
   
   /** 
    * Adds an Expression to the bindings.
@@ -79,6 +84,8 @@ public final class SimpleBindings extend
       throw new IllegalArgumentException("Invalid reference '" + name + "'");
     } else if (o instanceof Expression) {
       return ((Expression)o).getValueSource(this);
+    } else if (o instanceof ValueSource) {
+      return ((ValueSource)o);
     }
     SortField field = (SortField) o;
     switch(field.getType()) {

Modified: lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/Javascript.g
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/Javascript.g?rev=1609337&r1=1609336&r2=1609337&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/Javascript.g (original)
+++ lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/Javascript.g Wed Jul  9 23:18:58 2014
@@ -309,11 +309,11 @@ unary_operator
 
 postfix
     : primary
-    | NAMESPACE_ID arguments -> ^(AT_CALL NAMESPACE_ID arguments?)
+    | VARIABLE arguments -> ^(AT_CALL VARIABLE arguments?)
     ;
 
 primary
-    : NAMESPACE_ID
+    : VARIABLE
     | numeric
     | AT_LPAREN! conditional AT_RPAREN!
     ;
@@ -330,8 +330,19 @@ numeric
 // * Lexer Rules
 // ***********************************************************************
 
-NAMESPACE_ID
-    : ID (AT_DOT ID)*
+VARIABLE
+    : OBJECT (AT_DOT OBJECT)*
+    ;
+
+fragment
+OBJECT
+    : ID ARRAY*
+    ;
+
+fragment
+ARRAY
+    : '[' STRING ']'
+    | '[' DECIMALINTEGER ']'
     ;
 
 fragment
@@ -339,6 +350,26 @@ ID
     : ('a'..'z'|'A'..'Z'|'_'|'$') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'$')*
     ;
 
+fragment
+STRING
+    : '\'' SINGLE_STRING_CHAR* '\'' { }
+    | '"' DOUBLE_STRING_CHAR* '"'
+    ;
+
+fragment
+SINGLE_STRING_CHAR
+    : '\\\''
+    | '\\\\'
+    | ~('\\'|'\'')
+    ;
+
+fragment
+DOUBLE_STRING_CHAR
+    : '\\"'
+    | '\\\\'
+    | ~('\\'|'"')
+    ;
+
 WS
     : (' '|'\t'|'\n'|'\r')+ {skip();}
     ;

Modified: lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/Javascript.tokens
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/Javascript.tokens?rev=1609337&r1=1609336&r2=1609337&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/Javascript.tokens (original)
+++ lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/Javascript.tokens Wed Jul  9 23:18:58 2014
@@ -1,67 +1,72 @@
-AT_ADD=4
-AT_BIT_AND=5
-AT_BIT_NOT=6
-AT_BIT_OR=7
-AT_BIT_SHL=8
-AT_BIT_SHR=9
-AT_BIT_SHU=10
-AT_BIT_XOR=11
-AT_BOOL_AND=12
-AT_BOOL_NOT=13
-AT_BOOL_OR=14
-AT_CALL=15
-AT_COLON=16
-AT_COMMA=17
-AT_COMP_EQ=18
-AT_COMP_GT=19
-AT_COMP_GTE=20
-AT_COMP_LT=21
-AT_COMP_LTE=22
-AT_COMP_NEQ=23
-AT_COND_QUE=24
-AT_DIVIDE=25
-AT_DOT=26
-AT_LPAREN=27
-AT_MODULO=28
-AT_MULTIPLY=29
-AT_NEGATE=30
-AT_RPAREN=31
-AT_SUBTRACT=32
-DECIMAL=33
-DECIMALDIGIT=34
-DECIMALINTEGER=35
-EXPONENT=36
-HEX=37
-HEXDIGIT=38
-ID=39
-NAMESPACE_ID=40
-OCTAL=41
-OCTALDIGIT=42
-WS=43
-'!'=13
-'!='=23
-'%'=28
-'&&'=12
-'&'=5
-'('=27
-')'=31
-'*'=29
-'+'=4
-','=17
-'-'=32
-'.'=26
-'/'=25
-':'=16
-'<'=21
-'<<'=8
-'<='=22
-'=='=18
-'>'=19
-'>='=20
-'>>'=9
-'>>>'=10
-'?'=24
-'^'=11
-'|'=7
-'||'=14
-'~'=6
+ARRAY=4
+AT_ADD=5
+AT_BIT_AND=6
+AT_BIT_NOT=7
+AT_BIT_OR=8
+AT_BIT_SHL=9
+AT_BIT_SHR=10
+AT_BIT_SHU=11
+AT_BIT_XOR=12
+AT_BOOL_AND=13
+AT_BOOL_NOT=14
+AT_BOOL_OR=15
+AT_CALL=16
+AT_COLON=17
+AT_COMMA=18
+AT_COMP_EQ=19
+AT_COMP_GT=20
+AT_COMP_GTE=21
+AT_COMP_LT=22
+AT_COMP_LTE=23
+AT_COMP_NEQ=24
+AT_COND_QUE=25
+AT_DIVIDE=26
+AT_DOT=27
+AT_LPAREN=28
+AT_MODULO=29
+AT_MULTIPLY=30
+AT_NEGATE=31
+AT_RPAREN=32
+AT_SUBTRACT=33
+DECIMAL=34
+DECIMALDIGIT=35
+DECIMALINTEGER=36
+DOUBLE_STRING_CHAR=37
+EXPONENT=38
+HEX=39
+HEXDIGIT=40
+ID=41
+OBJECT=42
+OCTAL=43
+OCTALDIGIT=44
+SINGLE_STRING_CHAR=45
+STRING=46
+VARIABLE=47
+WS=48
+'!'=14
+'!='=24
+'%'=29
+'&&'=13
+'&'=6
+'('=28
+')'=32
+'*'=30
+'+'=5
+','=18
+'-'=33
+'.'=27
+'/'=26
+':'=17
+'<'=22
+'<<'=9
+'<='=23
+'=='=19
+'>'=20
+'>='=21
+'>>'=10
+'>>>'=11
+'?'=25
+'^'=12
+'|'=8
+'||'=15
+'~'=7

Modified: lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptCompiler.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptCompiler.java?rev=1609337&r1=1609336&r2=1609337&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptCompiler.java (original)
+++ lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptCompiler.java Wed Jul  9 23:18:58 2014
@@ -254,8 +254,12 @@ public class JavascriptCompiler {
         
         gen.cast(Type.DOUBLE_TYPE, expected);
         break;
-      case JavascriptParser.NAMESPACE_ID:
+      case JavascriptParser.VARIABLE:
         int index;
+
+        // normalize quotes
+        text = normalizeQuotes(text);
+
         
         if (externalsMap.containsKey(text)) {
           index = externalsMap.get(text);
@@ -491,6 +495,46 @@ public class JavascriptCompiler {
       throw exception;
     }
   }
+
+  private static String normalizeQuotes(String text) {
+    StringBuilder out = new StringBuilder(text.length());
+    boolean inDoubleQuotes = false;
+    for (int i = 0; i < text.length(); ++i) {
+      char c = text.charAt(i);
+      if (c == '\\') {
+        c = text.charAt(++i);
+        if (c == '\\') {
+          out.append('\\'); // re-escape the backslash
+        }
+        // no escape for double quote
+      } else if (c == '\'') {
+        if (inDoubleQuotes) {
+          // escape in output
+          out.append('\\');
+        } else {
+          int j = findSingleQuoteStringEnd(text, i);
+          out.append(text, i, j); // copy up to end quote (leave end for append below)
+          i = j;
+        }
+      } else if (c == '"') {
+        c = '\''; // change beginning/ending doubles to singles
+        inDoubleQuotes = !inDoubleQuotes;
+      }
+      out.append(c);
+    }
+    return out.toString();
+  }
+
+  private static int findSingleQuoteStringEnd(String text, int start) {
+    ++start; // skip beginning
+    while (text.charAt(start) != '\'') {
+      if (text.charAt(start) == '\\') {
+        ++start; // blindly consume escape value
+      }
+      ++start;
+    }
+    return start;
+  }
   
   /** 
    * The default set of functions available to expressions.

Modified: lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptLexer.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptLexer.java?rev=1609337&r1=1609336&r2=1609337&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptLexer.java (original)
+++ lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptLexer.java Wed Jul  9 23:18:58 2014
@@ -13,46 +13,51 @@ import java.util.ArrayList;
 @SuppressWarnings("all")
 class JavascriptLexer extends Lexer {
   public static final int EOF=-1;
-  public static final int AT_ADD=4;
-  public static final int AT_BIT_AND=5;
-  public static final int AT_BIT_NOT=6;
-  public static final int AT_BIT_OR=7;
-  public static final int AT_BIT_SHL=8;
-  public static final int AT_BIT_SHR=9;
-  public static final int AT_BIT_SHU=10;
-  public static final int AT_BIT_XOR=11;
-  public static final int AT_BOOL_AND=12;
-  public static final int AT_BOOL_NOT=13;
-  public static final int AT_BOOL_OR=14;
-  public static final int AT_CALL=15;
-  public static final int AT_COLON=16;
-  public static final int AT_COMMA=17;
-  public static final int AT_COMP_EQ=18;
-  public static final int AT_COMP_GT=19;
-  public static final int AT_COMP_GTE=20;
-  public static final int AT_COMP_LT=21;
-  public static final int AT_COMP_LTE=22;
-  public static final int AT_COMP_NEQ=23;
-  public static final int AT_COND_QUE=24;
-  public static final int AT_DIVIDE=25;
-  public static final int AT_DOT=26;
-  public static final int AT_LPAREN=27;
-  public static final int AT_MODULO=28;
-  public static final int AT_MULTIPLY=29;
-  public static final int AT_NEGATE=30;
-  public static final int AT_RPAREN=31;
-  public static final int AT_SUBTRACT=32;
-  public static final int DECIMAL=33;
-  public static final int DECIMALDIGIT=34;
-  public static final int DECIMALINTEGER=35;
-  public static final int EXPONENT=36;
-  public static final int HEX=37;
-  public static final int HEXDIGIT=38;
-  public static final int ID=39;
-  public static final int NAMESPACE_ID=40;
-  public static final int OCTAL=41;
-  public static final int OCTALDIGIT=42;
-  public static final int WS=43;
+  public static final int ARRAY=4;
+  public static final int AT_ADD=5;
+  public static final int AT_BIT_AND=6;
+  public static final int AT_BIT_NOT=7;
+  public static final int AT_BIT_OR=8;
+  public static final int AT_BIT_SHL=9;
+  public static final int AT_BIT_SHR=10;
+  public static final int AT_BIT_SHU=11;
+  public static final int AT_BIT_XOR=12;
+  public static final int AT_BOOL_AND=13;
+  public static final int AT_BOOL_NOT=14;
+  public static final int AT_BOOL_OR=15;
+  public static final int AT_CALL=16;
+  public static final int AT_COLON=17;
+  public static final int AT_COMMA=18;
+  public static final int AT_COMP_EQ=19;
+  public static final int AT_COMP_GT=20;
+  public static final int AT_COMP_GTE=21;
+  public static final int AT_COMP_LT=22;
+  public static final int AT_COMP_LTE=23;
+  public static final int AT_COMP_NEQ=24;
+  public static final int AT_COND_QUE=25;
+  public static final int AT_DIVIDE=26;
+  public static final int AT_DOT=27;
+  public static final int AT_LPAREN=28;
+  public static final int AT_MODULO=29;
+  public static final int AT_MULTIPLY=30;
+  public static final int AT_NEGATE=31;
+  public static final int AT_RPAREN=32;
+  public static final int AT_SUBTRACT=33;
+  public static final int DECIMAL=34;
+  public static final int DECIMALDIGIT=35;
+  public static final int DECIMALINTEGER=36;
+  public static final int DOUBLE_STRING_CHAR=37;
+  public static final int EXPONENT=38;
+  public static final int HEX=39;
+  public static final int HEXDIGIT=40;
+  public static final int ID=41;
+  public static final int OBJECT=42;
+  public static final int OCTAL=43;
+  public static final int OCTALDIGIT=44;
+  public static final int SINGLE_STRING_CHAR=45;
+  public static final int STRING=46;
+  public static final int VARIABLE=47;
+  public static final int WS=48;
 
 
   @Override
@@ -630,17 +635,17 @@ class JavascriptLexer extends Lexer {
   }
   // $ANTLR end "AT_SUBTRACT"
 
-  // $ANTLR start "NAMESPACE_ID"
-  public final void mNAMESPACE_ID() throws RecognitionException {
+  // $ANTLR start "VARIABLE"
+  public final void mVARIABLE() throws RecognitionException {
     try {
-      int _type = NAMESPACE_ID;
+      int _type = VARIABLE;
       int _channel = DEFAULT_TOKEN_CHANNEL;
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:334:5: ( ID ( AT_DOT ID )* )
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:334:7: ID ( AT_DOT ID )*
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:334:5: ( OBJECT ( AT_DOT OBJECT )* )
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:334:7: OBJECT ( AT_DOT OBJECT )*
       {
-      mID(); 
+      mOBJECT(); 
 
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:334:10: ( AT_DOT ID )*
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:334:14: ( AT_DOT OBJECT )*
       loop1:
       while (true) {
         int alt1=2;
@@ -651,11 +656,11 @@ class JavascriptLexer extends Lexer {
 
         switch (alt1) {
         case 1 :
-          // src/java/org/apache/lucene/expressions/js/Javascript.g:334:11: AT_DOT ID
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:334:15: AT_DOT OBJECT
           {
           mAT_DOT(); 
 
-          mID(); 
+          mOBJECT(); 
 
           }
           break;
@@ -674,13 +679,116 @@ class JavascriptLexer extends Lexer {
       // do for sure before leaving
     }
   }
-  // $ANTLR end "NAMESPACE_ID"
+  // $ANTLR end "VARIABLE"
+
+  // $ANTLR start "OBJECT"
+  public final void mOBJECT() throws RecognitionException {
+    try {
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:340:5: ( ID ( ARRAY )* )
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:340:7: ID ( ARRAY )*
+      {
+      mID(); 
+
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:340:10: ( ARRAY )*
+      loop2:
+      while (true) {
+        int alt2=2;
+        int LA2_0 = input.LA(1);
+        if ( (LA2_0=='[') ) {
+          alt2=1;
+        }
+
+        switch (alt2) {
+        case 1 :
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:340:10: ARRAY
+          {
+          mARRAY(); 
+
+          }
+          break;
+
+        default :
+          break loop2;
+        }
+      }
+
+      }
+
+    }
+    finally {
+      // do for sure before leaving
+    }
+  }
+  // $ANTLR end "OBJECT"
+
+  // $ANTLR start "ARRAY"
+  public final void mARRAY() throws RecognitionException {
+    try {
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:345:5: ( '[' STRING ']' | '[' DECIMALINTEGER ']' )
+      int alt3=2;
+      int LA3_0 = input.LA(1);
+      if ( (LA3_0=='[') ) {
+        int LA3_1 = input.LA(2);
+        if ( (LA3_1=='\"'||LA3_1=='\'') ) {
+          alt3=1;
+        }
+        else if ( ((LA3_1 >= '0' && LA3_1 <= '9')) ) {
+          alt3=2;
+        }
+
+        else {
+          int nvaeMark = input.mark();
+          try {
+            input.consume();
+            NoViableAltException nvae =
+              new NoViableAltException("", 3, 1, input);
+            throw nvae;
+          } finally {
+            input.rewind(nvaeMark);
+          }
+        }
+
+      }
+
+      else {
+        NoViableAltException nvae =
+          new NoViableAltException("", 3, 0, input);
+        throw nvae;
+      }
+
+      switch (alt3) {
+        case 1 :
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:345:7: '[' STRING ']'
+          {
+          match('['); 
+          mSTRING(); 
+
+          match(']'); 
+          }
+          break;
+        case 2 :
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:346:7: '[' DECIMALINTEGER ']'
+          {
+          match('['); 
+          mDECIMALINTEGER(); 
+
+          match(']'); 
+          }
+          break;
+
+      }
+    }
+    finally {
+      // do for sure before leaving
+    }
+  }
+  // $ANTLR end "ARRAY"
 
   // $ANTLR start "ID"
   public final void mID() throws RecognitionException {
     try {
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:340:5: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '$' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '$' )* )
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:340:7: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '$' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '$' )*
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:351:5: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '$' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '$' )* )
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:351:7: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '$' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '$' )*
       {
       if ( input.LA(1)=='$'||(input.LA(1) >= 'A' && input.LA(1) <= 'Z')||input.LA(1)=='_'||(input.LA(1) >= 'a' && input.LA(1) <= 'z') ) {
         input.consume();
@@ -690,16 +798,16 @@ class JavascriptLexer extends Lexer {
         recover(mse);
         throw mse;
       }
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:340:35: ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '$' )*
-      loop2:
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:351:35: ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '$' )*
+      loop4:
       while (true) {
-        int alt2=2;
-        int LA2_0 = input.LA(1);
-        if ( (LA2_0=='$'||(LA2_0 >= '0' && LA2_0 <= '9')||(LA2_0 >= 'A' && LA2_0 <= 'Z')||LA2_0=='_'||(LA2_0 >= 'a' && LA2_0 <= 'z')) ) {
-          alt2=1;
+        int alt4=2;
+        int LA4_0 = input.LA(1);
+        if ( (LA4_0=='$'||(LA4_0 >= '0' && LA4_0 <= '9')||(LA4_0 >= 'A' && LA4_0 <= 'Z')||LA4_0=='_'||(LA4_0 >= 'a' && LA4_0 <= 'z')) ) {
+          alt4=1;
         }
 
-        switch (alt2) {
+        switch (alt4) {
         case 1 :
           // src/java/org/apache/lucene/expressions/js/Javascript.g:
           {
@@ -715,7 +823,7 @@ class JavascriptLexer extends Lexer {
           break;
 
         default :
-          break loop2;
+          break loop4;
         }
       }
 
@@ -728,25 +836,265 @@ class JavascriptLexer extends Lexer {
   }
   // $ANTLR end "ID"
 
+  // $ANTLR start "STRING"
+  public final void mSTRING() throws RecognitionException {
+    try {
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:356:5: ( '\\'' ( SINGLE_STRING_CHAR )* '\\'' | '\"' ( DOUBLE_STRING_CHAR )* '\"' )
+      int alt7=2;
+      int LA7_0 = input.LA(1);
+      if ( (LA7_0=='\'') ) {
+        alt7=1;
+      }
+      else if ( (LA7_0=='\"') ) {
+        alt7=2;
+      }
+
+      else {
+        NoViableAltException nvae =
+          new NoViableAltException("", 7, 0, input);
+        throw nvae;
+      }
+
+      switch (alt7) {
+        case 1 :
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:356:7: '\\'' ( SINGLE_STRING_CHAR )* '\\''
+          {
+          match('\''); 
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:356:12: ( SINGLE_STRING_CHAR )*
+          loop5:
+          while (true) {
+            int alt5=2;
+            int LA5_0 = input.LA(1);
+            if ( ((LA5_0 >= '\u0000' && LA5_0 <= '&')||(LA5_0 >= '(' && LA5_0 <= '\uFFFF')) ) {
+              alt5=1;
+            }
+
+            switch (alt5) {
+            case 1 :
+              // src/java/org/apache/lucene/expressions/js/Javascript.g:356:12: SINGLE_STRING_CHAR
+              {
+              mSINGLE_STRING_CHAR(); 
+
+              }
+              break;
+
+            default :
+              break loop5;
+            }
+          }
+
+          match('\''); 
+           
+          }
+          break;
+        case 2 :
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:357:7: '\"' ( DOUBLE_STRING_CHAR )* '\"'
+          {
+          match('\"'); 
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:357:11: ( DOUBLE_STRING_CHAR )*
+          loop6:
+          while (true) {
+            int alt6=2;
+            int LA6_0 = input.LA(1);
+            if ( ((LA6_0 >= '\u0000' && LA6_0 <= '!')||(LA6_0 >= '#' && LA6_0 <= '\uFFFF')) ) {
+              alt6=1;
+            }
+
+            switch (alt6) {
+            case 1 :
+              // src/java/org/apache/lucene/expressions/js/Javascript.g:357:11: DOUBLE_STRING_CHAR
+              {
+              mDOUBLE_STRING_CHAR(); 
+
+              }
+              break;
+
+            default :
+              break loop6;
+            }
+          }
+
+          match('\"'); 
+          }
+          break;
+
+      }
+    }
+    finally {
+      // do for sure before leaving
+    }
+  }
+  // $ANTLR end "STRING"
+
+  // $ANTLR start "SINGLE_STRING_CHAR"
+  public final void mSINGLE_STRING_CHAR() throws RecognitionException {
+    try {
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:362:5: ( '\\\\\\'' | '\\\\\\\\' |~ ( '\\\\' | '\\'' ) )
+      int alt8=3;
+      int LA8_0 = input.LA(1);
+      if ( (LA8_0=='\\') ) {
+        int LA8_1 = input.LA(2);
+        if ( (LA8_1=='\'') ) {
+          alt8=1;
+        }
+        else if ( (LA8_1=='\\') ) {
+          alt8=2;
+        }
+
+        else {
+          int nvaeMark = input.mark();
+          try {
+            input.consume();
+            NoViableAltException nvae =
+              new NoViableAltException("", 8, 1, input);
+            throw nvae;
+          } finally {
+            input.rewind(nvaeMark);
+          }
+        }
+
+      }
+      else if ( ((LA8_0 >= '\u0000' && LA8_0 <= '&')||(LA8_0 >= '(' && LA8_0 <= '[')||(LA8_0 >= ']' && LA8_0 <= '\uFFFF')) ) {
+        alt8=3;
+      }
+
+      else {
+        NoViableAltException nvae =
+          new NoViableAltException("", 8, 0, input);
+        throw nvae;
+      }
+
+      switch (alt8) {
+        case 1 :
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:362:7: '\\\\\\''
+          {
+          match("\\'"); 
+
+          }
+          break;
+        case 2 :
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:363:7: '\\\\\\\\'
+          {
+          match("\\\\"); 
+
+          }
+          break;
+        case 3 :
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:364:7: ~ ( '\\\\' | '\\'' )
+          {
+          if ( (input.LA(1) >= '\u0000' && input.LA(1) <= '&')||(input.LA(1) >= '(' && input.LA(1) <= '[')||(input.LA(1) >= ']' && input.LA(1) <= '\uFFFF') ) {
+            input.consume();
+          }
+          else {
+            MismatchedSetException mse = new MismatchedSetException(null,input);
+            recover(mse);
+            throw mse;
+          }
+          }
+          break;
+
+      }
+    }
+    finally {
+      // do for sure before leaving
+    }
+  }
+  // $ANTLR end "SINGLE_STRING_CHAR"
+
+  // $ANTLR start "DOUBLE_STRING_CHAR"
+  public final void mDOUBLE_STRING_CHAR() throws RecognitionException {
+    try {
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:369:5: ( '\\\\\"' | '\\\\\\\\' |~ ( '\\\\' | '\"' ) )
+      int alt9=3;
+      int LA9_0 = input.LA(1);
+      if ( (LA9_0=='\\') ) {
+        int LA9_1 = input.LA(2);
+        if ( (LA9_1=='\"') ) {
+          alt9=1;
+        }
+        else if ( (LA9_1=='\\') ) {
+          alt9=2;
+        }
+
+        else {
+          int nvaeMark = input.mark();
+          try {
+            input.consume();
+            NoViableAltException nvae =
+              new NoViableAltException("", 9, 1, input);
+            throw nvae;
+          } finally {
+            input.rewind(nvaeMark);
+          }
+        }
+
+      }
+      else if ( ((LA9_0 >= '\u0000' && LA9_0 <= '!')||(LA9_0 >= '#' && LA9_0 <= '[')||(LA9_0 >= ']' && LA9_0 <= '\uFFFF')) ) {
+        alt9=3;
+      }
+
+      else {
+        NoViableAltException nvae =
+          new NoViableAltException("", 9, 0, input);
+        throw nvae;
+      }
+
+      switch (alt9) {
+        case 1 :
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:369:7: '\\\\\"'
+          {
+          match("\\\""); 
+
+          }
+          break;
+        case 2 :
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:370:7: '\\\\\\\\'
+          {
+          match("\\\\"); 
+
+          }
+          break;
+        case 3 :
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:371:7: ~ ( '\\\\' | '\"' )
+          {
+          if ( (input.LA(1) >= '\u0000' && input.LA(1) <= '!')||(input.LA(1) >= '#' && input.LA(1) <= '[')||(input.LA(1) >= ']' && input.LA(1) <= '\uFFFF') ) {
+            input.consume();
+          }
+          else {
+            MismatchedSetException mse = new MismatchedSetException(null,input);
+            recover(mse);
+            throw mse;
+          }
+          }
+          break;
+
+      }
+    }
+    finally {
+      // do for sure before leaving
+    }
+  }
+  // $ANTLR end "DOUBLE_STRING_CHAR"
+
   // $ANTLR start "WS"
   public final void mWS() throws RecognitionException {
     try {
       int _type = WS;
       int _channel = DEFAULT_TOKEN_CHANNEL;
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:343:5: ( ( ' ' | '\\t' | '\\n' | '\\r' )+ )
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:343:7: ( ' ' | '\\t' | '\\n' | '\\r' )+
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:374:5: ( ( ' ' | '\\t' | '\\n' | '\\r' )+ )
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:374:7: ( ' ' | '\\t' | '\\n' | '\\r' )+
       {
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:343:7: ( ' ' | '\\t' | '\\n' | '\\r' )+
-      int cnt3=0;
-      loop3:
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:374:7: ( ' ' | '\\t' | '\\n' | '\\r' )+
+      int cnt10=0;
+      loop10:
       while (true) {
-        int alt3=2;
-        int LA3_0 = input.LA(1);
-        if ( ((LA3_0 >= '\t' && LA3_0 <= '\n')||LA3_0=='\r'||LA3_0==' ') ) {
-          alt3=1;
+        int alt10=2;
+        int LA10_0 = input.LA(1);
+        if ( ((LA10_0 >= '\t' && LA10_0 <= '\n')||LA10_0=='\r'||LA10_0==' ') ) {
+          alt10=1;
         }
 
-        switch (alt3) {
+        switch (alt10) {
         case 1 :
           // src/java/org/apache/lucene/expressions/js/Javascript.g:
           {
@@ -762,11 +1110,11 @@ class JavascriptLexer extends Lexer {
           break;
 
         default :
-          if ( cnt3 >= 1 ) break loop3;
-          EarlyExitException eee = new EarlyExitException(3, input);
+          if ( cnt10 >= 1 ) break loop10;
+          EarlyExitException eee = new EarlyExitException(10, input);
           throw eee;
         }
-        cnt3++;
+        cnt10++;
       }
 
       skip();
@@ -786,27 +1134,27 @@ class JavascriptLexer extends Lexer {
     try {
       int _type = DECIMAL;
       int _channel = DEFAULT_TOKEN_CHANNEL;
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:347:5: ( DECIMALINTEGER AT_DOT ( DECIMALDIGIT )* ( EXPONENT )? | AT_DOT ( DECIMALDIGIT )+ ( EXPONENT )? | DECIMALINTEGER ( EXPONENT )? )
-      int alt9=3;
-      alt9 = dfa9.predict(input);
-      switch (alt9) {
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:378:5: ( DECIMALINTEGER AT_DOT ( DECIMALDIGIT )* ( EXPONENT )? | AT_DOT ( DECIMALDIGIT )+ ( EXPONENT )? | DECIMALINTEGER ( EXPONENT )? )
+      int alt16=3;
+      alt16 = dfa16.predict(input);
+      switch (alt16) {
         case 1 :
-          // src/java/org/apache/lucene/expressions/js/Javascript.g:347:7: DECIMALINTEGER AT_DOT ( DECIMALDIGIT )* ( EXPONENT )?
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:378:7: DECIMALINTEGER AT_DOT ( DECIMALDIGIT )* ( EXPONENT )?
           {
           mDECIMALINTEGER(); 
 
           mAT_DOT(); 
 
-          // src/java/org/apache/lucene/expressions/js/Javascript.g:347:29: ( DECIMALDIGIT )*
-          loop4:
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:378:29: ( DECIMALDIGIT )*
+          loop11:
           while (true) {
-            int alt4=2;
-            int LA4_0 = input.LA(1);
-            if ( ((LA4_0 >= '0' && LA4_0 <= '9')) ) {
-              alt4=1;
+            int alt11=2;
+            int LA11_0 = input.LA(1);
+            if ( ((LA11_0 >= '0' && LA11_0 <= '9')) ) {
+              alt11=1;
             }
 
-            switch (alt4) {
+            switch (alt11) {
             case 1 :
               // src/java/org/apache/lucene/expressions/js/Javascript.g:
               {
@@ -822,19 +1170,19 @@ class JavascriptLexer extends Lexer {
               break;
 
             default :
-              break loop4;
+              break loop11;
             }
           }
 
-          // src/java/org/apache/lucene/expressions/js/Javascript.g:347:43: ( EXPONENT )?
-          int alt5=2;
-          int LA5_0 = input.LA(1);
-          if ( (LA5_0=='E'||LA5_0=='e') ) {
-            alt5=1;
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:378:43: ( EXPONENT )?
+          int alt12=2;
+          int LA12_0 = input.LA(1);
+          if ( (LA12_0=='E'||LA12_0=='e') ) {
+            alt12=1;
           }
-          switch (alt5) {
+          switch (alt12) {
             case 1 :
-              // src/java/org/apache/lucene/expressions/js/Javascript.g:347:43: EXPONENT
+              // src/java/org/apache/lucene/expressions/js/Javascript.g:378:43: EXPONENT
               {
               mEXPONENT(); 
 
@@ -846,21 +1194,21 @@ class JavascriptLexer extends Lexer {
           }
           break;
         case 2 :
-          // src/java/org/apache/lucene/expressions/js/Javascript.g:348:7: AT_DOT ( DECIMALDIGIT )+ ( EXPONENT )?
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:379:7: AT_DOT ( DECIMALDIGIT )+ ( EXPONENT )?
           {
           mAT_DOT(); 
 
-          // src/java/org/apache/lucene/expressions/js/Javascript.g:348:14: ( DECIMALDIGIT )+
-          int cnt6=0;
-          loop6:
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:379:14: ( DECIMALDIGIT )+
+          int cnt13=0;
+          loop13:
           while (true) {
-            int alt6=2;
-            int LA6_0 = input.LA(1);
-            if ( ((LA6_0 >= '0' && LA6_0 <= '9')) ) {
-              alt6=1;
+            int alt13=2;
+            int LA13_0 = input.LA(1);
+            if ( ((LA13_0 >= '0' && LA13_0 <= '9')) ) {
+              alt13=1;
             }
 
-            switch (alt6) {
+            switch (alt13) {
             case 1 :
               // src/java/org/apache/lucene/expressions/js/Javascript.g:
               {
@@ -876,22 +1224,22 @@ class JavascriptLexer extends Lexer {
               break;
 
             default :
-              if ( cnt6 >= 1 ) break loop6;
-              EarlyExitException eee = new EarlyExitException(6, input);
+              if ( cnt13 >= 1 ) break loop13;
+              EarlyExitException eee = new EarlyExitException(13, input);
               throw eee;
             }
-            cnt6++;
+            cnt13++;
           }
 
-          // src/java/org/apache/lucene/expressions/js/Javascript.g:348:28: ( EXPONENT )?
-          int alt7=2;
-          int LA7_0 = input.LA(1);
-          if ( (LA7_0=='E'||LA7_0=='e') ) {
-            alt7=1;
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:379:28: ( EXPONENT )?
+          int alt14=2;
+          int LA14_0 = input.LA(1);
+          if ( (LA14_0=='E'||LA14_0=='e') ) {
+            alt14=1;
           }
-          switch (alt7) {
+          switch (alt14) {
             case 1 :
-              // src/java/org/apache/lucene/expressions/js/Javascript.g:348:28: EXPONENT
+              // src/java/org/apache/lucene/expressions/js/Javascript.g:379:28: EXPONENT
               {
               mEXPONENT(); 
 
@@ -903,19 +1251,19 @@ class JavascriptLexer extends Lexer {
           }
           break;
         case 3 :
-          // src/java/org/apache/lucene/expressions/js/Javascript.g:349:7: DECIMALINTEGER ( EXPONENT )?
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:380:7: DECIMALINTEGER ( EXPONENT )?
           {
           mDECIMALINTEGER(); 
 
-          // src/java/org/apache/lucene/expressions/js/Javascript.g:349:22: ( EXPONENT )?
-          int alt8=2;
-          int LA8_0 = input.LA(1);
-          if ( (LA8_0=='E'||LA8_0=='e') ) {
-            alt8=1;
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:380:22: ( EXPONENT )?
+          int alt15=2;
+          int LA15_0 = input.LA(1);
+          if ( (LA15_0=='E'||LA15_0=='e') ) {
+            alt15=1;
           }
-          switch (alt8) {
+          switch (alt15) {
             case 1 :
-              // src/java/org/apache/lucene/expressions/js/Javascript.g:349:22: EXPONENT
+              // src/java/org/apache/lucene/expressions/js/Javascript.g:380:22: EXPONENT
               {
               mEXPONENT(); 
 
@@ -942,21 +1290,21 @@ class JavascriptLexer extends Lexer {
     try {
       int _type = OCTAL;
       int _channel = DEFAULT_TOKEN_CHANNEL;
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:353:5: ( '0' ( OCTALDIGIT )+ )
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:353:7: '0' ( OCTALDIGIT )+
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:384:5: ( '0' ( OCTALDIGIT )+ )
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:384:7: '0' ( OCTALDIGIT )+
       {
       match('0'); 
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:353:11: ( OCTALDIGIT )+
-      int cnt10=0;
-      loop10:
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:384:11: ( OCTALDIGIT )+
+      int cnt17=0;
+      loop17:
       while (true) {
-        int alt10=2;
-        int LA10_0 = input.LA(1);
-        if ( ((LA10_0 >= '0' && LA10_0 <= '7')) ) {
-          alt10=1;
+        int alt17=2;
+        int LA17_0 = input.LA(1);
+        if ( ((LA17_0 >= '0' && LA17_0 <= '7')) ) {
+          alt17=1;
         }
 
-        switch (alt10) {
+        switch (alt17) {
         case 1 :
           // src/java/org/apache/lucene/expressions/js/Javascript.g:
           {
@@ -972,11 +1320,11 @@ class JavascriptLexer extends Lexer {
           break;
 
         default :
-          if ( cnt10 >= 1 ) break loop10;
-          EarlyExitException eee = new EarlyExitException(10, input);
+          if ( cnt17 >= 1 ) break loop17;
+          EarlyExitException eee = new EarlyExitException(17, input);
           throw eee;
         }
-        cnt10++;
+        cnt17++;
       }
 
       }
@@ -995,19 +1343,19 @@ class JavascriptLexer extends Lexer {
     try {
       int _type = HEX;
       int _channel = DEFAULT_TOKEN_CHANNEL;
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:357:5: ( ( '0x' | '0X' ) ( HEXDIGIT )+ )
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:357:7: ( '0x' | '0X' ) ( HEXDIGIT )+
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:388:5: ( ( '0x' | '0X' ) ( HEXDIGIT )+ )
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:388:7: ( '0x' | '0X' ) ( HEXDIGIT )+
       {
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:357:7: ( '0x' | '0X' )
-      int alt11=2;
-      int LA11_0 = input.LA(1);
-      if ( (LA11_0=='0') ) {
-        int LA11_1 = input.LA(2);
-        if ( (LA11_1=='x') ) {
-          alt11=1;
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:388:7: ( '0x' | '0X' )
+      int alt18=2;
+      int LA18_0 = input.LA(1);
+      if ( (LA18_0=='0') ) {
+        int LA18_1 = input.LA(2);
+        if ( (LA18_1=='x') ) {
+          alt18=1;
         }
-        else if ( (LA11_1=='X') ) {
-          alt11=2;
+        else if ( (LA18_1=='X') ) {
+          alt18=2;
         }
 
         else {
@@ -1015,7 +1363,7 @@ class JavascriptLexer extends Lexer {
           try {
             input.consume();
             NoViableAltException nvae =
-              new NoViableAltException("", 11, 1, input);
+              new NoViableAltException("", 18, 1, input);
             throw nvae;
           } finally {
             input.rewind(nvaeMark);
@@ -1026,20 +1374,20 @@ class JavascriptLexer extends Lexer {
 
       else {
         NoViableAltException nvae =
-          new NoViableAltException("", 11, 0, input);
+          new NoViableAltException("", 18, 0, input);
         throw nvae;
       }
 
-      switch (alt11) {
+      switch (alt18) {
         case 1 :
-          // src/java/org/apache/lucene/expressions/js/Javascript.g:357:8: '0x'
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:388:8: '0x'
           {
           match("0x"); 
 
           }
           break;
         case 2 :
-          // src/java/org/apache/lucene/expressions/js/Javascript.g:357:13: '0X'
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:388:13: '0X'
           {
           match("0X"); 
 
@@ -1048,17 +1396,17 @@ class JavascriptLexer extends Lexer {
 
       }
 
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:357:19: ( HEXDIGIT )+
-      int cnt12=0;
-      loop12:
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:388:19: ( HEXDIGIT )+
+      int cnt19=0;
+      loop19:
       while (true) {
-        int alt12=2;
-        int LA12_0 = input.LA(1);
-        if ( ((LA12_0 >= '0' && LA12_0 <= '9')||(LA12_0 >= 'A' && LA12_0 <= 'F')||(LA12_0 >= 'a' && LA12_0 <= 'f')) ) {
-          alt12=1;
+        int alt19=2;
+        int LA19_0 = input.LA(1);
+        if ( ((LA19_0 >= '0' && LA19_0 <= '9')||(LA19_0 >= 'A' && LA19_0 <= 'F')||(LA19_0 >= 'a' && LA19_0 <= 'f')) ) {
+          alt19=1;
         }
 
-        switch (alt12) {
+        switch (alt19) {
         case 1 :
           // src/java/org/apache/lucene/expressions/js/Javascript.g:
           {
@@ -1074,11 +1422,11 @@ class JavascriptLexer extends Lexer {
           break;
 
         default :
-          if ( cnt12 >= 1 ) break loop12;
-          EarlyExitException eee = new EarlyExitException(12, input);
+          if ( cnt19 >= 1 ) break loop19;
+          EarlyExitException eee = new EarlyExitException(19, input);
           throw eee;
         }
-        cnt12++;
+        cnt19++;
       }
 
       }
@@ -1095,43 +1443,43 @@ class JavascriptLexer extends Lexer {
   // $ANTLR start "DECIMALINTEGER"
   public final void mDECIMALINTEGER() throws RecognitionException {
     try {
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:363:5: ( '0' | '1' .. '9' ( DECIMALDIGIT )* )
-      int alt14=2;
-      int LA14_0 = input.LA(1);
-      if ( (LA14_0=='0') ) {
-        alt14=1;
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:394:5: ( '0' | '1' .. '9' ( DECIMALDIGIT )* )
+      int alt21=2;
+      int LA21_0 = input.LA(1);
+      if ( (LA21_0=='0') ) {
+        alt21=1;
       }
-      else if ( ((LA14_0 >= '1' && LA14_0 <= '9')) ) {
-        alt14=2;
+      else if ( ((LA21_0 >= '1' && LA21_0 <= '9')) ) {
+        alt21=2;
       }
 
       else {
         NoViableAltException nvae =
-          new NoViableAltException("", 14, 0, input);
+          new NoViableAltException("", 21, 0, input);
         throw nvae;
       }
 
-      switch (alt14) {
+      switch (alt21) {
         case 1 :
-          // src/java/org/apache/lucene/expressions/js/Javascript.g:363:7: '0'
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:394:7: '0'
           {
           match('0'); 
           }
           break;
         case 2 :
-          // src/java/org/apache/lucene/expressions/js/Javascript.g:364:7: '1' .. '9' ( DECIMALDIGIT )*
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:395:7: '1' .. '9' ( DECIMALDIGIT )*
           {
           matchRange('1','9'); 
-          // src/java/org/apache/lucene/expressions/js/Javascript.g:364:16: ( DECIMALDIGIT )*
-          loop13:
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:395:16: ( DECIMALDIGIT )*
+          loop20:
           while (true) {
-            int alt13=2;
-            int LA13_0 = input.LA(1);
-            if ( ((LA13_0 >= '0' && LA13_0 <= '9')) ) {
-              alt13=1;
+            int alt20=2;
+            int LA20_0 = input.LA(1);
+            if ( ((LA20_0 >= '0' && LA20_0 <= '9')) ) {
+              alt20=1;
             }
 
-            switch (alt13) {
+            switch (alt20) {
             case 1 :
               // src/java/org/apache/lucene/expressions/js/Javascript.g:
               {
@@ -1147,7 +1495,7 @@ class JavascriptLexer extends Lexer {
               break;
 
             default :
-              break loop13;
+              break loop20;
             }
           }
 
@@ -1165,8 +1513,8 @@ class JavascriptLexer extends Lexer {
   // $ANTLR start "EXPONENT"
   public final void mEXPONENT() throws RecognitionException {
     try {
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:369:5: ( ( 'e' | 'E' ) ( '+' | '-' )? ( DECIMALDIGIT )+ )
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:369:7: ( 'e' | 'E' ) ( '+' | '-' )? ( DECIMALDIGIT )+
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:400:5: ( ( 'e' | 'E' ) ( '+' | '-' )? ( DECIMALDIGIT )+ )
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:400:7: ( 'e' | 'E' ) ( '+' | '-' )? ( DECIMALDIGIT )+
       {
       if ( input.LA(1)=='E'||input.LA(1)=='e' ) {
         input.consume();
@@ -1176,13 +1524,13 @@ class JavascriptLexer extends Lexer {
         recover(mse);
         throw mse;
       }
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:369:17: ( '+' | '-' )?
-      int alt15=2;
-      int LA15_0 = input.LA(1);
-      if ( (LA15_0=='+'||LA15_0=='-') ) {
-        alt15=1;
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:400:17: ( '+' | '-' )?
+      int alt22=2;
+      int LA22_0 = input.LA(1);
+      if ( (LA22_0=='+'||LA22_0=='-') ) {
+        alt22=1;
       }
-      switch (alt15) {
+      switch (alt22) {
         case 1 :
           // src/java/org/apache/lucene/expressions/js/Javascript.g:
           {
@@ -1199,17 +1547,17 @@ class JavascriptLexer extends Lexer {
 
       }
 
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:369:28: ( DECIMALDIGIT )+
-      int cnt16=0;
-      loop16:
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:400:28: ( DECIMALDIGIT )+
+      int cnt23=0;
+      loop23:
       while (true) {
-        int alt16=2;
-        int LA16_0 = input.LA(1);
-        if ( ((LA16_0 >= '0' && LA16_0 <= '9')) ) {
-          alt16=1;
+        int alt23=2;
+        int LA23_0 = input.LA(1);
+        if ( ((LA23_0 >= '0' && LA23_0 <= '9')) ) {
+          alt23=1;
         }
 
-        switch (alt16) {
+        switch (alt23) {
         case 1 :
           // src/java/org/apache/lucene/expressions/js/Javascript.g:
           {
@@ -1225,11 +1573,11 @@ class JavascriptLexer extends Lexer {
           break;
 
         default :
-          if ( cnt16 >= 1 ) break loop16;
-          EarlyExitException eee = new EarlyExitException(16, input);
+          if ( cnt23 >= 1 ) break loop23;
+          EarlyExitException eee = new EarlyExitException(23, input);
           throw eee;
         }
-        cnt16++;
+        cnt23++;
       }
 
       }
@@ -1244,7 +1592,7 @@ class JavascriptLexer extends Lexer {
   // $ANTLR start "DECIMALDIGIT"
   public final void mDECIMALDIGIT() throws RecognitionException {
     try {
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:374:5: ( '0' .. '9' )
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:405:5: ( '0' .. '9' )
       // src/java/org/apache/lucene/expressions/js/Javascript.g:
       {
       if ( (input.LA(1) >= '0' && input.LA(1) <= '9') ) {
@@ -1267,7 +1615,7 @@ class JavascriptLexer extends Lexer {
   // $ANTLR start "HEXDIGIT"
   public final void mHEXDIGIT() throws RecognitionException {
     try {
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:379:5: ( DECIMALDIGIT | 'a' .. 'f' | 'A' .. 'F' )
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:410:5: ( DECIMALDIGIT | 'a' .. 'f' | 'A' .. 'F' )
       // src/java/org/apache/lucene/expressions/js/Javascript.g:
       {
       if ( (input.LA(1) >= '0' && input.LA(1) <= '9')||(input.LA(1) >= 'A' && input.LA(1) <= 'F')||(input.LA(1) >= 'a' && input.LA(1) <= 'f') ) {
@@ -1290,7 +1638,7 @@ class JavascriptLexer extends Lexer {
   // $ANTLR start "OCTALDIGIT"
   public final void mOCTALDIGIT() throws RecognitionException {
     try {
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:386:5: ( '0' .. '7' )
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:417:5: ( '0' .. '7' )
       // src/java/org/apache/lucene/expressions/js/Javascript.g:
       {
       if ( (input.LA(1) >= '0' && input.LA(1) <= '7') ) {
@@ -1312,41 +1660,41 @@ class JavascriptLexer extends Lexer {
 
   @Override
   public void mTokens() throws RecognitionException {
-    // src/java/org/apache/lucene/expressions/js/Javascript.g:1:8: ( AT_ADD | AT_BIT_AND | AT_BIT_NOT | AT_BIT_OR | AT_BIT_SHL | AT_BIT_SHR | AT_BIT_SHU | AT_BIT_XOR | AT_BOOL_AND | AT_BOOL_NOT | AT_BOOL_OR | AT_COLON | AT_COMMA | AT_COMP_EQ | AT_COMP_GT | AT_COMP_GTE | AT_COMP_LT | AT_COMP_LTE | AT_COMP_NEQ | AT_COND_QUE | AT_DIVIDE | AT_DOT | AT_LPAREN | AT_MODULO | AT_MULTIPLY | AT_RPAREN | AT_SUBTRACT | NAMESPACE_ID | WS | DECIMAL | OCTAL | HEX )
-    int alt17=32;
+    // src/java/org/apache/lucene/expressions/js/Javascript.g:1:8: ( AT_ADD | AT_BIT_AND | AT_BIT_NOT | AT_BIT_OR | AT_BIT_SHL | AT_BIT_SHR | AT_BIT_SHU | AT_BIT_XOR | AT_BOOL_AND | AT_BOOL_NOT | AT_BOOL_OR | AT_COLON | AT_COMMA | AT_COMP_EQ | AT_COMP_GT | AT_COMP_GTE | AT_COMP_LT | AT_COMP_LTE | AT_COMP_NEQ | AT_COND_QUE | AT_DIVIDE | AT_DOT | AT_LPAREN | AT_MODULO | AT_MULTIPLY | AT_RPAREN | AT_SUBTRACT | VARIABLE | WS | DECIMAL | OCTAL | HEX )
+    int alt24=32;
     switch ( input.LA(1) ) {
     case '+':
       {
-      alt17=1;
+      alt24=1;
       }
       break;
     case '&':
       {
-      int LA17_2 = input.LA(2);
-      if ( (LA17_2=='&') ) {
-        alt17=9;
+      int LA24_2 = input.LA(2);
+      if ( (LA24_2=='&') ) {
+        alt24=9;
       }
 
       else {
-        alt17=2;
+        alt24=2;
       }
 
       }
       break;
     case '~':
       {
-      alt17=3;
+      alt24=3;
       }
       break;
     case '|':
       {
-      int LA17_4 = input.LA(2);
-      if ( (LA17_4=='|') ) {
-        alt17=11;
+      int LA24_4 = input.LA(2);
+      if ( (LA24_4=='|') ) {
+        alt24=11;
       }
 
       else {
-        alt17=4;
+        alt24=4;
       }
 
       }
@@ -1356,16 +1704,16 @@ class JavascriptLexer extends Lexer {
       switch ( input.LA(2) ) {
       case '<':
         {
-        alt17=5;
+        alt24=5;
         }
         break;
       case '=':
         {
-        alt17=18;
+        alt24=18;
         }
         break;
       default:
-        alt17=17;
+        alt24=17;
       }
       }
       break;
@@ -1374,106 +1722,106 @@ class JavascriptLexer extends Lexer {
       switch ( input.LA(2) ) {
       case '>':
         {
-        int LA17_31 = input.LA(3);
-        if ( (LA17_31=='>') ) {
-          alt17=7;
+        int LA24_31 = input.LA(3);
+        if ( (LA24_31=='>') ) {
+          alt24=7;
         }
 
         else {
-          alt17=6;
+          alt24=6;
         }
 
         }
         break;
       case '=':
         {
-        alt17=16;
+        alt24=16;
         }
         break;
       default:
-        alt17=15;
+        alt24=15;
       }
       }
       break;
     case '^':
       {
-      alt17=8;
+      alt24=8;
       }
       break;
     case '!':
       {
-      int LA17_8 = input.LA(2);
-      if ( (LA17_8=='=') ) {
-        alt17=19;
+      int LA24_8 = input.LA(2);
+      if ( (LA24_8=='=') ) {
+        alt24=19;
       }
 
       else {
-        alt17=10;
+        alt24=10;
       }
 
       }
       break;
     case ':':
       {
-      alt17=12;
+      alt24=12;
       }
       break;
     case ',':
       {
-      alt17=13;
+      alt24=13;
       }
       break;
     case '=':
       {
-      alt17=14;
+      alt24=14;
       }
       break;
     case '?':
       {
-      alt17=20;
+      alt24=20;
       }
       break;
     case '/':
       {
-      alt17=21;
+      alt24=21;
       }
       break;
     case '.':
       {
-      int LA17_14 = input.LA(2);
-      if ( ((LA17_14 >= '0' && LA17_14 <= '9')) ) {
-        alt17=30;
+      int LA24_14 = input.LA(2);
+      if ( ((LA24_14 >= '0' && LA24_14 <= '9')) ) {
+        alt24=30;
       }
 
       else {
-        alt17=22;
+        alt24=22;
       }
 
       }
       break;
     case '(':
       {
-      alt17=23;
+      alt24=23;
       }
       break;
     case '%':
       {
-      alt17=24;
+      alt24=24;
       }
       break;
     case '*':
       {
-      alt17=25;
+      alt24=25;
       }
       break;
     case ')':
       {
-      alt17=26;
+      alt24=26;
       }
       break;
     case '-':
       {
-      alt17=27;
+      alt24=27;
       }
       break;
     case '$':
@@ -1531,7 +1879,7 @@ class JavascriptLexer extends Lexer {
     case 'y':
     case 'z':
       {
-      alt17=28;
+      alt24=28;
       }
       break;
     case '\t':
@@ -1539,7 +1887,7 @@ class JavascriptLexer extends Lexer {
     case '\r':
     case ' ':
       {
-      alt17=29;
+      alt24=29;
       }
       break;
     case '0':
@@ -1548,7 +1896,7 @@ class JavascriptLexer extends Lexer {
       case 'X':
       case 'x':
         {
-        alt17=32;
+        alt24=32;
         }
         break;
       case '0':
@@ -1560,11 +1908,11 @@ class JavascriptLexer extends Lexer {
       case '6':
       case '7':
         {
-        alt17=31;
+        alt24=31;
         }
         break;
       default:
-        alt17=30;
+        alt24=30;
       }
       }
       break;
@@ -1578,15 +1926,15 @@ class JavascriptLexer extends Lexer {
     case '8':
     case '9':
       {
-      alt17=30;
+      alt24=30;
       }
       break;
     default:
       NoViableAltException nvae =
-        new NoViableAltException("", 17, 0, input);
+        new NoViableAltException("", 24, 0, input);
       throw nvae;
     }
-    switch (alt17) {
+    switch (alt24) {
       case 1 :
         // src/java/org/apache/lucene/expressions/js/Javascript.g:1:10: AT_ADD
         {
@@ -1777,35 +2125,35 @@ class JavascriptLexer extends Lexer {
         }
         break;
       case 28 :
-        // src/java/org/apache/lucene/expressions/js/Javascript.g:1:298: NAMESPACE_ID
+        // src/java/org/apache/lucene/expressions/js/Javascript.g:1:298: VARIABLE
         {
-        mNAMESPACE_ID(); 
+        mVARIABLE(); 
 
         }
         break;
       case 29 :
-        // src/java/org/apache/lucene/expressions/js/Javascript.g:1:311: WS
+        // src/java/org/apache/lucene/expressions/js/Javascript.g:1:307: WS
         {
         mWS(); 
 
         }
         break;
       case 30 :
-        // src/java/org/apache/lucene/expressions/js/Javascript.g:1:314: DECIMAL
+        // src/java/org/apache/lucene/expressions/js/Javascript.g:1:310: DECIMAL
         {
         mDECIMAL(); 
 
         }
         break;
       case 31 :
-        // src/java/org/apache/lucene/expressions/js/Javascript.g:1:322: OCTAL
+        // src/java/org/apache/lucene/expressions/js/Javascript.g:1:318: OCTAL
         {
         mOCTAL(); 
 
         }
         break;
       case 32 :
-        // src/java/org/apache/lucene/expressions/js/Javascript.g:1:328: HEX
+        // src/java/org/apache/lucene/expressions/js/Javascript.g:1:324: HEX
         {
         mHEX(); 
 
@@ -1816,20 +2164,20 @@ class JavascriptLexer extends Lexer {
   }
 
 
-  protected DFA9 dfa9 = new DFA9(this);
-  static final String DFA9_eotS =
+  protected DFA16 dfa16 = new DFA16(this);
+  static final String DFA16_eotS =
     "\1\uffff\2\4\3\uffff\1\4";
-  static final String DFA9_eofS =
+  static final String DFA16_eofS =
     "\7\uffff";
-  static final String DFA9_minS =
+  static final String DFA16_minS =
     "\3\56\3\uffff\1\56";
-  static final String DFA9_maxS =
+  static final String DFA16_maxS =
     "\1\71\1\56\1\71\3\uffff\1\71";
-  static final String DFA9_acceptS =
+  static final String DFA16_acceptS =
     "\3\uffff\1\2\1\3\1\1\1\uffff";
-  static final String DFA9_specialS =
+  static final String DFA16_specialS =
     "\7\uffff}>";
-  static final String[] DFA9_transitionS = {
+  static final String[] DFA16_transitionS = {
       "\1\3\1\uffff\1\1\11\2",
       "\1\5",
       "\1\5\1\uffff\12\6",
@@ -1839,38 +2187,38 @@ class JavascriptLexer extends Lexer {
       "\1\5\1\uffff\12\6"
   };
 
-  static final short[] DFA9_eot = DFA.unpackEncodedString(DFA9_eotS);
-  static final short[] DFA9_eof = DFA.unpackEncodedString(DFA9_eofS);
-  static final char[] DFA9_min = DFA.unpackEncodedStringToUnsignedChars(DFA9_minS);
-  static final char[] DFA9_max = DFA.unpackEncodedStringToUnsignedChars(DFA9_maxS);
-  static final short[] DFA9_accept = DFA.unpackEncodedString(DFA9_acceptS);
-  static final short[] DFA9_special = DFA.unpackEncodedString(DFA9_specialS);
-  static final short[][] DFA9_transition;
+  static final short[] DFA16_eot = DFA.unpackEncodedString(DFA16_eotS);
+  static final short[] DFA16_eof = DFA.unpackEncodedString(DFA16_eofS);
+  static final char[] DFA16_min = DFA.unpackEncodedStringToUnsignedChars(DFA16_minS);
+  static final char[] DFA16_max = DFA.unpackEncodedStringToUnsignedChars(DFA16_maxS);
+  static final short[] DFA16_accept = DFA.unpackEncodedString(DFA16_acceptS);
+  static final short[] DFA16_special = DFA.unpackEncodedString(DFA16_specialS);
+  static final short[][] DFA16_transition;
 
   static {
-    int numStates = DFA9_transitionS.length;
-    DFA9_transition = new short[numStates][];
+    int numStates = DFA16_transitionS.length;
+    DFA16_transition = new short[numStates][];
     for (int i=0; i<numStates; i++) {
-      DFA9_transition[i] = DFA.unpackEncodedString(DFA9_transitionS[i]);
+      DFA16_transition[i] = DFA.unpackEncodedString(DFA16_transitionS[i]);
     }
   }
 
-  protected class DFA9 extends DFA {
+  protected class DFA16 extends DFA {
 
-    public DFA9(BaseRecognizer recognizer) {
+    public DFA16(BaseRecognizer recognizer) {
       this.recognizer = recognizer;
-      this.decisionNumber = 9;
-      this.eot = DFA9_eot;
-      this.eof = DFA9_eof;
-      this.min = DFA9_min;
-      this.max = DFA9_max;
-      this.accept = DFA9_accept;
-      this.special = DFA9_special;
-      this.transition = DFA9_transition;
+      this.decisionNumber = 16;
+      this.eot = DFA16_eot;
+      this.eof = DFA16_eof;
+      this.min = DFA16_min;
+      this.max = DFA16_max;
+      this.accept = DFA16_accept;
+      this.special = DFA16_special;
+      this.transition = DFA16_transition;
     }
     @Override
     public String getDescription() {
-      return "346:1: DECIMAL : ( DECIMALINTEGER AT_DOT ( DECIMALDIGIT )* ( EXPONENT )? | AT_DOT ( DECIMALDIGIT )+ ( EXPONENT )? | DECIMALINTEGER ( EXPONENT )? );";
+      return "377:1: DECIMAL : ( DECIMALINTEGER AT_DOT ( DECIMALDIGIT )* ( EXPONENT )? | AT_DOT ( DECIMALDIGIT )+ ( EXPONENT )? | DECIMALINTEGER ( EXPONENT )? );";
     }
   }
 

Modified: lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptParser.java?rev=1609337&r1=1609336&r2=1609337&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptParser.java (original)
+++ lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/JavascriptParser.java Wed Jul  9 23:18:58 2014
@@ -16,56 +16,62 @@ import org.antlr.runtime.tree.*;
 @SuppressWarnings("all")
 class JavascriptParser extends Parser {
   public static final String[] tokenNames = new String[] {
-    "<invalid>", "<EOR>", "<DOWN>", "<UP>", "AT_ADD", "AT_BIT_AND", "AT_BIT_NOT", 
-    "AT_BIT_OR", "AT_BIT_SHL", "AT_BIT_SHR", "AT_BIT_SHU", "AT_BIT_XOR", "AT_BOOL_AND", 
-    "AT_BOOL_NOT", "AT_BOOL_OR", "AT_CALL", "AT_COLON", "AT_COMMA", "AT_COMP_EQ", 
-    "AT_COMP_GT", "AT_COMP_GTE", "AT_COMP_LT", "AT_COMP_LTE", "AT_COMP_NEQ", 
-    "AT_COND_QUE", "AT_DIVIDE", "AT_DOT", "AT_LPAREN", "AT_MODULO", "AT_MULTIPLY", 
-    "AT_NEGATE", "AT_RPAREN", "AT_SUBTRACT", "DECIMAL", "DECIMALDIGIT", "DECIMALINTEGER", 
-    "EXPONENT", "HEX", "HEXDIGIT", "ID", "NAMESPACE_ID", "OCTAL", "OCTALDIGIT", 
-    "WS"
+    "<invalid>", "<EOR>", "<DOWN>", "<UP>", "ARRAY", "AT_ADD", "AT_BIT_AND", 
+    "AT_BIT_NOT", "AT_BIT_OR", "AT_BIT_SHL", "AT_BIT_SHR", "AT_BIT_SHU", "AT_BIT_XOR", 
+    "AT_BOOL_AND", "AT_BOOL_NOT", "AT_BOOL_OR", "AT_CALL", "AT_COLON", "AT_COMMA", 
+    "AT_COMP_EQ", "AT_COMP_GT", "AT_COMP_GTE", "AT_COMP_LT", "AT_COMP_LTE", 
+    "AT_COMP_NEQ", "AT_COND_QUE", "AT_DIVIDE", "AT_DOT", "AT_LPAREN", "AT_MODULO", 
+    "AT_MULTIPLY", "AT_NEGATE", "AT_RPAREN", "AT_SUBTRACT", "DECIMAL", "DECIMALDIGIT", 
+    "DECIMALINTEGER", "DOUBLE_STRING_CHAR", "EXPONENT", "HEX", "HEXDIGIT", 
+    "ID", "OBJECT", "OCTAL", "OCTALDIGIT", "SINGLE_STRING_CHAR", "STRING", 
+    "VARIABLE", "WS"
   };
   public static final int EOF=-1;
-  public static final int AT_ADD=4;
-  public static final int AT_BIT_AND=5;
-  public static final int AT_BIT_NOT=6;
-  public static final int AT_BIT_OR=7;
-  public static final int AT_BIT_SHL=8;
-  public static final int AT_BIT_SHR=9;
-  public static final int AT_BIT_SHU=10;
-  public static final int AT_BIT_XOR=11;
-  public static final int AT_BOOL_AND=12;
-  public static final int AT_BOOL_NOT=13;
-  public static final int AT_BOOL_OR=14;
-  public static final int AT_CALL=15;
-  public static final int AT_COLON=16;
-  public static final int AT_COMMA=17;
-  public static final int AT_COMP_EQ=18;
-  public static final int AT_COMP_GT=19;
-  public static final int AT_COMP_GTE=20;
-  public static final int AT_COMP_LT=21;
-  public static final int AT_COMP_LTE=22;
-  public static final int AT_COMP_NEQ=23;
-  public static final int AT_COND_QUE=24;
-  public static final int AT_DIVIDE=25;
-  public static final int AT_DOT=26;
-  public static final int AT_LPAREN=27;
-  public static final int AT_MODULO=28;
-  public static final int AT_MULTIPLY=29;
-  public static final int AT_NEGATE=30;
-  public static final int AT_RPAREN=31;
-  public static final int AT_SUBTRACT=32;
-  public static final int DECIMAL=33;
-  public static final int DECIMALDIGIT=34;
-  public static final int DECIMALINTEGER=35;
-  public static final int EXPONENT=36;
-  public static final int HEX=37;
-  public static final int HEXDIGIT=38;
-  public static final int ID=39;
-  public static final int NAMESPACE_ID=40;
-  public static final int OCTAL=41;
-  public static final int OCTALDIGIT=42;
-  public static final int WS=43;
+  public static final int ARRAY=4;
+  public static final int AT_ADD=5;
+  public static final int AT_BIT_AND=6;
+  public static final int AT_BIT_NOT=7;
+  public static final int AT_BIT_OR=8;
+  public static final int AT_BIT_SHL=9;
+  public static final int AT_BIT_SHR=10;
+  public static final int AT_BIT_SHU=11;
+  public static final int AT_BIT_XOR=12;
+  public static final int AT_BOOL_AND=13;
+  public static final int AT_BOOL_NOT=14;
+  public static final int AT_BOOL_OR=15;
+  public static final int AT_CALL=16;
+  public static final int AT_COLON=17;
+  public static final int AT_COMMA=18;
+  public static final int AT_COMP_EQ=19;
+  public static final int AT_COMP_GT=20;
+  public static final int AT_COMP_GTE=21;
+  public static final int AT_COMP_LT=22;
+  public static final int AT_COMP_LTE=23;
+  public static final int AT_COMP_NEQ=24;
+  public static final int AT_COND_QUE=25;
+  public static final int AT_DIVIDE=26;
+  public static final int AT_DOT=27;
+  public static final int AT_LPAREN=28;
+  public static final int AT_MODULO=29;
+  public static final int AT_MULTIPLY=30;
+  public static final int AT_NEGATE=31;
+  public static final int AT_RPAREN=32;
+  public static final int AT_SUBTRACT=33;
+  public static final int DECIMAL=34;
+  public static final int DECIMALDIGIT=35;
+  public static final int DECIMALINTEGER=36;
+  public static final int DOUBLE_STRING_CHAR=37;
+  public static final int EXPONENT=38;
+  public static final int HEX=39;
+  public static final int HEXDIGIT=40;
+  public static final int ID=41;
+  public static final int OBJECT=42;
+  public static final int OCTAL=43;
+  public static final int OCTALDIGIT=44;
+  public static final int SINGLE_STRING_CHAR=45;
+  public static final int STRING=46;
+  public static final int VARIABLE=47;
+  public static final int WS=48;
 
   // delegates
   public Parser[] getDelegates() {
@@ -1271,8 +1277,8 @@ class JavascriptParser extends Parser {
       case AT_LPAREN:
       case DECIMAL:
       case HEX:
-      case NAMESPACE_ID:
       case OCTAL:
+      case VARIABLE:
         {
         alt12=1;
         }
@@ -1493,26 +1499,26 @@ class JavascriptParser extends Parser {
 
 
   // $ANTLR start "postfix"
-  // src/java/org/apache/lucene/expressions/js/Javascript.g:310:1: postfix : ( primary | NAMESPACE_ID arguments -> ^( AT_CALL NAMESPACE_ID ( arguments )? ) );
+  // src/java/org/apache/lucene/expressions/js/Javascript.g:310:1: postfix : ( primary | VARIABLE arguments -> ^( AT_CALL VARIABLE ( arguments )? ) );
   public final JavascriptParser.postfix_return postfix() throws RecognitionException {
     JavascriptParser.postfix_return retval = new JavascriptParser.postfix_return();
     retval.start = input.LT(1);
 
     CommonTree root_0 = null;
 
-    Token NAMESPACE_ID47=null;
+    Token VARIABLE47=null;
     ParserRuleReturnScope primary46 =null;
     ParserRuleReturnScope arguments48 =null;
 
-    CommonTree NAMESPACE_ID47_tree=null;
-    RewriteRuleTokenStream stream_NAMESPACE_ID=new RewriteRuleTokenStream(adaptor,"token NAMESPACE_ID");
+    CommonTree VARIABLE47_tree=null;
+    RewriteRuleTokenStream stream_VARIABLE=new RewriteRuleTokenStream(adaptor,"token VARIABLE");
     RewriteRuleSubtreeStream stream_arguments=new RewriteRuleSubtreeStream(adaptor,"rule arguments");
 
     try {
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:311:5: ( primary | NAMESPACE_ID arguments -> ^( AT_CALL NAMESPACE_ID ( arguments )? ) )
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:311:5: ( primary | VARIABLE arguments -> ^( AT_CALL VARIABLE ( arguments )? ) )
       int alt14=2;
       int LA14_0 = input.LA(1);
-      if ( (LA14_0==NAMESPACE_ID) ) {
+      if ( (LA14_0==VARIABLE) ) {
         int LA14_1 = input.LA(2);
         if ( (LA14_1==EOF||(LA14_1 >= AT_ADD && LA14_1 <= AT_BIT_AND)||(LA14_1 >= AT_BIT_OR && LA14_1 <= AT_BOOL_AND)||LA14_1==AT_BOOL_OR||(LA14_1 >= AT_COLON && LA14_1 <= AT_DIVIDE)||(LA14_1 >= AT_MODULO && LA14_1 <= AT_MULTIPLY)||(LA14_1 >= AT_RPAREN && LA14_1 <= AT_SUBTRACT)) ) {
           alt14=1;
@@ -1560,10 +1566,10 @@ class JavascriptParser extends Parser {
           }
           break;
         case 2 :
-          // src/java/org/apache/lucene/expressions/js/Javascript.g:312:7: NAMESPACE_ID arguments
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:312:7: VARIABLE arguments
           {
-          NAMESPACE_ID47=(Token)match(input,NAMESPACE_ID,FOLLOW_NAMESPACE_ID_in_postfix1168);  
-          stream_NAMESPACE_ID.add(NAMESPACE_ID47);
+          VARIABLE47=(Token)match(input,VARIABLE,FOLLOW_VARIABLE_in_postfix1168);  
+          stream_VARIABLE.add(VARIABLE47);
 
           pushFollow(FOLLOW_arguments_in_postfix1170);
           arguments48=arguments();
@@ -1571,7 +1577,7 @@ class JavascriptParser extends Parser {
 
           stream_arguments.add(arguments48.getTree());
           // AST REWRITE
-          // elements: arguments, NAMESPACE_ID
+          // elements: VARIABLE, arguments
           // token labels: 
           // rule labels: retval
           // token list labels: 
@@ -1581,14 +1587,14 @@ class JavascriptParser extends Parser {
           RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
           root_0 = (CommonTree)adaptor.nil();
-          // 312:30: -> ^( AT_CALL NAMESPACE_ID ( arguments )? )
+          // 312:26: -> ^( AT_CALL VARIABLE ( arguments )? )
           {
-            // src/java/org/apache/lucene/expressions/js/Javascript.g:312:33: ^( AT_CALL NAMESPACE_ID ( arguments )? )
+            // src/java/org/apache/lucene/expressions/js/Javascript.g:312:29: ^( AT_CALL VARIABLE ( arguments )? )
             {
             CommonTree root_1 = (CommonTree)adaptor.nil();
             root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(AT_CALL, "AT_CALL"), root_1);
-            adaptor.addChild(root_1, stream_NAMESPACE_ID.nextNode());
-            // src/java/org/apache/lucene/expressions/js/Javascript.g:312:56: ( arguments )?
+            adaptor.addChild(root_1, stream_VARIABLE.nextNode());
+            // src/java/org/apache/lucene/expressions/js/Javascript.g:312:48: ( arguments )?
             if ( stream_arguments.hasNext() ) {
               adaptor.addChild(root_1, stream_arguments.nextTree());
             }
@@ -1633,28 +1639,28 @@ class JavascriptParser extends Parser {
 
 
   // $ANTLR start "primary"
-  // src/java/org/apache/lucene/expressions/js/Javascript.g:315:1: primary : ( NAMESPACE_ID | numeric | AT_LPAREN ! conditional AT_RPAREN !);
+  // src/java/org/apache/lucene/expressions/js/Javascript.g:315:1: primary : ( VARIABLE | numeric | AT_LPAREN ! conditional AT_RPAREN !);
   public final JavascriptParser.primary_return primary() throws RecognitionException {
     JavascriptParser.primary_return retval = new JavascriptParser.primary_return();
     retval.start = input.LT(1);
 
     CommonTree root_0 = null;
 
-    Token NAMESPACE_ID49=null;
+    Token VARIABLE49=null;
     Token AT_LPAREN51=null;
     Token AT_RPAREN53=null;
     ParserRuleReturnScope numeric50 =null;
     ParserRuleReturnScope conditional52 =null;
 
-    CommonTree NAMESPACE_ID49_tree=null;
+    CommonTree VARIABLE49_tree=null;
     CommonTree AT_LPAREN51_tree=null;
     CommonTree AT_RPAREN53_tree=null;
 
     try {
-      // src/java/org/apache/lucene/expressions/js/Javascript.g:316:5: ( NAMESPACE_ID | numeric | AT_LPAREN ! conditional AT_RPAREN !)
+      // src/java/org/apache/lucene/expressions/js/Javascript.g:316:5: ( VARIABLE | numeric | AT_LPAREN ! conditional AT_RPAREN !)
       int alt15=3;
       switch ( input.LA(1) ) {
-      case NAMESPACE_ID:
+      case VARIABLE:
         {
         alt15=1;
         }
@@ -1678,14 +1684,14 @@ class JavascriptParser extends Parser {
       }
       switch (alt15) {
         case 1 :
-          // src/java/org/apache/lucene/expressions/js/Javascript.g:316:7: NAMESPACE_ID
+          // src/java/org/apache/lucene/expressions/js/Javascript.g:316:7: VARIABLE
           {
           root_0 = (CommonTree)adaptor.nil();
 
 
-          NAMESPACE_ID49=(Token)match(input,NAMESPACE_ID,FOLLOW_NAMESPACE_ID_in_primary1198); 
-          NAMESPACE_ID49_tree = (CommonTree)adaptor.create(NAMESPACE_ID49);
-          adaptor.addChild(root_0, NAMESPACE_ID49_tree);
+          VARIABLE49=(Token)match(input,VARIABLE,FOLLOW_VARIABLE_in_primary1198); 
+          VARIABLE49_tree = (CommonTree)adaptor.create(VARIABLE49);
+          adaptor.addChild(root_0, VARIABLE49_tree);
 
           }
           break;
@@ -1776,7 +1782,7 @@ class JavascriptParser extends Parser {
       // src/java/org/apache/lucene/expressions/js/Javascript.g:322:18: ( conditional ( AT_COMMA ! conditional )* )?
       int alt17=2;
       int LA17_0 = input.LA(1);
-      if ( (LA17_0==AT_ADD||LA17_0==AT_BIT_NOT||LA17_0==AT_BOOL_NOT||LA17_0==AT_LPAREN||(LA17_0 >= AT_SUBTRACT && LA17_0 <= DECIMAL)||LA17_0==HEX||(LA17_0 >= NAMESPACE_ID && LA17_0 <= OCTAL)) ) {
+      if ( (LA17_0==AT_ADD||LA17_0==AT_BIT_NOT||LA17_0==AT_BOOL_NOT||LA17_0==AT_LPAREN||(LA17_0 >= AT_SUBTRACT && LA17_0 <= DECIMAL)||LA17_0==HEX||LA17_0==OCTAL||LA17_0==VARIABLE) ) {
         alt17=1;
       }
       switch (alt17) {
@@ -1906,60 +1912,60 @@ class JavascriptParser extends Parser {
 
   public static final BitSet FOLLOW_conditional_in_expression737 = new BitSet(new long[]{0x0000000000000000L});
   public static final BitSet FOLLOW_EOF_in_expression739 = new BitSet(new long[]{0x0000000000000002L});
-  public static final BitSet FOLLOW_logical_or_in_conditional757 = new BitSet(new long[]{0x0000000001000002L});
-  public static final BitSet FOLLOW_AT_COND_QUE_in_conditional760 = new BitSet(new long[]{0x0000032308002050L});
-  public static final BitSet FOLLOW_conditional_in_conditional763 = new BitSet(new long[]{0x0000000000010000L});
-  public static final BitSet FOLLOW_AT_COLON_in_conditional765 = new BitSet(new long[]{0x0000032308002050L});
+  public static final BitSet FOLLOW_logical_or_in_conditional757 = new BitSet(new long[]{0x0000000002000002L});
+  public static final BitSet FOLLOW_AT_COND_QUE_in_conditional760 = new BitSet(new long[]{0x00008886100040A0L});
+  public static final BitSet FOLLOW_conditional_in_conditional763 = new BitSet(new long[]{0x0000000000020000L});
+  public static final BitSet FOLLOW_AT_COLON_in_conditional765 = new BitSet(new long[]{0x00008886100040A0L});
   public static final BitSet FOLLOW_conditional_in_conditional768 = new BitSet(new long[]{0x0000000000000002L});
-  public static final BitSet FOLLOW_logical_and_in_logical_or787 = new BitSet(new long[]{0x0000000000004002L});
-  public static final BitSet FOLLOW_AT_BOOL_OR_in_logical_or790 = new BitSet(new long[]{0x0000032308002050L});
-  public static final BitSet FOLLOW_logical_and_in_logical_or793 = new BitSet(new long[]{0x0000000000004002L});
-  public static final BitSet FOLLOW_bitwise_or_in_logical_and812 = new BitSet(new long[]{0x0000000000001002L});
-  public static final BitSet FOLLOW_AT_BOOL_AND_in_logical_and815 = new BitSet(new long[]{0x0000032308002050L});
-  public static final BitSet FOLLOW_bitwise_or_in_logical_and818 = new BitSet(new long[]{0x0000000000001002L});
-  public static final BitSet FOLLOW_bitwise_xor_in_bitwise_or837 = new BitSet(new long[]{0x0000000000000082L});
-  public static final BitSet FOLLOW_AT_BIT_OR_in_bitwise_or840 = new BitSet(new long[]{0x0000032308002050L});
-  public static final BitSet FOLLOW_bitwise_xor_in_bitwise_or843 = new BitSet(new long[]{0x0000000000000082L});
-  public static final BitSet FOLLOW_bitwise_and_in_bitwise_xor862 = new BitSet(new long[]{0x0000000000000802L});
-  public static final BitSet FOLLOW_AT_BIT_XOR_in_bitwise_xor865 = new BitSet(new long[]{0x0000032308002050L});
-  public static final BitSet FOLLOW_bitwise_and_in_bitwise_xor868 = new BitSet(new long[]{0x0000000000000802L});
-  public static final BitSet FOLLOW_equality_in_bitwise_and888 = new BitSet(new long[]{0x0000000000000022L});
-  public static final BitSet FOLLOW_AT_BIT_AND_in_bitwise_and891 = new BitSet(new long[]{0x0000032308002050L});
-  public static final BitSet FOLLOW_equality_in_bitwise_and894 = new BitSet(new long[]{0x0000000000000022L});
-  public static final BitSet FOLLOW_relational_in_equality913 = new BitSet(new long[]{0x0000000000840002L});
-  public static final BitSet FOLLOW_set_in_equality916 = new BitSet(new long[]{0x0000032308002050L});
-  public static final BitSet FOLLOW_relational_in_equality925 = new BitSet(new long[]{0x0000000000840002L});
-  public static final BitSet FOLLOW_shift_in_relational944 = new BitSet(new long[]{0x0000000000780002L});
-  public static final BitSet FOLLOW_set_in_relational947 = new BitSet(new long[]{0x0000032308002050L});
-  public static final BitSet FOLLOW_shift_in_relational964 = new BitSet(new long[]{0x0000000000780002L});
-  public static final BitSet FOLLOW_additive_in_shift983 = new BitSet(new long[]{0x0000000000000702L});
-  public static final BitSet FOLLOW_set_in_shift986 = new BitSet(new long[]{0x0000032308002050L});
-  public static final BitSet FOLLOW_additive_in_shift999 = new BitSet(new long[]{0x0000000000000702L});
-  public static final BitSet FOLLOW_multiplicative_in_additive1018 = new BitSet(new long[]{0x0000000100000012L});
-  public static final BitSet FOLLOW_set_in_additive1021 = new BitSet(new long[]{0x0000032308002050L});
-  public static final BitSet FOLLOW_multiplicative_in_additive1030 = new BitSet(new long[]{0x0000000100000012L});
-  public static final BitSet FOLLOW_unary_in_multiplicative1049 = new BitSet(new long[]{0x0000000032000002L});
-  public static final BitSet FOLLOW_set_in_multiplicative1052 = new BitSet(new long[]{0x0000032308002050L});
-  public static final BitSet FOLLOW_unary_in_multiplicative1065 = new BitSet(new long[]{0x0000000032000002L});
+  public static final BitSet FOLLOW_logical_and_in_logical_or787 = new BitSet(new long[]{0x0000000000008002L});
+  public static final BitSet FOLLOW_AT_BOOL_OR_in_logical_or790 = new BitSet(new long[]{0x00008886100040A0L});
+  public static final BitSet FOLLOW_logical_and_in_logical_or793 = new BitSet(new long[]{0x0000000000008002L});
+  public static final BitSet FOLLOW_bitwise_or_in_logical_and812 = new BitSet(new long[]{0x0000000000002002L});
+  public static final BitSet FOLLOW_AT_BOOL_AND_in_logical_and815 = new BitSet(new long[]{0x00008886100040A0L});
+  public static final BitSet FOLLOW_bitwise_or_in_logical_and818 = new BitSet(new long[]{0x0000000000002002L});
+  public static final BitSet FOLLOW_bitwise_xor_in_bitwise_or837 = new BitSet(new long[]{0x0000000000000102L});
+  public static final BitSet FOLLOW_AT_BIT_OR_in_bitwise_or840 = new BitSet(new long[]{0x00008886100040A0L});
+  public static final BitSet FOLLOW_bitwise_xor_in_bitwise_or843 = new BitSet(new long[]{0x0000000000000102L});
+  public static final BitSet FOLLOW_bitwise_and_in_bitwise_xor862 = new BitSet(new long[]{0x0000000000001002L});
+  public static final BitSet FOLLOW_AT_BIT_XOR_in_bitwise_xor865 = new BitSet(new long[]{0x00008886100040A0L});
+  public static final BitSet FOLLOW_bitwise_and_in_bitwise_xor868 = new BitSet(new long[]{0x0000000000001002L});
+  public static final BitSet FOLLOW_equality_in_bitwise_and888 = new BitSet(new long[]{0x0000000000000042L});
+  public static final BitSet FOLLOW_AT_BIT_AND_in_bitwise_and891 = new BitSet(new long[]{0x00008886100040A0L});
+  public static final BitSet FOLLOW_equality_in_bitwise_and894 = new BitSet(new long[]{0x0000000000000042L});
+  public static final BitSet FOLLOW_relational_in_equality913 = new BitSet(new long[]{0x0000000001080002L});
+  public static final BitSet FOLLOW_set_in_equality916 = new BitSet(new long[]{0x00008886100040A0L});
+  public static final BitSet FOLLOW_relational_in_equality925 = new BitSet(new long[]{0x0000000001080002L});
+  public static final BitSet FOLLOW_shift_in_relational944 = new BitSet(new long[]{0x0000000000F00002L});
+  public static final BitSet FOLLOW_set_in_relational947 = new BitSet(new long[]{0x00008886100040A0L});
+  public static final BitSet FOLLOW_shift_in_relational964 = new BitSet(new long[]{0x0000000000F00002L});
+  public static final BitSet FOLLOW_additive_in_shift983 = new BitSet(new long[]{0x0000000000000E02L});
+  public static final BitSet FOLLOW_set_in_shift986 = new BitSet(new long[]{0x00008886100040A0L});
+  public static final BitSet FOLLOW_additive_in_shift999 = new BitSet(new long[]{0x0000000000000E02L});
+  public static final BitSet FOLLOW_multiplicative_in_additive1018 = new BitSet(new long[]{0x0000000200000022L});
+  public static final BitSet FOLLOW_set_in_additive1021 = new BitSet(new long[]{0x00008886100040A0L});
+  public static final BitSet FOLLOW_multiplicative_in_additive1030 = new BitSet(new long[]{0x0000000200000022L});
+  public static final BitSet FOLLOW_unary_in_multiplicative1049 = new BitSet(new long[]{0x0000000064000002L});
+  public static final BitSet FOLLOW_set_in_multiplicative1052 = new BitSet(new long[]{0x00008886100040A0L});
+  public static final BitSet FOLLOW_unary_in_multiplicative1065 = new BitSet(new long[]{0x0000000064000002L});
   public static final BitSet FOLLOW_postfix_in_unary1084 = new BitSet(new long[]{0x0000000000000002L});
-  public static final BitSet FOLLOW_AT_ADD_in_unary1092 = new BitSet(new long[]{0x0000032308002050L});
+  public static final BitSet FOLLOW_AT_ADD_in_unary1092 = new BitSet(new long[]{0x00008886100040A0L});
   public static final BitSet FOLLOW_unary_in_unary1095 = new BitSet(new long[]{0x0000000000000002L});
-  public static final BitSet FOLLOW_unary_operator_in_unary1103 = new BitSet(new long[]{0x0000032308002050L});
+  public static final BitSet FOLLOW_unary_operator_in_unary1103 = new BitSet(new long[]{0x00008886100040A0L});
   public static final BitSet FOLLOW_unary_in_unary1106 = new BitSet(new long[]{0x0000000000000002L});
   public static final BitSet FOLLOW_AT_SUBTRACT_in_unary_operator1123 = new BitSet(new long[]{0x0000000000000002L});
   public static final BitSet FOLLOW_AT_BIT_NOT_in_unary_operator1135 = new BitSet(new long[]{0x0000000000000002L});
   public static final BitSet FOLLOW_AT_BOOL_NOT_in_unary_operator1143 = new BitSet(new long[]{0x0000000000000002L});
   public static final BitSet FOLLOW_primary_in_postfix1160 = new BitSet(new long[]{0x0000000000000002L});
-  public static final BitSet FOLLOW_NAMESPACE_ID_in_postfix1168 = new BitSet(new long[]{0x0000000008000000L});
+  public static final BitSet FOLLOW_VARIABLE_in_postfix1168 = new BitSet(new long[]{0x0000000010000000L});
   public static final BitSet FOLLOW_arguments_in_postfix1170 = new BitSet(new long[]{0x0000000000000002L});
-  public static final BitSet FOLLOW_NAMESPACE_ID_in_primary1198 = new BitSet(new long[]{0x0000000000000002L});
+  public static final BitSet FOLLOW_VARIABLE_in_primary1198 = new BitSet(new long[]{0x0000000000000002L});
   public static final BitSet FOLLOW_numeric_in_primary1206 = new BitSet(new long[]{0x0000000000000002L});
-  public static final BitSet FOLLOW_AT_LPAREN_in_primary1214 = new BitSet(new long[]{0x0000032308002050L});
-  public static final BitSet FOLLOW_conditional_in_primary1217 = new BitSet(new long[]{0x0000000080000000L});
+  public static final BitSet FOLLOW_AT_LPAREN_in_primary1214 = new BitSet(new long[]{0x00008886100040A0L});
+  public static final BitSet FOLLOW_conditional_in_primary1217 = new BitSet(new long[]{0x0000000100000000L});
   public static final BitSet FOLLOW_AT_RPAREN_in_primary1219 = new BitSet(new long[]{0x0000000000000002L});
-  public static final BitSet FOLLOW_AT_LPAREN_in_arguments1237 = new BitSet(new long[]{0x0000032388002050L});
-  public static final BitSet FOLLOW_conditional_in_arguments1241 = new BitSet(new long[]{0x0000000080020000L});
-  public static final BitSet FOLLOW_AT_COMMA_in_arguments1244 = new BitSet(new long[]{0x0000032308002050L});
-  public static final BitSet FOLLOW_conditional_in_arguments1247 = new BitSet(new long[]{0x0000000080020000L});
+  public static final BitSet FOLLOW_AT_LPAREN_in_arguments1237 = new BitSet(new long[]{0x00008887100040A0L});
+  public static final BitSet FOLLOW_conditional_in_arguments1241 = new BitSet(new long[]{0x0000000100040000L});
+  public static final BitSet FOLLOW_AT_COMMA_in_arguments1244 = new BitSet(new long[]{0x00008886100040A0L});
+  public static final BitSet FOLLOW_conditional_in_arguments1247 = new BitSet(new long[]{0x0000000100040000L});
   public static final BitSet FOLLOW_AT_RPAREN_in_arguments1253 = new BitSet(new long[]{0x0000000000000002L});
 }

Added: lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/VariableContext.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/VariableContext.java?rev=1609337&view=auto
==============================================================================
--- lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/VariableContext.java (added)
+++ lucene/dev/trunk/lucene/expressions/src/java/org/apache/lucene/expressions/js/VariableContext.java Wed Jul  9 23:18:58 2014
@@ -0,0 +1,127 @@
+package org.apache.lucene.expressions.js;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A helper to parse the context of a variable name, which is the base variable, followed by the
+ * sequence of array (integer or string indexed) and member accesses.
+ */
+public class VariableContext {
+
+  /**
+   * Represents what a piece of a variable does.
+   */
+  public static enum Type {
+    /**
+     * A member of the previous context (ie "dot" access).
+     */ 
+    MEMBER,
+
+    /**
+     * Brackets containing a string as the "index".
+     */ 
+    STR_INDEX,
+
+    /**
+     * Brackets containg an integer index (ie an array).
+     */
+    INT_INDEX
+  }
+
+  /**
+   * The type of this piece of a variable.
+   */ 
+  public final Type type;
+
+  /**
+   * The text of this piece of the variable. Used for {@link Type#MEMBER} and {@link Type#STR_INDEX} types.
+   */ 
+  public final String text;
+
+  /**
+   * The integer value for this piece of the variable. Used for {@link Type#INT_INDEX}.
+   */ 
+  public final int integer;
+
+  private VariableContext(Type c, String s, int i) {
+    type = c;
+    text = s;
+    integer = i;
+  }
+
+  /**
+   * Parses a normalized javascript variable. All strings in the variable should be single quoted,
+   * and no spaces (except possibly within strings).
+   */
+  public static final VariableContext[] parse(String variable) {
+    char[] text = variable.toCharArray();
+    List<VariableContext> contexts = new ArrayList<>();
+    int i = addMember(text, 0, contexts); // base variable is a "member" of the global namespace
+    while (i < text.length) {
+      if (text[i] == '[') {
+        if (text[++i] == '\'') {
+          i = addStringIndex(text, i, contexts);
+        } else {
+          i = addIntIndex(text, i, contexts);
+        }
+        ++i; // move past end bracket
+      } else { // text[i] == '.', ie object member
+        i = addMember(text, i + 1, contexts);
+      }
+    }
+    return contexts.toArray(new VariableContext[contexts.size()]);
+  }
+
+  // i points to start of member name
+  private static int addMember(final char[] text, int i, List<VariableContext> contexts) {
+    int j = i + 1;
+    while (j < text.length && text[j] != '[' && text[j] != '.') ++j; // find first array or member access
+    contexts.add(new VariableContext(Type.MEMBER, new String(text, i, j - i), -1));
+    return j;
+  }
+
+  // i points to start of single quoted index
+  private static int addStringIndex(final char[] text, int i, List<VariableContext> contexts) {
+    ++i; // move past quote
+    int j = i;
+    while (text[j] != '\'') { // find end of single quoted string
+      if (text[j] == '\\') ++j; // skip over escapes
+      ++j;
+    }
+    StringBuffer buf = new StringBuffer(j - i); // space for string, without end quote
+    while (i < j) { // copy string to buffer (without begin/end quotes)
+      if (text[i] == '\\') ++i; // unescape escapes
+      buf.append(text[i]);
+      ++i;
+    }
+    contexts.add(new VariableContext(Type.STR_INDEX, buf.toString(), -1));
+    return j + 1; // move past quote, return end bracket location
+  }
+
+  // i points to start of integer index
+  private static int addIntIndex(final char[] text, int i, List<VariableContext> contexts) {
+    int j = i + 1;
+    while (text[j] != ']') ++j; // find end of array access
+    int index = Integer.parseInt(new String(text, i, j - i));
+    contexts.add(new VariableContext(Type.INT_INDEX, null, index));
+    return j ;
+  }
+}