source: josm/trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/parser/MapCSSParser.java@ 4069

Last change on this file since 4069 was 4069, checked in by bastiK, 13 years ago

mapcss: add role based selection (collaborative work by Gubaer and me)

  • Property svn:eol-style set to native
File size: 56.8 KB
Line 
1/* Generated By:JavaCC: Do not edit this line. MapCSSParser.java */
2package org.openstreetmap.josm.gui.mappaint.mapcss.parser;
3
4import java.awt.Color;
5import java.util.ArrayList;
6import java.util.List;
7
8import org.openstreetmap.josm.gui.mappaint.Keyword;
9import org.openstreetmap.josm.gui.mappaint.mapcss.Condition;
10import org.openstreetmap.josm.gui.mappaint.mapcss.Condition.Context;
11import org.openstreetmap.josm.gui.mappaint.mapcss.Expression;
12import org.openstreetmap.josm.gui.mappaint.mapcss.Instruction;
13import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSRule;
14import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSStyleSource;
15import org.openstreetmap.josm.gui.mappaint.mapcss.Selector;
16import org.openstreetmap.josm.gui.mappaint.mapcss.Expression.FunctionExpression;
17import org.openstreetmap.josm.gui.mappaint.mapcss.Expression.LiteralExpression;
18import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSException;
19import org.openstreetmap.josm.gui.mappaint.mapcss.Selector.ChildOrParentSelector;
20import org.openstreetmap.josm.gui.mappaint.mapcss.Selector.GeneralSelector;
21import org.openstreetmap.josm.gui.mappaint.mapcss.Selector.LinkSelector;
22import org.openstreetmap.josm.tools.Pair;
23
24public class MapCSSParser implements MapCSSParserConstants {
25 MapCSSStyleSource sheet;
26
27/*************
28 * Parser definitions
29 *
30 * rule
31 * _______________________|______________________________
32 * | |
33 * selector declaration
34 * _________|___________________ _________|____________
35 * | | | |
36 *
37 * way|z11-12[highway=residential] { color: red; width: 3 }
38 *
39 * |_____||___________________| |_________|
40 * | | |
41 * zoom condition instruction
42 *
43 * more general:
44 *
45 * way|z13-[a=b][c=d]::subpart, way|z-3[u=v]:closed::subpart2 { p1 : val; p2 : val; }
46 *
47 * 'val' can be a literal, or an expression like "prop(width, default) + 0.8".
48 *
49 */
50 final public int uint() throws ParseException {
51 Token i;
52 i = jj_consume_token(UINT);
53 {if (true) return Integer.parseInt(i.image);}
54 throw new Error("Missing return statement in function");
55 }
56
57 final public int int_() throws ParseException {
58 int i;
59 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
60 case MINUS:
61 jj_consume_token(MINUS);
62 i = uint();
63 {if (true) return -i;}
64 break;
65 case UINT:
66 i = uint();
67 {if (true) return i;}
68 break;
69 default:
70 jj_la1[0] = jj_gen;
71 jj_consume_token(-1);
72 throw new ParseException();
73 }
74 throw new Error("Missing return statement in function");
75 }
76
77 final public float ufloat() throws ParseException {
78 Token f;
79 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
80 case UFLOAT:
81 f = jj_consume_token(UFLOAT);
82 break;
83 case UINT:
84 f = jj_consume_token(UINT);
85 break;
86 default:
87 jj_la1[1] = jj_gen;
88 jj_consume_token(-1);
89 throw new ParseException();
90 }
91 {if (true) return Float.parseFloat(f.image);}
92 throw new Error("Missing return statement in function");
93 }
94
95 final public float float_() throws ParseException {
96 float f;
97 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
98 case MINUS:
99 jj_consume_token(MINUS);
100 f = ufloat();
101 {if (true) return -f;}
102 break;
103 case UINT:
104 case UFLOAT:
105 f = ufloat();
106 {if (true) return f;}
107 break;
108 default:
109 jj_la1[2] = jj_gen;
110 jj_consume_token(-1);
111 throw new ParseException();
112 }
113 throw new Error("Missing return statement in function");
114 }
115
116 final public String string() throws ParseException {
117 Token t;
118 t = jj_consume_token(STRING);
119 {if (true) return t.image.substring(1, t.image.length() - 1).replace("\\\"", "\"").replace("\\\\", "\\");}
120 throw new Error("Missing return statement in function");
121 }
122
123 final public String string_or_ident() throws ParseException {
124 Token t;
125 String s;
126 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
127 case IDENT:
128 t = jj_consume_token(IDENT);
129 {if (true) return t.image;}
130 break;
131 case STRING:
132 s = string();
133 {if (true) return s;}
134 break;
135 default:
136 jj_la1[3] = jj_gen;
137 jj_consume_token(-1);
138 throw new ParseException();
139 }
140 throw new Error("Missing return statement in function");
141 }
142
143 final public String regex() throws ParseException {
144 Token t;
145 t = jj_consume_token(REGEX);
146 {if (true) return t.image.substring(1, t.image.length() - 1);}
147 throw new Error("Missing return statement in function");
148 }
149
150/**
151 * white-space
152 */
153 final public void s() throws ParseException {
154 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
155 case S:
156 jj_consume_token(S);
157 break;
158 default:
159 jj_la1[4] = jj_gen;
160 ;
161 }
162 }
163
164/**
165 * mix of white-space and comments
166 */
167 final public void w() throws ParseException {
168 label_1:
169 while (true) {
170 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
171 case S:
172 case COMMENT_START:
173 ;
174 break;
175 default:
176 jj_la1[5] = jj_gen;
177 break label_1;
178 }
179 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
180 case S:
181 jj_consume_token(S);
182 break;
183 case COMMENT_START:
184 jj_consume_token(COMMENT_START);
185 jj_consume_token(COMMENT_END);
186 break;
187 default:
188 jj_la1[6] = jj_gen;
189 jj_consume_token(-1);
190 throw new ParseException();
191 }
192 }
193 }
194
195/**
196 * comma delimited list of floats (at least 2, all >= 0)
197 */
198 final public List<Float> float_array() throws ParseException {
199 float f;
200 List<Float> fs = new ArrayList<Float>();
201 f = ufloat();
202 fs.add(f);
203 label_2:
204 while (true) {
205 jj_consume_token(COMMA);
206 s();
207 f = ufloat();
208 fs.add(f);
209 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
210 case COMMA:
211 ;
212 break;
213 default:
214 jj_la1[7] = jj_gen;
215 break label_2;
216 }
217 }
218 {if (true) return fs;}
219 throw new Error("Missing return statement in function");
220 }
221
222/**
223 * root
224 */
225 final public void sheet(MapCSSStyleSource sheet) throws ParseException {
226 MapCSSRule r;
227 Token com = null;
228 this.sheet = sheet;
229 w();
230 label_3:
231 while (true) {
232 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
233 case IDENT:
234 case STAR:
235 ;
236 break;
237 default:
238 jj_la1[8] = jj_gen;
239 break label_3;
240 }
241 try {
242 /* try {*/
243 r = rule();
244 if (r != null) { sheet.rules.add(r); }
245 w();
246 } catch (MapCSSException mex) {
247 error_skipto(RBRACE, mex);
248 w();
249/* throw new ParseException(mex.getMessage());*/
250/* }*/
251
252 } catch (ParseException ex) {
253 error_skipto(RBRACE, null);
254 w();
255 }
256 }
257 jj_consume_token(0);
258 }
259
260 final public MapCSSRule rule() throws ParseException {
261 List<Selector> selectors = new ArrayList<Selector>();
262 Selector sel;
263 List<Instruction> decl;
264 sel = child_selector();
265 selectors.add(sel);
266 label_4:
267 while (true) {
268 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
269 case COMMA:
270 ;
271 break;
272 default:
273 jj_la1[9] = jj_gen;
274 break label_4;
275 }
276 jj_consume_token(COMMA);
277 w();
278 sel = child_selector();
279 selectors.add(sel);
280 }
281 decl = declaration();
282 {if (true) return new MapCSSRule(selectors, decl);}
283 throw new Error("Missing return statement in function");
284 }
285
286 final public Selector child_selector() throws ParseException {
287 boolean parentSelector = false;
288 Condition c;
289 List<Condition> conditions = new ArrayList<Condition>();
290 Selector selLeft;
291 LinkSelector selLink = null;
292 Selector selRight = null;
293 selLeft = selector();
294 w();
295 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
296 case GREATER:
297 case LESS:
298 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
299 case GREATER:
300 jj_consume_token(GREATER);
301 parentSelector = false;
302 break;
303 case LESS:
304 jj_consume_token(LESS);
305 parentSelector = true;
306 break;
307 default:
308 jj_la1[10] = jj_gen;
309 jj_consume_token(-1);
310 throw new ParseException();
311 }
312 label_5:
313 while (true) {
314 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
315 case LSQUARE:
316 case EXCLAMATION:
317 case COLON:
318 ;
319 break;
320 default:
321 jj_la1[11] = jj_gen;
322 break label_5;
323 }
324 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
325 case LSQUARE:
326 c = condition(Context.LINK);
327 break;
328 case EXCLAMATION:
329 case COLON:
330 c = pseudoclass(Context.LINK);
331 break;
332 default:
333 jj_la1[12] = jj_gen;
334 jj_consume_token(-1);
335 throw new ParseException();
336 }
337 conditions.add(c);
338 }
339 selLink = new LinkSelector(conditions);
340 w();
341 selRight = selector();
342 w();
343 break;
344 default:
345 jj_la1[13] = jj_gen;
346 ;
347 }
348 {if (true) return selRight != null ? new ChildOrParentSelector(selLeft, selLink, selRight, parentSelector) : selLeft;}
349 throw new Error("Missing return statement in function");
350 }
351
352 final public Selector selector() throws ParseException {
353 Token base;
354 Condition c;
355 Pair<Integer, Integer> r = null;
356 List<Condition> conditions = new ArrayList<Condition>();
357 String sub = null;
358 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
359 case IDENT:
360 base = jj_consume_token(IDENT);
361 break;
362 case STAR:
363 base = jj_consume_token(STAR);
364 break;
365 default:
366 jj_la1[14] = jj_gen;
367 jj_consume_token(-1);
368 throw new ParseException();
369 }
370 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
371 case PIPE_Z:
372 r = zoom();
373 break;
374 default:
375 jj_la1[15] = jj_gen;
376 ;
377 }
378 label_6:
379 while (true) {
380 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
381 case LSQUARE:
382 case EXCLAMATION:
383 case COLON:
384 ;
385 break;
386 default:
387 jj_la1[16] = jj_gen;
388 break label_6;
389 }
390 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
391 case LSQUARE:
392 c = condition(Context.PRIMITIVE);
393 break;
394 case EXCLAMATION:
395 case COLON:
396 c = pseudoclass(Context.PRIMITIVE);
397 break;
398 default:
399 jj_la1[17] = jj_gen;
400 jj_consume_token(-1);
401 throw new ParseException();
402 }
403 conditions.add(c);
404 }
405 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
406 case DCOLON:
407 sub = subpart();
408 break;
409 default:
410 jj_la1[18] = jj_gen;
411 ;
412 }
413 {if (true) return new GeneralSelector(base.image, r, conditions, sub);}
414 throw new Error("Missing return statement in function");
415 }
416
417 final public Pair<Integer, Integer> zoom() throws ParseException {
418 Integer min = 0;
419 Integer max = Integer.MAX_VALUE;
420 jj_consume_token(PIPE_Z);
421 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
422 case MINUS:
423 jj_consume_token(MINUS);
424 max = uint();
425 break;
426 case UINT:
427 min = uint();
428 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
429 case MINUS:
430 jj_consume_token(MINUS);
431 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
432 case UINT:
433 max = uint();
434 break;
435 default:
436 jj_la1[19] = jj_gen;
437 ;
438 }
439 break;
440 default:
441 jj_la1[20] = jj_gen;
442 ;
443 }
444 break;
445 default:
446 jj_la1[21] = jj_gen;
447 jj_consume_token(-1);
448 throw new ParseException();
449 }
450 {if (true) return new Pair<Integer, Integer>(min, max);}
451 throw new Error("Missing return statement in function");
452 }
453
454 final public Condition condition(Context context) throws ParseException {
455 Condition c;
456 Expression e;
457 jj_consume_token(LSQUARE);
458 s();
459 if (jj_2_1(2147483647)) {
460 c = simple_key_condition(context);
461 s();
462 jj_consume_token(RSQUARE);
463 {if (true) return c;}
464 } else if (jj_2_2(2147483647)) {
465 c = simple_key_value_condition(context);
466 s();
467 jj_consume_token(RSQUARE);
468 {if (true) return c;}
469 } else {
470 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
471 case IDENT:
472 case UINT:
473 case UFLOAT:
474 case STRING:
475 case HEXCOLOR:
476 case LPAR:
477 case EXCLAMATION:
478 case PLUS:
479 case MINUS:
480 e = expression();
481 jj_consume_token(RSQUARE);
482 {if (true) return Condition.create(e, context);}
483 break;
484 default:
485 jj_la1[22] = jj_gen;
486 jj_consume_token(-1);
487 throw new ParseException();
488 }
489 }
490 throw new Error("Missing return statement in function");
491 }
492
493 final public String tag_key() throws ParseException {
494 String s;
495 Token t;
496 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
497 case STRING:
498 s = string();
499 {if (true) return s;}
500 break;
501 case IDENT:
502 t = jj_consume_token(IDENT);
503 s = t.image;
504 label_7:
505 while (true) {
506 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
507 case COLON:
508 ;
509 break;
510 default:
511 jj_la1[23] = jj_gen;
512 break label_7;
513 }
514 jj_consume_token(COLON);
515 t = jj_consume_token(IDENT);
516 s += ':' + t.image;
517 }
518 {if (true) return s;}
519 break;
520 default:
521 jj_la1[24] = jj_gen;
522 jj_consume_token(-1);
523 throw new ParseException();
524 }
525 throw new Error("Missing return statement in function");
526 }
527
528 final public Condition simple_key_condition(Context context) throws ParseException {
529 boolean not = false;
530 boolean yes = false;
531 String key;
532 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
533 case EXCLAMATION:
534 jj_consume_token(EXCLAMATION);
535 not = true;
536 break;
537 default:
538 jj_la1[25] = jj_gen;
539 ;
540 }
541 key = tag_key();
542 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
543 case QUESTION:
544 jj_consume_token(QUESTION);
545 yes = true;
546 break;
547 default:
548 jj_la1[26] = jj_gen;
549 ;
550 }
551 {if (true) return Condition.create(key, not, yes, context);}
552 throw new Error("Missing return statement in function");
553 }
554
555 final public Condition simple_key_value_condition(Context context) throws ParseException {
556 String key;
557 String val;
558 float f;
559 int i;
560 Condition.Op op;
561 key = tag_key();
562 s();
563 if (jj_2_4(2)) {
564 jj_consume_token(EQUAL);
565 jj_consume_token(TILDE);
566 op=Condition.Op.REGEX;
567 s();
568 val = regex();
569 } else {
570 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
571 case STAR:
572 case EQUAL:
573 case EXCLAMATION:
574 case TILDE:
575 case DOLLAR:
576 case CARET:
577 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
578 case EXCLAMATION:
579 jj_consume_token(EXCLAMATION);
580 jj_consume_token(EQUAL);
581 op=Condition.Op.NEQ;
582 break;
583 case EQUAL:
584 jj_consume_token(EQUAL);
585 op=Condition.Op.EQ;
586 break;
587 case TILDE:
588 jj_consume_token(TILDE);
589 jj_consume_token(EQUAL);
590 op=Condition.Op.ONE_OF;
591 break;
592 case CARET:
593 jj_consume_token(CARET);
594 jj_consume_token(EQUAL);
595 op=Condition.Op.BEGINS_WITH;
596 break;
597 case DOLLAR:
598 jj_consume_token(DOLLAR);
599 jj_consume_token(EQUAL);
600 op=Condition.Op.ENDS_WITH;
601 break;
602 case STAR:
603 jj_consume_token(STAR);
604 jj_consume_token(EQUAL);
605 op=Condition.Op.CONTAINS;
606 break;
607 default:
608 jj_la1[27] = jj_gen;
609 jj_consume_token(-1);
610 throw new ParseException();
611 }
612 s();
613 if (jj_2_3(2)) {
614 i = int_();
615 val=Integer.toString(i);
616 } else {
617 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
618 case UINT:
619 case UFLOAT:
620 case MINUS:
621 f = float_();
622 val=Float.toString(f);
623 break;
624 case IDENT:
625 case STRING:
626 val = string_or_ident();
627 break;
628 default:
629 jj_la1[28] = jj_gen;
630 jj_consume_token(-1);
631 throw new ParseException();
632 }
633 }
634 break;
635 case GREATER_EQUAL:
636 case LESS_EQUAL:
637 case GREATER:
638 case LESS:
639 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
640 case GREATER_EQUAL:
641 jj_consume_token(GREATER_EQUAL);
642 op=Condition.Op.GREATER_OR_EQUAL;
643 break;
644 case GREATER:
645 jj_consume_token(GREATER);
646 op=Condition.Op.GREATER;
647 break;
648 case LESS_EQUAL:
649 jj_consume_token(LESS_EQUAL);
650 op=Condition.Op.LESS_OR_EQUAL;
651 break;
652 case LESS:
653 jj_consume_token(LESS);
654 op=Condition.Op.LESS;
655 break;
656 default:
657 jj_la1[29] = jj_gen;
658 jj_consume_token(-1);
659 throw new ParseException();
660 }
661 s();
662 f = float_();
663 val=Float.toString(f);
664 break;
665 default:
666 jj_la1[30] = jj_gen;
667 jj_consume_token(-1);
668 throw new ParseException();
669 }
670 }
671 {if (true) return Condition.create(key, val, op, context);}
672 throw new Error("Missing return statement in function");
673 }
674
675 final public Condition pseudoclass(Context context) throws ParseException {
676 Token t;
677 boolean not = false;
678 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
679 case EXCLAMATION:
680 jj_consume_token(EXCLAMATION);
681 not = true;
682 break;
683 default:
684 jj_la1[31] = jj_gen;
685 ;
686 }
687 jj_consume_token(COLON);
688 t = jj_consume_token(IDENT);
689 {if (true) return Condition.create(t.image, not, context);}
690 throw new Error("Missing return statement in function");
691 }
692
693 final public String subpart() throws ParseException {
694 Token t;
695 jj_consume_token(DCOLON);
696 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
697 case IDENT:
698 t = jj_consume_token(IDENT);
699 break;
700 case STAR:
701 t = jj_consume_token(STAR);
702 break;
703 default:
704 jj_la1[32] = jj_gen;
705 jj_consume_token(-1);
706 throw new ParseException();
707 }
708 {if (true) return t.image;}
709 throw new Error("Missing return statement in function");
710 }
711
712 final public List<Instruction> declaration() throws ParseException {
713 List<Instruction> ins = new ArrayList<Instruction>();
714 Instruction i;
715 Token key;
716 Object val;
717 jj_consume_token(LBRACE);
718 w();
719 label_8:
720 while (true) {
721 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
722 case IDENT:
723 ;
724 break;
725 default:
726 jj_la1[33] = jj_gen;
727 break label_8;
728 }
729 key = jj_consume_token(IDENT);
730 w();
731 jj_consume_token(COLON);
732 w();
733 if (jj_2_5(2147483647)) {
734 val = float_array();
735 ins.add(new Instruction.AssignmentInstruction(key.image, val));
736 w();
737 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
738 case RBRACE:
739 jj_consume_token(RBRACE);
740 {if (true) return ins;}
741 break;
742 case SEMICOLON:
743 jj_consume_token(SEMICOLON);
744 w();
745 break;
746 default:
747 jj_la1[34] = jj_gen;
748 jj_consume_token(-1);
749 throw new ParseException();
750 }
751 } else if (jj_2_6(2147483647)) {
752 val = expression();
753 ins.add(new Instruction.AssignmentInstruction(key.image, val));
754 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
755 case RBRACE:
756 jj_consume_token(RBRACE);
757 {if (true) return ins;}
758 break;
759 case SEMICOLON:
760 jj_consume_token(SEMICOLON);
761 w();
762 break;
763 default:
764 jj_la1[35] = jj_gen;
765 jj_consume_token(-1);
766 throw new ParseException();
767 }
768 } else {
769 val = readRaw();
770 w();
771 ins.add(new Instruction.AssignmentInstruction(key.image, val));
772 }
773 }
774 jj_consume_token(RBRACE);
775 {if (true) return ins;}
776 throw new Error("Missing return statement in function");
777 }
778
779 final public Expression expression() throws ParseException {
780 List<Expression> args = new ArrayList<Expression>();
781 Expression e;
782 String op = null;
783 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
784 case EXCLAMATION:
785 jj_consume_token(EXCLAMATION);
786 op = "not";
787 w();
788 e = primary();
789 args.add(e);
790 w();
791 break;
792 case MINUS:
793 jj_consume_token(MINUS);
794 op = "minus";
795 w();
796 e = primary();
797 args.add(e);
798 w();
799 break;
800 case IDENT:
801 case UINT:
802 case UFLOAT:
803 case STRING:
804 case HEXCOLOR:
805 case LPAR:
806 case PLUS:
807 e = primary();
808 args.add(e);
809 w();
810 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
811 case STAR:
812 case SLASH:
813 case GREATER_EQUAL:
814 case LESS_EQUAL:
815 case GREATER:
816 case LESS:
817 case EQUAL:
818 case PIPE:
819 case PLUS:
820 case MINUS:
821 case AMPERSAND:
822 case QUESTION:
823 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
824 case PLUS:
825 label_9:
826 while (true) {
827 jj_consume_token(PLUS);
828 op = "plus";
829 w();
830 e = primary();
831 args.add(e);
832 w();
833 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
834 case PLUS:
835 ;
836 break;
837 default:
838 jj_la1[36] = jj_gen;
839 break label_9;
840 }
841 }
842 break;
843 case STAR:
844 label_10:
845 while (true) {
846 jj_consume_token(STAR);
847 op = "times";
848 w();
849 e = primary();
850 args.add(e);
851 w();
852 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
853 case STAR:
854 ;
855 break;
856 default:
857 jj_la1[37] = jj_gen;
858 break label_10;
859 }
860 }
861 break;
862 case MINUS:
863 label_11:
864 while (true) {
865 jj_consume_token(MINUS);
866 op = "minus";
867 w();
868 e = primary();
869 args.add(e);
870 w();
871 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
872 case MINUS:
873 ;
874 break;
875 default:
876 jj_la1[38] = jj_gen;
877 break label_11;
878 }
879 }
880 break;
881 case SLASH:
882 label_12:
883 while (true) {
884 jj_consume_token(SLASH);
885 op = "divided_by";
886 w();
887 e = primary();
888 args.add(e);
889 w();
890 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
891 case SLASH:
892 ;
893 break;
894 default:
895 jj_la1[39] = jj_gen;
896 break label_12;
897 }
898 }
899 break;
900 case GREATER_EQUAL:
901 jj_consume_token(GREATER_EQUAL);
902 op = "greater_equal";
903 w();
904 e = primary();
905 args.add(e);
906 w();
907 break;
908 case LESS_EQUAL:
909 jj_consume_token(LESS_EQUAL);
910 op = "less_equal";
911 w();
912 e = primary();
913 args.add(e);
914 w();
915 break;
916 case GREATER:
917 jj_consume_token(GREATER);
918 op = "greater";
919 w();
920 e = primary();
921 args.add(e);
922 w();
923 break;
924 case EQUAL:
925 jj_consume_token(EQUAL);
926 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
927 case EQUAL:
928 jj_consume_token(EQUAL);
929 break;
930 default:
931 jj_la1[40] = jj_gen;
932 ;
933 }
934 op = "equal";
935 w();
936 e = primary();
937 args.add(e);
938 w();
939 break;
940 case LESS:
941 jj_consume_token(LESS);
942 op = "less";
943 w();
944 e = primary();
945 args.add(e);
946 w();
947 break;
948 case AMPERSAND:
949 jj_consume_token(AMPERSAND);
950 jj_consume_token(AMPERSAND);
951 op = "and";
952 w();
953 e = primary();
954 args.add(e);
955 w();
956 break;
957 case PIPE:
958 jj_consume_token(PIPE);
959 jj_consume_token(PIPE);
960 op = "or";
961 w();
962 e = primary();
963 args.add(e);
964 w();
965 break;
966 case QUESTION:
967 jj_consume_token(QUESTION);
968 op = "cond";
969 w();
970 e = primary();
971 args.add(e);
972 w();
973 jj_consume_token(COLON);
974 w();
975 e = primary();
976 args.add(e);
977 w();
978 break;
979 default:
980 jj_la1[41] = jj_gen;
981 jj_consume_token(-1);
982 throw new ParseException();
983 }
984 break;
985 default:
986 jj_la1[42] = jj_gen;
987 ;
988 }
989 break;
990 default:
991 jj_la1[43] = jj_gen;
992 jj_consume_token(-1);
993 throw new ParseException();
994 }
995 if (op == null)
996 {if (true) return args.get(0);}
997 {if (true) return new FunctionExpression(op, args);}
998 throw new Error("Missing return statement in function");
999 }
1000
1001 final public Expression primary() throws ParseException {
1002 Expression nested;
1003 FunctionExpression fn;
1004 Object lit;
1005 if (jj_2_7(3)) {
1006 // both function and identifier start with an identifier (+ optional whitespace)
1007 fn = function();
1008 {if (true) return fn;}
1009 } else {
1010 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1011 case IDENT:
1012 case UINT:
1013 case UFLOAT:
1014 case STRING:
1015 case HEXCOLOR:
1016 case PLUS:
1017 lit = literal();
1018 {if (true) return new LiteralExpression(lit);}
1019 break;
1020 case LPAR:
1021 jj_consume_token(LPAR);
1022 w();
1023 nested = expression();
1024 jj_consume_token(RPAR);
1025 {if (true) return nested;}
1026 break;
1027 default:
1028 jj_la1[44] = jj_gen;
1029 jj_consume_token(-1);
1030 throw new ParseException();
1031 }
1032 }
1033 throw new Error("Missing return statement in function");
1034 }
1035
1036 final public FunctionExpression function() throws ParseException {
1037 Token tmp;
1038 Expression arg;
1039 String name;
1040 List<Expression> args = new ArrayList<Expression>();
1041 tmp = jj_consume_token(IDENT);
1042 name = tmp.image;
1043 w();
1044 jj_consume_token(LPAR);
1045 w();
1046 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1047 case IDENT:
1048 case UINT:
1049 case UFLOAT:
1050 case STRING:
1051 case HEXCOLOR:
1052 case LPAR:
1053 case EXCLAMATION:
1054 case PLUS:
1055 case MINUS:
1056 arg = expression();
1057 args.add(arg);
1058 label_13:
1059 while (true) {
1060 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1061 case COMMA:
1062 ;
1063 break;
1064 default:
1065 jj_la1[45] = jj_gen;
1066 break label_13;
1067 }
1068 jj_consume_token(COMMA);
1069 w();
1070 arg = expression();
1071 args.add(arg);
1072 }
1073 break;
1074 default:
1075 jj_la1[46] = jj_gen;
1076 ;
1077 }
1078 jj_consume_token(RPAR);
1079 {if (true) return new FunctionExpression(name, args);}
1080 throw new Error("Missing return statement in function");
1081 }
1082
1083 final public Object literal() throws ParseException {
1084 String val;
1085 Token t;
1086 float f;
1087 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1088 case IDENT:
1089 t = jj_consume_token(IDENT);
1090 {if (true) return new Keyword(t.image);}
1091 break;
1092 case STRING:
1093 val = string();
1094 {if (true) return val;}
1095 break;
1096 case PLUS:
1097 jj_consume_token(PLUS);
1098 f = ufloat();
1099 {if (true) return new Instruction.RelativeFloat(f);}
1100 break;
1101 case UINT:
1102 case UFLOAT:
1103 f = ufloat();
1104 {if (true) return f;}
1105 break;
1106 case HEXCOLOR:
1107 t = jj_consume_token(HEXCOLOR);
1108 String clr = t.image.substring(1);
1109 if (clr.length() == 3) {
1110 clr = new String(new char[] {clr.charAt(0),clr.charAt(0),clr.charAt(1),clr.charAt(1),clr.charAt(2),clr.charAt(2)});
1111 }
1112 if (clr.length() != 6)
1113 {if (true) throw new AssertionError();}
1114 {if (true) return new Color(Integer.parseInt(clr, 16));}
1115 break;
1116 default:
1117 jj_la1[47] = jj_gen;
1118 jj_consume_token(-1);
1119 throw new ParseException();
1120 }
1121 throw new Error("Missing return statement in function");
1122 }
1123
1124 void error_skipto(int kind, MapCSSException me) throws ParseException {
1125 if (token.kind == EOF)
1126 throw new ParseException("Reached end of file while parsing");
1127
1128 Exception e = null;
1129 ParseException pe = generateParseException();
1130
1131 if (me != null) {
1132 me.setLine(pe.currentToken.next.beginLine);
1133 me.setColumn(pe.currentToken.next.beginColumn);
1134 e = me;
1135 } else {
1136 e = new ParseException(pe.getMessage()); // prevent memory leak
1137 }
1138
1139 System.err.println("Skipping to the next rule, because of an error:");
1140 System.err.println(e);
1141 if (sheet != null) {
1142 sheet.logError(e);
1143 }
1144 Token t;
1145 do {
1146 t = getNextToken();
1147 } while (t.kind != kind && t.kind != EOF);
1148 if (t.kind == EOF)
1149 throw new ParseException("Reached end of file while parsing");
1150 }
1151
1152/**
1153 * read everything to the next semicolon
1154 */
1155 String readRaw() throws ParseException {
1156 Token t;
1157 StringBuilder s = new StringBuilder();
1158 while (true) {
1159 t = getNextToken();
1160 if ((t.kind == S || t.kind == STRING || t.kind == UNEXPECTED_CHAR) &&
1161 t.image.contains("\n")) {
1162 ParseException e = new ParseException(String.format("Warning: end of line while reading an unquoted string at line %s column %s.", t.beginLine, t.beginColumn));
1163 System.err.println(e);
1164 if (sheet != null) {
1165 sheet.logError(e);
1166 }
1167 }
1168 if (t.kind == SEMICOLON || t.kind == EOF)
1169 break;
1170 s.append(t.image);
1171 }
1172 if (t.kind == EOF)
1173 throw new ParseException("Reached end of file while parsing");
1174 return s.toString();
1175 }
1176
1177 private boolean jj_2_1(int xla) {
1178 jj_la = xla; jj_lastpos = jj_scanpos = token;
1179 try { return !jj_3_1(); }
1180 catch(LookaheadSuccess ls) { return true; }
1181 finally { jj_save(0, xla); }
1182 }
1183
1184 private boolean jj_2_2(int xla) {
1185 jj_la = xla; jj_lastpos = jj_scanpos = token;
1186 try { return !jj_3_2(); }
1187 catch(LookaheadSuccess ls) { return true; }
1188 finally { jj_save(1, xla); }
1189 }
1190
1191 private boolean jj_2_3(int xla) {
1192 jj_la = xla; jj_lastpos = jj_scanpos = token;
1193 try { return !jj_3_3(); }
1194 catch(LookaheadSuccess ls) { return true; }
1195 finally { jj_save(2, xla); }
1196 }
1197
1198 private boolean jj_2_4(int xla) {
1199 jj_la = xla; jj_lastpos = jj_scanpos = token;
1200 try { return !jj_3_4(); }
1201 catch(LookaheadSuccess ls) { return true; }
1202 finally { jj_save(3, xla); }
1203 }
1204
1205 private boolean jj_2_5(int xla) {
1206 jj_la = xla; jj_lastpos = jj_scanpos = token;
1207 try { return !jj_3_5(); }
1208 catch(LookaheadSuccess ls) { return true; }
1209 finally { jj_save(4, xla); }
1210 }
1211
1212 private boolean jj_2_6(int xla) {
1213 jj_la = xla; jj_lastpos = jj_scanpos = token;
1214 try { return !jj_3_6(); }
1215 catch(LookaheadSuccess ls) { return true; }
1216 finally { jj_save(5, xla); }
1217 }
1218
1219 private boolean jj_2_7(int xla) {
1220 jj_la = xla; jj_lastpos = jj_scanpos = token;
1221 try { return !jj_3_7(); }
1222 catch(LookaheadSuccess ls) { return true; }
1223 finally { jj_save(6, xla); }
1224 }
1225
1226 private boolean jj_3R_25() {
1227 Token xsp;
1228 xsp = jj_scanpos;
1229 if (jj_3R_39()) {
1230 jj_scanpos = xsp;
1231 if (jj_3R_40()) {
1232 jj_scanpos = xsp;
1233 if (jj_3R_41()) {
1234 jj_scanpos = xsp;
1235 if (jj_3R_42()) {
1236 jj_scanpos = xsp;
1237 if (jj_3R_43()) {
1238 jj_scanpos = xsp;
1239 if (jj_3R_44()) return true;
1240 }
1241 }
1242 }
1243 }
1244 }
1245 if (jj_3R_15()) return true;
1246 xsp = jj_scanpos;
1247 if (jj_3_3()) {
1248 jj_scanpos = xsp;
1249 if (jj_3R_45()) {
1250 jj_scanpos = xsp;
1251 if (jj_3R_46()) return true;
1252 }
1253 }
1254 return false;
1255 }
1256
1257 private boolean jj_3R_15() {
1258 Token xsp;
1259 xsp = jj_scanpos;
1260 if (jj_scan_token(9)) jj_scanpos = xsp;
1261 return false;
1262 }
1263
1264 private boolean jj_3R_60() {
1265 if (jj_3R_29()) return true;
1266 return false;
1267 }
1268
1269 private boolean jj_3R_57() {
1270 if (jj_scan_token(COLON)) return true;
1271 if (jj_scan_token(IDENT)) return true;
1272 return false;
1273 }
1274
1275 private boolean jj_3_4() {
1276 if (jj_scan_token(EQUAL)) return true;
1277 if (jj_scan_token(TILDE)) return true;
1278 if (jj_3R_15()) return true;
1279 if (jj_3R_38()) return true;
1280 return false;
1281 }
1282
1283 private boolean jj_3R_86() {
1284 if (jj_scan_token(HEXCOLOR)) return true;
1285 return false;
1286 }
1287
1288 private boolean jj_3R_85() {
1289 if (jj_3R_29()) return true;
1290 return false;
1291 }
1292
1293 private boolean jj_3R_84() {
1294 if (jj_scan_token(PLUS)) return true;
1295 if (jj_3R_29()) return true;
1296 return false;
1297 }
1298
1299 private boolean jj_3R_38() {
1300 if (jj_scan_token(REGEX)) return true;
1301 return false;
1302 }
1303
1304 private boolean jj_3R_16() {
1305 if (jj_3R_23()) return true;
1306 if (jj_3R_15()) return true;
1307 Token xsp;
1308 xsp = jj_scanpos;
1309 if (jj_3_4()) {
1310 jj_scanpos = xsp;
1311 if (jj_3R_25()) {
1312 jj_scanpos = xsp;
1313 if (jj_3R_26()) return true;
1314 }
1315 }
1316 return false;
1317 }
1318
1319 private boolean jj_3R_83() {
1320 if (jj_3R_56()) return true;
1321 return false;
1322 }
1323
1324 private boolean jj_3R_82() {
1325 if (jj_scan_token(IDENT)) return true;
1326 return false;
1327 }
1328
1329 private boolean jj_3R_77() {
1330 Token xsp;
1331 xsp = jj_scanpos;
1332 if (jj_3R_82()) {
1333 jj_scanpos = xsp;
1334 if (jj_3R_83()) {
1335 jj_scanpos = xsp;
1336 if (jj_3R_84()) {
1337 jj_scanpos = xsp;
1338 if (jj_3R_85()) {
1339 jj_scanpos = xsp;
1340 if (jj_3R_86()) return true;
1341 }
1342 }
1343 }
1344 }
1345 return false;
1346 }
1347
1348 private boolean jj_3R_58() {
1349 Token xsp;
1350 xsp = jj_scanpos;
1351 if (jj_3R_75()) {
1352 jj_scanpos = xsp;
1353 if (jj_3R_76()) return true;
1354 }
1355 return false;
1356 }
1357
1358 private boolean jj_3R_75() {
1359 if (jj_scan_token(IDENT)) return true;
1360 return false;
1361 }
1362
1363 private boolean jj_3R_28() {
1364 if (jj_3R_52()) return true;
1365 return false;
1366 }
1367
1368 private boolean jj_3R_24() {
1369 if (jj_scan_token(QUESTION)) return true;
1370 return false;
1371 }
1372
1373 private boolean jj_3R_22() {
1374 if (jj_scan_token(EXCLAMATION)) return true;
1375 return false;
1376 }
1377
1378 private boolean jj_3R_87() {
1379 if (jj_scan_token(COMMA)) return true;
1380 if (jj_3R_19()) return true;
1381 if (jj_3R_20()) return true;
1382 return false;
1383 }
1384
1385 private boolean jj_3R_14() {
1386 Token xsp;
1387 xsp = jj_scanpos;
1388 if (jj_3R_22()) jj_scanpos = xsp;
1389 if (jj_3R_23()) return true;
1390 xsp = jj_scanpos;
1391 if (jj_3R_24()) jj_scanpos = xsp;
1392 return false;
1393 }
1394
1395 private boolean jj_3R_56() {
1396 if (jj_scan_token(STRING)) return true;
1397 return false;
1398 }
1399
1400 private boolean jj_3R_35() {
1401 if (jj_3R_20()) return true;
1402 Token xsp;
1403 while (true) {
1404 xsp = jj_scanpos;
1405 if (jj_3R_87()) { jj_scanpos = xsp; break; }
1406 }
1407 return false;
1408 }
1409
1410 private boolean jj_3R_37() {
1411 if (jj_scan_token(IDENT)) return true;
1412 Token xsp;
1413 while (true) {
1414 xsp = jj_scanpos;
1415 if (jj_3R_57()) { jj_scanpos = xsp; break; }
1416 }
1417 return false;
1418 }
1419
1420 private boolean jj_3R_36() {
1421 if (jj_3R_56()) return true;
1422 return false;
1423 }
1424
1425 private boolean jj_3R_23() {
1426 Token xsp;
1427 xsp = jj_scanpos;
1428 if (jj_3R_36()) {
1429 jj_scanpos = xsp;
1430 if (jj_3R_37()) return true;
1431 }
1432 return false;
1433 }
1434
1435 private boolean jj_3R_21() {
1436 if (jj_scan_token(IDENT)) return true;
1437 if (jj_3R_19()) return true;
1438 if (jj_scan_token(LPAR)) return true;
1439 if (jj_3R_19()) return true;
1440 Token xsp;
1441 xsp = jj_scanpos;
1442 if (jj_3R_35()) jj_scanpos = xsp;
1443 if (jj_scan_token(RPAR)) return true;
1444 return false;
1445 }
1446
1447 private boolean jj_3R_51() {
1448 Token xsp;
1449 xsp = jj_scanpos;
1450 if (jj_3R_59()) {
1451 jj_scanpos = xsp;
1452 if (jj_3R_60()) return true;
1453 }
1454 return false;
1455 }
1456
1457 private boolean jj_3R_59() {
1458 if (jj_scan_token(MINUS)) return true;
1459 if (jj_3R_29()) return true;
1460 return false;
1461 }
1462
1463 private boolean jj_3_2() {
1464 if (jj_3R_16()) return true;
1465 if (jj_3R_15()) return true;
1466 if (jj_scan_token(RSQUARE)) return true;
1467 return false;
1468 }
1469
1470 private boolean jj_3_1() {
1471 if (jj_3R_14()) return true;
1472 if (jj_3R_15()) return true;
1473 if (jj_scan_token(RSQUARE)) return true;
1474 return false;
1475 }
1476
1477 private boolean jj_3R_62() {
1478 if (jj_scan_token(LPAR)) return true;
1479 if (jj_3R_19()) return true;
1480 if (jj_3R_20()) return true;
1481 if (jj_scan_token(RPAR)) return true;
1482 return false;
1483 }
1484
1485 private boolean jj_3R_61() {
1486 if (jj_3R_77()) return true;
1487 return false;
1488 }
1489
1490 private boolean jj_3R_29() {
1491 Token xsp;
1492 xsp = jj_scanpos;
1493 if (jj_scan_token(3)) {
1494 jj_scanpos = xsp;
1495 if (jj_scan_token(2)) return true;
1496 }
1497 return false;
1498 }
1499
1500 private boolean jj_3_7() {
1501 if (jj_3R_21()) return true;
1502 return false;
1503 }
1504
1505 private boolean jj_3R_54() {
1506 Token xsp;
1507 xsp = jj_scanpos;
1508 if (jj_3_7()) {
1509 jj_scanpos = xsp;
1510 if (jj_3R_61()) {
1511 jj_scanpos = xsp;
1512 if (jj_3R_62()) return true;
1513 }
1514 }
1515 return false;
1516 }
1517
1518 private boolean jj_3R_27() {
1519 if (jj_scan_token(MINUS)) return true;
1520 if (jj_3R_52()) return true;
1521 return false;
1522 }
1523
1524 private boolean jj_3R_17() {
1525 Token xsp;
1526 xsp = jj_scanpos;
1527 if (jj_3R_27()) {
1528 jj_scanpos = xsp;
1529 if (jj_3R_28()) return true;
1530 }
1531 return false;
1532 }
1533
1534 private boolean jj_3R_74() {
1535 if (jj_scan_token(QUESTION)) return true;
1536 if (jj_3R_19()) return true;
1537 if (jj_3R_54()) return true;
1538 if (jj_3R_19()) return true;
1539 if (jj_scan_token(COLON)) return true;
1540 if (jj_3R_19()) return true;
1541 if (jj_3R_54()) return true;
1542 if (jj_3R_19()) return true;
1543 return false;
1544 }
1545
1546 private boolean jj_3R_73() {
1547 if (jj_scan_token(PIPE)) return true;
1548 if (jj_scan_token(PIPE)) return true;
1549 if (jj_3R_19()) return true;
1550 if (jj_3R_54()) return true;
1551 if (jj_3R_19()) return true;
1552 return false;
1553 }
1554
1555 private boolean jj_3R_72() {
1556 if (jj_scan_token(AMPERSAND)) return true;
1557 if (jj_scan_token(AMPERSAND)) return true;
1558 if (jj_3R_19()) return true;
1559 if (jj_3R_54()) return true;
1560 if (jj_3R_19()) return true;
1561 return false;
1562 }
1563
1564 private boolean jj_3R_71() {
1565 if (jj_scan_token(LESS)) return true;
1566 if (jj_3R_19()) return true;
1567 if (jj_3R_54()) return true;
1568 if (jj_3R_19()) return true;
1569 return false;
1570 }
1571
1572 private boolean jj_3R_52() {
1573 if (jj_scan_token(UINT)) return true;
1574 return false;
1575 }
1576
1577 private boolean jj_3R_70() {
1578 if (jj_scan_token(EQUAL)) return true;
1579 Token xsp;
1580 xsp = jj_scanpos;
1581 if (jj_scan_token(22)) jj_scanpos = xsp;
1582 if (jj_3R_19()) return true;
1583 if (jj_3R_54()) return true;
1584 if (jj_3R_19()) return true;
1585 return false;
1586 }
1587
1588 private boolean jj_3R_69() {
1589 if (jj_scan_token(GREATER)) return true;
1590 if (jj_3R_19()) return true;
1591 if (jj_3R_54()) return true;
1592 if (jj_3R_19()) return true;
1593 return false;
1594 }
1595
1596 private boolean jj_3R_68() {
1597 if (jj_scan_token(LESS_EQUAL)) return true;
1598 if (jj_3R_19()) return true;
1599 if (jj_3R_54()) return true;
1600 if (jj_3R_19()) return true;
1601 return false;
1602 }
1603
1604 private boolean jj_3R_81() {
1605 if (jj_scan_token(SLASH)) return true;
1606 if (jj_3R_19()) return true;
1607 if (jj_3R_54()) return true;
1608 if (jj_3R_19()) return true;
1609 return false;
1610 }
1611
1612 private boolean jj_3R_67() {
1613 if (jj_scan_token(GREATER_EQUAL)) return true;
1614 if (jj_3R_19()) return true;
1615 if (jj_3R_54()) return true;
1616 if (jj_3R_19()) return true;
1617 return false;
1618 }
1619
1620 private boolean jj_3R_80() {
1621 if (jj_scan_token(MINUS)) return true;
1622 if (jj_3R_19()) return true;
1623 if (jj_3R_54()) return true;
1624 if (jj_3R_19()) return true;
1625 return false;
1626 }
1627
1628 private boolean jj_3R_66() {
1629 Token xsp;
1630 if (jj_3R_81()) return true;
1631 while (true) {
1632 xsp = jj_scanpos;
1633 if (jj_3R_81()) { jj_scanpos = xsp; break; }
1634 }
1635 return false;
1636 }
1637
1638 private boolean jj_3R_79() {
1639 if (jj_scan_token(STAR)) return true;
1640 if (jj_3R_19()) return true;
1641 if (jj_3R_54()) return true;
1642 if (jj_3R_19()) return true;
1643 return false;
1644 }
1645
1646 private boolean jj_3R_65() {
1647 Token xsp;
1648 if (jj_3R_80()) return true;
1649 while (true) {
1650 xsp = jj_scanpos;
1651 if (jj_3R_80()) { jj_scanpos = xsp; break; }
1652 }
1653 return false;
1654 }
1655
1656 private boolean jj_3R_78() {
1657 if (jj_scan_token(PLUS)) return true;
1658 if (jj_3R_19()) return true;
1659 if (jj_3R_54()) return true;
1660 if (jj_3R_19()) return true;
1661 return false;
1662 }
1663
1664 private boolean jj_3R_64() {
1665 Token xsp;
1666 if (jj_3R_79()) return true;
1667 while (true) {
1668 xsp = jj_scanpos;
1669 if (jj_3R_79()) { jj_scanpos = xsp; break; }
1670 }
1671 return false;
1672 }
1673
1674 private boolean jj_3R_55() {
1675 Token xsp;
1676 xsp = jj_scanpos;
1677 if (jj_3R_63()) {
1678 jj_scanpos = xsp;
1679 if (jj_3R_64()) {
1680 jj_scanpos = xsp;
1681 if (jj_3R_65()) {
1682 jj_scanpos = xsp;
1683 if (jj_3R_66()) {
1684 jj_scanpos = xsp;
1685 if (jj_3R_67()) {
1686 jj_scanpos = xsp;
1687 if (jj_3R_68()) {
1688 jj_scanpos = xsp;
1689 if (jj_3R_69()) {
1690 jj_scanpos = xsp;
1691 if (jj_3R_70()) {
1692 jj_scanpos = xsp;
1693 if (jj_3R_71()) {
1694 jj_scanpos = xsp;
1695 if (jj_3R_72()) {
1696 jj_scanpos = xsp;
1697 if (jj_3R_73()) {
1698 jj_scanpos = xsp;
1699 if (jj_3R_74()) return true;
1700 }
1701 }
1702 }
1703 }
1704 }
1705 }
1706 }
1707 }
1708 }
1709 }
1710 }
1711 return false;
1712 }
1713
1714 private boolean jj_3R_63() {
1715 Token xsp;
1716 if (jj_3R_78()) return true;
1717 while (true) {
1718 xsp = jj_scanpos;
1719 if (jj_3R_78()) { jj_scanpos = xsp; break; }
1720 }
1721 return false;
1722 }
1723
1724 private boolean jj_3R_34() {
1725 if (jj_3R_54()) return true;
1726 if (jj_3R_19()) return true;
1727 Token xsp;
1728 xsp = jj_scanpos;
1729 if (jj_3R_55()) jj_scanpos = xsp;
1730 return false;
1731 }
1732
1733 private boolean jj_3R_33() {
1734 if (jj_scan_token(MINUS)) return true;
1735 if (jj_3R_19()) return true;
1736 if (jj_3R_54()) return true;
1737 if (jj_3R_19()) return true;
1738 return false;
1739 }
1740
1741 private boolean jj_3R_32() {
1742 if (jj_scan_token(EXCLAMATION)) return true;
1743 if (jj_3R_19()) return true;
1744 if (jj_3R_54()) return true;
1745 if (jj_3R_19()) return true;
1746 return false;
1747 }
1748
1749 private boolean jj_3_6() {
1750 if (jj_3R_20()) return true;
1751 Token xsp;
1752 xsp = jj_scanpos;
1753 if (jj_scan_token(27)) {
1754 jj_scanpos = xsp;
1755 if (jj_scan_token(13)) return true;
1756 }
1757 return false;
1758 }
1759
1760 private boolean jj_3R_20() {
1761 Token xsp;
1762 xsp = jj_scanpos;
1763 if (jj_3R_32()) {
1764 jj_scanpos = xsp;
1765 if (jj_3R_33()) {
1766 jj_scanpos = xsp;
1767 if (jj_3R_34()) return true;
1768 }
1769 }
1770 return false;
1771 }
1772
1773 private boolean jj_3_5() {
1774 if (jj_3R_18()) return true;
1775 if (jj_3R_19()) return true;
1776 Token xsp;
1777 xsp = jj_scanpos;
1778 if (jj_scan_token(27)) {
1779 jj_scanpos = xsp;
1780 if (jj_scan_token(13)) return true;
1781 }
1782 return false;
1783 }
1784
1785 private boolean jj_3R_50() {
1786 if (jj_scan_token(LESS)) return true;
1787 return false;
1788 }
1789
1790 private boolean jj_3R_49() {
1791 if (jj_scan_token(LESS_EQUAL)) return true;
1792 return false;
1793 }
1794
1795 private boolean jj_3R_48() {
1796 if (jj_scan_token(GREATER)) return true;
1797 return false;
1798 }
1799
1800 private boolean jj_3R_46() {
1801 if (jj_3R_58()) return true;
1802 return false;
1803 }
1804
1805 private boolean jj_3R_47() {
1806 if (jj_scan_token(GREATER_EQUAL)) return true;
1807 return false;
1808 }
1809
1810 private boolean jj_3R_45() {
1811 if (jj_3R_51()) return true;
1812 return false;
1813 }
1814
1815 private boolean jj_3R_30() {
1816 if (jj_scan_token(COMMA)) return true;
1817 if (jj_3R_15()) return true;
1818 if (jj_3R_29()) return true;
1819 return false;
1820 }
1821
1822 private boolean jj_3R_26() {
1823 Token xsp;
1824 xsp = jj_scanpos;
1825 if (jj_3R_47()) {
1826 jj_scanpos = xsp;
1827 if (jj_3R_48()) {
1828 jj_scanpos = xsp;
1829 if (jj_3R_49()) {
1830 jj_scanpos = xsp;
1831 if (jj_3R_50()) return true;
1832 }
1833 }
1834 }
1835 if (jj_3R_15()) return true;
1836 if (jj_3R_51()) return true;
1837 return false;
1838 }
1839
1840 private boolean jj_3R_18() {
1841 if (jj_3R_29()) return true;
1842 Token xsp;
1843 if (jj_3R_30()) return true;
1844 while (true) {
1845 xsp = jj_scanpos;
1846 if (jj_3R_30()) { jj_scanpos = xsp; break; }
1847 }
1848 return false;
1849 }
1850
1851 private boolean jj_3_3() {
1852 if (jj_3R_17()) return true;
1853 return false;
1854 }
1855
1856 private boolean jj_3R_44() {
1857 if (jj_scan_token(STAR)) return true;
1858 if (jj_scan_token(EQUAL)) return true;
1859 return false;
1860 }
1861
1862 private boolean jj_3R_53() {
1863 if (jj_scan_token(COMMENT_START)) return true;
1864 if (jj_scan_token(COMMENT_END)) return true;
1865 return false;
1866 }
1867
1868 private boolean jj_3R_43() {
1869 if (jj_scan_token(DOLLAR)) return true;
1870 if (jj_scan_token(EQUAL)) return true;
1871 return false;
1872 }
1873
1874 private boolean jj_3R_42() {
1875 if (jj_scan_token(CARET)) return true;
1876 if (jj_scan_token(EQUAL)) return true;
1877 return false;
1878 }
1879
1880 private boolean jj_3R_41() {
1881 if (jj_scan_token(TILDE)) return true;
1882 if (jj_scan_token(EQUAL)) return true;
1883 return false;
1884 }
1885
1886 private boolean jj_3R_76() {
1887 if (jj_3R_56()) return true;
1888 return false;
1889 }
1890
1891 private boolean jj_3R_31() {
1892 Token xsp;
1893 xsp = jj_scanpos;
1894 if (jj_scan_token(9)) {
1895 jj_scanpos = xsp;
1896 if (jj_3R_53()) return true;
1897 }
1898 return false;
1899 }
1900
1901 private boolean jj_3R_40() {
1902 if (jj_scan_token(EQUAL)) return true;
1903 return false;
1904 }
1905
1906 private boolean jj_3R_19() {
1907 Token xsp;
1908 while (true) {
1909 xsp = jj_scanpos;
1910 if (jj_3R_31()) { jj_scanpos = xsp; break; }
1911 }
1912 return false;
1913 }
1914
1915 private boolean jj_3R_39() {
1916 if (jj_scan_token(EXCLAMATION)) return true;
1917 if (jj_scan_token(EQUAL)) return true;
1918 return false;
1919 }
1920
1921 /** Generated Token Manager. */
1922 public MapCSSParserTokenManager token_source;
1923 SimpleCharStream jj_input_stream;
1924 /** Current token. */
1925 public Token token;
1926 /** Next token. */
1927 public Token jj_nt;
1928 private int jj_ntk;
1929 private Token jj_scanpos, jj_lastpos;
1930 private int jj_la;
1931 private int jj_gen;
1932 final private int[] jj_la1 = new int[48];
1933 static private int[] jj_la1_0;
1934 static private int[] jj_la1_1;
1935 static {
1936 jj_la1_init_0();
1937 jj_la1_init_1();
1938 }
1939 private static void jj_la1_init_0() {
1940 jj_la1_0 = new int[] {0x4,0xc,0xc,0x12,0x200,0x200,0x200,0x10000000,0x402,0x10000000,0x300000,0x2804000,0x2804000,0x300000,0x402,0x40000000,0x2804000,0x2804000,0x4000000,0x4,0x0,0x4,0x8081011e,0x2000000,0x12,0x800000,0x0,0x1c00400,0x1e,0x3c0000,0x1fc0400,0x800000,0x402,0x2,0x8002000,0x8002000,0x80000000,0x400,0x0,0x800,0x400000,0xa07c0c00,0xa07c0c00,0x8081011e,0x8001011e,0x10000000,0x8081011e,0x8000011e,};
1941 }
1942 private static void jj_la1_init_1() {
1943 jj_la1_1 = new int[] {0x1,0x0,0x1,0x0,0x0,0x20,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x1,0x0,0x0,0x0,0x4,0x18,0x1,0x0,0x18,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x7,0x7,0x1,0x0,0x0,0x1,0x0,};
1944 }
1945 final private JJCalls[] jj_2_rtns = new JJCalls[7];
1946 private boolean jj_rescan = false;
1947 private int jj_gc = 0;
1948
1949 /** Constructor with InputStream. */
1950 public MapCSSParser(java.io.InputStream stream) {
1951 this(stream, null);
1952 }
1953 /** Constructor with InputStream and supplied encoding */
1954 public MapCSSParser(java.io.InputStream stream, String encoding) {
1955 try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
1956 token_source = new MapCSSParserTokenManager(jj_input_stream);
1957 token = new Token();
1958 jj_ntk = -1;
1959 jj_gen = 0;
1960 for (int i = 0; i < 48; i++) jj_la1[i] = -1;
1961 for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
1962 }
1963
1964 /** Reinitialise. */
1965 public void ReInit(java.io.InputStream stream) {
1966 ReInit(stream, null);
1967 }
1968 /** Reinitialise. */
1969 public void ReInit(java.io.InputStream stream, String encoding) {
1970 try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
1971 token_source.ReInit(jj_input_stream);
1972 token = new Token();
1973 jj_ntk = -1;
1974 jj_gen = 0;
1975 for (int i = 0; i < 48; i++) jj_la1[i] = -1;
1976 for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
1977 }
1978
1979 /** Constructor. */
1980 public MapCSSParser(java.io.Reader stream) {
1981 jj_input_stream = new SimpleCharStream(stream, 1, 1);
1982 token_source = new MapCSSParserTokenManager(jj_input_stream);
1983 token = new Token();
1984 jj_ntk = -1;
1985 jj_gen = 0;
1986 for (int i = 0; i < 48; i++) jj_la1[i] = -1;
1987 for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
1988 }
1989
1990 /** Reinitialise. */
1991 public void ReInit(java.io.Reader stream) {
1992 jj_input_stream.ReInit(stream, 1, 1);
1993 token_source.ReInit(jj_input_stream);
1994 token = new Token();
1995 jj_ntk = -1;
1996 jj_gen = 0;
1997 for (int i = 0; i < 48; i++) jj_la1[i] = -1;
1998 for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
1999 }
2000
2001 /** Constructor with generated Token Manager. */
2002 public MapCSSParser(MapCSSParserTokenManager tm) {
2003 token_source = tm;
2004 token = new Token();
2005 jj_ntk = -1;
2006 jj_gen = 0;
2007 for (int i = 0; i < 48; i++) jj_la1[i] = -1;
2008 for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
2009 }
2010
2011 /** Reinitialise. */
2012 public void ReInit(MapCSSParserTokenManager tm) {
2013 token_source = tm;
2014 token = new Token();
2015 jj_ntk = -1;
2016 jj_gen = 0;
2017 for (int i = 0; i < 48; i++) jj_la1[i] = -1;
2018 for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
2019 }
2020
2021 private Token jj_consume_token(int kind) throws ParseException {
2022 Token oldToken;
2023 if ((oldToken = token).next != null) token = token.next;
2024 else token = token.next = token_source.getNextToken();
2025 jj_ntk = -1;
2026 if (token.kind == kind) {
2027 jj_gen++;
2028 if (++jj_gc > 100) {
2029 jj_gc = 0;
2030 for (int i = 0; i < jj_2_rtns.length; i++) {
2031 JJCalls c = jj_2_rtns[i];
2032 while (c != null) {
2033 if (c.gen < jj_gen) c.first = null;
2034 c = c.next;
2035 }
2036 }
2037 }
2038 return token;
2039 }
2040 token = oldToken;
2041 jj_kind = kind;
2042 throw generateParseException();
2043 }
2044
2045 static private final class LookaheadSuccess extends java.lang.Error { }
2046 final private LookaheadSuccess jj_ls = new LookaheadSuccess();
2047 private boolean jj_scan_token(int kind) {
2048 if (jj_scanpos == jj_lastpos) {
2049 jj_la--;
2050 if (jj_scanpos.next == null) {
2051 jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
2052 } else {
2053 jj_lastpos = jj_scanpos = jj_scanpos.next;
2054 }
2055 } else {
2056 jj_scanpos = jj_scanpos.next;
2057 }
2058 if (jj_rescan) {
2059 int i = 0; Token tok = token;
2060 while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; }
2061 if (tok != null) jj_add_error_token(kind, i);
2062 }
2063 if (jj_scanpos.kind != kind) return true;
2064 if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
2065 return false;
2066 }
2067
2068
2069/** Get the next Token. */
2070 final public Token getNextToken() {
2071 if (token.next != null) token = token.next;
2072 else token = token.next = token_source.getNextToken();
2073 jj_ntk = -1;
2074 jj_gen++;
2075 return token;
2076 }
2077
2078/** Get the specific Token. */
2079 final public Token getToken(int index) {
2080 Token t = token;
2081 for (int i = 0; i < index; i++) {
2082 if (t.next != null) t = t.next;
2083 else t = t.next = token_source.getNextToken();
2084 }
2085 return t;
2086 }
2087
2088 private int jj_ntk() {
2089 if ((jj_nt=token.next) == null)
2090 return (jj_ntk = (token.next=token_source.getNextToken()).kind);
2091 else
2092 return (jj_ntk = jj_nt.kind);
2093 }
2094
2095 private java.util.List jj_expentries = new java.util.ArrayList();
2096 private int[] jj_expentry;
2097 private int jj_kind = -1;
2098 private int[] jj_lasttokens = new int[100];
2099 private int jj_endpos;
2100
2101 private void jj_add_error_token(int kind, int pos) {
2102 if (pos >= 100) return;
2103 if (pos == jj_endpos + 1) {
2104 jj_lasttokens[jj_endpos++] = kind;
2105 } else if (jj_endpos != 0) {
2106 jj_expentry = new int[jj_endpos];
2107 for (int i = 0; i < jj_endpos; i++) {
2108 jj_expentry[i] = jj_lasttokens[i];
2109 }
2110 jj_entries_loop: for (java.util.Iterator it = jj_expentries.iterator(); it.hasNext();) {
2111 int[] oldentry = (int[])(it.next());
2112 if (oldentry.length == jj_expentry.length) {
2113 for (int i = 0; i < jj_expentry.length; i++) {
2114 if (oldentry[i] != jj_expentry[i]) {
2115 continue jj_entries_loop;
2116 }
2117 }
2118 jj_expentries.add(jj_expentry);
2119 break jj_entries_loop;
2120 }
2121 }
2122 if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind;
2123 }
2124 }
2125
2126 /** Generate ParseException. */
2127 public ParseException generateParseException() {
2128 jj_expentries.clear();
2129 boolean[] la1tokens = new boolean[41];
2130 if (jj_kind >= 0) {
2131 la1tokens[jj_kind] = true;
2132 jj_kind = -1;
2133 }
2134 for (int i = 0; i < 48; i++) {
2135 if (jj_la1[i] == jj_gen) {
2136 for (int j = 0; j < 32; j++) {
2137 if ((jj_la1_0[i] & (1<<j)) != 0) {
2138 la1tokens[j] = true;
2139 }
2140 if ((jj_la1_1[i] & (1<<j)) != 0) {
2141 la1tokens[32+j] = true;
2142 }
2143 }
2144 }
2145 }
2146 for (int i = 0; i < 41; i++) {
2147 if (la1tokens[i]) {
2148 jj_expentry = new int[1];
2149 jj_expentry[0] = i;
2150 jj_expentries.add(jj_expentry);
2151 }
2152 }
2153 jj_endpos = 0;
2154 jj_rescan_token();
2155 jj_add_error_token(0, 0);
2156 int[][] exptokseq = new int[jj_expentries.size()][];
2157 for (int i = 0; i < jj_expentries.size(); i++) {
2158 exptokseq[i] = (int[])jj_expentries.get(i);
2159 }
2160 return new ParseException(token, exptokseq, tokenImage);
2161 }
2162
2163 /** Enable tracing. */
2164 final public void enable_tracing() {
2165 }
2166
2167 /** Disable tracing. */
2168 final public void disable_tracing() {
2169 }
2170
2171 private void jj_rescan_token() {
2172 jj_rescan = true;
2173 for (int i = 0; i < 7; i++) {
2174 try {
2175 JJCalls p = jj_2_rtns[i];
2176 do {
2177 if (p.gen > jj_gen) {
2178 jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;
2179 switch (i) {
2180 case 0: jj_3_1(); break;
2181 case 1: jj_3_2(); break;
2182 case 2: jj_3_3(); break;
2183 case 3: jj_3_4(); break;
2184 case 4: jj_3_5(); break;
2185 case 5: jj_3_6(); break;
2186 case 6: jj_3_7(); break;
2187 }
2188 }
2189 p = p.next;
2190 } while (p != null);
2191 } catch(LookaheadSuccess ls) { }
2192 }
2193 jj_rescan = false;
2194 }
2195
2196 private void jj_save(int index, int xla) {
2197 JJCalls p = jj_2_rtns[index];
2198 while (p.gen > jj_gen) {
2199 if (p.next == null) { p = p.next = new JJCalls(); break; }
2200 p = p.next;
2201 }
2202 p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla;
2203 }
2204
2205 static final class JJCalls {
2206 int gen;
2207 Token first;
2208 int arg;
2209 JJCalls next;
2210 }
2211
2212}
Note: See TracBrowser for help on using the repository browser.