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

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

index a841bd5445372697e9fd32ec8c3ae90e1200e5a6..eb4c52ae0d87780d2e72ef0e313fd9f415e08a94 100644 (file)
@@ -3143,6 +3143,15 @@ boolean isPseudoElement = false;
     throw new Error("Missing return statement in function");
   }
 
+  void checkMixinOptionalArguments(LexicalUnitImpl arg, String name) throws ParseException {
+        boolean currentArgHasArguments = arg.getLexicalUnitType() == LexicalUnitImpl.SCSS_VARIABLE;
+
+        if(currentArgHasArguments)
+        {
+                        throw new ParseException("Sass Error: Required argument "+ name +" must come before any optional arguments.");
+        }
+  }
+
   final public VariableNode mixinArg() throws ParseException {
     String name;
     LexicalUnitImpl first = null;
@@ -3194,7 +3203,11 @@ boolean isPseudoElement = false;
           ;
         }
         next = term(prev);
-                                                                                                                       prev.setNextLexicalUnit(next); prev = next;
+       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;
     default:
@@ -3218,6 +3231,7 @@ boolean isPseudoElement = false;
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case PLUS:
       case MINUS:
+      case COLON:
       case STRING:
       case IDENT:
       case NUMBER:
@@ -3249,39 +3263,60 @@ boolean isPseudoElement = false;
         jj_la1[143] = jj_gen;
         break label_94;
       }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case COLON:
+        jj_consume_token(COLON);
+        label_95:
+        while (true) {
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case S:
+            ;
+            break;
+          default:
+            jj_la1[144] = jj_gen;
+            break label_95;
+          }
+          jj_consume_token(S);
+        }
+        break;
+      default:
+        jj_la1[145] = jj_gen;
+        ;
+      }
       next = term(prev);
-                                                                         prev.setNextLexicalUnit(next); prev = next;
+                                                                                              prev.setNextLexicalUnit(next); prev = next;
     }
-    label_95:
+    label_96:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case COMMA:
         ;
         break;
       default:
-        jj_la1[144] = jj_gen;
-        break label_95;
+        jj_la1[146] = jj_gen;
+        break label_96;
       }
       jj_consume_token(COMMA);
-      label_96:
+      label_97:
       while (true) {
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case S:
           ;
           break;
         default:
-          jj_la1[145] = jj_gen;
-          break label_96;
+          jj_la1[147] = jj_gen;
+          break label_97;
         }
         jj_consume_token(S);
       }
       first = term(null);
                          args.add(first); prev = first;
-      label_97:
+      label_98:
       while (true) {
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case PLUS:
         case MINUS:
+        case COLON:
         case STRING:
         case IDENT:
         case NUMBER:
@@ -3310,11 +3345,31 @@ boolean isPseudoElement = false;
           ;
           break;
         default:
-          jj_la1[146] = jj_gen;
-          break label_97;
+          jj_la1[148] = jj_gen;
+          break label_98;
+        }
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case COLON:
+          jj_consume_token(COLON);
+          label_99:
+          while (true) {
+            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+            case S:
+              ;
+              break;
+            default:
+              jj_la1[149] = jj_gen;
+              break label_99;
+            }
+            jj_consume_token(S);
+          }
+          break;
+        default:
+          jj_la1[150] = jj_gen;
+          ;
         }
         next = term(prev);
-                                                                         prev.setNextLexicalUnit(next); prev = next;
+                                                                                              prev.setNextLexicalUnit(next); prev = next;
       }
     }
      {if (true) return args;}
@@ -3325,15 +3380,15 @@ boolean isPseudoElement = false;
     String name;
     ArrayList<LexicalUnitImpl> args=null;
     jj_consume_token(INCLUDE_SYM);
-    label_98:
+    label_100:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case S:
         ;
         break;
       default:
-        jj_la1[147] = jj_gen;
-        break label_98;
+        jj_la1[151] = jj_gen;
+        break label_100;
       }
       jj_consume_token(S);
     }
@@ -3347,22 +3402,22 @@ boolean isPseudoElement = false;
       jj_consume_token(RPARAN);
       break;
     default:
-      jj_la1[148] = jj_gen;
+      jj_la1[152] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
-    label_99:
+    label_101:
     while (true) {
       jj_consume_token(SEMICOLON);
-      label_100:
+      label_102:
       while (true) {
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case S:
           ;
           break;
         default:
-          jj_la1[149] = jj_gen;
-          break label_100;
+          jj_la1[153] = jj_gen;
+          break label_102;
         }
         jj_consume_token(S);
       }
@@ -3371,8 +3426,8 @@ boolean isPseudoElement = false;
         ;
         break;
       default:
-        jj_la1[150] = jj_gen;
-        break label_99;
+        jj_la1[154] = jj_gen;
+        break label_101;
       }
     }
             documentHandler.includeDirective(name, args);
@@ -3389,41 +3444,41 @@ boolean isPseudoElement = false;
         Token n = null;
     n = jj_consume_token(VARIABLE);
                     variable = n.image;
-    label_101:
+    label_103:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case S:
         ;
         break;
       default:
-        jj_la1[151] = jj_gen;
-        break label_101;
+        jj_la1[155] = jj_gen;
+        break label_103;
       }
       jj_consume_token(S);
     }
     jj_consume_token(COLON);
-    label_102:
+    label_104:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case S:
         ;
         break;
       default:
-        jj_la1[152] = jj_gen;
-        break label_102;
+        jj_la1[156] = jj_gen;
+        break label_104;
       }
       jj_consume_token(S);
     }
     jj_consume_token(REMOVE);
-    label_103:
+    label_105:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case S:
         ;
         break;
       default:
-        jj_la1[153] = jj_gen;
-        break label_103;
+        jj_la1[157] = jj_gen;
+        break label_105;
       }
       jj_consume_token(S);
     }
@@ -3433,19 +3488,19 @@ boolean isPseudoElement = false;
       jj_consume_token(RPARAN);
       break;
     default:
-      jj_la1[154] = jj_gen;
+      jj_la1[158] = jj_gen;
       ;
     }
     jj_consume_token(COMMA);
-    label_104:
+    label_106:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case S:
         ;
         break;
       default:
-        jj_la1[155] = jj_gen;
-        break label_104;
+        jj_la1[159] = jj_gen;
+        break label_106;
       }
       jj_consume_token(S);
     }
