]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fully fixes #9846, sass mixins with multiple optional params (author: seba)
authorMarc Englund <marc@vaadin.com>
Thu, 4 Oct 2012 12:49:12 +0000 (15:49 +0300)
committerMarc Englund <marc@vaadin.com>
Thu, 4 Oct 2012 12:49:12 +0000 (15:49 +0300)
Change-Id: I8330c6c0a7022b3485bbfee5c6a4833ef5cb4e1d

theme-compiler/src/com/vaadin/sass/parser/Parser.java
theme-compiler/src/com/vaadin/sass/parser/Parser.jj
theme-compiler/tests/resources/scss/mixins.scss

index eb4c52ae0d87780d2e72ef0e313fd9f415e08a94..f5a2e4e432cd55664def08f68ffd9151b6faacda 100644 (file)
@@ -3111,6 +3111,7 @@ boolean isPseudoElement = false;
   final public ArrayList<VariableNode> arglist() throws ParseException {
     ArrayList<VariableNode> args = new ArrayList<VariableNode>();
     VariableNode arg;
+    boolean hasNonOptionalArgument = false;
     arg = mixinArg();
     label_89:
     while (true) {
@@ -3135,83 +3136,100 @@ boolean isPseudoElement = false;
         }
         jj_consume_token(S);
       }
-                                      args.add(arg);
+                                      hasNonOptionalArgument = checkMixinForNonOptionalArguments(arg, hasNonOptionalArgument); args.add(arg);
       arg = mixinArg();
     }
-      args.add(arg);
+      hasNonOptionalArgument = checkMixinForNonOptionalArguments(arg, hasNonOptionalArgument); args.add(arg);
         {if (true) return args;}
     throw new Error("Missing return statement in function");
   }
 
-  void checkMixinOptionalArguments(LexicalUnitImpl arg, String name) throws ParseException {
-        boolean currentArgHasArguments = arg.getLexicalUnitType() == LexicalUnitImpl.SCSS_VARIABLE;
+  boolean checkMixinForNonOptionalArguments(VariableNode arg, boolean hasNonOptionalArguments) throws ParseException {
+        boolean currentArgHasArguments = arg.getExpr() != null && arg.getExpr().getLexicalUnitType() == LexicalUnitImpl.SCSS_VARIABLE && arg.getExpr().getNextLexicalUnit() != null;
 
         if(currentArgHasArguments)
         {
-                        throw new ParseException("Sass Error: Required argument "+ name +" must come before any optional arguments.");
+                if(hasNonOptionalArguments)
+                {
+                        throw new ParseException("Sass Error: Required argument $"+ arg.getName() +" must come before any optional arguments.");
+                }
+                return hasNonOptionalArguments;
+        }else
+        {
+        return true;
         }
   }
 
   final public VariableNode mixinArg() throws ParseException {
     String name;
+    Token variable = null;
     LexicalUnitImpl first = null;
-    LexicalUnitImpl next = null;
     LexicalUnitImpl prev = null;
+    LexicalUnitImpl next = null;
     name = variableName();
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case COLON:
-      jj_consume_token(COLON);
-      label_91:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case S:
-          ;
-          break;
-        default:
-          jj_la1[139] = jj_gen;
-          break label_91;
-        }
-        jj_consume_token(S);
-      }
-      first = term(null);
-                                                      prev = first;
-      label_92:
-      while (true) {
-        if (jj_2_10(2)) {
-          ;
-        } else {
-          break label_92;
+    case VARIABLE:
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case COLON:
+        jj_consume_token(COLON);
+        label_91:
+        while (true) {
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case S:
+            ;
+            break;
+          default:
+            jj_la1[139] = jj_gen;
+            break label_91;
+          }
+          jj_consume_token(S);
         }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          jj_consume_token(COMMA);
-          label_93:
-          while (true) {
-            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-            case S:
-              ;
-              break;
-            default:
-              jj_la1[140] = jj_gen;
-              break label_93;
+        first = nonVariableTerm(null);
+        prev = first;
+        label_92:
+        while (true) {
+          if (jj_2_10(3)) {
+            ;
+          } else {
+            break label_92;
+          }
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case COMMA:
+            jj_consume_token(COMMA);
+            label_93:
+            while (true) {
+              switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+              case S:
+                ;
+                break;
+              default:
+                jj_la1[140] = jj_gen;
+                break label_93;
+              }
+              jj_consume_token(S);
             }
-            jj_consume_token(S);
+            break;
+          default:
+            jj_la1[141] = jj_gen;
+            ;
           }
-          break;
-        default:
-          jj_la1[141] = jj_gen;
-          ;
+          prev = nonVariableTerm(prev);
         }
-        next = term(prev);
-       if(next.getLexicalUnitType() == LexicalUnitImpl.SCSS_VARIABLE)
-       {
-         {if (true) throw new ParseException("Sass Error: Required argument "+ next.toString() +" must come before any optional arguments.");}
-       }
-       prev.setNextLexicalUnit(next); prev = next;
+        break;
+      case VARIABLE:
+        variable = jj_consume_token(VARIABLE);
+                                    first = LexicalUnitImpl.createVariable(token.beginLine, token.beginColumn,
+                 prev, variable.image);
+        break;
+      default:
+        jj_la1[142] = jj_gen;
+        jj_consume_token(-1);
+        throw new ParseException();
       }
       break;
     default:
-      jj_la1[142] = jj_gen;
+      jj_la1[143] = jj_gen;
       ;
     }
         VariableNode arg = new VariableNode(name, first, false);
@@ -3260,7 +3278,7 @@ boolean isPseudoElement = false;
         ;
         break;
       default:
-        jj_la1[143] = jj_gen;
+        jj_la1[144] = jj_gen;
         break label_94;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -3273,14 +3291,14 @@ boolean isPseudoElement = false;
             ;
             break;
           default:
-            jj_la1[144] = jj_gen;
+            jj_la1[145] = jj_gen;
             break label_95;
           }
           jj_consume_token(S);
         }
         break;
       default:
-        jj_la1[145] = jj_gen;
+        jj_la1[146] = jj_gen;
         ;
       }
       next = term(prev);
@@ -3293,7 +3311,7 @@ boolean isPseudoElement = false;
         ;
         break;
       default:
-        jj_la1[146] = jj_gen;
+        jj_la1[147] = jj_gen;
         break label_96;
       }
       jj_consume_token(COMMA);
@@ -3304,7 +3322,7 @@ boolean isPseudoElement = false;
           ;
           break;
         default:
-          jj_la1[147] = jj_gen;
+          jj_la1[148] = jj_gen;
           break label_97;
         }
         jj_consume_token(S);
@@ -3345,7 +3363,7 @@ boolean isPseudoElement = false;
           ;
           break;
         default:
-          jj_la1[148] = jj_gen;
+          jj_la1[149] = jj_gen;
           break label_98;
         }
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -3358,14 +3376,14 @@ boolean isPseudoElement = false;
               ;
               break;
             default:
-              jj_la1[149] = jj_gen;
+              jj_la1[150] = jj_gen;
               break label_99;
             }
             jj_consume_token(S);
           }
           break;
         default:
-          jj_la1[150] = jj_gen;
+          jj_la1[151] = jj_gen;
           ;
         }
         next = term(prev);
@@ -3387,7 +3405,7 @@ boolean isPseudoElement = false;
         ;
         break;
       default:
-        jj_la1[151] = jj_gen;
+        jj_la1[152] = jj_gen;
         break label_100;
       }
       jj_consume_token(S);
@@ -3402,7 +3420,7 @@ boolean isPseudoElement = false;
       jj_consume_token(RPARAN);
       break;
     default:
-      jj_la1[152] = jj_gen;
+      jj_la1[153] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
@@ -3416,7 +3434,7 @@ boolean isPseudoElement = false;
           ;
           break;
         default:
-          jj_la1[153] = jj_gen;
+          jj_la1[154] = jj_gen;
           break label_102;
         }
         jj_consume_token(S);
@@ -3426,7 +3444,7 @@ boolean isPseudoElement = false;
         ;
         break;
       default:
-        jj_la1[154] = jj_gen;
+        jj_la1[155] = jj_gen;
         break label_101;
       }
     }
@@ -3451,7 +3469,7 @@ boolean isPseudoElement = false;
         ;
         break;
       default:
-        jj_la1[155] = jj_gen;
+        jj_la1[156] = jj_gen;
         break label_103;
       }
       jj_consume_token(S);
@@ -3464,7 +3482,7 @@ boolean isPseudoElement = false;
         ;
         break;
       default:
-        jj_la1[156] = jj_gen;
+        jj_la1[157] = jj_gen;
         break label_104;
       }
       jj_consume_token(S);
@@ -3477,7 +3495,7 @@ boolean isPseudoElement = false;
         ;
         break;
       default:
-        jj_la1[157] = jj_gen;
+        jj_la1[158] = jj_gen;
         break label_105;
       }
       jj_consume_token(S);
@@ -3488,7 +3506,7 @@ boolean isPseudoElement = false;
       jj_consume_token(RPARAN);
       break;
     default:
