Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: com/steadystate/css/parser/SACParser.java


1   /* Generated By:JavaCC: Do not edit this line. SACParser.java */
2   package com.steadystate.css.parser;
3   
4   import java.io.*;
5   import java.net.*;
6   import java.util.*;
7   import org.w3c.css.sac.*;
8   import com.steadystate.css.parser.selectors.*;
9   
10  /**
11   * @author David Schweinsberg
12   * @version $Release$
13   */
14  public class SACParser implements Parser, SACParserConstants {
15  
16      private InputSource _source = null;
17      private Locale _locale = null;
18      private DocumentHandler _docHandler = null;
19      private ErrorHandler _errHandler = null;
20      private SelectorFactory _selectorFactory = new SelectorFactoryImpl();
21      private ConditionFactory _conditionFactory = new ConditionFactoryImpl();
22      private boolean _quiet = true;
23  
24      public SACParser() {
25          this((CharStream) null);
26      }
27  
28      public void setLocale(Locale locale) throws CSSException {
29          _locale = locale;
30  
31          // TODO: Search for requested locale
32  
33          throw new CSSException(CSSException.SAC_NOT_SUPPORTED_ERR);
34      }
35  
36      public void setDocumentHandler(DocumentHandler handler) {
37          _docHandler = handler;
38      }
39  
40      public void setSelectorFactory(SelectorFactory selectorFactory) {
41          _selectorFactory = selectorFactory;
42      }
43  
44      public void setConditionFactory(ConditionFactory conditionFactory) {
45          _conditionFactory = conditionFactory;
46      }
47  
48      public void setErrorHandler(ErrorHandler handler) {
49          _errHandler = handler;
50      }
51  
52      public void parseStyleSheet(InputSource source)
53              throws CSSException, IOException {
54          _source = source;
55          ReInit(getCharStream(source));
56          try {
57              styleSheet();
58          } catch (ParseException e) {
59              throw new CSSException(CSSException.SAC_SYNTAX_ERR, e.getMessage(), e);
60          }
61      }
62  
63      public void parseStyleSheet(String uri) throws CSSException, IOException {
64          parseStyleSheet(new InputSource(uri));
65      }
66  
67      public void parseStyleDeclaration(InputSource source)
68              throws CSSException, IOException {
69          _source = source;
70          ReInit(getCharStream(source));
71          try {
72              styleDeclaration();
73          } catch (ParseException e) {
74              throw new CSSException(CSSException.SAC_SYNTAX_ERR, e.getMessage(), e);
75          }
76      }
77  
78      public void parseRule(InputSource source) throws CSSException, IOException {
79          _source = source;
80          ReInit(getCharStream(source));
81          try {
82              styleSheetRuleSingle();
83          } catch (ParseException e) {
84              throw new CSSException(CSSException.SAC_SYNTAX_ERR, e.getMessage(), e);
85          }
86      }
87  
88      public String getParserVersion() {
89          return "http://www.w3.org/TR/REC-CSS2";
90      }
91  
92      public SelectorList parseSelectors(InputSource source)
93              throws CSSException, IOException {
94          _source = source;
95          ReInit(getCharStream(source));
96          SelectorList sl = null;
97          try {
98              sl = selectorList();
99          } catch (ParseException e) {
100             throw new CSSException(CSSException.SAC_SYNTAX_ERR, e.getMessage(), e);
101         }
102         return sl;
103     }
104 
105     public LexicalUnit parsePropertyValue(InputSource source)
106             throws CSSException, IOException {
107         _source = source;
108         ReInit(getCharStream(source));
109         LexicalUnit lu = null;
110         try {
111             lu = expr();
112         } catch (ParseException e) {
113             throw new CSSException(CSSException.SAC_SYNTAX_ERR, e.getMessage(), e);
114         }
115         return lu;
116     }
117 
118     public boolean parsePriority(InputSource source)
119             throws CSSException, IOException {
120         _source = source;
121         ReInit(getCharStream(source));
122         boolean b = false;
123         try {
124             b = prio();
125         } catch (ParseException e) {
126             throw new CSSException(CSSException.SAC_SYNTAX_ERR, e.getMessage(), e);
127         }
128         return b;
129     }
130 
131     private CharStream getCharStream(InputSource source)
132             throws CSSException, IOException {
133         if (source.getCharacterStream() != null) {
134                 return new ASCII_CharStream(source.getCharacterStream(), 1, 1);
135             } else {
136 
137             // TODO: Handle other sources
138             return null;
139         }
140     }
141 
142     private Locator getLocator() {
143         return null;
144     }
145 
146 //
147 // stylesheet
148 //  : [ CHARSET_SYM S* STRING S* ';' ]?
149 //      [S|CDO|CDC]* [ import [S|CDO|CDC]* ]*
150 //      [ [ ruleset | media | page | font_face ] [S|CDO|CDC]* ]*
151 //  ;
152 //
153   final public void styleSheet() throws ParseException {
154     try {
155           _docHandler.startDocument(_source);
156       styleSheetRuleList();
157       jj_consume_token(0);
158     } finally {
159         _docHandler.endDocument(_source);
160     }
161   }
162 
163   final public void styleSheetRuleList() throws ParseException {
164     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
165     case CHARSET_SYM:
166       charsetRule();
167       break;
168     default:
169       jj_la1[0] = jj_gen;
170       ;
171     }
172     label_1:
173     while (true) {
174       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
175       case S:
176       case CDO:
177       case CDC:
178         ;
179         break;
180       default:
181         jj_la1[1] = jj_gen;
182         break label_1;
183       }
184       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
185       case S:
186         jj_consume_token(S);
187         break;
188       case CDO:
189         jj_consume_token(CDO);
190         break;
191       case CDC:
192         jj_consume_token(CDC);
193         break;
194       default:
195         jj_la1[2] = jj_gen;
196         jj_consume_token(-1);
197         throw new ParseException();
198       }
199     }
200     label_2:
201     while (true) {
202       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
203       case IMPORT_SYM:
204         ;
205         break;
206       default:
207         jj_la1[3] = jj_gen;
208         break label_2;
209       }
210       importRule();
211       label_3:
212       while (true) {
213         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
214         case S:
215         case CDO:
216         case CDC:
217           ;
218           break;
219         default:
220           jj_la1[4] = jj_gen;
221           break label_3;
222         }
223         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
224         case S:
225           jj_consume_token(S);
226           break;
227         case CDO:
228           jj_consume_token(CDO);
229           break;
230         case CDC:
231           jj_consume_token(CDC);
232           break;
233         default:
234           jj_la1[5] = jj_gen;
235           jj_consume_token(-1);
236           throw new ParseException();
237         }
238       }
239     }
240     label_4:
241     while (true) {
242       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
243       case DOT:
244       case COLON:
245       case ASTERISK:
246       case LSQUARE:
247       case HASH:
248       case PAGE_SYM:
249       case MEDIA_SYM:
250       case FONT_FACE_SYM:
251       case ATKEYWORD:
252       case IDENT:
253         ;
254         break;
255       default:
256         jj_la1[6] = jj_gen;
257         break label_4;
258       }
259       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
260       case DOT:
261       case COLON:
262       case ASTERISK:
263       case LSQUARE:
264       case HASH:
265       case IDENT:
266         styleRule();
267         break;
268       case MEDIA_SYM:
269         mediaRule();
270         break;
271       case PAGE_SYM:
272         pageRule();
273         break;
274       case FONT_FACE_SYM:
275         fontFaceRule();
276         break;
277       case ATKEYWORD:
278         unknownRule();
279         break;
280       default:
281         jj_la1[7] = jj_gen;
282         jj_consume_token(-1);
283         throw new ParseException();
284       }
285       label_5:
286       while (true) {
287         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
288         case S:
289         case CDO:
290         case CDC:
291           ;
292           break;
293         default:
294           jj_la1[8] = jj_gen;
295           break label_5;
296         }
297         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
298         case S:
299           jj_consume_token(S);
300           break;
301         case CDO:
302           jj_consume_token(CDO);
303           break;
304         case CDC:
305           jj_consume_token(CDC);
306           break;
307         default:
308           jj_la1[9] = jj_gen;
309           jj_consume_token(-1);
310           throw new ParseException();
311         }
312       }
313     }
314   }
315 
316 //
317 // This is used by ASTStyleSheet.insertRule to parse a single rule
318 //
319   final public void styleSheetRuleSingle() throws ParseException {
320     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
321     case CHARSET_SYM:
322       charsetRule();
323       break;
324     case IMPORT_SYM:
325       importRule();
326       break;
327     case DOT:
328     case COLON:
329     case ASTERISK:
330     case LSQUARE:
331     case HASH:
332     case IDENT:
333       styleRule();
334       break;
335     case MEDIA_SYM:
336       mediaRule();
337       break;
338     case PAGE_SYM:
339       pageRule();
340       break;
341     case FONT_FACE_SYM:
342       fontFaceRule();
343       break;
344     case ATKEYWORD:
345       unknownRule();
346       break;
347     default:
348       jj_la1[10] = jj_gen;
349       jj_consume_token(-1);
350       throw new ParseException();
351     }
352   }
353 
354   final public void charsetRule() throws ParseException {
355   Token t;
356     jj_consume_token(CHARSET_SYM);
357     label_6:
358     while (true) {
359       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
360       case S:
361         ;
362         break;
363       default:
364         jj_la1[11] = jj_gen;
365         break label_6;
366       }
367       jj_consume_token(S);
368     }
369     t = jj_consume_token(STRING);
370     label_7:
371     while (true) {
372       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
373       case S:
374         ;
375         break;
376       default:
377         jj_la1[12] = jj_gen;
378         break label_7;
379       }
380       jj_consume_token(S);
381     }
382     jj_consume_token(SEMICOLON);
383   }
384 
385   final public void unknownRule() throws ParseException {
386     Token t;
387     String s;
388     t = jj_consume_token(ATKEYWORD);
389         s = skip();
390         _docHandler.ignorableAtRule(s);
391   }
392 
393 //
394 // import
395 //   : IMPORT_SYM S*
396 //     [STRING|URI] S* [ medium [ ',' S* medium]* ]? ';' S*
397 //   ;
398 //
399   final public void importRule() throws ParseException {
400     Token t;
401     String s;
402     SACMediaListImpl ml = new SACMediaListImpl();
403     jj_consume_token(IMPORT_SYM);
404     label_8:
405     while (true) {
406       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
407       case S:
408         ;
409         break;
410       default:
411         jj_la1[13] = jj_gen;
412         break label_8;
413       }
414       jj_consume_token(S);
415     }
416     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
417     case STRING:
418       t = jj_consume_token(STRING);
419       break;
420     case URI:
421       t = jj_consume_token(URI);
422       break;
423     default:
424       jj_la1[14] = jj_gen;
425       jj_consume_token(-1);
426       throw new ParseException();
427     }
428     label_9:
429     while (true) {
430       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
431       case S:
432         ;
433         break;
434       default:
435         jj_la1[15] = jj_gen;
436         break label_9;
437       }
438       jj_consume_token(S);
439     }
440     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
441     case IDENT:
442       mediaList(ml);
443       break;
444     default:
445       jj_la1[16] = jj_gen;
446       ;
447     }
448     jj_consume_token(SEMICOLON);
449         _docHandler.importStyle(unescape(t.image), ml, null);
450   }
451 
452 //
453 // media
454 //   : MEDIA_SYM S* medium [ ',' S* medium ]* '{' S* ruleset* '}' S*
455 //   ;
456 //
457   final public void mediaRule() throws ParseException {
458     boolean start = false;
459     SACMediaListImpl ml = new SACMediaListImpl();
460     try {
461       jj_consume_token(MEDIA_SYM);
462       label_10:
463       while (true) {
464         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
465         case S:
466           ;
467           break;
468         default:
469           jj_la1[17] = jj_gen;
470           break label_10;
471         }
472         jj_consume_token(S);
473       }
474       mediaList(ml);
475             start = true;
476             _docHandler.startMedia(ml);
477       jj_consume_token(LBRACE);
478       label_11:
479       while (true) {
480         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
481         case S:
482           ;
483           break;
484         default:
485           jj_la1[18] = jj_gen;
486           break label_11;
487         }
488         jj_consume_token(S);
489       }
490       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
491       case DOT:
492       case COLON:
493       case ASTERISK:
494       case LSQUARE:
495       case HASH:
496       case PAGE_SYM:
497       case ATKEYWORD:
498       case IDENT:
499         mediaRuleList();
500         break;
501       default:
502         jj_la1[19] = jj_gen;
503         ;
504       }
505       jj_consume_token(RBRACE);
506     } finally {
507         if (start) {
508             _docHandler.endMedia(ml);
509         }
510     }
511   }
512 
513   final public void mediaList(SACMediaListImpl ml) throws ParseException {
514     String s;
515     s = medium();
516     label_12:
517     while (true) {
518       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
519       case COMMA:
520         ;
521         break;
522       default:
523         jj_la1[20] = jj_gen;
524         break label_12;
525       }
526       jj_consume_token(COMMA);
527       label_13:
528       while (true) {
529         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
530         case S:
531           ;
532           break;
533         default:
534           jj_la1[21] = jj_gen;
535           break label_13;
536         }
537         jj_consume_token(S);
538       }
539                          ml.add(s);
540       s = medium();
541     }
542       ml.add(s);
543   }
544 
545   final public void mediaRuleList() throws ParseException {
546     label_14:
547     while (true) {
548       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
549       case DOT:
550       case COLON:
551       case ASTERISK:
552       case LSQUARE:
553       case HASH:
554       case IDENT:
555         styleRule();
556         break;
557       case PAGE_SYM:
558         pageRule();
559         break;
560       case ATKEYWORD:
561         unknownRule();
562         break;
563       default:
564         jj_la1[22] = jj_gen;
565         jj_consume_token(-1);
566         throw new ParseException();
567       }
568       label_15:
569       while (true) {
570         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
571         case S:
572           ;
573           break;
574         default:
575           jj_la1[23] = jj_gen;
576           break label_15;
577         }
578         jj_consume_token(S);
579       }
580       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
581       case DOT:
582       case COLON:
583       case ASTERISK:
584       case LSQUARE:
585       case HASH:
586       case PAGE_SYM:
587       case ATKEYWORD:
588       case IDENT:
589         ;
590         break;
591       default:
592         jj_la1[24] = jj_gen;
593         break label_14;
594       }
595     }
596   }
597 
598   final public void mediaRuleSingle() throws ParseException {
599     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
600     case DOT:
601     case COLON:
602     case ASTERISK:
603     case LSQUARE:
604     case HASH:
605     case IDENT:
606       styleRule();
607       break;
608     case PAGE_SYM:
609       pageRule();
610       break;
611     case ATKEYWORD:
612       unknownRule();
613       break;
614     default:
615       jj_la1[25] = jj_gen;
616       jj_consume_token(-1);
617       throw new ParseException();
618     }
619   }
620 
621 //
622 // medium
623 //   : IDENT S*
624 //   ;
625 //
626   final public String medium() throws ParseException {
627   Token t;
628     t = jj_consume_token(IDENT);
629     label_16:
630     while (true) {
631       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
632       case S:
633         ;
634         break;
635       default:
636         jj_la1[26] = jj_gen;
637         break label_16;
638       }
639       jj_consume_token(S);
640     }
641                          {if (true) return t.image;}
642     throw new Error("Missing return statement in function");
643   }
644 
645 //
646 // page
647 //   : PAGE_SYM S* IDENT? pseudo_page? S*
648 //     '{' S* declaration [ ';' S* declaration ]* '}' S*
649 //   ;
650 //
651   final public void pageRule() throws ParseException {
652     Token t = null;
653     String s = null;
654     boolean start = false;
655     try {
656       jj_consume_token(PAGE_SYM);
657       label_17:
658       while (true) {
659         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
660         case S:
661           ;
662           break;
663         default:
664           jj_la1[27] = jj_gen;
665           break label_17;
666         }
667         jj_consume_token(S);
668       }
669       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
670       case COLON:
671       case IDENT:
672         if (jj_2_1(2)) {
673           t = jj_consume_token(IDENT);
674           label_18:
675           while (true) {
676             switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
677             case S:
678               ;
679               break;
680             default:
681               jj_la1[28] = jj_gen;
682               break label_18;
683             }
684             jj_consume_token(S);
685           }
686         } else {
687           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
688           case IDENT:
689             t = jj_consume_token(IDENT);
690             s = pseudoPage();
691             label_19:
692             while (true) {
693               switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
694               case S:
695                 ;
696                 break;
697               default:
698                 jj_la1[29] = jj_gen;
699                 break label_19;
700               }
701               jj_consume_token(S);
702             }
703             break;
704           case COLON:
705             s = pseudoPage();
706             label_20:
707             while (true) {
708               switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
709               case S:
710                 ;
711                 break;
712               default:
713                 jj_la1[30] = jj_gen;
714                 break label_20;
715               }
716               jj_consume_token(S);
717             }
718             break;
719           default:
720             jj_la1[31] = jj_gen;
721             jj_consume_token(-1);
722             throw new ParseException();
723           }
724         }
725         break;
726       default:
727         jj_la1[32] = jj_gen;
728         ;
729       }
730       jj_consume_token(LBRACE);
731       label_21:
732       while (true) {
733         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
734         case S:
735           ;
736           break;
737         default:
738           jj_la1[33] = jj_gen;
739           break label_21;
740         }
741         jj_consume_token(S);
742       }
743             start = true;
744             _docHandler.startPage((t != null) ? unescape(t.image) : null, s);
745       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
746       case IDENT:
747         declaration();
748         break;
749       default:
750         jj_la1[34] = jj_gen;
751         ;
752       }
753       label_22:
754       while (true) {
755         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
756         case SEMICOLON:
757           ;
758           break;
759         default:
760           jj_la1[35] = jj_gen;
761           break label_22;
762         }
763         jj_consume_token(SEMICOLON);
764         label_23:
765         while (true) {
766           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
767           case S:
768             ;
769             break;
770           default:
771             jj_la1[36] = jj_gen;
772             break label_23;
773           }
774           jj_consume_token(S);
775         }
776         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
777         case IDENT:
778           declaration();
779           break;
780         default:
781           jj_la1[37] = jj_gen;
782           ;
783         }
784       }
785       jj_consume_token(RBRACE);
786     } finally {
787         if (start) {
788             _docHandler.endPage((t != null) ? unescape(t.image) : null, s);
789         }
790     }
791   }
792 
793 //
794 // pseudoPage
795 //   : ':' IDENT
796 //   ;
797 //
798   final public String pseudoPage() throws ParseException {
799   Token t;
800     jj_consume_token(COLON);
801     t = jj_consume_token(IDENT);
802                         {if (true) return t.image;}
803     throw new Error("Missing return statement in function");
804   }
805 
806 //
807 // font_face
808 //   : FONT_FACE_SYM S*
809 //     '{' S* declaration [ ';' S* declaration ]* '}' S*
810 //   ;
811 //
812   final public void fontFaceRule() throws ParseException {
813     boolean start = false;
814     try {
815       jj_consume_token(FONT_FACE_SYM);
816       label_24:
817       while (true) {
818         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
819         case S:
820           ;
821           break;
822         default:
823           jj_la1[38] = jj_gen;
824           break label_24;
825         }
826         jj_consume_token(S);
827       }
828       jj_consume_token(LBRACE);
829       label_25:
830       while (true) {
831         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
832         case S:
833           ;
834           break;
835         default:
836           jj_la1[39] = jj_gen;
837           break label_25;
838         }
839         jj_consume_token(S);
840       }
841                             start = true; _docHandler.startFontFace();
842       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
843       case IDENT:
844         declaration();
845         break;
846       default:
847         jj_la1[40] = jj_gen;
848         ;
849       }
850       label_26:
851       while (true) {
852         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
853         case SEMICOLON:
854           ;
855           break;
856         default:
857           jj_la1[41] = jj_gen;
858           break label_26;
859         }
860         jj_consume_token(SEMICOLON);
861         label_27:
862         while (true) {
863           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
864           case S:
865             ;
866             break;
867           default:
868             jj_la1[42] = jj_gen;
869             break label_27;
870           }
871           jj_consume_token(S);
872         }
873         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
874         case IDENT:
875           declaration();
876           break;
877         default:
878           jj_la1[43] = jj_gen;
879           ;
880         }
881       }
882       jj_consume_token(RBRACE);
883     } finally {
884         if (start) {
885             _docHandler.endFontFace();
886         }
887     }
888   }
889 
890 //
891 // operator
892 //   : '/' S* | ',' S* |
893 //   ;
894 //
895   final public LexicalUnit operator(LexicalUnit prev) throws ParseException {
896   Token t;
897     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
898     case SLASH:
899       t = jj_consume_token(SLASH);
900       label_28:
901       while (true) {
902         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
903         case S:
904           ;
905           break;
906         default:
907           jj_la1[44] = jj_gen;
908           break label_28;
909         }
910         jj_consume_token(S);
911       }
912                            {if (true) return new LexicalUnitImpl(prev, LexicalUnit.SAC_OPERATOR_SLASH);}
913       break;
914     case COMMA:
915       t = jj_consume_token(COMMA);
916       label_29:
917       while (true) {
918         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
919         case S:
920           ;
921           break;
922         default:
923           jj_la1[45] = jj_gen;
924           break label_29;
925         }
926         jj_consume_token(S);
927       }
928                            {if (true) return new LexicalUnitImpl(prev, LexicalUnit.SAC_OPERATOR_COMMA);}
929       break;
930     default:
931       jj_la1[46] = jj_gen;
932       jj_consume_token(-1);
933       throw new ParseException();
934     }
935     throw new Error("Missing return statement in function");
936   }
937 
938 //
939 // combinator
940 //   : '+' S* | '>' S* |
941 //   ;
942 //
943   final public char combinator() throws ParseException {
944   char c = ' ';
945     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
946     case PLUS:
947       jj_consume_token(PLUS);
948              c='+';
949       label_30:
950       while (true) {
951         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
952         case S:
953           ;
954           break;
955         default:
956           jj_la1[47] = jj_gen;
957           break label_30;
958         }
959         jj_consume_token(S);
960       }
961       break;
962     case GT:
963       jj_consume_token(GT);
964            c='>';
965       label_31:
966       while (true) {
967         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
968         case S:
969           ;
970           break;
971         default:
972           jj_la1[48] = jj_gen;
973           break label_31;
974         }
975         jj_consume_token(S);
976       }
977       break;
978     case S:
979       jj_consume_token(S);
980       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
981       case PLUS:
982       case GT:
983         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
984         case PLUS:
985           jj_consume_token(PLUS);
986                      c='+';
987           break;
988         case GT:
989           jj_consume_token(GT);
990                                        c='>';
991           break;
992         default:
993           jj_la1[49] = jj_gen;
994           jj_consume_token(-1);
995           throw new ParseException();
996         }
997         label_32:
998         while (true) {
999           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1000          case S:
1001            ;
1002            break;
1003          default:
1004            jj_la1[50] = jj_gen;
1005            break label_32;
1006          }
1007          jj_consume_token(S);
1008        }
1009        break;
1010      default:
1011        jj_la1[51] = jj_gen;
1012        ;
1013      }
1014      break;
1015    default:
1016      jj_la1[52] = jj_gen;
1017      jj_consume_token(-1);
1018      throw new ParseException();
1019    }
1020    {if (true) return c;}
1021    throw new Error("Missing return statement in function");
1022  }
1023
1024//
1025// unary_operator
1026//   : '-' | '+'
1027//   ;
1028//
1029  final public char unaryOperator() throws ParseException {
1030    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1031    case MINUS:
1032      jj_consume_token(MINUS);
1033              {if (true) return '-';}
1034      break;
1035    case PLUS:
1036      jj_consume_token(PLUS);
1037                                       {if (true) return '+';}
1038      break;
1039    default:
1040      jj_la1[53] = jj_gen;
1041      jj_consume_token(-1);
1042      throw new ParseException();
1043    }
1044    throw new Error("Missing return statement in function");
1045  }
1046
1047//
1048// property
1049//   : IDENT S*
1050//   ;
1051//
1052  final public String property() throws ParseException {
1053    Token t;
1054    t = jj_consume_token(IDENT);
1055    label_33:
1056    while (true) {
1057      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1058      case S:
1059        ;
1060        break;
1061      default:
1062        jj_la1[54] = jj_gen;
1063        break label_33;
1064      }
1065      jj_consume_token(S);
1066    }
1067      {if (true) return unescape(t.image);}
1068    throw new Error("Missing return statement in function");
1069  }
1070
1071//
1072// ruleset
1073//   : selector [ ',' S* selector ]*
1074//     '{' S* declaration [ ';' S* declaration ]* '}' S*
1075//   ;
1076//
1077  final public void styleRule() throws ParseException {
1078    SelectorList selList = null;
1079    boolean start = false;
1080    boolean noError = true;
1081    try {
1082      selList = selectorList();
1083      jj_consume_token(LBRACE);
1084      label_34:
1085      while (true) {
1086        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1087        case S:
1088          ;
1089          break;
1090        default:
1091          jj_la1[55] = jj_gen;
1092          break label_34;
1093        }
1094        jj_consume_token(S);
1095      }
1096            start = true;
1097            _docHandler.startSelector(selList);
1098      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1099      case IDENT:
1100        declaration();
1101        break;
1102      default:
1103        jj_la1[56] = jj_gen;
1104        ;
1105      }
1106      label_35:
1107      while (true) {
1108        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1109        case SEMICOLON:
1110          ;
1111          break;
1112        default:
1113          jj_la1[57] = jj_gen;
1114          break label_35;
1115        }
1116        jj_consume_token(SEMICOLON);
1117        label_36:
1118        while (true) {
1119          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1120          case S:
1121            ;
1122            break;
1123          default:
1124            jj_la1[58] = jj_gen;
1125            break label_36;
1126          }
1127          jj_consume_token(S);
1128        }
1129        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1130        case IDENT:
1131          declaration();
1132          break;
1133        default:
1134          jj_la1[59] = jj_gen;
1135          ;
1136        }
1137      }
1138      jj_consume_token(RBRACE);
1139    } catch (ParseException e) {
1140//        System.err.println("Exception in styleRule()");
1141//        System.err.println(e.getMessage());
1142        noError = false;
1143        error_skipblock();
1144    } finally {
1145        if (start) {
1146            _docHandler.endSelector(selList);
1147        }
1148    }
1149  }
1150
1151  final public SelectorList selectorList() throws ParseException {
1152    SelectorListImpl selList = new SelectorListImpl();
1153    Selector sel;
1154    try {
1155      sel = selector();
1156      label_37:
1157      while (true) {
1158        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1159        case COMMA:
1160          ;
1161          break;
1162        default:
1163          jj_la1[60] = jj_gen;
1164          break label_37;
1165        }
1166        jj_consume_token(COMMA);
1167        label_38:
1168        while (true) {
1169          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1170          case S:
1171            ;
1172            break;
1173          default:
1174            jj_la1[61] = jj_gen;
1175            break label_38;
1176          }
1177          jj_consume_token(S);
1178        }
1179                             selList.add(sel);
1180        sel = selector();
1181      }
1182            selList.add(sel);
1183            {if (true) return selList;}
1184    } catch (ParseException e) {
1185        System.err.println("Exception in selectorList()");
1186    }
1187    throw new Error("Missing return statement in function");
1188  }
1189
1190//
1191// selector
1192//   : simple_selector [ combinator simple_selector ]*
1193//   ;
1194//
1195  final public Selector selector() throws ParseException {
1196    Selector sel;
1197    char comb;
1198    try {
1199      sel = simpleSelector(null, ' ');
1200      label_39:
1201      while (true) {
1202        if (jj_2_2(2)) {
1203          ;
1204        } else {
1205          break label_39;
1206        }
1207        comb = combinator();
1208        sel = simpleSelector(sel, comb);
1209      }
1210      label_40:
1211      while (true) {
1212        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1213        case S:
1214          ;
1215          break;
1216        default:
1217          jj_la1[62] = jj_gen;
1218          break label_40;
1219        }
1220        jj_consume_token(S);
1221      }
1222            {if (true) return sel;}
1223    } catch (ParseException e) {
1224        skipSelector();
1225    }
1226    throw new Error("Missing return statement in function");
1227  }
1228
1229//
1230// simple_selector
1231//   : element_name? [ HASH | class | attrib | pseudo ]* S*
1232//   ;
1233//
1234  final public Selector simpleSelector(Selector sel, char comb) throws ParseException {
1235    SimpleSelector simpleSel = null;
1236    Condition c = null;
1237    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1238    case ASTERISK:
1239    case IDENT:
1240      simpleSel = elementName();
1241      label_41:
1242      while (true) {
1243        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1244        case DOT:
1245        case COLON:
1246        case LSQUARE:
1247        case HASH:
1248          ;
1249          break;
1250        default:
1251          jj_la1[63] = jj_gen;
1252          break label_41;
1253        }
1254        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1255        case HASH:
1256          c = hash(c);
1257          break;
1258        case DOT:
1259          c = _class(c);
1260          break;
1261        case LSQUARE:
1262          c = attrib(c);
1263          break;
1264        case COLON:
1265          c = pseudo(c);
1266          break;
1267        default:
1268          jj_la1[64] = jj_gen;
1269          jj_consume_token(-1);
1270          throw new ParseException();
1271        }
1272      }
1273      break;
1274    case DOT:
1275    case COLON:
1276    case LSQUARE:
1277    case HASH:
1278            simpleSel = _selectorFactory.createElementSelector(null, null);
1279      label_42:
1280      while (true) {
1281        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1282        case HASH:
1283          c = hash(c);
1284          break;
1285        case DOT:
1286          c = _class(c);
1287          break;
1288        case LSQUARE:
1289          c = attrib(c);
1290          break;
1291        case COLON:
1292          c = pseudo(c);
1293          break;
1294        default:
1295          jj_la1[65] = jj_gen;
1296          jj_consume_token(-1);
1297          throw new ParseException();
1298        }
1299        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1300        case DOT:
1301        case COLON:
1302        case LSQUARE:
1303        case HASH:
1304          ;
1305          break;
1306        default:
1307          jj_la1[66] = jj_gen;
1308          break label_42;
1309        }
1310      }
1311      break;
1312    default:
1313      jj_la1[67] = jj_gen;
1314      jj_consume_token(-1);
1315      throw new ParseException();
1316    }
1317        if (c != null) {
1318            simpleSel = _selectorFactory.createConditionalSelector(simpleSel, c);
1319        }
1320
1321        if (sel != null) {
1322            switch (comb) {
1323            case ' ':
1324                sel = _selectorFactory.createDescendantSelector(sel, simpleSel);
1325                break;
1326            case '+':
1327                sel = _selectorFactory.createDirectAdjacentSelector(sel.getSelectorType(), sel, simpleSel);
1328                break;
1329            case '>':
1330                sel = _selectorFactory.createChildSelector(sel, simpleSel);
1331                break;
1332            }
1333        } else {
1334            sel = simpleSel;
1335        }
1336
1337        {if (true) return sel;}
1338    throw new Error("Missing return statement in function");
1339  }
1340
1341//
1342// class
1343//   : '.' IDENT
1344//   ;
1345//
1346  final public Condition _class(Condition pred) throws ParseException {
1347    Token t;
1348    jj_consume_token(DOT);
1349    t = jj_consume_token(IDENT);
1350        Condition c = _conditionFactory.createClassCondition(null, t.image);
1351        {if (true) return (pred == null) ? c : _conditionFactory.createAndCondition(pred, c);}
1352    throw new Error("Missing return statement in function");
1353  }
1354
1355//
1356// element_name
1357//   : IDENT | '*'
1358//   ;
1359//
1360  final public SimpleSelector elementName() throws ParseException {
1361    Token t;
1362    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1363    case IDENT:
1364      t = jj_consume_token(IDENT);
1365    {if (true) return _selectorFactory.createElementSelector(null, unescape(t.image));}
1366      break;
1367    case ASTERISK:
1368      jj_consume_token(ASTERISK);
1369    {if (true) return _selectorFactory.createElementSelector(null, null);}
1370      break;
1371    default:
1372      jj_la1[68] = jj_gen;
1373      jj_consume_token(-1);
1374      throw new ParseException();
1375    }
1376    throw new Error("Missing return statement in function");
1377  }
1378
1379//
1380// attrib
1381//   : '[' S* IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S*
1382//     [ IDENT | STRING ] S* ]? ']'
1383//   ;
1384//
1385  final public Condition attrib(Condition pred) throws ParseException {
1386    Token t;
1387    String name = null;
1388    String value = null;
1389    int type = 0;
1390    jj_consume_token(LSQUARE);
1391    label_43:
1392    while (true) {
1393      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1394      case S:
1395        ;
1396        break;
1397      default:
1398        jj_la1[69] = jj_gen;
1399        break label_43;
1400      }
1401      jj_consume_token(S);
1402    }
1403    t = jj_consume_token(IDENT);
1404                  name = unescape(t.image);
1405    label_44:
1406    while (true) {
1407      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1408      case S:
1409        ;
1410        break;
1411      default:
1412        jj_la1[70] = jj_gen;
1413        break label_44;
1414      }
1415      jj_consume_token(S);
1416    }
1417    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1418    case EQUALS:
1419    case INCLUDES:
1420    case DASHMATCH:
1421      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1422      case EQUALS:
1423        jj_consume_token(EQUALS);
1424                       type = 1;
1425        break;
1426      case INCLUDES:
1427        jj_consume_token(INCLUDES);
1428                         type = 2;
1429        break;
1430      case DASHMATCH:
1431        jj_consume_token(DASHMATCH);
1432                          type = 3;
1433        break;
1434      default:
1435        jj_la1[71] = jj_gen;
1436        jj_consume_token(-1);
1437        throw new ParseException();
1438      }
1439      label_45:
1440      while (true) {
1441        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1442        case S:
1443          ;
1444          break;
1445        default:
1446          jj_la1[72] = jj_gen;
1447          break label_45;
1448        }
1449        jj_consume_token(S);
1450      }
1451      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1452      case IDENT:
1453        t = jj_consume_token(IDENT);
1454                          value = t.image;
1455        break;
1456      case STRING:
1457        t = jj_consume_token(STRING);
1458                           value = unescape(t.image);
1459        break;
1460      default:
1461        jj_la1[73] = jj_gen;
1462        jj_consume_token(-1);
1463        throw new ParseException();
1464      }
1465      label_46:
1466      while (true) {
1467        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1468        case S:
1469          ;
1470          break;
1471        default:
1472          jj_la1[74] = jj_gen;
1473          break label_46;
1474        }
1475        jj_consume_token(S);
1476      }
1477      break;
1478    default:
1479      jj_la1[75] = jj_gen;
1480      ;
1481    }
1482    jj_consume_token(RSQUARE);
1483        Condition c = null;
1484        switch (type) {
1485        case 0:
1486            c = _conditionFactory.createAttributeCondition(name, null, false, null);
1487            break;
1488        case 1:
1489            c = _conditionFactory.createAttributeCondition(name, null, false, value);
1490            break;
1491        case 2:
1492            c = _conditionFactory.createOneOfAttributeCondition(name, null, false, value);
1493            break;
1494        case 3:
1495            c = _conditionFactory.createBeginHyphenAttributeCondition(name, null, false, value);
1496            break;
1497        }
1498        {if (true) return (pred == null) ? c : _conditionFactory.createAndCondition(pred, c);}
1499    throw new Error("Missing return statement in function");
1500  }
1501
1502//
1503// pseudo
1504//   : ':' [ IDENT | FUNCTION S* IDENT S* ')' ]
1505//   ;
1506//
1507  final public Condition pseudo(Condition pred) throws ParseException {
1508    Condition c;
1509    Token t;
1510    String function;
1511    String arg;
1512    jj_consume_token(COLON);
1513    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1514    case IDENT:
1515      t = jj_consume_token(IDENT);
1516            // There appears to be an issue here regarding "first-letter" & "first-line"
1517            String s = unescape(t.image);
1518                    c = _conditionFactory.createPseudoClassCo