@@ -3453,60 +3508,60 @@ boolean isPseudoElement = false;
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case COMMA:
       jj_consume_token(COMMA);
-      label_105:
+      label_107:
       while (true) {
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case S:
           ;
           break;
         default:
-          jj_la1[156] = jj_gen;
-          break label_105;
+          jj_la1[160] = jj_gen;
+          break label_107;
         }
         jj_consume_token(S);
       }
       n = jj_consume_token(IDENT);
                                      separator = n.image;
-      label_106:
+      label_108:
       while (true) {
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case S:
           ;
           break;
         default:
-          jj_la1[157] = jj_gen;
-          break label_106;
+          jj_la1[161] = jj_gen;
+          break label_108;
         }
         jj_consume_token(S);
       }
       break;
     default:
-      jj_la1[158] = jj_gen;
+      jj_la1[162] = jj_gen;
       ;
     }
     jj_consume_token(RPARAN);
-    label_107:
+    label_109:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case S:
         ;
         break;
       default:
-        jj_la1[159] = jj_gen;
-        break label_107;
+        jj_la1[163] = jj_gen;
+        break label_109;
       }
       jj_consume_token(S);
     }
     jj_consume_token(SEMICOLON);
-    label_108:
+    label_110:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case S:
         ;
         break;
       default:
-        jj_la1[160] = jj_gen;
-        break label_108;
+        jj_la1[164] = jj_gen;
+        break label_110;
       }
       jj_consume_token(S);
     }
@@ -3618,20 +3673,20 @@ boolean isPseudoElement = false;
                        exclusive = false;
       break;
     default:
-      jj_la1[161] = jj_gen;
+      jj_la1[165] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
     to = skipStatementUntilLeftBrace();
-    label_109:
+    label_111:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case S:
         ;
         break;
       default:
-        jj_la1[162] = jj_gen;
-        break label_109;
+        jj_la1[166] = jj_gen;
+        break label_111;
       }
       jj_consume_token(S);
     }
@@ -3652,31 +3707,31 @@ boolean isPseudoElement = false;
   final public void extendDirective() throws ParseException {
  ArrayList<String> list;
     jj_consume_token(EXTEND_SYM);
-    label_110:
+    label_112:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case S:
         ;
         break;
       default:
-        jj_la1[163] = jj_gen;
-        break label_110;
+        jj_la1[167] = jj_gen;
+        break label_112;
       }
       jj_consume_token(S);
     }
     list = selectorList();
-    label_111:
+    label_113:
     while (true) {
       jj_consume_token(SEMICOLON);
-      label_112:
+      label_114:
       while (true) {
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case S:
           ;
           break;
         default:
-          jj_la1[164] = jj_gen;
-          break label_112;
+          jj_la1[168] = jj_gen;
+          break label_114;
         }
         jj_consume_token(S);
       }
@@ -3685,8 +3740,8 @@ boolean isPseudoElement = false;
         ;
         break;
       default:
-        jj_la1[165] = jj_gen;
-        break label_111;
+        jj_la1[169] = jj_gen;
+        break label_113;
       }
     }
      documentHandler.extendDirective(list);
@@ -3713,28 +3768,28 @@ boolean isPseudoElement = false;
 LexicalUnit exp;
     name = property();
     jj_consume_token(COLON);
-    label_113:
+    label_115:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case S:
         ;
         break;
       default:
-        jj_la1[166] = jj_gen;
-        break label_113;
+        jj_la1[170] = jj_gen;
+        break label_115;
       }
       jj_consume_token(S);
     }
     jj_consume_token(LBRACE);
-    label_114:
+    label_116:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case S:
         ;
         break;
       default:
-        jj_la1[167] = jj_gen;
-        break label_114;
+        jj_la1[171] = jj_gen;
+        break label_116;
       }
       jj_consume_token(S);
     }
@@ -3744,29 +3799,29 @@ LexicalUnit exp;
       declaration();
       break;
     default:
-      jj_la1[168] = jj_gen;
+      jj_la1[172] = jj_gen;
       ;
     }
-    label_115:
+    label_117:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case SEMICOLON:
         ;
         break;
       default:
-        jj_la1[169] = jj_gen;
-        break label_115;
+        jj_la1[173] = jj_gen;
+        break label_117;
       }
       jj_consume_token(SEMICOLON);
-      label_116:
+      label_118:
       while (true) {
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case S:
           ;
           break;
         default:
-          jj_la1[170] = jj_gen;
-          break label_116;
+          jj_la1[174] = jj_gen;
+          break label_118;
         }
         jj_consume_token(S);
       }
@@ -3775,21 +3830,21 @@ LexicalUnit exp;
         declaration();
         break;
       default:
-        jj_la1[171] = jj_gen;
+        jj_la1[175] = jj_gen;
         ;
       }
     }
     jj_consume_token(RBRACE);
       documentHandler.endNestedProperties(name);
-    label_117:
+    label_119:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case S:
         ;
         break;
       default:
-        jj_la1[172] = jj_gen;
-        break label_117;
+        jj_la1[176] = jj_gen;
+        break label_119;
       }
       jj_consume_token(S);
     }
@@ -3808,15 +3863,15 @@ LexicalUnit exp;
       name = property();
        save = token;
       jj_consume_token(COLON);
-      label_118:
+      label_120:
       while (true) {
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case S:
           ;
           break;
         default:
-          jj_la1[173] = jj_gen;
-          break label_118;
+          jj_la1[177] = jj_gen;
+          break label_120;
         }
         jj_consume_token(S);
       }
@@ -3854,7 +3909,7 @@ LexicalUnit exp;
           important = prio();
           break;
         default:
-          jj_la1[174] = jj_gen;
+          jj_la1[178] = jj_gen;
           ;
         }
          Token next = getToken(1);
@@ -3872,15 +3927,15 @@ LexicalUnit exp;
         break;
       case LBRACE:
         jj_consume_token(LBRACE);
-        label_119:
+        label_121:
         while (true) {
           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
           case S:
             ;
             break;
           default:
-            jj_la1[175] = jj_gen;
-            break label_119;
+            jj_la1[179] = jj_gen;
+            break label_121;
           }
           jj_consume_token(S);
         }
@@ -3890,29 +3945,29 @@ LexicalUnit exp;
           declaration();
           break;
         default:
-          jj_la1[176] = jj_gen;
+          jj_la1[180] = jj_gen;
           ;
         }