-      jj_la1[158] = jj_gen;
+      jj_la1[159] = jj_gen;
       ;
     }
     jj_consume_token(COMMA);
@@ -3499,7 +3517,7 @@ boolean isPseudoElement = false;
         ;
         break;
       default:
-        jj_la1[159] = jj_gen;
+        jj_la1[160] = jj_gen;
         break label_106;
       }
       jj_consume_token(S);
@@ -3515,7 +3533,7 @@ boolean isPseudoElement = false;
           ;
           break;
         default:
-          jj_la1[160] = jj_gen;
+          jj_la1[161] = jj_gen;
           break label_107;
         }
         jj_consume_token(S);
@@ -3529,14 +3547,14 @@ boolean isPseudoElement = false;
           ;
           break;
         default:
-          jj_la1[161] = jj_gen;
+          jj_la1[162] = jj_gen;
           break label_108;
         }
         jj_consume_token(S);
       }
       break;
     default:
-      jj_la1[162] = jj_gen;
+      jj_la1[163] = jj_gen;
       ;
     }
     jj_consume_token(RPARAN);
@@ -3547,7 +3565,7 @@ boolean isPseudoElement = false;
         ;
         break;
       default:
-        jj_la1[163] = jj_gen;
+        jj_la1[164] = jj_gen;
         break label_109;
       }
       jj_consume_token(S);
@@ -3560,7 +3578,7 @@ boolean isPseudoElement = false;
         ;
         break;
       default:
-        jj_la1[164] = jj_gen;
+        jj_la1[165] = jj_gen;
         break label_110;
       }
       jj_consume_token(S);
@@ -3673,7 +3691,7 @@ boolean isPseudoElement = false;
                        exclusive = false;
       break;
     default:
-      jj_la1[165] = jj_gen;
+      jj_la1[166] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
@@ -3685,7 +3703,7 @@ boolean isPseudoElement = false;
         ;
         break;
       default:
-        jj_la1[166] = jj_gen;
+        jj_la1[167] = jj_gen;
         break label_111;
       }
       jj_consume_token(S);
@@ -3714,7 +3732,7 @@ boolean isPseudoElement = false;
         ;
         break;
       default:
-        jj_la1[167] = jj_gen;
+        jj_la1[168] = jj_gen;
         break label_112;
       }
       jj_consume_token(S);
@@ -3730,7 +3748,7 @@ boolean isPseudoElement = false;
           ;
           break;
         default:
-          jj_la1[168] = jj_gen;
+          jj_la1[169] = jj_gen;
           break label_114;
         }
         jj_consume_token(S);
@@ -3740,7 +3758,7 @@ boolean isPseudoElement = false;
         ;
         break;
       default:
-        jj_la1[169] = jj_gen;
+        jj_la1[170] = jj_gen;
         break label_113;
       }
     }
@@ -3775,7 +3793,7 @@ LexicalUnit exp;
         ;
         break;
       default:
-        jj_la1[170] = jj_gen;
+        jj_la1[171] = jj_gen;
         break label_115;
       }
       jj_consume_token(S);
@@ -3788,7 +3806,7 @@ LexicalUnit exp;
         ;
         break;
       default:
-        jj_la1[171] = jj_gen;
+        jj_la1[172] = jj_gen;
         break label_116;
       }
       jj_consume_token(S);
@@ -3799,7 +3817,7 @@ LexicalUnit exp;
       declaration();
       break;
     default:
-      jj_la1[172] = jj_gen;
+      jj_la1[173] = jj_gen;
       ;
     }
     label_117:
@@ -3809,7 +3827,7 @@ LexicalUnit exp;
         ;
         break;
       default:
-        jj_la1[173] = jj_gen;
+        jj_la1[174] = jj_gen;
         break label_117;
       }
       jj_consume_token(SEMICOLON);
@@ -3820,7 +3838,7 @@ LexicalUnit exp;
           ;
           break;
         default:
-          jj_la1[174] = jj_gen;
+          jj_la1[175] = jj_gen;
           break label_118;
         }
         jj_consume_token(S);
@@ -3830,7 +3848,7 @@ LexicalUnit exp;
         declaration();
         break;
       default:
-        jj_la1[175] = jj_gen;
+        jj_la1[176] = jj_gen;
         ;
       }
     }
@@ -3843,7 +3861,7 @@ LexicalUnit exp;
         ;
         break;
       default:
-        jj_la1[176] = jj_gen;
+        jj_la1[177] = jj_gen;
         break label_119;
       }
       jj_consume_token(S);
@@ -3870,7 +3888,7 @@ LexicalUnit exp;
           ;
           break;
         default:
-          jj_la1[177] = jj_gen;
+          jj_la1[178] = jj_gen;
           break label_120;
         }
         jj_consume_token(S);
@@ -3909,7 +3927,7 @@ LexicalUnit exp;
           important = prio();
           break;
         default:
-          jj_la1[178] = jj_gen;
+          jj_la1[179] = jj_gen;
           ;
         }
          Token next = getToken(1);
@@ -3934,7 +3952,7 @@ LexicalUnit exp;
             ;
             break;
           default:
-            jj_la1[179] = jj_gen;
+            jj_la1[180] = jj_gen;
             break label_121;
           }
           jj_consume_token(S);
@@ -3945,7 +3963,7 @@ LexicalUnit exp;
           declaration();
           break;
         default:
-          jj_la1[180] = jj_gen;
+          jj_la1[181] = jj_gen;
           ;
         }
         label_122:
@@ -3955,7 +3973,7 @@ LexicalUnit exp;
             ;
             break;
           default:
-            jj_la1[181] = jj_gen;
+            jj_la1[182] = jj_gen;
             break label_122;
           }
           jj_consume_token(SEMICOLON);
@@ -3966,7 +3984,7 @@ LexicalUnit exp;
               ;
               break;
             default:
-              jj_la1[182] = jj_gen;
+              jj_la1[183] = jj_gen;
               break label_123;
             }
             jj_consume_token(S);
@@ -3976,7 +3994,7 @@ LexicalUnit exp;
             declaration();
             break;
           default:
-            jj_la1[183] = jj_gen;
+            jj_la1[184] = jj_gen;
             ;
           }
         }
@@ -3988,7 +4006,7 @@ LexicalUnit exp;
             ;
             break;
           default:
-            jj_la1[184] = jj_gen;
+            jj_la1[185] = jj_gen;
             break label_124;
           }
           jj_consume_token(S);
@@ -3996,7 +4014,7 @@ LexicalUnit exp;
          documentHandler.endNestedProperties(name);
         break;
       default:
-        jj_la1[185] = jj_gen;
+        jj_la1[186] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -4053,7 +4071,7 @@ LexicalUnit exp;
           ;
           break;
         default:
-          jj_la1[186] = jj_gen;
+          jj_la1[187] = jj_gen;
           break label_125;
         }
         jj_consume_token(S);
@@ -4064,7 +4082,7 @@ LexicalUnit exp;
         important = prio();
         break;
       default:
-        jj_la1[187] = jj_gen;
+        jj_la1[188] = jj_gen;
         ;
       }
          documentHandler.property(name, exp, important);
@@ -4114,7 +4132,7 @@ LexicalUnit exp;
         ;
         break;
       default:
-        jj_la1[188] = jj_gen;
+        jj_la1[189] = jj_gen;
         break label_126;
       }
       jj_consume_token(S);
@@ -4132,7 +4150,7 @@ LexicalUnit exp;
         ;
         break;
       default:
-        jj_la1[189] = jj_gen;
+        jj_la1[190] = jj_gen;
         break label_127;
       }
       jj_consume_token(S);
@@ -4156,7 +4174,7 @@ LexicalUnit exp;
           ;
           break;
         default:
-          jj_la1[190] = jj_gen;
+          jj_la1[191] = jj_gen;
           break label_128;
         }
         jj_consume_token(S);
@@ -4174,7 +4192,7 @@ LexicalUnit exp;
           ;
           break;
         default:
-          jj_la1[191] = jj_gen;
+          jj_la1[192] = jj_gen;
           break label_129;
         }
         jj_consume_token(S);
@@ -4184,7 +4202,7 @@ LexicalUnit exp;
                                                          prev);}
       break;
     default:
-      jj_la1[192] = jj_gen;
+      jj_la1[193] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
@@ -4212,7 +4230,7 @@ LexicalUnit exp;
         res = operator(res);
         break;
       default:
-        jj_la1[193] = jj_gen;
+        jj_la1[194] = jj_gen;
         ;
       }
       res = term(res);
@@ -4235,7 +4253,7 @@ LexicalUnit exp;
         {if (true) return '+';}
       break;
     default:
-      jj_la1[194] = jj_gen;
+      jj_la1[195] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
@@ -4249,7 +4267,6 @@ LexicalUnit exp;
   LexicalUnitImpl result = null;
   Token n = null;
   char op = ' ';
-  String varName;
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case PLUS:
     case MINUS:
