KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > steadystate > css > parser > SACParser


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 JavaDoc 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 JavaDoc 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 SACMediaList parseMedia(InputSource source)
106             throws CSSException, IOException {
107         _source = source;
108         ReInit(getCharStream(source));
109         SACMediaListImpl sml = new SACMediaListImpl();
110         try {
111             mediaList(sml);
112         } catch (ParseException e) {
113             throw new CSSException(CSSException.SAC_SYNTAX_ERR, e.getMessage(), e);
114         }
115         return sml;
116     }
117
118     public LexicalUnit parsePropertyValue(InputSource source)
119             throws CSSException, IOException {
120         _source = source;
121         ReInit(getCharStream(source));
122         LexicalUnit lu = null;
123         try {
124             lu = expr();
125         } catch (ParseException e) {
126             throw new CSSException(CSSException.SAC_SYNTAX_ERR, e.getMessage(), e);
127         }
128         return lu;
129     }
130
131     public boolean parsePriority(InputSource source)
132             throws CSSException, IOException {
133         _source = source;
134         ReInit(getCharStream(source));
135         boolean b = false;
136         try {
137             b = prio();
138         } catch (ParseException e) {
139             throw new CSSException(CSSException.SAC_SYNTAX_ERR, e.getMessage(), e);
140         }
141         return b;
142     }
143
144     private CharStream getCharStream(InputSource source)
145             throws CSSException, IOException {
146         if (source.getCharacterStream() != null) {
147                 return new ASCII_CharStream(source.getCharacterStream(), 1, 1);
148             } else {
149
150             // TODO: Handle other sources
151
return null;
152         }
153     }
154
155     private Locator getLocator() {
156         return null;
157     }
158
159 //
160
// stylesheet
161
// : [ CHARSET_SYM S* STRING S* ';' ]?
162
// [S|CDO|CDC]* [ import [S|CDO|CDC]* ]*
163
// [ [ ruleset | media | page | font_face ] [S|CDO|CDC]* ]*
164
// ;
165
//
166
final public void styleSheet() throws ParseException {
167     try {
168           _docHandler.startDocument(_source);
169       styleSheetRuleList();
170       jj_consume_token(0);
171     } finally {
172         _docHandler.endDocument(_source);
173     }
174   }
175
176   final public void styleSheetRuleList() throws ParseException {
177     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
178     case CHARSET_SYM:
179       charsetRule();
180       break;
181     default:
182       jj_la1[0] = jj_gen;
183       ;
184     }
185     label_1:
186     while (true) {
187       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
188       case S:
189       case CDO:
190       case CDC:
191         ;
192         break;
193       default:
194         jj_la1[1] = jj_gen;
195         break label_1;
196       }
197       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
198       case S:
199         jj_consume_token(S);
200         break;
201       case CDO:
202         jj_consume_token(CDO);
203         break;
204       case CDC:
205         jj_consume_token(CDC);
206         break;
207       default:
208         jj_la1[2] = jj_gen;
209         jj_consume_token(-1);
210         throw new ParseException();
211       }
212     }
213     label_2:
214     while (true) {
215       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
216       case IMPORT_SYM:
217         ;
218         break;
219       default:
220         jj_la1[3] = jj_gen;
221         break label_2;
222       }
223       importRule();
224       label_3:
225       while (true) {
226         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
227         case S:
228         case CDO:
229         case CDC:
230           ;
231           break;
232         default:
233           jj_la1[4] = jj_gen;
234           break label_3;
235         }
236         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
237         case S:
238           jj_consume_token(S);
239           break;
240         case CDO:
241           jj_consume_token(CDO);
242           break;
243         case CDC:
244           jj_consume_token(CDC);
245           break;
246         default:
247           jj_la1[5] = jj_gen;
248           jj_consume_token(-1);
249           throw new ParseException();
250         }
251       }
252     }
253     label_4:
254     while (true) {
255       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
256       case DOT:
257       case COLON:
258       case ASTERISK:
259       case LSQUARE:
260       case HASH:
261       case PAGE_SYM:
262       case MEDIA_SYM:
263       case FONT_FACE_SYM:
264       case ATKEYWORD:
265       case IDENT:
266         ;
267         break;
268       default:
269         jj_la1[6] = jj_gen;
270         break label_4;
271       }
272       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
273       case DOT:
274       case COLON:
275       case ASTERISK:
276       case LSQUARE:
277       case HASH:
278       case IDENT:
279         styleRule();
280         break;
281       case MEDIA_SYM:
282         mediaRule();
283         break;
284       case PAGE_SYM:
285         pageRule();
286         break;
287       case FONT_FACE_SYM:
288         fontFaceRule();
289         break;
290       case ATKEYWORD:
291         unknownRule();
292         break;
293       default:
294         jj_la1[7] = jj_gen;
295         jj_consume_token(-1);
296         throw new ParseException();
297       }
298       label_5:
299       while (true) {
300         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
301         case S:
302         case CDO:
303         case CDC:
304           ;
305           break;
306         default:
307           jj_la1[8] = jj_gen;
308           break label_5;
309         }
310         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
311         case S:
312           jj_consume_token(S);
313           break;
314         case CDO:
315           jj_consume_token(CDO);
316           break;
317         case CDC:
318           jj_consume_token(CDC);
319           break;
320         default:
321           jj_la1[9] = jj_gen;
322           jj_consume_token(-1);
323           throw new ParseException();
324         }
325       }
326     }
327   }
328
329 //
330
// This is used by ASTStyleSheet.insertRule to parse a single rule
331
//
332
final public void styleSheetRuleSingle() throws ParseException {
333     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
334     case CHARSET_SYM:
335       charsetRule();
336       break;
337     case IMPORT_SYM:
338       importRule();
339       break;
340     case DOT:
341     case COLON:
342     case ASTERISK:
343     case LSQUARE:
344     case HASH:
345     case IDENT:
346       styleRule();
347       break;
348     case MEDIA_SYM:
349       mediaRule();
350       break;
351     case PAGE_SYM:
352       pageRule();
353       break;
354     case FONT_FACE_SYM:
355       fontFaceRule();
356       break;
357     case ATKEYWORD:
358       unknownRule();
359       break;
360     default:
361       jj_la1[10] = jj_gen;
362       jj_consume_token(-1);
363       throw new ParseException();
364     }
365   }
366
367   final public void charsetRule() throws ParseException {
368   Token t;
369     jj_consume_token(CHARSET_SYM);
370     label_6:
371     while (true) {
372       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
373       case S:
374         ;
375         break;
376       default:
377         jj_la1[11] = jj_gen;
378         break label_6;
379       }
380       jj_consume_token(S);
381     }
382     t = jj_consume_token(STRING);
383     label_7:
384     while (true) {
385       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
386       case S:
387         ;
388         break;
389       default:
390         jj_la1[12] = jj_gen;
391         break label_7;
392       }
393       jj_consume_token(S);
394     }
395     jj_consume_token(SEMICOLON);
396   }
397
398   final public void unknownRule() throws ParseException {
399     Token t;
400     String JavaDoc s;
401     t = jj_consume_token(ATKEYWORD);
402         s = skip();
403         _docHandler.ignorableAtRule(s);
404   }
405
406 //
407
// import
408
// : IMPORT_SYM S*
409
// [STRING|URI] S* [ medium [ ',' S* medium]* ]? ';' S*
410
// ;
411
//
412
final public void importRule() throws ParseException {
413     Token t;
414     String JavaDoc s;
415     SACMediaListImpl ml = new SACMediaListImpl();
416     jj_consume_token(IMPORT_SYM);
417     label_8:
418     while (true) {
419       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
420       case S:
421         ;
422         break;
423       default:
424         jj_la1[13] = jj_gen;
425         break label_8;
426       }
427       jj_consume_token(S);
428     }
429     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
430     case STRING:
431       t = jj_consume_token(STRING);
432       break;
433     case URI:
434       t = jj_consume_token(URI);
435       break;
436     default:
437       jj_la1[14] = jj_gen;
438       jj_consume_token(-1);
439       throw new ParseException();
440     }
441     label_9:
442     while (true) {
443       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
444       case S:
445         ;
446         break;
447       default:
448         jj_la1[15] = jj_gen;
449         break label_9;
450       }
451       jj_consume_token(S);
452     }
453     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
454     case IDENT:
455       mediaList(ml);
456       break;
457     default:
458       jj_la1[16] = jj_gen;
459       ;
460     }
461     jj_consume_token(SEMICOLON);
462         _docHandler.importStyle(unescape(t.image), ml, null);
463   }
464
465 //
466
// media
467
// : MEDIA_SYM S* medium [ ',' S* medium ]* '{' S* ruleset* '}' S*
468
// ;
469
//
470
final public void mediaRule() throws ParseException {
471     boolean start = false;
472     SACMediaListImpl ml = new SACMediaListImpl();
473     try {
474       jj_consume_token(MEDIA_SYM);
475       label_10:
476       while (true) {
477         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
478         case S:
479           ;
480           break;
481         default:
482           jj_la1[17] = jj_gen;
483           break label_10;
484         }
485         jj_consume_token(S);
486       }
487       mediaList(ml);
488             start = true;
489             _docHandler.startMedia(ml);
490       jj_consume_token(LBRACE);
491       label_11:
492       while (true) {
493         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
494         case S:
495           ;
496           break;
497         default:
498           jj_la1[18] = jj_gen;
499           break label_11;
500         }
501         jj_consume_token(S);
502       }
503       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
504       case DOT:
505       case COLON:
506       case ASTERISK:
507       case LSQUARE:
508       case HASH:
509       case PAGE_SYM:
510       case ATKEYWORD:
511       case IDENT:
512         mediaRuleList();
513         break;
514       default:
515         jj_la1[19] = jj_gen;
516         ;
517       }
518       jj_consume_token(RBRACE);
519     } finally {
520         if (start) {
521             _docHandler.endMedia(ml);
522         }
523     }
524   }
525
526   final public void mediaList(SACMediaListImpl ml) throws ParseException {
527     String JavaDoc s;
528     s = medium();
529     label_12:
530     while (true) {
531       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
532       case COMMA:
533         ;
534         break;
535       default:
536         jj_la1[20] = jj_gen;
537         break label_12;
538       }
539       jj_consume_token(COMMA);
540       label_13:
541       while (true) {
542         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
543         case S:
544           ;
545           break;
546         default:
547           jj_la1[21] = jj_gen;
548           break label_13;
549         }
550         jj_consume_token(S);
551       }
552                          ml.add(s);
553       s = medium();
554     }
555       ml.add(s);
556   }
557
558   final public void mediaRuleList() throws ParseException {
559     label_14:
560     while (true) {
561       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
562       case DOT:
563       case COLON:
564       case ASTERISK:
565       case LSQUARE:
566       case HASH:
567       case IDENT:
568         styleRule();
569         break;
570       case PAGE_SYM:
571         pageRule();
572         break;
573       case ATKEYWORD:
574         unknownRule();
575         break;
576       default:
577         jj_la1[22] = jj_gen;
578         jj_consume_token(-1);
579         throw new ParseException();
580       }
581       label_15:
582       while (true) {
583         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
584         case S:
585           ;
586           break;
587         default:
588           jj_la1[23] = jj_gen;
589           break label_15;
590         }
591         jj_consume_token(S);
592       }
593       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
594       case DOT:
595       case COLON:
596       case ASTERISK:
597       case LSQUARE:
598       case HASH:
599       case PAGE_SYM:
600       case ATKEYWORD:
601       case IDENT:
602         ;
603         break;
604       default:
605         jj_la1[24] = jj_gen;
606         break label_14;
607       }
608     }
609   }
610
611   final public void mediaRuleSingle() throws ParseException {
612     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
613     case DOT:
614     case COLON:
615     case ASTERISK:
616     case LSQUARE:
617     case HASH:
618     case IDENT:
619       styleRule();
620       break;
621     case PAGE_SYM:
622       pageRule();
623       break;
624     case ATKEYWORD:
625       unknownRule();
626       break;
627     default:
628       jj_la1[25] = jj_gen;
629       jj_consume_token(-1);
630       throw new ParseException();
631     }
632   }
633
634 //
635
// medium
636
// : IDENT S*
637
// ;
638
//
639
final public String JavaDoc medium() throws ParseException {
640   Token t;
641     t = jj_consume_token(IDENT);
642     label_16:
643     while (true) {
644       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
645       case S:
646         ;
647         break;
648       default:
649         jj_la1[26] = jj_gen;
650         break label_16;
651       }
652       jj_consume_token(S);
653     }
654                          {if (true) return t.image;}
655     throw new Error JavaDoc("Missing return statement in function");
656   }
657
658 //
659
// page
660
// : PAGE_SYM S* IDENT? pseudo_page? S*
661
// '{' S* declaration [ ';' S* declaration ]* '}' S*
662
// ;
663
//
664
final public void pageRule() throws ParseException {
665     Token t = null;
666     String JavaDoc s = null;
667     boolean start = false;
668     try {
669       jj_consume_token(PAGE_SYM);
670       label_17:
671       while (true) {
672         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
673         case S:
674           ;
675           break;
676         default:
677           jj_la1[27] = jj_gen;
678           break label_17;
679         }
680         jj_consume_token(S);
681       }
682       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
683       case COLON:
684       case IDENT:
685         if (jj_2_1(2)) {
686           t = jj_consume_token(IDENT);
687           label_18:
688           while (true) {
689             switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
690             case S:
691               ;
692               break;
693             default:
694               jj_la1[28] = jj_gen;
695               break label_18;
696             }
697             jj_consume_token(S);
698           }
699         } else {
700           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
701           case IDENT:
702             t = jj_consume_token(IDENT);
703             s = pseudoPage();
704             label_19:
705             while (true) {
706               switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
707               case S:
708                 ;
709                 break;
710               default:
711                 jj_la1[29] = jj_gen;
712                 break label_19;
713               }
714               jj_consume_token(S);
715             }
716             break;
717           case COLON:
718             s = pseudoPage();
719             label_20:
720             while (true) {
721               switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
722               case S:
723                 ;
724                 break;
725               default:
726                 jj_la1[30] = jj_gen;
727                 break label_20;
728               }
729               jj_consume_token(S);
730             }
731             break;
732           default:
733             jj_la1[31] = jj_gen;
734             jj_consume_token(-1);
735             throw new ParseException();
736           }
737         }
738         break;
739       default:
740         jj_la1[32] = jj_gen;
741         ;
742       }
743       jj_consume_token(LBRACE);
744       label_21:
745       while (true) {
746         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
747         case S:
748           ;
749           break;
750         default:
751           jj_la1[33] = jj_gen;
752           break label_21;
753         }
754         jj_consume_token(S);
755       }
756             start = true;
757             _docHandler.startPage((t != null) ? unescape(t.image) : null, s);
758       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
759       case IDENT:
760         declaration();
761         break;
762       default:
763         jj_la1[34] = jj_gen;
764         ;
765       }
766       label_22:
767       while (true) {
768         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
769         case SEMICOLON:
770           ;
771           break;
772         default:
773           jj_la1[35] = jj_gen;
774           break label_22;
775         }
776         jj_consume_token(SEMICOLON);
777         label_23:
778         while (true) {
779           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
780           case S:
781             ;
782             break;
783           default:
784             jj_la1[36] = jj_gen;
785             break label_23;
786           }
787           jj_consume_token(S);
788         }
789         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
790         case IDENT:
791           declaration();
792           break;
793         default:
794           jj_la1[37] = jj_gen;
795           ;
796         }
797       }
798       jj_consume_token(RBRACE);
799     } finally {
800         if (start) {
801             _docHandler.endPage((t != null) ? unescape(t.image) : null, s);
802         }
803     }
804   }
805
806 //
807
// pseudoPage
808
// : ':' IDENT
809
// ;
810
//
811
final public String JavaDoc pseudoPage() throws ParseException {
812   Token t;
813     jj_consume_token(COLON);
814     t = jj_consume_token(IDENT);
815                         {if (true) return t.image;}
816     throw new Error JavaDoc("Missing return statement in function");
817   }
818
819 //
820
// font_face
821
// : FONT_FACE_SYM S*
822
// '{' S* declaration [ ';' S* declaration ]* '}' S*
823
// ;
824
//
825
final public void fontFaceRule() throws ParseException {
826     boolean start = false;
827     try {
828       jj_consume_token(FONT_FACE_SYM);
829       label_24:
830       while (true) {
831         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
832         case S:
833           ;
834           break;
835         default:
836           jj_la1[38] = jj_gen;
837           break label_24;
838         }
839         jj_consume_token(S);
840       }
841       jj_consume_token(LBRACE);
842       label_25:
843       while (true) {
844         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
845         case S:
846           ;
847           break;
848         default:
849           jj_la1[39] = jj_gen;
850           break label_25;
851         }
852         jj_consume_token(S);
853       }
854                             start = true; _docHandler.startFontFace();
855       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
856       case IDENT:
857         declaration();
858         break;
859       default:
860         jj_la1[40] = jj_gen;
861         ;
862       }
863       label_26:
864       while (true) {
865         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
866         case SEMICOLON:
867           ;
868           break;
869         default:
870           jj_la1[41] = jj_gen;
871           break label_26;
872         }
873         jj_consume_token(SEMICOLON);
874         label_27:
875         while (true) {
876           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
877           case S:
878             ;
879             break;
880           default:
881             jj_la1[42] = jj_gen;
882             break label_27;
883           }
884           jj_consume_token(S);
885         }
886         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
887         case IDENT:
888           declaration();
889           break;
890         default:
891           jj_la1[43] = jj_gen;
892           ;
893         }
894       }
895       jj_consume_token(RBRACE);
896     } finally {
897         if (start) {
898             _docHandler.endFontFace();
899         }
900     }
901   }
902
903 //
904
// operator
905
// : '/' S* | ',' S* |
906
// ;
907
//
908
final public LexicalUnit operator(LexicalUnit prev) throws ParseException {
909   Token t;
910     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
911     case SLASH:
912       t = jj_consume_token(SLASH);
913       label_28:
914       while (true) {
915         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
916         case S:
917           ;
918           break;
919         default:
920           jj_la1[44] = jj_gen;
921           break label_28;
922         }
923         jj_consume_token(S);
924       }
925                            {if (true) return new LexicalUnitImpl(prev, LexicalUnit.SAC_OPERATOR_SLASH);}
926       break;
927     case COMMA:
928       t = jj_consume_token(COMMA);
929       label_29:
930       while (true) {
931         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
932         case S:
933           ;
934           break;
935         default:
936           jj_la1[45] = jj_gen;
937           break label_29;
938         }
939         jj_consume_token(S);
940       }
941                            {if (true) return new LexicalUnitImpl(prev, LexicalUnit.SAC_OPERATOR_COMMA);}
942       break;
943     default:
944       jj_la1[46] = jj_gen;
945       jj_consume_token(-1);
946       throw new ParseException();
947     }
948     throw new Error JavaDoc("Missing return statement in function");
949   }
950
951 //
952
// combinator
953
// : '+' S* | '>' S* |
954
// ;
955
//
956
final public char combinator() throws ParseException {
957   char c = ' ';
958     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
959     case PLUS:
960       jj_consume_token(PLUS);
961              c='+';
962       label_30:
963       while (true) {
964         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
965         case S:
966           ;
967           break;
968         default:
969           jj_la1[47] = jj_gen;
970           break label_30;
971         }
972         jj_consume_token(S);
973       }
974       break;
975     case GT:
976       jj_consume_token(GT);
977            c='>';
978       label_31:
979       while (true) {
980         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
981         case S:
982           ;
983           break;
984         default:
985           jj_la1[48] = jj_gen;
986           break label_31;
987         }
988         jj_consume_token(S);
989       }
990       break;
991     case S:
992       jj_consume_token(S);
993       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
994       case PLUS:
995       case GT:
996         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
997         case PLUS:
998           jj_consume_token(PLUS);
999                      c='+';
1000          break;
1001        case GT:
1002          jj_consume_token(GT);
1003                                       c='>';
1004          break;
1005        default:
1006          jj_la1[49] = jj_gen;
1007          jj_consume_token(-1);
1008          throw new ParseException();
1009        }
1010        label_32:
1011        while (true) {
1012          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1013          case S:
1014            ;
1015            break;
1016          default:
1017            jj_la1[50] = jj_gen;
1018            break label_32;
1019          }
1020          jj_consume_token(S);
1021        }
1022        break;
1023      default:
1024        jj_la1[51] = jj_gen;
1025        ;
1026      }
1027      break;
1028    default:
1029      jj_la1[52] = jj_gen;
1030      jj_consume_token(-1);
1031      throw new ParseException();
1032    }
1033    {if (true) return c;}
1034    throw new Error JavaDoc("Missing return statement in function");
1035  }
1036
1037//
1038
// unary_operator
1039
// : '-' | '+'
1040
// ;
1041
//
1042
final public char unaryOperator() throws ParseException {
1043    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1044    case MINUS:
1045      jj_consume_token(MINUS);
1046              {if (true) return '-';}
1047      break;
1048    case PLUS:
1049      jj_consume_token(PLUS);
1050                                       {if (true) return '+';}
1051      break;
1052    default:
1053      jj_la1[53] = jj_gen;
1054      jj_consume_token(-1);
1055      throw new ParseException();
1056    }
1057    throw new Error JavaDoc("Missing return statement in function");
1058  }
1059
1060//
1061
// property
1062
// : IDENT S*
1063
// ;
1064
//
1065
final public String JavaDoc property() throws ParseException {
1066    Token t;
1067    t = jj_consume_token(IDENT);
1068    label_33:
1069    while (true) {
1070      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1071      case S:
1072        ;
1073        break;
1074      default:
1075        jj_la1[54] = jj_gen;
1076        break label_33;
1077      }
1078      jj_consume_token(S);
1079    }
1080      {if (true) return unescape(t.image);}
1081    throw new Error JavaDoc("Missing return statement in function");
1082  }
1083
1084//
1085
// ruleset
1086
// : selector [ ',' S* selector ]*
1087
// '{' S* declaration [ ';' S* declaration ]* '}' S*
1088
// ;
1089
//
1090
final public void styleRule() throws ParseException {
1091    SelectorList selList = null;
1092    boolean start = false;
1093    boolean noError = true;
1094    try {
1095      selList = selectorList();
1096      jj_consume_token(LBRACE);
1097      label_34:
1098      while (true) {
1099        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1100        case S:
1101          ;
1102          break;
1103        default:
1104          jj_la1[55] = jj_gen;
1105          break label_34;
1106        }
1107        jj_consume_token(S);
1108      }
1109            start = true;
1110            _docHandler.startSelector(selList);
1111      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1112      case IDENT:
1113        declaration();
1114        break;
1115      default:
1116        jj_la1[56] = jj_gen;
1117        ;
1118      }
1119      label_35:
1120      while (true) {
1121        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1122        case SEMICOLON:
1123          ;
1124          break;
1125        default:
1126          jj_la1[57] = jj_gen;
1127          break label_35;
1128        }
1129        jj_consume_token(SEMICOLON);
1130        label_36:
1131        while (true) {
1132          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1133          case S:
1134            ;
1135            break;
1136          default:
1137            jj_la1[58] = jj_gen;
1138            break label_36;
1139          }
1140          jj_consume_token(S);
1141        }
1142        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1143        case IDENT:
1144          declaration();
1145          break;
1146        default:
1147          jj_la1[59] = jj_gen;
1148          ;
1149        }
1150      }
1151      jj_consume_token(RBRACE);
1152    } catch (ParseException e) {
1153// System.err.println("Exception in styleRule()");
1154
// System.err.println(e.getMessage());
1155
noError = false;
1156        error_skipblock();
1157    } finally {
1158        if (start) {
1159            _docHandler.endSelector(selList);
1160        }
1161    }
1162  }
1163
1164  final public SelectorList selectorList() throws ParseException {
1165    SelectorListImpl selList = new SelectorListImpl();
1166    Selector sel;
1167    try {
1168      sel = selector();
1169      label_37:
1170      while (true) {
1171        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1172        case COMMA:
1173          ;
1174          break;
1175        default:
1176          jj_la1[60] = jj_gen;
1177          break label_37;
1178        }
1179        jj_consume_token(COMMA);
1180        label_38:
1181        while (true) {
1182          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1183          case S:
1184            ;
1185            break;
1186          default:
1187            jj_la1[61] = jj_gen;
1188            break label_38;
1189          }
1190          jj_consume_token(S);
1191        }
1192                             selList.add(sel);
1193        sel = selector();
1194      }
1195            selList.add(sel);
1196            {if (true) return selList;}
1197    } catch (ParseException e) {
1198        System.err.println("Exception in selectorList()");
1199    }
1200    throw new Error JavaDoc("Missing return statement in function");
1201  }
1202
1203//
1204
// selector
1205
// : simple_selector [ combinator simple_selector ]*
1206
// ;
1207
//
1208
final public Selector selector() throws ParseException {
1209    Selector sel;
1210    char comb;
1211    try {
1212      sel = simpleSelector(null, ' ');
1213      label_39:
1214      while (true) {
1215        if (jj_2_2(2)) {
1216          ;
1217        } else {
1218          break label_39;
1219        }
1220        comb = combinator();
1221        sel = simpleSelector(sel, comb);
1222      }
1223      label_40:
1224      while (true) {
1225        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1226        case S:
1227          ;
1228          break;
1229        default:
1230          jj_la1[62] = jj_gen;
1231          break label_40;
1232        }
1233        jj_consume_token(S);
1234      }
1235            {if (true) return sel;}
1236    } catch (ParseException e) {
1237        skipSelector();
1238    }
1239    throw new Error JavaDoc("Missing return statement in function");
1240  }
1241
1242//
1243
// simple_selector
1244
// : element_name? [ HASH | class | attrib | pseudo ]* S*
1245
// ;
1246
//
1247
final public Selector simpleSelector(Selector sel, char comb) throws ParseException {
1248    SimpleSelector simpleSel = null;
1249    Condition c = null;
1250    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1251    case ASTERISK:
1252    case IDENT:
1253      simpleSel = elementName();
1254      label_41:
1255      while (true) {
1256        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1257        case DOT:
1258        case COLON:
1259        case LSQUARE:
1260        case HASH:
1261          ;
1262          break;
1263        default:
1264          jj_la1[63] = jj_gen;
1265          break label_41;
1266        }
1267        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1268        case HASH:
1269          c = hash(c);
1270          break;
1271        case DOT:
1272          c = _class(c);
1273          break;
1274        case LSQUARE:
1275          c = attrib(c);
1276          break;
1277        case COLON:
1278          c = pseudo(c);
1279          break;
1280        default:
1281          jj_la1[64] = jj_gen;
1282          jj_consume_token(-1);
1283          throw new ParseException();
1284        }
1285      }
1286      break;
1287    case DOT:
1288    case COLON:
1289    case LSQUARE:
1290    case HASH:
1291            simpleSel = _selectorFactory.createElementSelector(null, null);
1292      label_42:
1293      while (true) {
1294        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1295        case HASH:
1296          c = hash(c);
1297          break;
1298        case DOT:
1299          c = _class(c);
1300          break;
1301        case LSQUARE:
1302          c = attrib(c);
1303          break;
1304        case COLON:
1305          c = pseudo(c);
1306          break;
1307        default:
1308          jj_la1[65] = jj_gen;
1309          jj_consume_token(-1);
1310          throw new ParseException();
1311        }
1312        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1313        case DOT:
1314        case COLON:
1315        case LSQUARE:
1316        case HASH:
1317          ;
1318          break;
1319        default:
1320          jj_la1[66] = jj_gen;
1321          break label_42;
1322        }
1323      }
1324      break;
1325    default:
1326      jj_la1[67] = jj_gen;
1327      jj_consume_token(-1);
1328      throw new ParseException();
1329    }
1330        if (c != null) {
1331            simpleSel = _selectorFactory.createConditionalSelector(simpleSel, c);
1332        }
1333
1334        if (sel != null) {
1335            switch (comb) {
1336            case ' ':
1337                sel = _selectorFactory.createDescendantSelector(sel, simpleSel);
1338                break;
1339            case '+':
1340                sel = _selectorFactory.createDirectAdjacentSelector(sel.getSelectorType(), sel, simpleSel);
1341                break;
1342            case '>':
1343                sel = _selectorFactory.createChildSelector(sel, simpleSel);
1344                break;
1345            }
1346        } else {
1347            sel = simpleSel;
1348        }
1349
1350        {if (true) return sel;}
1351    throw new Error JavaDoc("Missing return statement in function");
1352  }
1353
1354//
1355
// class
1356
// : '.' IDENT
1357
// ;
1358
//
1359
final public Condition _class(Condition pred) throws ParseException {
1360    Token t;
1361    jj_consume_token(DOT);
1362    t = jj_consume_token(IDENT);
1363        Condition c = _conditionFactory.createClassCondition(null, t.image);
1364        {if (true) return (pred == null) ? c : _conditionFactory.createAndCondition(pred, c);}
1365    throw new Error JavaDoc("Missing return statement in function");
1366  }
1367
1368//
1369
// element_name
1370
// : IDENT | '*'
1371
// ;
1372
//
1373
final public SimpleSelector elementName() throws ParseException {
1374    Token t;
1375    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1376    case IDENT:
1377      t = jj_consume_token(IDENT);
1378    {if (true) return _selectorFactory.createElementSelector(null, unescape(t.image));}
1379      break;
1380    case ASTERISK:
1381      jj_consume_token(ASTERISK);
1382    {if (true) return _selectorFactory.createElementSelector(null, null);}
1383      break;
1384    default:
1385      jj_la1[68] = jj_gen;
1386      jj_consume_token(-1);
1387      throw new ParseException();
1388    }
1389    throw new Error JavaDoc("Missing return statement in function");
1390  }
1391
1392//
1393
// attrib
1394
// : '[' S* IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S*
1395
// [ IDENT | STRING ] S* ]? ']'
1396
// ;
1397
//
1398
final public Condition attrib(Condition pred) throws ParseException {
1399    Token t;
1400    String JavaDoc name = null;
1401    String JavaDoc value = null;
1402    int type = 0;
1403    jj_consume_token(LSQUARE);
1404    label_43:
1405    while (true) {
1406      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1407      case S:
1408        ;
1409        break;
1410      default:
1411        jj_la1[69] = jj_gen;
1412        break label_43;
1413      }
1414      jj_consume_token(S);
1415    }
1416    t = jj_consume_token(IDENT);
1417                  name = unescape(t.image);
1418    label_44:
1419    while (true) {
1420      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1421      case S:
1422        ;
1423        break;
1424      default:
1425        jj_la1[70] = jj_gen;
1426        break label_44;
1427      }
1428      jj_consume_token(S);
1429    }
1430    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1431    case EQUALS:
1432    case INCLUDES:
1433    case DASHMATCH:
1434      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1435      case EQUALS:
1436        jj_consume_token(EQUALS);
1437                       type = 1;
1438        break;
1439      case INCLUDES:
1440        jj_consume_token(INCLUDES);
1441                         type = 2;
1442        break;
1443      case DASHMATCH:
1444        jj_consume_token(DASHMATCH);
1445                          type = 3;
1446        break;
1447      default:
1448        jj_la1[71] = jj_gen;
1449        jj_consume_token(-1);
1450        throw new ParseException();
1451      }
1452      label_45:
1453      while (true) {
1454        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1455        case S:
1456          ;
1457          break;
1458        default:
1459          jj_la1[72] = jj_gen;
1460          break label_45;
1461        }
1462        jj_consume_token(S);
1463      }
1464      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1465      case IDENT:
1466        t = jj_consume_token(IDENT);
1467                          value = t.image;
1468        break;
1469      case STRING:
1470        t = jj_consume_token(STRING);
1471                           value = unescape(t.image);
1472        break;
1473      default:
1474        jj_la1[73] = jj_gen;
1475        jj_consume_token(-1);
1476        throw new ParseException();
1477      }
1478      label_46:
1479      while (true) {
1480        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1481        case S:
1482          ;
1483          break;
1484        default:
1485          jj_la1[74] = jj_gen;
1486          break label_46;
1487        }
1488        jj_consume_token(S);
1489      }
1490      break;
1491    default:
1492      jj_la1[75] = jj_gen;
1493      ;
1494    }
1495    jj_consume_token(RSQUARE);
1496        Condition c = null;
1497        switch (type) {
1498        case 0:
1499            c = _conditionFactory.createAttributeCondition(name, null, false, null);
1500            break;
1501        case 1:
1502            c = _conditionFactory.createAttributeCondition(name, null, false, value);
1503            break;
1504        case 2:
1505            c = _conditionFactory.createOneOfAttributeCondition(name, null, false, value);
1506            break;
1507        case 3:
1508            c = _conditionFactory.createBeginHyphenAttributeCondition(name, null, false, value);
1509            break;
1510        }
1511        {if (true) return (pred == null) ? c : _conditionFactory.createAndCondition(pred, c);}
1512    throw new Error JavaDoc("Missing return statement in function");
1513  }
1514
1515//
1516
// pseudo
1517
// : ':' [ IDENT | FUNCTION S* IDENT S* ')' ]
1518
// ;
1519
//
1520
final public Condition pseudo(Condition pred) throws ParseException {
1521    Condition c;
1522    Token t;
1523    String JavaDoc function;
1524    String JavaDoc arg;
1525    jj_consume_token(COLON);
1526    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1527    case IDENT:
1528      t = jj_consume_token(IDENT);
1529            // There appears to be an issue here regarding "first-letter" & "first-line"
1530
String JavaDoc s = unescape(t.image);
1531                    c = _conditionFactory.createPseudoClassCondition(null, s);
1532            {if (true) return (pred == null)
1533                ? c
1534                : _conditionFactory.createAndCondition(pred, c);}
1535      break;
1536    case FUNCTION:
1537      t = jj_consume_token(FUNCTION);
1538                             function = unescape(t.image);
1539      label_47:
1540      while (true) {
1541        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1542        case S:
1543          ;
1544          break;
1545        default:
1546          jj_la1[76] = jj_gen;
1547          break label_47;
1548        }
1549        jj_consume_token(S);
1550      }
1551      t = jj_consume_token(IDENT);
1552                          arg = unescape(t.image);
1553      label_48:
1554      while (true) {
1555        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1556        case S:
1557          ;
1558          break;
1559        default:
1560          jj_la1[77] = jj_gen;
1561          break label_48;
1562        }
1563        jj_consume_token(S);
1564      }
1565      jj_consume_token(RROUND);
1566                if (function.equalsIgnoreCase("lang(")) {
1567                    c = _conditionFactory.createLangCondition(unescape(arg));
1568                    {if (true) return (pred == null)
1569                        ? c
1570                        : _conditionFactory.createAndCondition(pred, c);}
1571                } else {
1572                    {if (true) throw new CSSParseException(
1573                        "Invalid pseudo function name " + function,
1574                        getLocator());}
1575                }
1576      break;
1577    default:
1578      jj_la1[78] = jj_gen;
1579      jj_consume_token(-1);
1580      throw new ParseException();
1581    }
1582    throw new Error JavaDoc("Missing return statement in function");
1583  }
1584
1585  final public Condition hash(Condition pred) throws ParseException {
1586    Token t;
1587    t = jj_consume_token(HASH);
1588        Condition c = _conditionFactory.createIdCondition(t.image.substring(1));
1589        {if (true) return (pred == null) ? c : _conditionFactory.createAndCondition(pred, c);}
1590    throw new Error JavaDoc("Missing return statement in function");
1591  }
1592
1593  final public void styleDeclaration() throws ParseException {
1594    jj_consume_token(LBRACE);
1595    label_49:
1596    while (true) {
1597      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1598      case S:
1599        ;
1600        break;
1601      default:
1602        jj_la1[79] = jj_gen;
1603        break label_49;
1604      }
1605      jj_consume_token(S);
1606    }
1607    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1608    case IDENT:
1609      declaration();
1610      break;
1611    default:
1612      jj_la1[80] = jj_gen;
1613      ;
1614    }
1615    label_50:
1616    while (true) {
1617      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1618      case SEMICOLON:
1619        ;
1620        break;
1621      default:
1622        jj_la1[81] = jj_gen;
1623        break label_50;
1624      }
1625      jj_consume_token(SEMICOLON);
1626      label_51:
1627      while (true) {
1628        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1629        case S:
1630          ;
1631          break;
1632        default:
1633          jj_la1[82] = jj_gen;
1634          break label_51;
1635        }
1636        jj_consume_token(S);
1637      }
1638      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1639      case IDENT:
1640        declaration();
1641        break;
1642      default:
1643        jj_la1[83] = jj_gen;
1644        ;
1645      }
1646    }
1647    jj_consume_token(RBRACE);
1648  }
1649
1650//
1651
// declaration
1652
// : property ':' S* expr prio?
1653
// |
1654
// ;
1655
//
1656
final public void declaration() throws ParseException {
1657  String JavaDoc p;
1658  LexicalUnit e;
1659  boolean priority = false;
1660// CSSValue e;
1661
boolean noError = true;
1662    try {
1663      p = property();
1664      jj_consume_token(COLON);
1665      label_52:
1666      while (true) {
1667        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1668        case S:
1669          ;
1670          break;
1671        default:
1672          jj_la1[84] = jj_gen;
1673          break label_52;
1674        }
1675        jj_consume_token(S);
1676      }
1677      e = expr();
1678      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1679      case IMPORTANT_SYM:
1680        priority = prio();
1681        break;
1682      default:
1683        jj_la1[85] = jj_gen;
1684        ;
1685      }
1686            _docHandler.property(p, e, priority);
1687    } catch (ParseException ex) {
1688        System.err.println("Exception in declaration()");
1689        noError = false;
1690        error_skipdecl();
1691    }
1692  }
1693
1694//
1695
// prio
1696
// : IMPORTANT_SYM S*
1697
// ;
1698
//
1699
final public boolean prio() throws ParseException {
1700    jj_consume_token(IMPORTANT_SYM);
1701    label_53:
1702    while (true) {
1703      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1704      case S:
1705        ;
1706        break;
1707      default:
1708        jj_la1[86] = jj_gen;
1709        break label_53;
1710      }
1711      jj_consume_token(S);
1712    }
1713    {if (true) return true;}
1714    throw new Error JavaDoc("Missing return statement in function");
1715  }
1716
1717//
1718
// expr
1719
// : term [ operator term ]*
1720
// ;
1721
//
1722
// TODO: Deal with the operator
1723
//
1724
final public LexicalUnit expr() throws ParseException {
1725    LexicalUnit head;
1726    LexicalUnit body;
1727    head = term(null);
1728                        body = head;
1729    label_54:
1730    while (true) {
1731      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1732      case COMMA:
1733      case SLASH:
1734      case PLUS:
1735      case MINUS:
1736      case HASH:
1737      case STRING:
1738      case URI:
1739      case INHERIT:
1740      case EMS:
1741      case EXS:
1742      case LENGTH_PX:
1743      case LENGTH_CM:
1744      case LENGTH_MM:
1745      case LENGTH_IN:
1746      case LENGTH_PT:
1747      case LENGTH_PC:
1748      case ANGLE_DEG:
1749      case ANGLE_RAD:
1750      case ANGLE_GRAD:
1751      case TIME_MS:
1752      case TIME_S:
1753      case FREQ_HZ:
1754      case FREQ_KHZ:
1755      case DIMEN:
1756      case PERCENTAGE:
1757      case NUMBER:
1758      case RGB:
1759      case FUNCTION:
1760      case IDENT:
1761      case UNICODERANGE:
1762        ;
1763        break;
1764      default:
1765        jj_la1[87] = jj_gen;
1766        break label_54;
1767      }
1768      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1769      case COMMA:
1770      case SLASH:
1771        body = operator(body);
1772        break;
1773      default:
1774        jj_la1[88] = jj_gen;
1775        ;
1776      }
1777      body = term(body);
1778    }
1779      {if (true) return head;}
1780    throw new Error JavaDoc("Missing return statement in function");
1781  }
1782
1783//
1784
// term
1785
// : unary_operator?
1786
// [ NUMBER S* | PERCENTAGE S* | LENGTH S* | EMS S* | EXS S* | ANGLE S* |
1787
// TIME S* | FREQ S* | function ]
1788
// | STRING S* | IDENT S* | URI S* | RGB S* | UNICODERANGE S* | hexcolor
1789
// ;
1790
//
1791
final public LexicalUnit term(LexicalUnit prev) throws ParseException {
1792  Token t;
1793  char op = ' ';
1794  String JavaDoc s;
1795  LexicalUnit value = null;
1796    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1797    case PLUS:
1798    case MINUS:
1799      op = unaryOperator();
1800      break;
1801    default:
1802      jj_la1[89] = jj_gen;
1803      ;
1804    }
1805    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1806    case EMS:
1807    case EXS:
1808    case LENGTH_PX:
1809    case LENGTH_CM:
1810    case LENGTH_MM:
1811    case LENGTH_IN:
1812    case LENGTH_PT:
1813    case LENGTH_PC:
1814    case ANGLE_DEG:
1815    case ANGLE_RAD:
1816    case ANGLE_GRAD:
1817    case TIME_MS:
1818    case TIME_S:
1819    case FREQ_HZ:
1820    case FREQ_KHZ:
1821    case PERCENTAGE:
1822    case NUMBER:
1823    case FUNCTION:
1824      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1825      case NUMBER:
1826        t = jj_consume_token(NUMBER);
1827                              value = LexicalUnitImpl.createNumber(prev, value(op, t.image));
1828        break;
1829      case PERCENTAGE:
1830        t = jj_consume_token(PERCENTAGE);
1831                              value = LexicalUnitImpl.createPercentage(prev, value(op, t.image));
1832        break;
1833      case LENGTH_PX:
1834        t = jj_consume_token(LENGTH_PX);
1835                              value = LexicalUnitImpl.createPixel(prev, value(op, t.image));
1836        break;
1837      case LENGTH_CM:
1838        t = jj_consume_token(LENGTH_CM);
1839                              value = LexicalUnitImpl.createCentimeter(prev, value(op, t.image));
1840        break;
1841      case LENGTH_MM:
1842        t = jj_consume_token(LENGTH_MM);
1843                              value = LexicalUnitImpl.createMillimeter(prev, value(op, t.image));
1844        break;
1845      case LENGTH_IN:
1846        t = jj_consume_token(LENGTH_IN);
1847                              value = LexicalUnitImpl.createInch(prev, value(op, t.image));
1848        break;
1849      case LENGTH_PT:
1850        t = jj_consume_token(LENGTH_PT);
1851                              value = LexicalUnitImpl.createPoint(prev, value(op, t.image));
1852        break;
1853      case LENGTH_PC:
1854        t = jj_consume_token(LENGTH_PC);
1855                              value = LexicalUnitImpl.createPica(prev, value(op, t.image));
1856        break;
1857      case EMS:
1858        t = jj_consume_token(EMS);
1859                              value = LexicalUnitImpl.createEm(prev, value(op, t.image));
1860        break;
1861      case EXS:
1862        t = jj_consume_token(EXS);
1863                              value = LexicalUnitImpl.createEx(prev, value(op, t.image));
1864        break;
1865      case ANGLE_DEG:
1866        t = jj_consume_token(ANGLE_DEG);
1867                              value = LexicalUnitImpl.createDegree(prev, value(op, t.image));
1868        break;
1869      case ANGLE_RAD:
1870        t = jj_consume_token(ANGLE_RAD);
1871                              value = LexicalUnitImpl.createRadian(prev, value(op, t.image));
1872        break;
1873      case ANGLE_GRAD:
1874        t = jj_consume_token(ANGLE_GRAD);
1875                              value = LexicalUnitImpl.createGradian(prev, value(op, t.image));
1876        break;
1877      case TIME_MS:
1878        t = jj_consume_token(TIME_MS);
1879                              value = LexicalUnitImpl.createMillisecond(prev, value(op, t.image));
1880        break;
1881      case TIME_S:
1882        t = jj_consume_token(TIME_S);
1883                              value = LexicalUnitImpl.createSecond(prev, value(op, t.image));
1884        break;
1885      case FREQ_HZ:
1886        t = jj_consume_token(FREQ_HZ);
1887                              value = LexicalUnitImpl.createHertz(prev, value(op, t.image));
1888        break;
1889      case FREQ_KHZ:
1890        t = jj_consume_token(FREQ_KHZ);
1891                              value = LexicalUnitImpl.createKiloHertz(prev, value(op, t.image));
1892        break;
1893      case FUNCTION:
1894        value = function(prev);
1895        break;
1896      default:
1897        jj_la1[90] = jj_gen;
1898        jj_consume_token(-1);
1899        throw new ParseException();
1900      }
1901      break;
1902    case STRING:
1903      t = jj_consume_token(STRING);
1904                              value = new LexicalUnitImpl(prev, LexicalUnit.SAC_STRING_VALUE, t.image);
1905      break;
1906    case IDENT:
1907      t = jj_consume_token(IDENT);
1908                              value = new LexicalUnitImpl(prev, LexicalUnit.SAC_IDENT, t.image);
1909      break;
1910    case URI:
1911      t = jj_consume_token(URI);
1912                              value = new LexicalUnitImpl(prev, LexicalUnit.SAC_URI, t.image);
1913      break;
1914    case UNICODERANGE:
1915      t = jj_consume_token(UNICODERANGE);
1916                              value = new LexicalUnitImpl(prev, LexicalUnit.SAC_UNICODERANGE, t.image);
1917      break;
1918    case RGB:
1919      value = rgb(prev);
1920      break;
1921    case HASH:
1922      value = hexcolor(prev);
1923      break;
1924    case DIMEN:
1925      t = jj_consume_token(DIMEN);
1926        int n = getLastNumPos(t.image);
1927        value = LexicalUnitImpl.createDimension(
1928            prev,
1929            value(op, t.image.substring(0, n+1)),
1930            t.image.substring(n+1));
1931      break;
1932    case INHERIT:
1933      t = jj_consume_token(INHERIT);
1934                              value = new LexicalUnitImpl(prev, LexicalUnit.SAC_INHERIT, t.image);
1935      break;
1936    default:
1937      jj_la1[91] = jj_gen;
1938      jj_consume_token(-1);
1939      throw new ParseException();
1940    }
1941    label_55:
1942    while (true) {
1943      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1944      case S:
1945        ;
1946        break;
1947      default:
1948        jj_la1[92] = jj_gen;
1949        break label_55;
1950      }
1951      jj_consume_token(S);
1952    }
1953      {if (true) return value;}
1954    throw new Error JavaDoc("Missing return statement in function");
1955  }
1956
1957//
1958
// function
1959
// : FUNCTION S* expr ')' S*
1960
// ;
1961
//
1962
final public LexicalUnit function(LexicalUnit prev) throws ParseException {
1963    Token t;
1964    LexicalUnit params;
1965    t = jj_consume_token(FUNCTION);
1966    label_56:
1967    while (true) {
1968      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1969      case S:
1970        ;
1971        break;
1972      default:
1973        jj_la1[93] = jj_gen;
1974        break label_56;
1975      }
1976      jj_consume_token(S);
1977    }
1978    params = expr();
1979    jj_consume_token(RROUND);
1980        if (t.image.equalsIgnoreCase("counter(")) {
1981           {if (true) return LexicalUnitImpl.createCounter(prev, params);}
1982        } else if (t.image.equalsIgnoreCase("counters(")) {
1983           {if (true) return LexicalUnitImpl.createCounters(prev, params);}
1984        } else if (t.image.equalsIgnoreCase("attr(")) {
1985           {if (true) return LexicalUnitImpl.createAttr(prev, params);}
1986        } else if (t.image.equalsIgnoreCase("rect(")) {
1987           {if (true) return LexicalUnitImpl.createRect(prev, params);}
1988        }
1989        {if (true) return LexicalUnitImpl.createFunction(
1990            prev,
1991            t.image.substring(0, t.image.length() - 1),
1992            params);}
1993    throw new Error JavaDoc("Missing return statement in function");
1994  }
1995
1996//
1997
// rgb
1998
// : RGB S* expr ')' S*
1999
// ;
2000
//
2001
final public LexicalUnit rgb(LexicalUnit prev) throws ParseException {
2002    Token t;
2003    LexicalUnit params;
2004    t = jj_consume_token(RGB);
2005    label_57:
2006    while (true) {
2007      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2008      case S:
2009        ;
2010        break;
2011      default:
2012        jj_la1[94] = jj_gen;
2013        break label_57;
2014      }
2015      jj_consume_token(S);
2016    }
2017    params = expr();
2018    jj_consume_token(RROUND);
2019        {if (true) return LexicalUnitImpl.createRgbColor(prev, params);}
2020    throw new Error JavaDoc("Missing return statement in function");
2021  }
2022
2023//
2024
// hexcolor
2025
// : HASH S*
2026
// ;
2027
//
2028
final public LexicalUnit hexcolor(LexicalUnit prev) throws ParseException {
2029    Token t;
2030    t = jj_consume_token(HASH);
2031        // Step past the hash at the beginning
2032
int i = 1;
2033        int r = 0;
2034        int g = 0;
2035        int b = 0;
2036        int len = t.image.length() - 1;
2037
2038        if (len == 3) {
2039            r = Integer.parseInt(t.image.substring(i + 0, i + 1), 16);
2040            g = Integer.parseInt(t.image.substring(i + 1, i + 2), 16);
2041            b = Integer.parseInt(t.image.substring(i + 2, i + 3), 16);
2042            r = (r << 4) | r;
2043            g = (g << 4) | g;
2044            b = (b << 4) | b;
2045        } else if (len == 6) {
2046            r = Integer.parseInt(t.image.substring(i + 0, i + 2), 16);
2047            g = Integer.parseInt(t.image.substring(i + 2, i + 4), 16);
2048            b = Integer.parseInt(t.image.substring(i + 4, i + 6), 16);
2049        } else {
2050            // Error
2051
}
2052
2053        // Turn into an "rgb()"
2054
LexicalUnit lr = LexicalUnitImpl.createNumber(null, r);
2055        LexicalUnit lc1 = LexicalUnitImpl.createComma(lr);
2056        LexicalUnit lg = LexicalUnitImpl.createNumber(lc1, g);
2057        LexicalUnit lc2 = LexicalUnitImpl.createComma(lg);
2058        LexicalUnit lb = LexicalUnitImpl.createNumber(lc2, b);
2059
2060        {if (true) return LexicalUnitImpl.createRgbColor(prev, lr);}
2061    throw new Error JavaDoc("Missing return statement in function");
2062  }
2063
2064  float value(char op, String JavaDoc s) throws ParseException {
2065    return ((op == '-') ? -1 : 1) * Float.parseFloat(s);
2066  }
2067
2068  int getLastNumPos(String JavaDoc s) throws ParseException {
2069    int i;
2070    for (i = 0; i < s.length(); i++) {
2071        if (Character.isLetter(s.charAt(i))) {
2072            break;
2073        }
2074    }
2075    return i - 1;
2076  }
2077
2078  String JavaDoc unescape(String JavaDoc s) throws ParseException {
2079    int len = s.length();
2080    StringBuffer JavaDoc buf = new StringBuffer JavaDoc(len);
2081    int index = 0;
2082
2083    while (index < len) {
2084        char c = s.charAt(index);
2085        if (c == '\\') {
2086            if (++index < len) {
2087                c = s.charAt(index);
2088                switch (c) {
2089                case '0': case '1': case '2': case '3': case '4':
2090                case '5': case '6': case '7': case '8': case '9':
2091                case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
2092                case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
2093                    int numValue = Character.digit(c, 16);
2094                    int count = 0;
2095                    int p = 16;
2096
2097                    while (index + 1 < len && count < 6) {
2098                        c = s.charAt(index+1);
2099
2100                        if (Character.digit(c, 16) != -1) {
2101                            numValue = (numValue * 16) + Character.digit(c, 16);
2102                            p *= 16;
2103                            index++;
2104                        } else {
2105                            if (c == ' ') {
2106                                // skip the latest white space
2107
index++;
2108                            }
2109                            break;
2110                        }
2111                    }
2112                    buf.append((char) numValue);
2113                    break;
2114                    case '\n':
2115                    case '\f':
2116                    break;
2117                    case '\r':
2118                    if (index + 1 < len) {
2119                        if (s.charAt(index + 1) == '\n') {
2120                            index ++;
2121                        }
2122                    }
2123                    break;
2124                default:
2125                    buf.append(c);
2126                }
2127            } else {
2128                throw new CSSParseException("invalid string " + s, getLocator());
2129            }
2130        } else {
2131            buf.append(c);
2132        }
2133        index++;
2134    }
2135
2136    return buf.toString();
2137  }
2138
2139  void skipSelector() throws ParseException {
2140    Token t = getToken(1);
2141    while (t.kind != COMMA && t.kind != SEMICOLON && t.kind != LBRACE && t.kind != EOF ) {
2142        getNextToken();
2143        t = getToken(1);
2144    }
2145  }
2146
2147  String JavaDoc skip() throws ParseException {
2148  StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
2149  int nesting = 0;
2150  Token t = getToken(0);
2151  if (t.image != null) {
2152    sb.append(t.image);
2153  }
2154  do {
2155    t = getNextToken();
2156    if (t.kind == EOF)
2157      break;
2158    sb.append(t.image);
2159    if (t.kind == LBRACE)
2160      nesting++;
2161    else if (t.kind == RBRACE)
2162      nesting--;
2163    else if (t.kind == SEMICOLON && nesting <= 0)
2164      break;
2165  }
2166  while ((t.kind != RBRACE) || (nesting > 0));
2167
2168  return sb.toString();
2169  }
2170
2171  void error_skipblock() throws ParseException {
2172  if (!_quiet) {
2173    ParseException e = generateParseException();
2174    System.err.println( "** error_skipblock **\n" + e.toString() );
2175  }
2176
2177  Token t;
2178  int nesting = 0;
2179  do {
2180    t = getNextToken();
2181    if( t.kind == LBRACE )
2182      nesting++;
2183    else if( t.kind == RBRACE )
2184      nesting--;
2185    else if( t.kind == EOF )
2186      break;
2187  }
2188  while ((t.kind != RBRACE) || (nesting > 0));
2189  }
2190
2191  void error_skipdecl() throws ParseException {
2192  if (!_quiet) {
2193    ParseException e = generateParseException();
2194    System.err.println("** error_skipdecl **\n" + e.toString());
2195  }
2196
2197  Token t = getToken(1);
2198  while (t.kind != SEMICOLON && t.kind != RBRACE && t.kind != EOF ) {
2199      getNextToken();
2200      t = getToken(1);
2201  }
2202  }
2203
2204  final private boolean jj_2_1(int xla) {
2205    jj_la = xla; jj_lastpos = jj_scanpos = token;
2206    try { return !jj_3_1(); }
2207    catch(LookaheadSuccess ls) { return true; }
2208    finally { jj_save(0, xla); }
2209  }
2210
2211  final private boolean jj_2_2(int xla) {
2212    jj_la = xla; jj_lastpos = jj_scanpos = token;
2213    try { return !jj_3_2(); }
2214    catch(LookaheadSuccess ls) { return true; }
2215    finally { jj_save(1, xla); }
2216  }
2217
2218  final private boolean jj_3R_73() {
2219    if (jj_3R_77()) return true;
2220    return false;
2221  }
2222
2223  final private boolean jj_3R_60() {
2224    if (jj_scan_token(PLUS)) return true;
2225    Token xsp;
2226    while (true) {
2227      xsp = jj_scanpos;
2228      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
2229    }
2230    return false;
2231  }
2232
2233  final private boolean jj_3R_66() {
2234    Token xsp;
2235    xsp = jj_scanpos;
2236    if (jj_3R_70()) {
2237    jj_scanpos = xsp;
2238    if (jj_3R_71()) return true;
2239    }
2240    return false;
2241  }
2242
2243  final private boolean jj_3R_70() {
2244    if (jj_scan_token(IDENT)) return true;
2245    return false;
2246  }
2247
2248  final private boolean jj_3R_67() {
2249    Token xsp;
2250    xsp = jj_scanpos;
2251    if (jj_3R_72()) {
2252    jj_scanpos = xsp;
2253    if (jj_3R_73()) {
2254    jj_scanpos = xsp;
2255    if (jj_3R_74()) {
2256    jj_scanpos = xsp;
2257    if (jj_3R_75()) return true;
2258    }
2259    }
2260    }
2261    return false;
2262  }
2263
2264  final private boolean jj_3R_72() {
2265    if (jj_3R_76()) return true;
2266    return false;
2267  }
2268
2269  final private boolean jj_3R_58() {
2270    Token xsp;
2271    xsp = jj_scanpos;
2272    if (jj_3R_60()) {
2273    jj_scanpos = xsp;
2274    if (jj_3R_61()) {
2275    jj_scanpos = xsp;
2276    if (jj_3R_62()) return true;
2277    }
2278    }
2279    return false;
2280  }
2281
2282  final private boolean jj_3R_64() {
2283    Token xsp;
2284    if (jj_3R_67()) return true;
2285    while (true) {
2286      xsp = jj_scanpos;
2287      if (jj_3R_67()) { jj_scanpos = xsp; break; }
2288    }
2289    return false;
2290  }
2291
2292  final private boolean jj_3R_77() {
2293    if (jj_scan_token(DOT)) return true;
2294    return false;
2295  }
2296
2297  final private boolean jj_3R_63() {
2298    if (jj_3R_66()) return true;
2299    return false;
2300  }
2301
2302  final private boolean jj_3R_69() {
2303    if (jj_scan_token(GT)) return true;
2304    return false;
2305  }
2306
2307  final private boolean jj_3R_79() {
2308    if (jj_scan_token(COLON)) return true;
2309    return false;
2310  }
2311
2312  final private boolean jj_3R_59() {
2313    Token xsp;
2314    xsp = jj_scanpos;
2315    if (jj_3R_63()) {
2316    jj_scanpos = xsp;
2317    if (jj_3R_64()) return true;
2318    }
2319    return false;
2320  }
2321
2322  final private boolean jj_3R_78() {
2323    if (jj_scan_token(LSQUARE)) return true;
2324    return false;
2325  }
2326
2327  final private boolean jj_3R_76() {
2328    if (jj_scan_token(HASH)) return true;
2329    return false;
2330  }
2331
2332  final private boolean jj_3_1() {
2333    if (jj_scan_token(IDENT)) return true;
2334    Token xsp;
2335    while (true) {
2336      xsp = jj_scanpos;
2337      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
2338    }
2339    return false;
2340  }
2341
2342  final private boolean jj_3_2() {
2343    if (jj_3R_58()) return true;
2344    if (jj_3R_59()) return true;
2345    return false;
2346  }
2347
2348  final private boolean jj_3R_68() {
2349    if (jj_scan_token(PLUS)) return true;
2350    return false;
2351  }
2352
2353  final private boolean jj_3R_65() {
2354    Token xsp;
2355    xsp = jj_scanpos;
2356    if (jj_3R_68()) {
2357    jj_scanpos = xsp;
2358    if (jj_3R_69()) return true;
2359    }
2360    return false;
2361  }
2362
2363  final private boolean jj_3R_71() {
2364    if (jj_scan_token(ASTERISK)) return true;
2365    return false;
2366  }
2367
2368  final private boolean jj_3R_75() {
2369    if (jj_3R_79()) return true;
2370    return false;
2371  }
2372
2373  final private boolean jj_3R_62() {
2374    if (jj_scan_token(S)) return true;
2375    Token xsp;
2376    xsp = jj_scanpos;
2377    if (jj_3R_65()) jj_scanpos = xsp;
2378    return false;
2379  }
2380
2381  final private boolean jj_3R_74() {
2382    if (jj_3R_78()) return true;
2383    return false;
2384  }
2385
2386  final private boolean jj_3R_61() {
2387    if (jj_scan_token(GT)) return true;
2388    Token xsp;
2389    while (true) {
2390      xsp = jj_scanpos;
2391      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
2392    }
2393    return false;
2394  }
2395
2396  public SACParserTokenManager token_source;
2397  public Token token, jj_nt;
2398  private int jj_ntk;
2399  private Token jj_scanpos, jj_lastpos;
2400  private int jj_la;
2401  public boolean lookingAhead = false;
2402  private boolean jj_semLA;
2403  private int jj_gen;
2404  final private int[] jj_la1 = new int[95];
2405  static private int[] jj_la1_0;
2406  static private int[] jj_la1_1;
2407  static private int[] jj_la1_2;
2408  static {
2409      jj_la1_0();
2410      jj_la1_1();
2411      jj_la1_2();
2412   }
2413   private static void jj_la1_0() {
2414      jj_la1_0 = new int[] {0x0,0x3000002,0x3000002,0x10000000,0x3000002,0x3000002,0xe00a0d00,0xe00a0d00,0x3000002,0x3000002,0xf00a0d00,0x2,0x2,0x2,0x900000,0x2,0x0,0x2,0x2,0x200a0d00,0x80,0x2,0x200a0d00,0x2,0x200a0d00,0x200a0d00,0x2,0x2,0x2,0x2,0x2,0x400,0x400,0x2,0x0,0x200,0x2,0x0,0x2,0x2,0x0,0x200,0x2,0x0,0x2,0x2,0x1080,0x2,0x2,0x12000,0x2,0x12000,0x12002,0x6000,0x2,0x2,0x0,0x200,0x2,0x0,0x80,0x2,0x2,0xa0500,0xa0500,0xa0500,0xa0500,0xa0d00,0x800,0x2,0x2,0xc008000,0x2,0x100000,0x2,0xc008000,0x2,0x2,0x0,0x2,0x0,0x200,0x2,0x0,0x2,0x0,0x2,0x987080,0x1080,0x6000,0x0,0x980000,0x2,0x2,0x2,};
2415   }
2416   private static void jj_la1_1() {
2417      jj_la1_1 = new int[] {0x1,0x0,0x0,0x0,0x0,0x0,0x1000002,0x1000002,0x0,0x0,0x1000003,0x0,0x0,0x0,0x0,0x0,0x1000000,0x0,0x0,0x1000002,0x0,0x0,0x1000002,0x0,0x1000002,0x1000002,0x0,0x0,0x0,0x0,0x0,0x1000000,0x1000000,0x0,0x1000000,0x0,0x0,0x1000000,0x0,0x0,0x1000000,0x0,0x0,0x1000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000,0x0,0x0,0x1000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000,0x1000000,0x0,0x0,0x0,0x0,0x1000000,0x0,0x0,0x0,0x0,0x1800000,0x0,0x1000000,0x0,0x0,0x1000000,0x0,0x4,0x0,0x9fffff8,0x0,0x0,0xb7fff0,0x9fffff8,0x0,0x0,0x0,};
2418   }
2419   private static void jj_la1_2() {
2420      jj_la1_2 = new int[] {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,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,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
2421   }
2422  final private JJCalls[] jj_2_rtns = new JJCalls[2];
2423  private boolean jj_rescan = false;
2424  private int jj_gc = 0;
2425
2426  public SACParser(CharStream stream) {
2427    token_source = new SACParserTokenManager(stream);
2428    token = new Token();
2429    jj_ntk = -1;
2430    jj_gen = 0;
2431    for (int i = 0; i < 95; i++) jj_la1[i] = -1;
2432    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
2433  }
2434
2435  public void ReInit(CharStream stream) {
2436    token_source.ReInit(stream);
2437    token = new Token();
2438    jj_ntk = -1;
2439    jj_gen = 0;
2440    for (int i = 0; i < 95; i++) jj_la1[i] = -1;
2441    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
2442  }
2443
2444  public SACParser(SACParserTokenManager tm) {
2445    token_source = tm;
2446    token = new Token();
2447    jj_ntk = -1;
2448    jj_gen = 0;
2449    for (int i = 0; i < 95; i++) jj_la1[i] = -1;
2450    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
2451  }
2452
2453  public void ReInit(SACParserTokenManager tm) {
2454    token_source = tm;
2455    token = new Token();
2456    jj_ntk = -1;
2457    jj_gen = 0;
2458    for (int i = 0; i < 95; i++) jj_la1[i] = -1;
2459    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
2460  }
2461
2462  final private Token jj_consume_token(int kind) throws ParseException {
2463    Token oldToken;
2464    if ((oldToken = token).next != null) token = token.next;
2465    else token = token.next = token_source.getNextToken();
2466    jj_ntk = -1;
2467    if (token.kind == kind) {
2468      jj_gen++;
2469      if (++jj_gc > 100) {
2470        jj_gc = 0;
2471        for (int i = 0; i < jj_2_rtns.length; i++) {
2472          JJCalls c = jj_2_rtns[i];
2473          while (c != null) {
2474            if (c.gen < jj_gen) c.first = null;
2475            c = c.next;
2476          }
2477        }
2478      }
2479      return token;
2480    }
2481    token = oldToken;
2482    jj_kind = kind;
2483    throw generateParseException();
2484  }
2485
2486  static private final class LookaheadSuccess extends java.lang.Error JavaDoc { }
2487  final private LookaheadSuccess jj_ls = new LookaheadSuccess();
2488  final private boolean jj_scan_token(int kind) {
2489    if (jj_scanpos == jj_lastpos) {
2490      jj_la--;
2491      if (jj_scanpos.next == null) {
2492        jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
2493      } else {
2494        jj_lastpos = jj_scanpos = jj_scanpos.next;
2495      }
2496    } else {
2497      jj_scanpos = jj_scanpos.next;
2498    }
2499    if (jj_rescan) {
2500      int i = 0; Token tok = token;
2501      while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; }
2502      if (tok != null) jj_add_error_token(kind, i);
2503    }
2504    if (jj_scanpos.kind != kind) return true;
2505    if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
2506    return false;
2507  }
2508
2509  final public Token getNextToken() {
2510    if (token.next != null) token = token.next;
2511    else token = token.next = token_source.getNextToken();
2512    jj_ntk = -1;
2513    jj_gen++;
2514    return token;
2515  }
2516
2517  final public Token getToken(int index) {
2518    Token t = lookingAhead ? jj_scanpos : token;
2519    for (int i = 0; i < index; i++) {
2520      if (t.next != null) t = t.next;
2521      else t = t.next = token_source.getNextToken();
2522    }
2523    return t;
2524  }
2525
2526  final private int jj_ntk() {
2527    if ((jj_nt=token.next) == null)
2528      return (jj_ntk = (token.next=token_source.getNextToken()).kind);
2529    else
2530      return (jj_ntk = jj_nt.kind);
2531  }
2532
2533  private java.util.Vector JavaDoc jj_expentries = new java.util.Vector JavaDoc();
2534  private int[] jj_expentry;
2535  private int jj_kind = -1;
2536  private int[] jj_lasttokens = new int[100];
2537  private int jj_endpos;
2538
2539  private void jj_add_error_token(int kind, int pos) {
2540    if (pos >= 100) return;
2541    if (pos == jj_endpos + 1) {
2542      jj_lasttokens[jj_endpos++] = kind;
2543    } else if (jj_endpos != 0) {
2544      jj_expentry = new int[jj_endpos];
2545      for (int i = 0; i < jj_endpos; i++) {
2546        jj_expentry[i] = jj_lasttokens[i];
2547      }
2548      boolean exists = false;
2549      for (java.util.Enumeration JavaDoc e = jj_expentries.elements(); e.hasMoreElements();) {
2550        int[] oldentry = (int[])(e.nextElement());
2551        if (oldentry.length == jj_expentry.length) {
2552          exists = true;
2553          for (int i = 0; i < jj_expentry.length; i++) {
2554            if (oldentry[i] != jj_expentry[i]) {
2555              exists = false;
2556              break;
2557            }
2558          }
2559          if (exists) break;
2560        }
2561      }
2562      if (!exists) jj_expentries.addElement(jj_expentry);
2563      if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind;
2564    }
2565  }
2566
2567  public ParseException generateParseException() {
2568    jj_expentries.removeAllElements();
2569    boolean[] la1tokens = new boolean[78];
2570    for (int i = 0; i < 78; i++) {
2571      la1tokens[i] = false;
2572    }
2573    if (jj_kind >= 0) {
2574      la1tokens[jj_kind] = true;
2575      jj_kind = -1;
2576    }
2577    for (int i = 0; i < 95; i++) {
2578      if (jj_la1[i] == jj_gen) {
2579        for (int j = 0; j < 32; j++) {
2580          if ((jj_la1_0[i] & (1<<j)) != 0) {
2581            la1tokens[j] = true;
2582          }
2583          if ((jj_la1_1[i] & (1<<j)) != 0) {
2584            la1tokens[32+j] = true;
2585          }
2586          if ((jj_la1_2[i] & (1<<j)) != 0) {
2587            la1tokens[64+j] = true;
2588          }
2589        }
2590      }
2591    }
2592    for (int i = 0; i < 78; i++) {
2593      if (la1tokens[i]) {
2594        jj_expentry = new int[1];
2595        jj_expentry[0] = i;
2596        jj_expentries.addElement(jj_expentry);
2597      }
2598    }
2599    jj_endpos = 0;
2600    jj_rescan_token();
2601    jj_add_error_token(0, 0);
2602    int[][] exptokseq = new int[jj_expentries.size()][];
2603    for (int i = 0; i < jj_expentries.size(); i++) {
2604      exptokseq[i] = (int[])jj_expentries.elementAt(i);
2605    }
2606    return new ParseException(token, exptokseq, tokenImage);
2607  }
2608
2609  final public void enable_tracing() {
2610  }
2611
2612  final public void disable_tracing() {
2613  }
2614
2615  final private void jj_rescan_token() {
2616    jj_rescan = true;
2617    for (int i = 0; i < 2; i++) {
2618      JJCalls p = jj_2_rtns[i];
2619      do {
2620        if (p.gen > jj_gen) {
2621          jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;
2622          switch (i) {
2623            case 0: jj_3_1(); break;
2624            case 1: jj_3_2(); break;
2625          }
2626        }
2627        p = p.next;
2628      } while (p != null);
2629    }
2630    jj_rescan = false;
2631  }
2632
2633  final private void jj_save(int index, int xla) {
2634    JJCalls p = jj_2_rtns[index];
2635    while (p.gen > jj_gen) {
2636      if (p.next == null) { p = p.next = new JJCalls(); break; }
2637      p = p.next;
2638    }
2639    p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla;
2640  }
2641
2642  static final class JJCalls {
2643    int gen;
2644    Token first;
2645    int arg;
2646    JJCalls next;
2647  }
2648
2649}
2650
Popular Tags