-        label_120:
+        label_122:
         while (true) {
           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
           case SEMICOLON:
             ;
             break;
           default:
-            jj_la1[177] = jj_gen;
-            break label_120;
+            jj_la1[181] = jj_gen;
+            break label_122;
           }
           jj_consume_token(SEMICOLON);
-          label_121:
+          label_123:
           while (true) {
             switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
             case S:
               ;
               break;
             default:
-              jj_la1[178] = jj_gen;
-              break label_121;
+              jj_la1[182] = jj_gen;
+              break label_123;
             }
             jj_consume_token(S);
           }
@@ -3921,27 +3976,27 @@ LexicalUnit exp;
             declaration();
             break;
           default:
-            jj_la1[179] = jj_gen;
+            jj_la1[183] = jj_gen;
             ;
           }
         }
         jj_consume_token(RBRACE);
-        label_122:
+        label_124:
         while (true) {
           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
           case S:
             ;
             break;
           default:
-            jj_la1[180] = jj_gen;
-            break label_122;
+            jj_la1[184] = jj_gen;
+            break label_124;
           }
           jj_consume_token(S);
         }
          documentHandler.endNestedProperties(name);
         break;
       default:
-        jj_la1[181] = jj_gen;
+        jj_la1[185] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -3991,15 +4046,15 @@ LexicalUnit exp;
       name = property();
        save = token;
       jj_consume_token(COLON);
-      label_123:
+      label_125:
       while (true) {
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case S:
           ;
           break;
         default:
-          jj_la1[182] = jj_gen;
-          break label_123;
+          jj_la1[186] = jj_gen;
+          break label_125;
         }
         jj_consume_token(S);
       }
@@ -4009,7 +4064,7 @@ LexicalUnit exp;
         important = prio();
         break;
       default:
-        jj_la1[183] = jj_gen;
+        jj_la1[187] = jj_gen;
         ;
       }
          documentHandler.property(name, exp, important);
@@ -4052,15 +4107,15 @@ LexicalUnit exp;
  */
   final public boolean prio() throws ParseException {
     jj_consume_token(IMPORTANT_SYM);
-    label_124:
+    label_126:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case S:
         ;
         break;
       default:
-        jj_la1[184] = jj_gen;
-        break label_124;
+        jj_la1[188] = jj_gen;
+        break label_126;
       }
       jj_consume_token(S);
     }
@@ -4070,15 +4125,15 @@ LexicalUnit exp;
 
   final public boolean guarded() throws ParseException {
     jj_consume_token(GUARDED_SYM);
-    label_125:
+    label_127:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case S:
         ;
         break;
       default:
-        jj_la1[185] = jj_gen;
-        break label_125;
+        jj_la1[189] = jj_gen;
+        break label_127;
       }
       jj_consume_token(S);
     }
@@ -4094,15 +4149,15 @@ LexicalUnit exp;
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case DIV:
       n = jj_consume_token(DIV);
-      label_126:
+      label_128:
       while (true) {
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case S:
           ;
           break;
         default:
-          jj_la1[186] = jj_gen;
-          break label_126;
+          jj_la1[190] = jj_gen;
+          break label_128;
         }
         jj_consume_token(S);
       }
@@ -4112,15 +4167,15 @@ LexicalUnit exp;
       break;
     case COMMA:
       n = jj_consume_token(COMMA);
-      label_127:
+      label_129:
       while (true) {
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case S:
           ;
           break;
         default:
-          jj_la1[187] = jj_gen;
-          break label_127;
+          jj_la1[191] = jj_gen;
+          break label_129;
         }
         jj_consume_token(S);
       }
@@ -4129,7 +4184,7 @@ LexicalUnit exp;
                                                          prev);}
       break;
     default:
-      jj_la1[188] = jj_gen;
+      jj_la1[192] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
@@ -4144,12 +4199,12 @@ LexicalUnit exp;
     char op;
     first = term(null);
                       res = first;
-    label_128:
+    label_130:
     while (true) {
       if (jj_2_11(2)) {
         ;
       } else {
-        break label_128;
+        break label_130;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case COMMA:
@@ -4157,7 +4212,7 @@ LexicalUnit exp;
         res = operator(res);
         break;
       default:
-        jj_la1[189] = jj_gen;
+        jj_la1[193] = jj_gen;
         ;
       }
       res = term(res);
@@ -4180,7 +4235,7 @@ LexicalUnit exp;
         {if (true) return '+';}
       break;
     default:
-      jj_la1[190] = jj_gen;
+      jj_la1[194] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
@@ -4250,7 +4305,7 @@ LexicalUnit exp;
           op = unaryOperator();
           break;
         default:
-          jj_la1[191] = jj_gen;
+          jj_la1[195] = jj_gen;
           ;
         }
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -4355,7 +4410,7 @@ LexicalUnit exp;
           result = function(op, prev);
           break;
         default:
-          jj_la1[192] = jj_gen;
+          jj_la1[196] = jj_gen;
           jj_consume_token(-1);
           throw new ParseException();
         }
@@ -4418,25 +4473,25 @@ LexicalUnit exp;
           result = unicode(prev);
           break;
         default:
-          jj_la1[193] = jj_gen;
+          jj_la1[197] = jj_gen;
           jj_consume_token(-1);
           throw new ParseException();
         }
         break;
       default:
-        jj_la1[194] = jj_gen;
+        jj_la1[198] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
-      label_129:
+      label_131:
       while (true) {
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case S:
           ;
           break;
         default:
-          jj_la1[195] = jj_gen;
-          break label_129;
+          jj_la1[199] = jj_gen;
+          break label_131;
         }
         jj_consume_token(S);
       }
@@ -4447,7 +4502,7 @@ LexicalUnit exp;
                  prev, varName);
       break;
     default:
-      jj_la1[196] = jj_gen;
+      jj_la1[200] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
@@ -4463,15 +4518,15 @@ LexicalUnit exp;
  Token n;
  LexicalUnit params = null;
     n = jj_consume_token(FUNCTION);
-    label_130:
+    label_132:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case S:
         ;
         break;
       default:
-        jj_la1[197] = jj_gen;
-        break label_130;
+        jj_la1[201] = jj_gen;
+        break label_132;
       }
       jj_consume_token(S);
     }
@@ -4512,7 +4567,7 @@ LexicalUnit exp;
       params = expr();
       break;
     default:
-      jj_la1[198] = jj_gen;
+      jj_la1[202] = jj_gen;
       ;
     }
     jj_consume_token(RPARAN);
@@ -4983,15 +5038,15 @@ LexicalUnit exp;
  */
   final public void _parseRule() throws ParseException {
  String ret = null;
-    label_131:
+    label_133:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case S:
         ;
         break;
       default:
-        jj_la1[199] = jj_gen;
-        break label_131;
+        jj_la1[203] = jj_gen;
+        break label_133;
       }
       jj_consume_token(S);
     }
@@ -5019,7 +5074,7 @@ LexicalUnit exp;
       fontFace();
       break;
     default:
-      jj_la1[200] = jj_gen;
+      jj_la1[204] = jj_gen;
       ret = skipStatement();
                     if ((ret == null) || (ret.length() == 0)) {
                         {if (true) return;}
@@ -5034,15 +5089,15 @@ LexicalUnit exp;
   }
 
   final public void _parseImportRule() throws ParseException {
-    label_132:
+    label_134:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case S:
         ;
         break;
       default:
-        jj_la1[201] = jj_gen;
-        break label_132;
+        jj_la1[205] = jj_gen;
+        break label_134;
       }
       jj_consume_token(S);
     }
@@ -5050,15 +5105,15 @@ LexicalUnit exp;
   }
 
   final public void _parseMediaRule() throws ParseException {
-    label_133:
+    label_135:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case S:
         ;
         break;
       default:
-        jj_la1[202] = jj_gen;
-        break label_133;
+        jj_la1[206] = jj_gen;
+        break label_135;
       }
       jj_consume_token(S);
     }
@@ -5066,15 +5121,15 @@ LexicalUnit exp;
   }
 
   final public void _parseDeclarationBlock() throws ParseException {
-    label_134:
+    label_136:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case S:
         ;
         break;
       default:
-        jj_la1[203] = jj_gen;
-        break label_134;
+        jj_la1[207] = jj_gen;
+        break label_136;
       }
       jj_consume_token(S);
     }
@@ -5083,29 +5138,29 @@ LexicalUnit exp;
       declaration();
       break;
     default:
-      jj_la1[204] = jj_gen;
+      jj_la1[208] = jj_gen;
       ;
     }
-    label_135:
+    label_137:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case SEMICOLON:
         ;
         break;
       default:
-        jj_la1[205] = jj_gen;
-        break label_135;
+        jj_la1[209] = jj_gen;
+        break label_137;
       }
       jj_consume_token(SEMICOLON);
-      label_136:
+      label_138:
       while (true) {
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case S:
           ;
           break;
         default:
-          jj_la1[206] = jj_gen;
-          break label_136;
+          jj_la1[210] = jj_gen;
+          break label_138;
         }
         jj_consume_token(S);
       }
@@ -5114,7 +5169,7 @@ LexicalUnit exp;
         declaration();
         break;
       default:
-        jj_la1[207] = jj_gen;
+        jj_la1[211] = jj_gen;
         ;
       }
     }
@@ -5123,15 +5178,15 @@ LexicalUnit exp;
   final public ArrayList<String> _parseSelectors() throws ParseException {
   ArrayList<String> p = null;
     try {
-      label_137:
+      label_139:
       while (true) {
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case S:
           ;
           break;
         default:
-          jj_la1[208] = jj_gen;
-          break label_137;
+          jj_la1[212] = jj_gen;
+          break label_139;
         }
         jj_consume_token(S);
       }
@@ -5220,142 +5275,102 @@ LexicalUnit exp;
     finally { jj_save(10, xla); }
   }
 
-  private boolean jj_3R_174() {
-    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; }
     }
-    return false;
-  }
-
-  private boolean jj_3R_161() {
-    Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_173()) {
-    jj_scanpos = xsp;
-    if (jj_3R_174()) return true;
-    }
+    if (jj_3R_226()) jj_scanpos = xsp;
+    if (jj_scan_token(RPARAN)) return true;
     return false;
   }
 