@@ -4276,126 +4293,154 @@ LexicalUnit exp;
     case DIMEN:
     case HASH:
     case UNICODERANGE:
+    case FUNCTION:
+      result = nonVariableTerm(prev);
+      break;
+    case VARIABLE:
+      result = variableTerm(prev);
+      break;
+    default:
+      jj_la1[196] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+          {if (true) return result;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public LexicalUnitImpl variableTerm(LexicalUnitImpl prev) throws ParseException {
+  LexicalUnitImpl result = null;
+  String varName = "";
+    varName = variableName();
+          result = LexicalUnitImpl.createVariable(token.beginLine, token.beginColumn,
+                 prev, varName); {if (true) return result;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public LexicalUnitImpl nonVariableTerm(LexicalUnitImpl prev) throws ParseException {
+LexicalUnitImpl result = null;
+  Token n = null;
+  char op = ' ';
+  String varName;
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case PLUS:
+    case MINUS:
+    case NUMBER:
+    case PERCENTAGE:
+    case PT:
+    case MM:
+    case CM:
+    case PC:
+    case IN:
+    case PX:
+    case EMS:
+    case EXS:
+    case DEG:
+    case RAD:
+    case GRAD:
+    case MS:
+    case SECOND:
+    case HZ:
+    case KHZ:
+    case DIMEN:
     case FUNCTION:
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case PLUS:
       case MINUS:
+        op = unaryOperator();
+        break;
+      default:
+        jj_la1[197] = jj_gen;
+        ;
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case NUMBER:
-      case PERCENTAGE:
-      case PT:
-      case MM:
-      case CM:
-      case PC:
-      case IN:
-      case PX:
-      case EMS:
-      case EXS:
-      case DEG:
-      case RAD:
-      case GRAD:
-      case MS:
-      case SECOND:
-      case HZ:
-      case KHZ:
-      case DIMEN:
-      case FUNCTION:
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case PLUS:
-        case MINUS:
-          op = unaryOperator();
-          break;
-        default:
-          jj_la1[195] = jj_gen;
-          ;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case NUMBER:
-          n = jj_consume_token(NUMBER);
+        n = jj_consume_token(NUMBER);
           result = LexicalUnitImpl.createNumber(n.beginLine, n.beginColumn,
                                                 prev, number(op, n, 0));
-          break;
-        case PERCENTAGE:
-          n = jj_consume_token(PERCENTAGE);
+        break;
+      case PERCENTAGE:
+        n = jj_consume_token(PERCENTAGE);
           result = LexicalUnitImpl.createPercentage(n.beginLine, n.beginColumn,
                                                     prev, number(op, n, 1));
-          break;
-        case PT:
-          n = jj_consume_token(PT);
+        break;
+      case PT:
+        n = jj_consume_token(PT);
           result = LexicalUnitImpl.createPT(n.beginLine, n.beginColumn,
                                             prev, number(op, n, 2));
-          break;
-        case CM:
-          n = jj_consume_token(CM);
+        break;
+      case CM:
+        n = jj_consume_token(CM);
           result = LexicalUnitImpl.createCM(n.beginLine, n.beginColumn,
                                             prev, number(op, n, 2));
-          break;
-        case MM:
-          n = jj_consume_token(MM);
+        break;
+      case MM:
+        n = jj_consume_token(MM);
           result = LexicalUnitImpl.createMM(n.beginLine, n.beginColumn,
                                             prev, number(op, n, 2));
-          break;
-        case PC:
-          n = jj_consume_token(PC);
+        break;
+      case PC:
+        n = jj_consume_token(PC);
           result = LexicalUnitImpl.createPC(n.beginLine, n.beginColumn,
                                             prev, number(op, n, 2));
-          break;
-        case IN:
-          n = jj_consume_token(IN);
+        break;
+      case IN:
+        n = jj_consume_token(IN);
           result = LexicalUnitImpl.createIN(n.beginLine, n.beginColumn,
                                             prev, number(op, n, 2));
-          break;
-        case PX:
-          n = jj_consume_token(PX);
+        break;
+      case PX:
+        n = jj_consume_token(PX);
           result = LexicalUnitImpl.createPX(n.beginLine, n.beginColumn,
                                             prev, number(op, n, 2));
-          break;
-        case EMS:
-          n = jj_consume_token(EMS);
+        break;
+      case EMS:
+        n = jj_consume_token(EMS);
           result = LexicalUnitImpl.createEMS(n.beginLine, n.beginColumn,
                                              prev, number(op, n, 2));
-          break;
-        case EXS:
-          n = jj_consume_token(EXS);
+        break;
+      case EXS:
+        n = jj_consume_token(EXS);
           result = LexicalUnitImpl.createEXS(n.beginLine, n.beginColumn,
                                              prev, number(op, n, 2));
-          break;
-        case DEG:
-          n = jj_consume_token(DEG);
+        break;
+      case DEG:
+        n = jj_consume_token(DEG);
           result = LexicalUnitImpl.createDEG(n.beginLine, n.beginColumn,
                                              prev, number(op, n, 3));
-          break;
-        case RAD:
-          n = jj_consume_token(RAD);
+        break;
+      case RAD:
+        n = jj_consume_token(RAD);
           result = LexicalUnitImpl.createRAD(n.beginLine, n.beginColumn,
                                              prev, number(op, n, 3));
-          break;
-        case GRAD:
-          n = jj_consume_token(GRAD);
+        break;
+      case GRAD:
+        n = jj_consume_token(GRAD);
           result = LexicalUnitImpl.createGRAD(n.beginLine, n.beginColumn,
                                               prev, number(op, n, 3));
-          break;
-        case SECOND:
-          n = jj_consume_token(SECOND);
+        break;
+      case SECOND:
+        n = jj_consume_token(SECOND);
           result = LexicalUnitImpl.createS(n.beginLine, n.beginColumn,
                                            prev, number(op, n, 1));
-          break;
-        case MS:
-          n = jj_consume_token(MS);
+        break;
+      case MS:
+        n = jj_consume_token(MS);
           result = LexicalUnitImpl.createMS(n.beginLine, n.beginColumn,
                                             prev, number(op, n, 2));
-          break;
-        case HZ:
-          n = jj_consume_token(HZ);
+        break;
+      case HZ:
+        n = jj_consume_token(HZ);
           result = LexicalUnitImpl.createHZ(n.beginLine, n.beginColumn,
                                             prev, number(op, n, 2));
-          break;
-        case KHZ:
-          n = jj_consume_token(KHZ);
+        break;
+      case KHZ:
+        n = jj_consume_token(KHZ);
           result = LexicalUnitImpl.createKHZ(n.beginLine, n.beginColumn,
                                              prev, number(op, n, 3));
-          break;
-        case DIMEN:
-          n = jj_consume_token(DIMEN);
+        break;
+      case DIMEN:
+        n = jj_consume_token(DIMEN);
             String s = n.image;
             int i = 0;
             while (i < s.length()
@@ -4405,31 +4450,31 @@ LexicalUnit exp;
             result = LexicalUnitImpl.createDimen(n.beginLine, n.beginColumn, prev,
                                                  Float.valueOf(s.substring(0, i)).floatValue(),
                                                  s.substring(i));
-          break;
-        case FUNCTION:
-          result = function(op, prev);
-          break;
-        default:
-          jj_la1[196] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
         break;
-      case STRING:
-      case IDENT:
-      case URL:
-      case HASH:
-      case UNICODERANGE:
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case STRING:
-          n = jj_consume_token(STRING);
-          result =
-          LexicalUnitImpl.createString(n.beginLine, n.beginColumn, prev,
-                                       convertStringIndex(n.image, 1,
-                                                          n.image.length() -1));
-          break;
-        case IDENT:
-          n = jj_consume_token(IDENT);
+      case FUNCTION:
+        result = function(op, prev);
+        break;
+      default:
+        jj_la1[198] = jj_gen;
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
+      break;
+    case STRING:
+    case IDENT:
+    case URL:
+    case HASH:
+    case UNICODERANGE:
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case STRING:
+        n = jj_consume_token(STRING);
+          result =
+          LexicalUnitImpl.createString(n.beginLine, n.beginColumn, prev,
+                                       convertStringIndex(n.image, 1,
+                                                          n.image.length() -1));
+        break;
+      case IDENT:
+        n = jj_consume_token(IDENT);
         String s = convertIdent(n.image);
         if ("inherit".equals(s)) {
             result = LexicalUnitImpl.createInherit(n.beginLine, n.beginColumn,
@@ -4462,51 +4507,40 @@ LexicalUnit exp;
        }
        / */
 
-          break;
-        case HASH:
-          result = hexcolor(prev);
-          break;
-        case URL:
-          result = url(prev);
-          break;
-        case UNICODERANGE:
-          result = unicode(prev);
-          break;
-        default:
-          jj_la1[197] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
+        break;
+      case HASH:
+        result = hexcolor(prev);
+        break;
+      case URL:
+        result = url(prev);
+        break;
+      case UNICODERANGE:
+        result = unicode(prev);
         break;
       default:
-        jj_la1[198] = jj_gen;
+        jj_la1[199] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
-      label_131:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case S:
-          ;
-          break;
-        default:
-          jj_la1[199] = jj_gen;
-          break label_131;
-        }
-        jj_consume_token(S);
-      }
-      break;
-    case VARIABLE:
-      varName = variableName();
-          result = LexicalUnitImpl.createVariable(token.beginLine, token.beginColumn,
-                 prev, varName);
       break;
     default:
       jj_la1[200] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
-          {if (true) return result;}
+    label_131:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[201] = jj_gen;
+        break label_131;
+      }
+      jj_consume_token(S);
+    }
+    {if (true) return result;}
     throw new Error("Missing return statement in function");
   }
 
@@ -4525,7 +4559,7 @@ LexicalUnit exp;
         ;
         break;
       default:
-        jj_la1[201] = jj_gen;
+        jj_la1[202] = jj_gen;
         break label_132;
       }
       jj_consume_token(S);
