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