-  private boolean jj_3R_173() {
-    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_3_1() {
+    if (jj_3R_140()) return true;
     return false;
   }
 
-  private boolean jj_3R_219() {
-    if (jj_scan_token(UNICODERANGE)) return true;
+  private boolean jj_3R_162() {
+    if (jj_3R_174()) return true;
     return false;
   }
 
-  private boolean jj_3_1() {
-    if (jj_3R_138()) return true;
+  private boolean jj_3R_215() {
+    if (jj_3R_221()) return true;
     return false;
   }
 
-  private boolean jj_3R_224() {
-    if (jj_3R_169()) return true;
+  private boolean jj_3R_214() {
+    if (jj_3R_220()) return true;
     return false;
   }
 
-  private boolean jj_3R_216() {
-    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_224()) jj_scanpos = xsp;
-    if (jj_scan_token(RPARAN)) return true;
+  private boolean jj_3R_213() {
+    if (jj_3R_219()) return true;
     return false;
   }
 
   private boolean jj_3_4() {
-    if (jj_3R_141()) return true;
-    if (jj_3R_142()) return true;
+    if (jj_3R_143()) return true;
+    if (jj_3R_144()) return true;
     return false;
   }
 
   private boolean jj_3_7() {
-    if (jj_3R_138()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_160() {
-    if (jj_3R_172()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_213() {
-    if (jj_3R_219()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_212() {
-    if (jj_3R_218()) return true;
+    if (jj_3R_140()) return true;
     return false;
   }
 
-  private boolean jj_3R_167() {
+  private boolean jj_3R_169() {
     if (jj_scan_token(COLON)) return true;
     return false;
   }
 
   private boolean jj_3_6() {
-    if (jj_3R_143()) return true;
+    if (jj_3R_145()) return true;
     return false;
   }
 
-  private boolean jj_3R_211() {
-    if (jj_3R_217()) return true;
+  private boolean jj_3R_212() {
+    if (jj_scan_token(IDENT)) return true;
     return false;
   }
 
   private boolean jj_3_5() {
-    if (jj_3R_143()) return true;
+    if (jj_3R_145()) return true;
     return false;
   }
 
-  private boolean jj_3_2() {
-    if (jj_3R_138()) return true;
+  private boolean jj_3R_211() {
+    if (jj_scan_token(STRING)) return true;
     return false;
   }
 
   private boolean jj_3R_210() {
-    if (jj_scan_token(IDENT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_209() {
-    if (jj_scan_token(STRING)) return true;
+    if (jj_3R_218()) return true;
     return false;
   }
 
-  private boolean jj_3R_208() {
-    if (jj_3R_216()) return true;
+  private boolean jj_3_2() {
+    if (jj_3R_140()) return true;
     return false;
   }
 
-  private boolean jj_3R_171() {
+  private boolean jj_3R_173() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_209()) {
-    jj_scanpos = xsp;
-    if (jj_3R_210()) {
-    jj_scanpos = xsp;
     if (jj_3R_211()) {
     jj_scanpos = xsp;
     if (jj_3R_212()) {
     jj_scanpos = xsp;
-    if (jj_3R_213()) return true;
+    if (jj_3R_213()) {
+    jj_scanpos = xsp;
+    if (jj_3R_214()) {
+    jj_scanpos = xsp;
+    if (jj_3R_215()) return true;
     }
     }
     }
@@ -5363,37 +5378,72 @@ LexicalUnit exp;
     return false;
   }
 
-  private boolean jj_3R_221() {
-    if (jj_scan_token(INTERPOLATION)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_207() {
+  private boolean jj_3R_209() {
     if (jj_scan_token(DIMEN)) return true;
     return false;
   }
 
-  private boolean jj_3R_206() {
+  private boolean jj_3R_208() {
     if (jj_scan_token(KHZ)) return true;
     return false;
   }
 
-  private boolean jj_3R_168() {
-    if (jj_scan_token(LBRACKET)) return true;
+  private boolean jj_3R_207() {
+    if (jj_scan_token(HZ)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_206() {
+    if (jj_scan_token(MS)) return true;
     return false;
   }
 
   private boolean jj_3R_205() {
-    if (jj_scan_token(HZ)) return true;
+    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() {
-    if (jj_scan_token(MS)) return true;
+    if (jj_scan_token(GRAD)) return true;
     return false;
   }
 
-  private boolean jj_3R_156() {
+  private boolean jj_3R_203() {
+    if (jj_scan_token(RAD)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_160() {
+    if (jj_scan_token(LBRACE)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_202() {
+    if (jj_scan_token(DEG)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_201() {
+    if (jj_scan_token(EXS)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_170() {
+    if (jj_scan_token(LBRACKET)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_200() {
+    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) {
@@ -5403,17 +5453,17 @@ LexicalUnit exp;
     return false;
   }
 
-  private boolean jj_3R_140() {
-    if (jj_3R_143()) return true;
+  private boolean jj_3R_199() {
+    if (jj_scan_token(PX)) return true;
     return false;
   }
 
-  private boolean jj_3R_203() {
-    if (jj_scan_token(SECOND)) return true;
+  private boolean jj_3R_142() {
+    if (jj_3R_145()) return true;
     return false;
   }
 
-  private boolean jj_3R_172() {
+  private boolean jj_3R_174() {
     if (jj_scan_token(VARIABLE)) return true;
     Token xsp;
     while (true) {
@@ -5423,174 +5473,252 @@ LexicalUnit exp;
     return false;
   }
 
-  private boolean jj_3R_144() {
-    if (jj_scan_token(COMMA)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
-    }
+  private boolean jj_3R_198() {
+    if (jj_scan_token(IN)) return true;
     return false;
   }
 
-  private boolean jj_3R_188() {
+  private boolean jj_3R_190() {
     if (jj_scan_token(PARENT)) return true;
     return false;
   }
 
-  private boolean jj_3R_202() {
-    if (jj_scan_token(GRAD)) return true;
+  private boolean jj_3R_159() {
+    if (jj_3R_171()) return true;
     return false;
   }
 
-  private boolean jj_3R_187() {
+  private boolean jj_3R_189() {
     if (jj_scan_token(ANY)) return true;
     return false;
   }
 
-  private boolean jj_3R_201() {
-    if (jj_scan_token(RAD)) return true;
+  private boolean jj_3R_197() {
+    if (jj_scan_token(PC)) return true;
     return false;
   }
 
-  private boolean jj_3R_158() {
-    if (jj_scan_token(LBRACE)) return true;
+  private boolean jj_3R_196() {
+    if (jj_scan_token(MM)) return true;
     return false;
   }
 
-  private boolean jj_3R_200() {
-    if (jj_scan_token(DEG)) return true;
+  private boolean jj_3R_195() {
+    if (jj_scan_token(CM)) return true;
     return false;
   }
 
-  private boolean jj_3R_220() {
+  private boolean jj_3R_222() {
     if (jj_scan_token(IDENT)) return true;
     return false;
   }
 
-  private boolean jj_3R_214() {
+  private boolean jj_3R_216() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_220()) {
+    if (jj_3R_222()) {
     jj_scanpos = xsp;
-    if (jj_3R_221()) return true;
+    if (jj_3R_223()) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_199() {
-    if (jj_scan_token(EXS)) return true;
+  private boolean jj_3R_145() {
+    if (jj_3R_158()) 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_159()) {
+    jj_scanpos = xsp;
+    if (jj_3R_160()) return true;
+    }
     return false;
   }
 
-  private boolean jj_3R_164() {
+  private boolean jj_3R_166() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_186()) {
+    if (jj_3R_188()) {
     jj_scanpos = xsp;
-    if (jj_3R_187()) {
+    if (jj_3R_189()) {
     jj_scanpos = xsp;
-    if (jj_3R_188()) return true;
+    if (jj_3R_190()) return true;
     }
     }
     return false;
   }
 
-  private boolean jj_3R_186() {
+  private boolean jj_3R_188() {
     Token xsp;
-    if (jj_3R_214()) return true;
+    if (jj_3R_216()) return true;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3R_214()) { jj_scanpos = xsp; break; }
+      if (jj_3R_216()) { jj_scanpos = xsp; break; }
     }
     return false;
   }
 
-  private boolean jj_3_10() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_144()) jj_scanpos = xsp;
-    if (jj_3R_145()) return true;
+  private boolean jj_3R_194() {
+    if (jj_scan_token(PT)) return true;
     return false;
   }
 
-  private boolean jj_3R_198() {
-    if (jj_scan_token(EMS)) return true;
+  private boolean jj_3R_140() {
+    if (jj_scan_token(VARIABLE)) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
+    }
+    if (jj_scan_token(COLON)) return true;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
+    }
+    if (jj_scan_token(REMOVE)) return true;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
+    }
+    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
     return false;
   }
 
-  private boolean jj_3R_183() {
+  private boolean jj_3R_185() {
     if (jj_scan_token(S)) return true;
     return false;
   }
 
-  private boolean jj_3R_182() {
+  private boolean jj_3R_184() {
     if (jj_scan_token(DOT)) return true;
     return false;
   }
 
-  private boolean jj_3R_181() {
+  private boolean jj_3R_193() {
+    if (jj_scan_token(PERCENTAGE)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_183() {
     if (jj_scan_token(EQ)) return true;
     return false;
   }
 
-  private boolean jj_3R_180() {
+  private boolean jj_3R_182() {
     if (jj_scan_token(RPARAN)) return true;
     return false;
   }
 
-  private boolean jj_3R_197() {
-    if (jj_scan_token(PX)) return true;
+  private boolean jj_3R_191() {
+    if (jj_3R_217()) return true;
     return false;
   }
 
-  private boolean jj_3R_179() {
+  private boolean jj_3R_181() {
     if (jj_scan_token(FUNCTION)) return true;
     return false;
   }
 
-  private boolean jj_3R_178() {
-    if (jj_scan_token(COLON)) return true;
+  private boolean jj_3R_192() {
+    if (jj_scan_token(NUMBER)) return true;
     return false;
   }
 
-  private boolean jj_3R_139() {
-    if (jj_3R_147()) return true;
+  private boolean jj_3R_180() {
+    if (jj_scan_token(COLON)) return true;
     return false;
   }
 
-  private boolean jj_3R_177() {
-    if (jj_scan_token(INTERPOLATION)) return true;
+  private boolean jj_3R_141() {
+    if (jj_3R_149()) return true;
     return false;
   }
 
-  private boolean jj_3R_196() {
-    if (jj_scan_token(IN)) return true;
+  private boolean jj_3R_179() {
+    if (jj_scan_token(INTERPOLATION)) return true;
     return false;
   }
 
-  private boolean jj_3R_176() {
+  private boolean jj_3R_178() {
     if (jj_scan_token(NUMBER)) return true;
     return false;
   }
 
-  private boolean jj_3R_157() {
-    if (jj_3R_169()) return true;
+  private boolean jj_3R_172() {
+    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()) {
+    jj_scanpos = xsp;
+    if (jj_3R_205()) {
+    jj_scanpos = xsp;
+    if (jj_3R_206()) {
+    jj_scanpos = xsp;
+    if (jj_3R_207()) {
+    jj_scanpos = xsp;
+    if (jj_3R_208()) {
+    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_143()) return true;
+    if (jj_3R_145()) return true;
     return false;
   }
 
-  private boolean jj_3R_162() {
+  private boolean jj_3R_164() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_175()) {
-    jj_scanpos = xsp;
-    if (jj_3R_176()) {
-    jj_scanpos = xsp;
     if (jj_3R_177()) {
     jj_scanpos = xsp;
     if (jj_3R_178()) {
@@ -5603,7 +5731,11 @@ LexicalUnit exp;
     jj_scanpos = xsp;
     if (jj_3R_182()) {
     jj_scanpos = xsp;
-    if (jj_3R_183()) return true;
+    if (jj_3R_183()) {
+    jj_scanpos = xsp;
+    if (jj_3R_184()) {
+    jj_scanpos = xsp;
+    if (jj_3R_185()) return true;
     }
     }
     }
@@ -5615,48 +5747,46 @@ LexicalUnit exp;
     return false;
   }
 
-  private boolean jj_3R_175() {
+  private boolean jj_3R_177() {
     if (jj_scan_token(IDENT)) return true;
     return false;
   }
 
-  private boolean jj_3R_195() {
-    if (jj_scan_token(PC)) return true;
+  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; }
+    }
     return false;
   }
 
-  private boolean jj_3R_194() {
-    if (jj_scan_token(MM)) return true;
+  private boolean jj_3R_147() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_161()) {
+    jj_scanpos = xsp;
+    if (jj_3R_162()) return true;
+    }
     return false;
   }
 
-  private boolean jj_3R_193() {
-    if (jj_scan_token(CM)) return true;
+  private boolean jj_3R_148() {
+    if (jj_3R_163()) return true;
     return false;
   }
 
-  private boolean jj_3R_166() {
+  private boolean jj_3R_168() {
     if (jj_scan_token(DOT)) return true;
     return false;
   }
 
-  private boolean jj_3R_143() {
-    if (jj_3R_156()) 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_157()) {
-    jj_scanpos = xsp;
-    if (jj_3R_158()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_147() {
+  private boolean jj_3R_149() {
     if (jj_scan_token(MICROSOFT_RULE)) return true;
     Token xsp;
     while (true) {
@@ -5664,20 +5794,20 @@ LexicalUnit exp;
       if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
     }
     if (jj_scan_token(COLON)) return true;
-    if (jj_3R_162()) return true;
+    if (jj_3R_164()) return true;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3R_162()) { jj_scanpos = xsp; break; }
+      if (jj_3R_164()) { jj_scanpos = xsp; break; }
     }
     return false;
   }
 
-  private boolean jj_3R_192() {
-    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_185() {
+  private boolean jj_3R_187() {
     if (jj_scan_token(PRECEDES)) return true;
     return false;
   }
@@ -5685,128 +5815,49 @@ LexicalUnit exp;
   private boolean jj_3_3() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_139()) {
+    if (jj_3R_141()) {
     jj_scanpos = xsp;
-    if (jj_3R_140()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_138() {
-    if (jj_scan_token(VARIABLE)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(COLON)) return true;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(REMOVE)) return true;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
+    if (jj_3R_142()) return true;
     }
-    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
     return false;
   }
 
-  private boolean jj_3R_191() {
-    if (jj_scan_token(PERCENTAGE)) return true;
+  private boolean jj_3R_186() {
+    if (jj_scan_token(PLUS)) return true;
     return false;
   }
 
-  private boolean jj_3R_184() {
+  private boolean jj_3R_225() {
     if (jj_scan_token(PLUS)) return true;
     return false;
   }
 
-  private boolean jj_3R_189() {
-    if (jj_3R_215()) return true;
+  private boolean jj_3R_224() {
+    if (jj_scan_token(MINUS)) return true;
     return false;
   }
 
-  private boolean jj_3R_163() {
+  private boolean jj_3R_217() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_184()) {
+    if (jj_3R_224()) {
     jj_scanpos = xsp;
-    if (jj_3R_185()) return true;
+    if (jj_3R_225()) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_190() {
-    if (jj_scan_token(NUMBER)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_170() {
+  private boolean jj_3R_165() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_189()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
-    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()) {
-    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()) {
-    jj_scanpos = xsp;
-    if (jj_3R_205()) {
-    jj_scanpos = xsp;
-    if (jj_3R_206()) {
-    jj_scanpos = xsp;
-    if (jj_3R_207()) {
+    if (jj_3R_186()) {
     jj_scanpos = xsp;
-    if (jj_3R_208()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
+    if (jj_3R_187()) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_149() {
+  private boolean jj_3R_151() {
     if (jj_scan_token(PRECEDES)) return true;
     Token xsp;
     while (true) {
@@ -5817,43 +5868,27 @@ LexicalUnit exp;
   }
 
   private boolean jj_3_8() {
-    if (jj_3R_143()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_159() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_170()) {
-    jj_scanpos = xsp;
-    if (jj_3R_171()) return true;
-    }
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
-    }
+    if (jj_3R_145()) return true;
     return false;
   }
 
-  private boolean jj_3R_145() {
+  private boolean jj_3_11() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_159()) {
-    jj_scanpos = xsp;
-    if (jj_3R_160()) return true;
-    }
+    if (jj_3R_148()) jj_scanpos = xsp;
+    if (jj_3R_147()) return true;
     return false;
   }
 
-  private boolean jj_3R_150() {
+  private boolean jj_3R_152() {
     if (jj_scan_token(S)) return true;
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_163()) jj_scanpos = xsp;
+    if (jj_3R_165()) jj_scanpos = xsp;
     return false;
   }
 
-  private boolean jj_3R_148() {
+  private boolean jj_3R_150() {
     if (jj_scan_token(PLUS)) return true;
     Token xsp;
     while (true) {
@@ -5863,69 +5898,89 @@ LexicalUnit exp;
     return false;
   }
 
-  private boolean jj_3R_141() {
+  private boolean jj_3R_143() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_148()) {
+    if (jj_3R_150()) {
     jj_scanpos = xsp;
-    if (jj_3R_149()) {
+    if (jj_3R_151()) {
     jj_scanpos = xsp;
-    if (jj_3R_150()) return true;
+    if (jj_3R_152()) return true;
     }
     }
     return false;
   }
 
-  private boolean jj_3R_146() {
-    if (jj_3R_161()) return true;
+  private boolean jj_3R_220() {
+    if (jj_scan_token(URL)) return true;
     return false;
   }
 
-  private boolean jj_3R_217() {
-    if (jj_scan_token(HASH)) return true;
+  private boolean jj_3R_171() {
+    if (jj_3R_147()) return true;
     return false;
   }
 
-  private boolean jj_3R_223() {
-    if (jj_scan_token(PLUS)) 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_222() {
-    if (jj_scan_token(MINUS)) return true;
+  private boolean jj_3R_176() {
+    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_215() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_222()) {
-    jj_scanpos = xsp;
-    if (jj_3R_223()) return true;
-    }
+  private boolean jj_3R_157() {
+    if (jj_3R_170()) return true;
     return false;
   }
 
-  private boolean jj_3_11() {
+  private boolean jj_3_10() {
     Token xsp;
     xsp = jj_scanpos;
     if (jj_3R_146()) jj_scanpos = xsp;
-    if (jj_3R_145()) return true;
+    if (jj_3R_147()) return true;
     return false;
   }
 
-  private boolean jj_3R_218() {
-    if (jj_scan_token(URL)) return true;
+  private boolean jj_3R_156() {
+    if (jj_3R_169()) return true;
     return false;
   }
 
-  private boolean jj_3R_155() {
-    if (jj_3R_168()) return true;
+  private boolean jj_3R_163() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_175()) {
+    jj_scanpos = xsp;
+    if (jj_3R_176()) return true;
+    }
     return false;
   }
 
-  private boolean jj_3R_169() {
-    if (jj_3R_145()) return true;
+  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; }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_155() {
+    if (jj_3R_168()) return true;
     return false;
   }
 
@@ -5934,33 +5989,33 @@ LexicalUnit exp;
     return false;
   }
 
-  private boolean jj_3R_153() {
-    if (jj_3R_166()) return true;
+  private boolean jj_3R_221() {
+    if (jj_scan_token(UNICODERANGE)) return true;
     return false;
   }
 
-  private boolean jj_3R_152() {
-    if (jj_3R_165()) return true;
+  private boolean jj_3R_226() {
+    if (jj_3R_171()) return true;
     return false;
   }
 
-  private boolean jj_3R_151() {
-    if (jj_3R_164()) return true;
+  private boolean jj_3R_153() {
+    if (jj_3R_166()) return true;
     return false;
   }
 
-  private boolean jj_3R_142() {
+  private boolean jj_3R_144() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_151()) {
-    jj_scanpos = xsp;
-    if (jj_3R_152()) {
-    jj_scanpos = xsp;
     if (jj_3R_153()) {
     jj_scanpos = xsp;
     if (jj_3R_154()) {
     jj_scanpos = xsp;
-    if (jj_3R_155()) return true;
+    if (jj_3R_155()) {
+    jj_scanpos = xsp;
+    if (jj_3R_156()) {
+    jj_scanpos = xsp;
+    if (jj_3R_157()) return true;
     }
     }
     }
@@ -5968,7 +6023,7 @@ LexicalUnit exp;
     return false;
   }
 
-  private boolean jj_3R_165() {
+  private boolean jj_3R_167() {
     if (jj_scan_token(HASH)) return true;
     return false;
   }
@@ -5983,7 +6038,7 @@ LexicalUnit exp;
   private Token jj_scanpos, jj_lastpos;
   private int jj_la;
   private int jj_gen;
-  final private int[] jj_la1 = new int[209];
+  final private int[] jj_la1 = new int[213];
   static private int[] jj_la1_0;
   static private int[] jj_la1_1;
   static private int[] jj_la1_2;
@@ -5995,16 +6050,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,0x400000,0x2,0x300000,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,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,};
    }
    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,0x0,0x0,0x0,0x0,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,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,0x1ffffee0,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,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,};
    }
    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,0xa000,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,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,};
    }
   final private JJCalls[] jj_2_rtns = new JJCalls[11];
   private boolean jj_rescan = false;
@@ -6016,7 +6071,7 @@ LexicalUnit exp;
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 209; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 213; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -6026,7 +6081,7 @@ LexicalUnit exp;
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 209; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 213; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -6036,7 +6091,7 @@ LexicalUnit exp;
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 209; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 213; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -6046,7 +6101,7 @@ LexicalUnit exp;
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 209; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 213; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -6163,7 +6218,7 @@ LexicalUnit exp;
       la1tokens[jj_kind] = true;
       jj_kind = -1;
     }
-    for (int i = 0; i < 209; i++) {
+    for (int i = 0; i < 213; i++) {
       if (jj_la1[i] == jj_gen) {
         for (int j = 0; j < 32; j++) {
           if ((jj_la1_0[i] & (1<<j)) != 0) {
index 9148da9ff99cde92108dc51cc3344a8de8fe0f0e..7503db94d9c18da88e9fe145aff0647b96e7c22a 100644 (file)
@@ -1514,6 +1514,13 @@ ArrayList<VariableNode> arglist() :
     }
 }
 
+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.");
+       }
+}
+
 VariableNode mixinArg() :
 {
     String name;
@@ -1522,7 +1529,16 @@ VariableNode mixinArg() :
     LexicalUnitImpl prev = null;
 }
 {
-    name=variableName() (":" (<S>)* first=term(null){ prev = first; } (LOOKAHEAD(2)(< COMMA >(< S >)*)?next=term(prev){prev.setNextLexicalUnit(next); prev = next;})* )?
+    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;
+       
+    })* )?
     {
         VariableNode arg = new VariableNode(name, first, false);
         return arg;
@@ -1537,9 +1553,9 @@ ArrayList<LexicalUnitImpl> argValuelist() :
     LexicalUnitImpl prev = null;
 }
 {
-    first = term(null) { args.add(first); prev = first;}(next=term(prev){prev.setNextLexicalUnit(next); prev = next;})*
+    first = term(null) { args.add(first); prev = first;}((< COLON > (< S >)*)?next=term(prev){prev.setNextLexicalUnit(next); prev = next;})*
     ( <COMMA> (<S>)*
-    first = term(null) { args.add(first); prev = first;}(next=term(prev){prev.setNextLexicalUnit(next); prev = next;})*
+    first = term(null) { args.add(first); prev = first;}((< COLON > (< S >)*)?next=term(prev){prev.setNextLexicalUnit(next); prev = next;})*
     )* 
     {return args;}
 }
index bf1fb65ae3bc507b1f0c9cd5291dc43c8429b570..fecc717437838eff2d02f28e08296c8a237c6b8c 100644 (file)
@@ -25,6 +25,7 @@ import com.vaadin.sass.tree.IVariableNode;
 import com.vaadin.sass.tree.MixinDefNode;
 import com.vaadin.sass.tree.MixinNode;
 import com.vaadin.sass.tree.Node;
+import com.vaadin.sass.tree.VariableNode;
 import com.vaadin.sass.util.DeepCopy;
 
 public class MixinVisitor implements Visitor {
@@ -78,12 +79,7 @@ public class MixinVisitor implements Visitor {
 
             MixinDefNode defClone = (MixinDefNode) DeepCopy.copy(mixinDef);
 
-            int i = 0;
-            for (final LexicalUnitImpl unit : mixinNode.getArglist()) {
-                defClone.getArglist().get(i)
-                        .setExpr((LexicalUnitImpl) DeepCopy.copy(unit));
-                i++;
-            }
+            replacePossibleArguments(mixinNode, defClone);
 
             Node previous = mixinNode;
             for (final Node child : defClone.getChildren()) {
@@ -102,6 +98,48 @@ public class MixinVisitor implements Visitor {
         current.removeChild(mixinNode);
     }
 
+    /**
+     * We have to replace all the mixin parameters. This is done in two phases.
+     * First phase replaces all the named parameters while the second replaces
+     * in order of remaining unmodified parameters.
+     * 
+     * @param mixinNode
+     * @param def
+     */
+    private void replacePossibleArguments(MixinNode mixinNode, MixinDefNode def) {
+
+        if (mixinNode.getArglist().size() > 0) {
+            ArrayList<VariableNode> remainingNodes = new ArrayList<VariableNode>(
+                    def.getArglist());
+            ArrayList<LexicalUnitImpl> remainingUnits = new ArrayList<LexicalUnitImpl>(
+                    mixinNode.getArglist());
+
+            for (final LexicalUnitImpl unit : mixinNode.getArglist()) {
+                if (unit.getLexicalUnitType() == LexicalUnitImpl.SCSS_VARIABLE
+                        && unit.getNextLexicalUnit() != null) {
+                    for (final VariableNode node : def.getArglist()) {
+                        if (node.getName().equals(unit.getValue().toString())) {
+                            node.setExpr((LexicalUnitImpl) DeepCopy.copy(unit
+                                    .getNextLexicalUnit()));
+                            remainingNodes.remove(node);
+                            remainingUnits.remove(unit);
+                            break;
+                        }
+                    }
+                }
+            }
+
+            int i = 0;
+            for (final LexicalUnitImpl unit : remainingUnits) {
+                remainingNodes.get(i).setExpr(
+                        (LexicalUnitImpl) DeepCopy.copy(unit));
+                i++;
+            }
+
+        }
+
+    }
+
     private void replaceChildVariables(MixinDefNode mixinDef, Node node) {
         for (final Node child : node.getChildren()) {
             replaceChildVariables(mixinDef, child);
index a1ba5b12591ef27def94c49eb48fbafcf7143a54..9bb9c95efaa9a0a7d577bbecff17333a1f1fbeaa 100644 (file)
@@ -22,6 +22,7 @@
 
 .banner {
        border: 1px solid black;
+       font-color: red;
 }
 
 .interpolation-test {
index 5ae7dc8faa1ea44f031121efa056c31031ca572f..32d8250fe865dc88be7a2294ac2683ed3d73e511 100644 (file)
@@ -55,11 +55,12 @@ $mixinVar : 1px;
 }
 
 .banner {
-       @include fontType(1px solid black);
+       @include fontType(1px solid black, $color : red);
 }
 
-@mixin fontType($border){
+@mixin fontType($border, $color : black){
        border : $border;
+       font-color: $color;
 }
 
 @include interpolation(interpolation);