@@ -4567,7 +4601,7 @@ LexicalUnit exp;
       params = expr();
       break;
     default:
-      jj_la1[202] = jj_gen;
+      jj_la1[203] = jj_gen;
       ;
     }
     jj_consume_token(RPARAN);
@@ -5045,7 +5079,7 @@ LexicalUnit exp;
         ;
         break;
       default:
-        jj_la1[203] = jj_gen;
+        jj_la1[204] = jj_gen;
         break label_133;
       }
       jj_consume_token(S);
@@ -5074,7 +5108,7 @@ LexicalUnit exp;
       fontFace();
       break;
     default:
-      jj_la1[204] = jj_gen;
+      jj_la1[205] = jj_gen;
       ret = skipStatement();
                     if ((ret == null) || (ret.length() == 0)) {
                         {if (true) return;}
@@ -5096,7 +5130,7 @@ LexicalUnit exp;
         ;
         break;
       default:
-        jj_la1[205] = jj_gen;
+        jj_la1[206] = jj_gen;
         break label_134;
       }
       jj_consume_token(S);
@@ -5112,7 +5146,7 @@ LexicalUnit exp;
         ;
         break;
       default:
-        jj_la1[206] = jj_gen;
+        jj_la1[207] = jj_gen;
         break label_135;
       }
       jj_consume_token(S);
@@ -5128,7 +5162,7 @@ LexicalUnit exp;
         ;
         break;
       default:
-        jj_la1[207] = jj_gen;
+        jj_la1[208] = jj_gen;
         break label_136;
       }
       jj_consume_token(S);
@@ -5138,7 +5172,7 @@ LexicalUnit exp;
       declaration();
       break;
     default:
-      jj_la1[208] = jj_gen;
+      jj_la1[209] = jj_gen;
       ;
     }
     label_137:
@@ -5148,7 +5182,7 @@ LexicalUnit exp;
         ;
         break;
       default:
-        jj_la1[209] = jj_gen;
+        jj_la1[210] = jj_gen;
         break label_137;
       }
       jj_consume_token(SEMICOLON);
@@ -5159,7 +5193,7 @@ LexicalUnit exp;
           ;
           break;
         default:
-          jj_la1[210] = jj_gen;
+          jj_la1[211] = jj_gen;
           break label_138;
         }
         jj_consume_token(S);
@@ -5169,7 +5203,7 @@ LexicalUnit exp;
         declaration();
         break;
       default:
-        jj_la1[211] = jj_gen;
+        jj_la1[212] = jj_gen;
         ;
       }
     }
@@ -5185,7 +5219,7 @@ LexicalUnit exp;
           ;
           break;
         default:
-          jj_la1[212] = jj_gen;
+          jj_la1[213] = jj_gen;
           break label_139;
         }
         jj_consume_token(S);
@@ -5275,41 +5309,42 @@ LexicalUnit exp;
     finally { jj_save(10, xla); }
   }
 
-  private boolean jj_3R_218() {
-    if (jj_scan_token(FUNCTION)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_3R_226()) jj_scanpos = xsp;
-    if (jj_scan_token(RPARAN)) return true;
-    return false;
-  }
-
   private boolean jj_3_1() {
     if (jj_3R_140()) return true;
     return false;
   }
 
-  private boolean jj_3R_162() {
-    if (jj_3R_174()) return true;
+  private boolean jj_3R_196() {
+    if (jj_scan_token(IDENT)) return true;
     return false;
   }
 
-  private boolean jj_3R_215() {
-    if (jj_3R_221()) return true;
+  private boolean jj_3R_195() {
+    if (jj_scan_token(STRING)) return true;
     return false;
   }
 
-  private boolean jj_3R_214() {
-    if (jj_3R_220()) return true;
+  private boolean jj_3R_194() {
+    if (jj_3R_218()) return true;
     return false;
   }
 
-  private boolean jj_3R_213() {
-    if (jj_3R_219()) return true;
+  private boolean jj_3R_163() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_195()) {
+    jj_scanpos = xsp;
+    if (jj_3R_196()) {
+    jj_scanpos = xsp;
+    if (jj_3R_197()) {
+    jj_scanpos = xsp;
+    if (jj_3R_198()) {
+    jj_scanpos = xsp;
+    if (jj_3R_199()) return true;
+    }
+    }
+    }
+    }
     return false;
   }
 
@@ -5324,246 +5359,271 @@ LexicalUnit exp;
     return false;
   }
 
-  private boolean jj_3R_169() {
-    if (jj_scan_token(COLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3_6() {
-    if (jj_3R_145()) return true;
+  private boolean jj_3R_193() {
+    if (jj_scan_token(DIMEN)) return true;
     return false;
   }
 
-  private boolean jj_3R_212() {
-    if (jj_scan_token(IDENT)) return true;
+  private boolean jj_3R_172() {
+    if (jj_scan_token(COLON)) return true;
     return false;
   }
 
-  private boolean jj_3_5() {
+  private boolean jj_3_6() {
     if (jj_3R_145()) return true;
     return false;
   }
 
-  private boolean jj_3R_211() {
-    if (jj_scan_token(STRING)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_210() {
-    if (jj_3R_218()) return true;
-    return false;
-  }
-
-  private boolean jj_3_2() {
-    if (jj_3R_140()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_173() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_211()) {
-    jj_scanpos = xsp;
-    if (jj_3R_212()) {
-    jj_scanpos = xsp;
-    if (jj_3R_213()) {
-    jj_scanpos = xsp;
-    if (jj_3R_214()) {
-    jj_scanpos = xsp;
-    if (jj_3R_215()) return true;
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_209() {
-    if (jj_scan_token(DIMEN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_208() {
+  private boolean jj_3R_192() {
     if (jj_scan_token(KHZ)) return true;
     return false;
   }
 
-  private boolean jj_3R_207() {
+  private boolean jj_3R_191() {
     if (jj_scan_token(HZ)) return true;
     return false;
   }
 
-  private boolean jj_3R_206() {
+  private boolean jj_3R_190() {
     if (jj_scan_token(MS)) return true;
     return false;
   }
 
-  private boolean jj_3R_205() {
+  private boolean jj_3R_189() {
     if (jj_scan_token(SECOND)) return true;
     return false;
   }
 
-  private boolean jj_3R_223() {
-    if (jj_scan_token(INTERPOLATION)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_204() {
+  private boolean jj_3R_188() {
     if (jj_scan_token(GRAD)) return true;
     return false;
   }
 
-  private boolean jj_3R_203() {
+  private boolean jj_3R_187() {
     if (jj_scan_token(RAD)) return true;
     return false;
   }
 
-  private boolean jj_3R_160() {
-    if (jj_scan_token(LBRACE)) return true;
+  private boolean jj_3_5() {
+    if (jj_3R_145()) return true;
     return false;
   }
 
-  private boolean jj_3R_202() {
+  private boolean jj_3R_186() {
     if (jj_scan_token(DEG)) return true;
     return false;
   }
 
-  private boolean jj_3R_201() {
+  private boolean jj_3R_185() {
     if (jj_scan_token(EXS)) return true;
     return false;
   }
 
-  private boolean jj_3R_170() {
-    if (jj_scan_token(LBRACKET)) return true;
+  private boolean jj_3_2() {
+    if (jj_3R_140()) return true;
     return false;
   }
 
-  private boolean jj_3R_200() {
+  private boolean jj_3R_184() {
     if (jj_scan_token(EMS)) return true;
     return false;
   }
 
-  private boolean jj_3R_158() {
-    if (jj_scan_token(IDENT)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
-    }
+  private boolean jj_3R_183() {
+    if (jj_scan_token(PX)) return true;
     return false;
   }
 
-  private boolean jj_3R_199() {
-    if (jj_scan_token(PX)) return true;
+  private boolean jj_3R_182() {
+    if (jj_scan_token(IN)) return true;
     return false;
   }
 
-  private boolean jj_3R_142() {
-    if (jj_3R_145()) return true;
+  private boolean jj_3R_181() {
+    if (jj_scan_token(PC)) return true;
     return false;
   }
 
-  private boolean jj_3R_174() {
-    if (jj_scan_token(VARIABLE)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
-    }
+  private boolean jj_3R_180() {
+    if (jj_scan_token(MM)) return true;
     return false;
   }
 
-  private boolean jj_3R_198() {
-    if (jj_scan_token(IN)) return true;
+  private boolean jj_3R_179() {
+    if (jj_scan_token(CM)) return true;
     return false;
   }
 
-  private boolean jj_3R_190() {
-    if (jj_scan_token(PARENT)) return true;
+  private boolean jj_3R_161() {
+    if (jj_scan_token(LBRACE)) return true;
     return false;
   }
 
-  private boolean jj_3R_159() {
-    if (jj_3R_171()) return true;
+  private boolean jj_3R_178() {
+    if (jj_scan_token(PT)) return true;
     return false;
   }
 
-  private boolean jj_3R_189() {
-    if (jj_scan_token(ANY)) return true;
+  private boolean jj_3R_177() {
+    if (jj_scan_token(PERCENTAGE)) return true;
     return false;
   }
 
-  private boolean jj_3R_197() {
-    if (jj_scan_token(PC)) return true;
+  private boolean jj_3R_166() {
+    if (jj_3R_202()) return true;
     return false;
   }
 
-  private boolean jj_3R_196() {
-    if (jj_scan_token(MM)) return true;
+  private boolean jj_3R_176() {
+    if (jj_scan_token(NUMBER)) return true;
     return false;
   }
 
-  private boolean jj_3R_195() {
-    if (jj_scan_token(CM)) return true;
+  private boolean jj_3R_228() {
+    if (jj_scan_token(INTERPOLATION)) return true;
     return false;
   }
 
-  private boolean jj_3R_222() {
-    if (jj_scan_token(IDENT)) return true;
+  private boolean jj_3R_175() {
+    if (jj_3R_217()) return true;
     return false;
   }
 
-  private boolean jj_3R_216() {
+  private boolean jj_3R_162() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_222()) {
+    if (jj_3R_175()) jj_scanpos = xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_176()) {
     jj_scanpos = xsp;
-    if (jj_3R_223()) return true;
-    }
-    return false;
+    if (jj_3R_177()) {
+    jj_scanpos = xsp;
+    if (jj_3R_178()) {
+    jj_scanpos = xsp;
+    if (jj_3R_179()) {
+    jj_scanpos = xsp;
+    if (jj_3R_180()) {
+    jj_scanpos = xsp;
+    if (jj_3R_181()) {
+    jj_scanpos = xsp;
+    if (jj_3R_182()) {
+    jj_scanpos = xsp;
+    if (jj_3R_183()) {
+    jj_scanpos = xsp;
+    if (jj_3R_184()) {
+    jj_scanpos = xsp;
+    if (jj_3R_185()) {
+    jj_scanpos = xsp;
+    if (jj_3R_186()) {
+    jj_scanpos = xsp;
+    if (jj_3R_187()) {
+    jj_scanpos = xsp;
+    if (jj_3R_188()) {
+    jj_scanpos = xsp;
+    if (jj_3R_189()) {
+    jj_scanpos = xsp;
+    if (jj_3R_190()) {
+    jj_scanpos = xsp;
+    if (jj_3R_191()) {
+    jj_scanpos = xsp;
+    if (jj_3R_192()) {
+    jj_scanpos = xsp;
+    if (jj_3R_193()) {
+    jj_scanpos = xsp;
+    if (jj_3R_194()) return true;
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    return false;
   }
 
-  private boolean jj_3R_145() {
-    if (jj_3R_158()) return true;
-    if (jj_scan_token(COLON)) return true;
+  private boolean jj_3R_160() {
+    if (jj_3R_174()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_147() {
     Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_162()) {
+    jj_scanpos = xsp;
+    if (jj_3R_163()) return true;
+    }
     while (true) {
       xsp = jj_scanpos;
       if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
     }
-    xsp = jj_scanpos;
-    if (jj_3R_159()) {
-    jj_scanpos = xsp;
-    if (jj_3R_160()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_173() {
+    if (jj_scan_token(LBRACKET)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_159() {
+    if (jj_scan_token(IDENT)) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
     }
     return false;
   }
 
-  private boolean jj_3R_166() {
+  private boolean jj_3R_145() {
+    if (jj_3R_159()) return true;
+    if (jj_scan_token(COLON)) return true;
     Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
+    }
     xsp = jj_scanpos;
-    if (jj_3R_188()) {
+    if (jj_3R_160()) {
     jj_scanpos = xsp;
-    if (jj_3R_189()) {
-    jj_scanpos = xsp;
-    if (jj_3R_190()) return true;
-    }
+    if (jj_3R_161()) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_188() {
+  private boolean jj_3R_142() {
+    if (jj_3R_145()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_222() {
+    if (jj_scan_token(VARIABLE)) return true;
     Token xsp;
-    if (jj_3R_216()) return true;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3R_216()) { jj_scanpos = xsp; break; }
+      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
     }
     return false;
   }
 
-  private boolean jj_3R_194() {
-    if (jj_scan_token(PT)) return true;
+  private boolean jj_3R_219() {
+    if (jj_scan_token(HASH)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_202() {
+    if (jj_3R_222()) return true;
     return false;
   }
 
@@ -5588,93 +5648,137 @@ LexicalUnit exp;
     return false;
   }
 
-  private boolean jj_3R_185() {
-    if (jj_scan_token(S)) return true;
+  private boolean jj_3R_216() {
+    if (jj_scan_token(PARENT)) return true;
     return false;
   }
 
-  private boolean jj_3R_184() {
-    if (jj_scan_token(DOT)) return true;
+  private boolean jj_3R_215() {
+    if (jj_scan_token(ANY)) return true;
     return false;
   }
 
-  private boolean jj_3R_193() {
-    if (jj_scan_token(PERCENTAGE)) return true;
+  private boolean jj_3R_227() {
+    if (jj_scan_token(IDENT)) return true;
     return false;
   }
 
-  private boolean jj_3R_183() {
-    if (jj_scan_token(EQ)) return true;
+  private boolean jj_3R_223() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_227()) {
+    jj_scanpos = xsp;
+    if (jj_3R_228()) return true;
+    }
     return false;
   }
 
-  private boolean jj_3R_182() {
-    if (jj_scan_token(RPARAN)) return true;
+  private boolean jj_3R_214() {
+    Token xsp;
+    if (jj_3R_223()) return true;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_223()) { jj_scanpos = xsp; break; }
+    }
     return false;
   }
 
-  private boolean jj_3R_191() {
-    if (jj_3R_217()) return true;
+  private boolean jj_3R_169() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_214()) {
+    jj_scanpos = xsp;
+    if (jj_3R_215()) {
+    jj_scanpos = xsp;
+    if (jj_3R_216()) return true;
+    }
+    }
     return false;
   }
 
-  private boolean jj_3R_181() {
-    if (jj_scan_token(FUNCTION)) return true;
+  private boolean jj_3R_165() {
+    if (jj_3R_147()) return true;
     return false;
   }
 
-  private boolean jj_3R_192() {
-    if (jj_scan_token(NUMBER)) return true;
+  private boolean jj_3R_220() {
+    if (jj_scan_token(URL)) return true;
     return false;
   }
 
-  private boolean jj_3R_180() {
+  private boolean jj_3R_149() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_165()) {
+    jj_scanpos = xsp;
+    if (jj_3R_166()) return true;
+    }
+    return false;
+  }
+
+  private boolean jj_3R_211() {
+    if (jj_scan_token(S)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_210() {
+    if (jj_scan_token(DOT)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_209() {
+    if (jj_scan_token(EQ)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_148() {
+    if (jj_3R_164()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_208() {
+    if (jj_scan_token(RPARAN)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_207() {
+    if (jj_scan_token(FUNCTION)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_206() {
     if (jj_scan_token(COLON)) return true;
     return false;
   }
 
   private boolean jj_3R_141() {
-    if (jj_3R_149()) return true;
+    if (jj_3R_150()) return true;
     return false;
   }
 
-  private boolean jj_3R_179() {
+  private boolean jj_3R_205() {
     if (jj_scan_token(INTERPOLATION)) return true;
     return false;
   }
 
-  private boolean jj_3R_178() {
+  private boolean jj_3R_204() {
     if (jj_scan_token(NUMBER)) return true;
     return false;
   }
 
-  private boolean jj_3R_172() {
+  private boolean jj_3_9() {
+    if (jj_3R_145()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_203() {
+    if (jj_scan_token(IDENT)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_167() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_191()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_192()) {
-    jj_scanpos = xsp;
-    if (jj_3R_193()) {
-    jj_scanpos = xsp;
-    if (jj_3R_194()) {
-    jj_scanpos = xsp;
-    if (jj_3R_195()) {
-    jj_scanpos = xsp;
-    if (jj_3R_196()) {
-    jj_scanpos = xsp;
-    if (jj_3R_197()) {
-    jj_scanpos = xsp;
-    if (jj_3R_198()) {
-    jj_scanpos = xsp;
-    if (jj_3R_199()) {
-    jj_scanpos = xsp;
-    if (jj_3R_200()) {
-    jj_scanpos = xsp;
-    if (jj_3R_201()) {
-    jj_scanpos = xsp;
-    if (jj_3R_202()) {
-    jj_scanpos = xsp;
     if (jj_3R_203()) {
     jj_scanpos = xsp;
     if (jj_3R_204()) {
@@ -5689,53 +5793,9 @@ LexicalUnit exp;
     jj_scanpos = xsp;
     if (jj_3R_209()) {
     jj_scanpos = xsp;
-    if (jj_3R_210()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  private boolean jj_3_9() {
-    if (jj_3R_145()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_164() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_177()) {
+    if (jj_3R_210()) {
     jj_scanpos = xsp;
-    if (jj_3R_178()) {
-    jj_scanpos = xsp;
-    if (jj_3R_179()) {
-    jj_scanpos = xsp;
-    if (jj_3R_180()) {
-    jj_scanpos = xsp;
-    if (jj_3R_181()) {
-    jj_scanpos = xsp;
-    if (jj_3R_182()) {
-    jj_scanpos = xsp;
-    if (jj_3R_183()) {
-    jj_scanpos = xsp;
-    if (jj_3R_184()) {
-    jj_scanpos = xsp;
-    if (jj_3R_185()) return true;
+    if (jj_3R_211()) return true;
     }
     }
     }
@@ -5747,46 +5807,40 @@ LexicalUnit exp;
     return false;
   }
 
-  private boolean jj_3R_177() {
-    if (jj_scan_token(IDENT)) return true;
+  private boolean jj_3R_225() {
+    if (jj_scan_token(PLUS)) return true;
     return false;
   }
 
-  private boolean jj_3R_161() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_172()) {
-    jj_scanpos = xsp;
-    if (jj_3R_173()) return true;
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
-    }
+  private boolean jj_3R_224() {
+    if (jj_scan_token(MINUS)) return true;
     return false;
   }
 
-  private boolean jj_3R_147() {
+  private boolean jj_3R_217() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_161()) {
+    if (jj_3R_224()) {
     jj_scanpos = xsp;
-    if (jj_3R_162()) return true;
+    if (jj_3R_225()) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_148() {
-    if (jj_3R_163()) return true;
+  private boolean jj_3R_171() {
+    if (jj_scan_token(DOT)) return true;
     return false;
   }
 
-  private boolean jj_3R_168() {
-    if (jj_scan_token(DOT)) return true;
+  private boolean jj_3_11() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_148()) jj_scanpos = xsp;
+    if (jj_3R_149()) return true;
     return false;
   }
 
-  private boolean jj_3R_149() {
+  private boolean jj_3R_150() {
     if (jj_scan_token(MICROSOFT_RULE)) return true;
     Token xsp;
     while (true) {
@@ -5794,20 +5848,25 @@ LexicalUnit exp;
       if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
     }
     if (jj_scan_token(COLON)) return true;
-    if (jj_3R_164()) return true;
+    if (jj_3R_167()) return true;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3R_164()) { jj_scanpos = xsp; break; }
+      if (jj_3R_167()) { jj_scanpos = xsp; break; }
     }
     return false;
   }
 
-  private boolean jj_3R_219() {
-    if (jj_scan_token(HASH)) return true;
+  private boolean jj_3R_146() {
+    if (jj_scan_token(COMMA)) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
+    }
     return false;
   }
 
-  private boolean jj_3R_187() {
+  private boolean jj_3R_213() {
     if (jj_scan_token(PRECEDES)) return true;
     return false;
   }
@@ -5822,42 +5881,37 @@ LexicalUnit exp;
     return false;
   }
 
-  private boolean jj_3R_186() {
-    if (jj_scan_token(PLUS)) return true;
+  private boolean jj_3R_174() {
+    if (jj_3R_149()) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3_11()) { jj_scanpos = xsp; break; }
+    }
     return false;
   }
 
-  private boolean jj_3R_225() {
+  private boolean jj_3R_212() {
     if (jj_scan_token(PLUS)) return true;
     return false;
   }
 
-  private boolean jj_3R_224() {
-    if (jj_scan_token(MINUS)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_217() {
+  private boolean jj_3R_168() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_224()) {
+    if (jj_3R_212()) {
     jj_scanpos = xsp;
-    if (jj_3R_225()) return true;
+    if (jj_3R_213()) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_165() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_186()) {
-    jj_scanpos = xsp;
-    if (jj_3R_187()) return true;
-    }
+  private boolean jj_3R_221() {
+    if (jj_scan_token(UNICODERANGE)) return true;
     return false;
   }
 
-  private boolean jj_3R_151() {
+  private boolean jj_3R_152() {
     if (jj_scan_token(PRECEDES)) return true;
     Token xsp;
     while (true) {
@@ -5872,23 +5926,20 @@ LexicalUnit exp;
     return false;
   }
 
-  private boolean jj_3_11() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_148()) jj_scanpos = xsp;
-    if (jj_3R_147()) return true;
+  private boolean jj_3R_226() {
+    if (jj_3R_174()) return true;
     return false;
   }
 
-  private boolean jj_3R_152() {
+  private boolean jj_3R_153() {
     if (jj_scan_token(S)) return true;
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_165()) jj_scanpos = xsp;
+    if (jj_3R_168()) jj_scanpos = xsp;
     return false;
   }
 
-  private boolean jj_3R_150() {
+  private boolean jj_3R_151() {
     if (jj_scan_token(PLUS)) return true;
     Token xsp;
     while (true) {
@@ -5901,27 +5952,25 @@ LexicalUnit exp;
   private boolean jj_3R_143() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_150()) {
-    jj_scanpos = xsp;
     if (jj_3R_151()) {
     jj_scanpos = xsp;
-    if (jj_3R_152()) return true;
+    if (jj_3R_152()) {
+    jj_scanpos = xsp;
+    if (jj_3R_153()) return true;
     }
     }
     return false;
   }
 
-  private boolean jj_3R_220() {
-    if (jj_scan_token(URL)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_171() {
+  private boolean jj_3_10() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_146()) jj_scanpos = xsp;
     if (jj_3R_147()) return true;
     return false;
   }
 
-  private boolean jj_3R_146() {
+  private boolean jj_3R_201() {
     if (jj_scan_token(COMMA)) return true;
     Token xsp;
     while (true) {
@@ -5931,91 +5980,91 @@ LexicalUnit exp;
     return false;
   }
 
-  private boolean jj_3R_176() {
-    if (jj_scan_token(COMMA)) return true;
+  private boolean jj_3R_218() {
+    if (jj_scan_token(FUNCTION)) return true;
     Token xsp;
     while (true) {
       xsp = jj_scanpos;
       if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
     }
+    xsp = jj_scanpos;
+    if (jj_3R_226()) jj_scanpos = xsp;
+    if (jj_scan_token(RPARAN)) return true;
     return false;
   }
 
-  private boolean jj_3R_157() {
-    if (jj_3R_170()) return true;
+  private boolean jj_3R_200() {
+    if (jj_scan_token(DIV)) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
+    }
     return false;
   }
 
-  private boolean jj_3_10() {
+  private boolean jj_3R_164() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_146()) jj_scanpos = xsp;
-    if (jj_3R_147()) return true;
+    if (jj_3R_200()) {
+    jj_scanpos = xsp;
+    if (jj_3R_201()) return true;
+    }
     return false;
   }
 
-  private boolean jj_3R_156() {
-    if (jj_3R_169()) return true;
+  private boolean jj_3R_199() {
+    if (jj_3R_221()) return true;
     return false;
   }
 
-  private boolean jj_3R_163() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_175()) {
-    jj_scanpos = xsp;
-    if (jj_3R_176()) return true;
-    }
+  private boolean jj_3R_198() {
+    if (jj_3R_220()) return true;
     return false;
   }
 
-  private boolean jj_3R_175() {
-    if (jj_scan_token(DIV)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
-    }
+  private boolean jj_3R_158() {
+    if (jj_3R_173()) return true;
     return false;
   }
 
-  private boolean jj_3R_155() {
-    if (jj_3R_168()) return true;
+  private boolean jj_3R_197() {
+    if (jj_3R_219()) return true;
     return false;
   }
 
-  private boolean jj_3R_154() {
-    if (jj_3R_167()) return true;
+  private boolean jj_3R_157() {
+    if (jj_3R_172()) return true;
     return false;
   }
 
-  private boolean jj_3R_221() {
-    if (jj_scan_token(UNICODERANGE)) return true;
+  private boolean jj_3R_156() {
+    if (jj_3R_171()) return true;
     return false;
   }
 
-  private boolean jj_3R_226() {
-    if (jj_3R_171()) return true;
+  private boolean jj_3R_155() {
+    if (jj_3R_170()) return true;
     return false;
   }
 
-  private boolean jj_3R_153() {
-    if (jj_3R_166()) return true;
+  private boolean jj_3R_154() {
+    if (jj_3R_169()) return true;
     return false;
   }
 
   private boolean jj_3R_144() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_153()) {
-    jj_scanpos = xsp;
     if (jj_3R_154()) {
     jj_scanpos = xsp;
     if (jj_3R_155()) {
     jj_scanpos = xsp;
     if (jj_3R_156()) {
     jj_scanpos = xsp;
-    if (jj_3R_157()) return true;
+    if (jj_3R_157()) {
+    jj_scanpos = xsp;
+    if (jj_3R_158()) return true;
     }
     }
     }
@@ -6023,7 +6072,7 @@ LexicalUnit exp;
     return false;
   }
 
-  private boolean jj_3R_167() {
+  private boolean jj_3R_170() {
     if (jj_scan_token(HASH)) return true;
     return false;
   }
@@ -6038,7 +6087,7 @@ LexicalUnit exp;
   private Token jj_scanpos, jj_lastpos;
   private int jj_la;
   private int jj_gen;
-  final private int[] jj_la1 = new int[213];
+  final private int[] jj_la1 = new int[214];
   static private int[] jj_la1_0;
   static private int[] jj_la1_1;
   static private int[] jj_la1_2;
@@ -6050,16 +6099,16 @@ LexicalUnit exp;
       jj_la1_init_3();
    }
    private static void jj_la1_init_0() {
-      jj_la1_0 = new int[] {0x0,0xc02,0xc02,0x0,0xc00,0x2,0x2,0x2,0x0,0xe8000000,0xc00,0x2,0xc00,0x2,0x0,0x2,0x0,0x2,0x2,0x2,0xe9f45400,0xe9f45400,0x2,0x400000,0x2,0x2,0x2,0x2,0x0,0x0,0x2,0x0,0x800000,0x2,0x0,0x2,0x2,0x2,0x2,0x0,0x800000,0x2,0x0,0x2,0x1f45400,0x2,0x2,0x1100000,0x2,0x1100000,0x1100002,0x2,0x80080002,0x80080002,0x2,0x2,0x2,0x2,0x2,0xe8000000,0x0,0x0,0x0,0xe8000000,0x2,0x400000,0x2,0x2,0x88000000,0x88000000,0x88000000,0x88000000,0x88000000,0x88000000,0x88000000,0x88000000,0x88000000,0x88000000,0xe8000000,0x0,0x0,0x0,0x0,0x60000000,0x2,0x2,0xfc000,0x2,0x0,0x2,0xfc000,0x0,0x2,0x2,0x0,0x2,0x0,0x2,0x800000,0x27380002,0x2,0xe8000000,0x0,0xe8000000,0x2,0x0,0x2,0x27380002,0x0,0x2,0xe8000000,0x0,0xe8000000,0x2,0x27380002,0x2,0x2,0x2,0x0,0x2,0xe8000000,0x0,0x0,0xe8000000,0x2,0x2,0x400000,0x2,0x2,0x2,0x2,0x0,0x2,0xe8000000,0x0,0xe8000000,0x2,0x400000,0x2,0x2,0x2,0x400000,0x0,0x300000,0x2,0x0,0x400000,0x2,0x300000,0x2,0x0,0x2,0x0,0x2,0x800000,0x2,0x2,0x2,0x0,0x2,0x2,0x2,0x400000,0x2,0x2,0x0,0x2,0x2,0x2,0x800000,0x2,0x2,0x0,0x800000,0x2,0x0,0x2,0x2,0x0,0x2,0x0,0x800000,0x2,0x0,0x2,0x301000,0x2,0x0,0x2,0x2,0x2,0x2,0x4400000,0x4400000,0x300000,0x300000,0x0,0x0,0x300000,0x2,0x300000,0x2,0x300000,0x2,0xe8000000,0x2,0x2,0x2,0x0,0x800000,0x2,0x0,0x2,};
+      jj_la1_0 = new int[] {0x0,0xc02,0xc02,0x0,0xc00,0x2,0x2,0x2,0x0,0xe8000000,0xc00,0x2,0xc00,0x2,0x0,0x2,0x0,0x2,0x2,0x2,0xe9f45400,0xe9f45400,0x2,0x400000,0x2,0x2,0x2,0x2,0x0,0x0,0x2,0x0,0x800000,0x2,0x0,0x2,0x2,0x2,0x2,0x0,0x800000,0x2,0x0,0x2,0x1f45400,0x2,0x2,0x1100000,0x2,0x1100000,0x1100002,0x2,0x80080002,0x80080002,0x2,0x2,0x2,0x2,0x2,0xe8000000,0x0,0x0,0x0,0xe8000000,0x2,0x400000,0x2,0x2,0x88000000,0x88000000,0x88000000,0x88000000,0x88000000,0x88000000,0x88000000,0x88000000,0x88000000,0x88000000,0xe8000000,0x0,0x0,0x0,0x0,0x60000000,0x2,0x2,0xfc000,0x2,0x0,0x2,0xfc000,0x0,0x2,0x2,0x0,0x2,0x0,0x2,0x800000,0x27380002,0x2,0xe8000000,0x0,0xe8000000,0x2,0x0,0x2,0x27380002,0x0,0x2,0xe8000000,0x0,0xe8000000,0x2,0x27380002,0x2,0x2,0x2,0x0,0x2,0xe8000000,0x0,0x0,0xe8000000,0x2,0x2,0x400000,0x2,0x2,0x2,0x2,0x0,0x2,0xe8000000,0x0,0xe8000000,0x2,0x400000,0x2,0x2,0x2,0x400000,0x0,0x0,0x300000,0x2,0x0,0x400000,0x2,0x300000,0x2,0x0,0x2,0x0,0x2,0x800000,0x2,0x2,0x2,0x0,0x2,0x2,0x2,0x400000,0x2,0x2,0x0,0x2,0x2,0x2,0x800000,0x2,0x2,0x0,0x800000,0x2,0x0,0x2,0x2,0x0,0x2,0x0,0x800000,0x2,0x0,0x2,0x301000,0x2,0x0,0x2,0x2,0x2,0x2,0x4400000,0x4400000,0x300000,0x300000,0x300000,0x0,0x0,0x300000,0x2,0x2,0x300000,0x2,0xe8000000,0x2,0x2,0x2,0x0,0x800000,0x2,0x0,0x2,};
    }
    private static void jj_la1_init_1() {
-      jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x83000c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1c0,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x100,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc2,0xc2,0x0,0x0,0x0,0x0,0x0,0xa82000c0,0x0,0x20000000,0x88200000,0xc0,0x0,0x0,0x0,0x0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xc0,0x80,0x80,0x80,0x80,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3f,0x0,0x802000c0,0x80200000,0xc0,0x0,0x40000000,0x0,0x3f,0x0,0x0,0x802000c0,0x80200000,0xc0,0x0,0x3f,0x0,0x0,0x0,0x0,0x0,0x802000c0,0x200000,0x80000000,0xc0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x882000c0,0x88200000,0xc0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x40,0x0,0x40,0x0,0x0,0x40,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x60000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
+      jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x83000c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1c0,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x100,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc2,0xc2,0x0,0x0,0x0,0x0,0x0,0xa82000c0,0x0,0x20000000,0x88200000,0xc0,0x0,0x0,0x0,0x0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xc0,0x80,0x80,0x80,0x80,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3f,0x0,0x802000c0,0x80200000,0xc0,0x0,0x40000000,0x0,0x3f,0x0,0x0,0x802000c0,0x80200000,0xc0,0x0,0x3f,0x0,0x0,0x0,0x0,0x0,0x802000c0,0x200000,0x80000000,0xc0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x882000c0,0x88200000,0xc0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x40,0x40,0x0,0x40,0x0,0x0,0x40,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x60000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
    }
    private static void jj_la1_init_2() {
-      jj_la1_2 = new int[] {0x80000000,0x0,0x0,0x20000000,0x0,0x0,0x0,0x0,0x400,0x50000440,0x0,0x0,0x0,0x0,0x220,0x0,0x40,0x0,0x0,0x0,0xf0000ae0,0xf0000ae0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x40,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x40,0x0,0xe0000aa0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc0,0xc0,0x0,0x0,0x0,0x0,0x0,0x50000444,0x44,0x0,0x40000400,0x10000040,0x0,0x0,0x0,0x0,0x10000000,0x10000000,0x0,0x0,0x10000000,0x10000000,0x10000000,0x10000000,0x10000000,0x10000000,0x10000040,0x40,0x40,0x40,0x40,0x40,0x0,0x0,0x0,0x0,0x60,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x10,0x0,0x0,0x4c0,0x0,0x50000440,0x40000400,0x10000040,0x0,0x0,0x0,0x4c0,0x8,0x0,0x50000440,0x40000400,0x10000040,0x0,0x4c0,0x0,0x0,0x0,0x440,0x0,0x50000440,0x0,0x40000400,0x10000040,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x50000440,0x40000400,0x10000040,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1ffffee0,0x0,0x0,0x0,0x0,0x1ffffee0,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x40,0x0,0x1ffffee0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xffff880,0x10000260,0x1ffffae0,0x0,0x1ffffee0,0x0,0x1ffffee0,0x0,0x70000040,0x0,0x0,0x0,0x40,0x0,0x0,0x40,0x0,};
+      jj_la1_2 = new int[] {0x80000000,0x0,0x0,0x20000000,0x0,0x0,0x0,0x0,0x400,0x50000440,0x0,0x0,0x0,0x0,0x220,0x0,0x40,0x0,0x0,0x0,0xf0000ae0,0xf0000ae0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x40,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x40,0x0,0xe0000aa0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc0,0xc0,0x0,0x0,0x0,0x0,0x0,0x50000444,0x44,0x0,0x40000400,0x10000040,0x0,0x0,0x0,0x0,0x10000000,0x10000000,0x0,0x0,0x10000000,0x10000000,0x10000000,0x10000000,0x10000000,0x10000000,0x10000040,0x40,0x40,0x40,0x40,0x40,0x0,0x0,0x0,0x0,0x60,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x10,0x0,0x0,0x4c0,0x0,0x50000440,0x40000400,0x10000040,0x0,0x0,0x0,0x4c0,0x8,0x0,0x50000440,0x40000400,0x10000040,0x0,0x4c0,0x0,0x0,0x0,0x440,0x0,0x50000440,0x0,0x40000400,0x10000040,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x50000440,0x40000400,0x10000040,0x0,0x0,0x0,0x0,0x0,0x0,0x400,0x400,0x1ffffee0,0x0,0x0,0x0,0x0,0x1ffffee0,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x40,0x0,0x1ffffee0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1ffffee0,0x0,0xffff880,0x10000260,0x1ffffae0,0x0,0x0,0x1ffffee0,0x0,0x70000040,0x0,0x0,0x0,0x40,0x0,0x0,0x40,0x0,};
    }
    private static void jj_la1_init_3() {
-      jj_la1_3 = new int[] {0x0,0x4,0x4,0x0,0x4,0x0,0x0,0x0,0x0,0x3,0x4,0x0,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1a00f,0x1a00f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1a00f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8000,0x8000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xa000,0x0,0x0,0x0,0x0,0xa000,0x0,0x0,0x0,0x8000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x0,0x0,0x0,0xa000,0x0,0x8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8000,0x2000,0xa000,0x0,0xa000,0x0,0xa000,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
+      jj_la1_3 = new int[] {0x0,0x4,0x4,0x0,0x4,0x0,0x0,0x0,0x0,0x3,0x4,0x0,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1a00f,0x1a00f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1a00f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8000,0x8000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xa000,0x0,0x0,0x0,0x0,0xa000,0x0,0x0,0x0,0x8000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x0,0x0,0x0,0xa000,0x0,0x8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xa000,0x0,0x8000,0x2000,0xa000,0x0,0x0,0xa000,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
    }
   final private JJCalls[] jj_2_rtns = new JJCalls[11];
   private boolean jj_rescan = false;
@@ -6071,7 +6120,7 @@ LexicalUnit exp;
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 213; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 214; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -6081,7 +6130,7 @@ LexicalUnit exp;
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 213; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 214; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -6091,7 +6140,7 @@ LexicalUnit exp;
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 213; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 214; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -6101,7 +6150,7 @@ LexicalUnit exp;
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 213; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 214; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -6218,7 +6267,7 @@ LexicalUnit exp;
       la1tokens[jj_kind] = true;
       jj_kind = -1;
     }
-    for (int i = 0; i < 213; i++) {
+    for (int i = 0; i < 214; i++) {
       if (jj_la1[i] == jj_gen) {
         for (int j = 0; j < 32; j++) {
           if ((jj_la1_0[i] & (1<<j)) != 0) {
index 7503db94d9c18da88e9fe145aff0647b96e7c22a..ac022413e27ac61474d3210e17761fced73f8566 100644 (file)
@@ -1505,40 +1505,46 @@ ArrayList<VariableNode> arglist() :
 {
     ArrayList<VariableNode> args = new ArrayList<VariableNode>();
     VariableNode arg;
+    boolean hasNonOptionalArgument = false;
 }
 {
-    arg=mixinArg() ( <COMMA> (<S>)* { args.add(arg); } 
+    arg=mixinArg() ( <COMMA> (<S>)* { hasNonOptionalArgument = checkMixinForNonOptionalArguments(arg, hasNonOptionalArgument); args.add(arg); } 
         arg=mixinArg() )* 
-    { args.add(arg); 
+    { hasNonOptionalArgument = checkMixinForNonOptionalArguments(arg, hasNonOptionalArgument); args.add(arg); 
         return args;
     }
 }
 
 JAVACODE
-void checkMixinOptionalArguments(LexicalUnitImpl arg, String name)\r{
-       boolean currentArgHasArguments = arg.getLexicalUnitType() == LexicalUnitImpl.SCSS_VARIABLE;
-  \r    if(currentArgHasArguments)\r     {\r                      throw new ParseException("Sass Error: Required argument "+ name +" must come before any optional arguments.");
+boolean checkMixinForNonOptionalArguments(VariableNode arg, boolean hasNonOptionalArguments)\r{
+       boolean currentArgHasArguments = arg.getExpr() != null && arg.getExpr().getLexicalUnitType() == LexicalUnitImpl.SCSS_VARIABLE && arg.getExpr().getNextLexicalUnit() != null;
+  \r    if(currentArgHasArguments)\r     {
+               if(hasNonOptionalArguments)\r            {\r                      throw new ParseException("Sass Error: Required argument $"+ arg.getName() +" must come before any optional arguments.");
+               }
+               return hasNonOptionalArguments;
+       }else\r  {\r      return true;
        }
 }
 
 VariableNode mixinArg() :
 {
     String name;
+    Token variable = null;
     LexicalUnitImpl first = null;
-    LexicalUnitImpl next = null;
     LexicalUnitImpl prev = null;
+    LexicalUnitImpl next = null;
 }
 {
-    name=variableName() (":" (<S>)* first=term(null){ prev = first; }
-    (LOOKAHEAD(2)(< COMMA >(< S >)*)?
-    next=term(prev){
-       if(next.getLexicalUnitType() == LexicalUnitImpl.SCSS_VARIABLE)
-       {
-         throw new ParseException("Sass Error: Required argument "+ next.toString() +" must come before any optional arguments.");
-       }
-       prev.setNextLexicalUnit(next); prev = next;
-       
-    })* )?
+    name=variableName() (< COLON > (< S >)*
+
+    (\r      first = nonVariableTerm(null)\r      {
+        prev = first;\r      }
+         (LOOKAHEAD(3)(< COMMA >(< S >)*)? prev = nonVariableTerm(prev))*\r     )
+       | (variable = < VARIABLE >{ first = LexicalUnitImpl.createVariable(token.beginLine, token.beginColumn,
+                 prev, variable.image);}
+               
+       )
+    )?
     {
         VariableNode arg = new VariableNode(name, first, false);
         return arg;
@@ -1922,10 +1928,28 @@ LexicalUnitImpl term(LexicalUnitImpl prev) :
 { LexicalUnitImpl result = null;
   Token n = null;
   char op = ' ';
+}
+{
+  (result = nonVariableTerm(prev)| result = variableTerm(prev))
+      {
+         return result;
+      }
+}
+
+LexicalUnitImpl variableTerm(LexicalUnitImpl prev) :\r{
+  LexicalUnitImpl result = null;
+  String varName = "";\r}\r{
+  varName = variableName()
+         {result = LexicalUnitImpl.createVariable(token.beginLine, token.beginColumn,
+                 prev, varName); return result;}\r}
+
+LexicalUnitImpl nonVariableTerm(LexicalUnitImpl prev) :\r{\rLexicalUnitImpl result = null;
+  Token n = null;
+  char op = ' ';
   String varName;
 }
 {
-  (( ( ( op=unaryOperator() )?
+( ( ( op=unaryOperator() )?
     (
       n=<NUMBER>
        { result = LexicalUnitImpl.createNumber(n.beginLine, n.beginColumn,
@@ -2033,13 +2057,8 @@ LexicalUnitImpl term(LexicalUnitImpl prev) :
         | result=url(prev)
        | result=unicode(prev)
          ) ) ( <S> )*
-        | varName = variableName()
-         {result = LexicalUnitImpl.createVariable(token.beginLine, token.beginColumn,
-                 prev, varName);})
-      {
-         return result;
-      }
-}
+  {
+    return result;\r  }\r}
 
 /**
  * Handle all CSS2 functions.
index 32d8250fe865dc88be7a2294ac2683ed3d73e511..cb05cc87e312f74cff0553c66433a16863c2f60d 100644 (file)
@@ -58,7 +58,7 @@ $mixinVar : 1px;
        @include fontType(1px solid black, $color : red);
 }
 
-@mixin fontType($border, $color : black){
+@mixin fontType($border : 2px solid red, $color : black){
        border : $border;
        font-color: $color;
 }