1
2
3 package org.apache.commons.flatfile.dsl;
4
5 import java.io.IOException;
6
7 import java.util.List;
8 import java.util.Stack;
9 import java.util.Iterator;
10 import java.util.ArrayList;
11 import java.util.HashMap;
12
13 import org.apache.commons.flatfile.*;
14 import org.apache.commons.flatfile.util.ApplyOptions;
15
16 import antlr.TreeParser;
17 import antlr.Token;
18 import antlr.collections.AST;
19 import antlr.RecognitionException;
20 import antlr.ANTLRException;
21 import antlr.NoViableAltException;
22 import antlr.MismatchedTokenException;
23 import antlr.SemanticException;
24 import antlr.collections.impl.BitSet;
25 import antlr.ASTPair;
26 import antlr.collections.impl.ASTArray;
27
28
29 public class EntityTreeParser extends antlr.TreeParser implements EntityTreeParserTokenTypes
30 {
31
32 private java.lang.ref.WeakReference<ParserEntityFactory> entityFactoryRef;
33 private Stack<String> stk = new Stack<String>();
34
35 public synchronized Entity createEntity(EntityDefinition def) {
36 String name = def.getName();
37 if (stk.contains(def.getName())) {
38 throw new IllegalStateException("Circular reference detected for entity type " + name);
39 }
40 stk.push(def.getName());
41 try {
42 Entity result = entity(def.getAst());
43 runChecks(def, result);
44 return result;
45 } catch (ANTLRException e) {
46 throw new RuntimeException(e);
47 } finally {
48 String x = stk.pop();
49 if (!x.equals(def.getName())) {
50 throw new IllegalStateException("Stack out of balance; encountered " + x);
51 }
52 }
53 }
54
55 public void setEntityFactory(ParserEntityFactory entityFactory) {
56 this.entityFactoryRef = new java.lang.ref.WeakReference<ParserEntityFactory>(entityFactory);
57 }
58
59 private void runChecks(EntityDefinition def, Entity e) {
60 for (AST check : def.getChecks()) {
61 switch (check.getType()) {
62 case LENGTH :
63 int expected = Integer.parseInt(check.getText());
64 int actual = e.length();
65 if (expected != actual) {
66 throw new IllegalStateException(
67 "expected entity " + def.getName() + " length=" + expected + "; actually " + actual);
68 }
69 break;
70 default :
71 throw new IllegalArgumentException("Unknown check: " + check);
72 }
73 }
74 }
75
76 private byte[] getBytes(String s) {
77 try {
78 return s.getBytes("UTF-8");
79 } catch (IOException e) {
80 throw new RuntimeException(e);
81 }
82 }
83
84 private ParserEntityFactory getEntityFactory() {
85 return entityFactoryRef.get();
86 }
87 public EntityTreeParser() {
88 tokenNames = _tokenNames;
89 }
90
91 public final void load(AST _t) throws RecognitionException {
92
93 AST load_AST_in = (_t == ASTNULL) ? null : (AST)_t;
94 AST e = null;
95 AST c = null;
96 List<AST> checks = new ArrayList<AST>(); String name = null;
97
98 AST __t2 = _t;
99 AST tmp1_AST_in = (AST)_t;
100 match(_t,ROOT);
101 _t = _t.getFirstChild();
102 {
103 _loop4:
104 do {
105 if (_t==null) _t=ASTNULL;
106 if ((_t.getType()==OPTIONS)) {
107 defaultOptions(_t);
108 _t = _retTree;
109 }
110 else {
111 break _loop4;
112 }
113
114 } while (true);
115 }
116 {
117 int _cnt9=0;
118 _loop9:
119 do {
120 if (_t==null) _t=ASTNULL;
121 if ((_t.getType()==ASSIGN)) {
122 AST __t6 = _t;
123 AST tmp2_AST_in = (AST)_t;
124 match(_t,ASSIGN);
125 _t = _t.getFirstChild();
126 name=name(_t);
127 _t = _retTree;
128 e = (AST)_t;
129 if ( _t==null ) throw new MismatchedTokenException();
130 _t = _t.getNextSibling();
131 _t = __t6;
132 _t = _t.getNextSibling();
133 {
134 _loop8:
135 do {
136 if (_t==null) _t=ASTNULL;
137 if ((_t.getType()==CHECK)) {
138 AST tmp3_AST_in = (AST)_t;
139 match(_t,CHECK);
140 _t = _t.getNextSibling();
141 c = (AST)_t;
142 if ( _t==null ) throw new MismatchedTokenException();
143 _t = _t.getNextSibling();
144
145 checks.add(c);
146
147 }
148 else {
149 break _loop8;
150 }
151
152 } while (true);
153 }
154
155 EntityDefinition ed = new EntityDefinition(name, e);
156 if (!checks.isEmpty()) {
157 ed.setChecks(new ArrayList<AST>(checks));
158 checks.clear();
159 }
160 getEntityFactory().add(name, ed);
161
162 }
163 else {
164 if ( _cnt9>=1 ) { break _loop9; } else {throw new NoViableAltException(_t);}
165 }
166
167 _cnt9++;
168 } while (true);
169 }
170 _t = __t2;
171 _t = _t.getNextSibling();
172 _retTree = _t;
173 }
174
175 protected final void defaultOptions(AST _t) throws RecognitionException {
176
177 AST defaultOptions_AST_in = (_t == ASTNULL) ? null : (AST)_t;
178 AST o = null;
179 HashMap<String, String> m = new HashMap<String, String>(); String key = null, value = null;
180
181 AST __t11 = _t;
182 o = _t==ASTNULL ? null :(AST)_t;
183 match(_t,OPTIONS);
184 _t = _t.getFirstChild();
185 {
186 int _cnt14=0;
187 _loop14:
188 do {
189 if (_t==null) _t=ASTNULL;
190 if ((_t.getType()==ASSIGN)) {
191 AST __t13 = _t;
192 AST tmp4_AST_in = (AST)_t;
193 match(_t,ASSIGN);
194 _t = _t.getFirstChild();
195 key=optionKV(_t);
196 _t = _retTree;
197 value=optionKV(_t);
198 _t = _retTree;
199 m.put(key, value);
200 _t = __t13;
201 _t = _t.getNextSibling();
202 }
203 else {
204 if ( _cnt14>=1 ) { break _loop14; } else {throw new NoViableAltException(_t);}
205 }
206
207 _cnt14++;
208 } while (true);
209 }
210 _t = __t11;
211 _t = _t.getNextSibling();
212 getEntityFactory().setDefaultOptions(o.getText(), m);
213 _retTree = _t;
214 }
215
216 protected final String name(AST _t) throws RecognitionException {
217 String s = null;
218
219 AST name_AST_in = (_t == ASTNULL) ? null : (AST)_t;
220 AST i = null;
221
222 if (_t==null) _t=ASTNULL;
223 switch ( _t.getType()) {
224 case IDENT:
225 {
226 i = (AST)_t;
227 match(_t,IDENT);
228 _t = _t.getNextSibling();
229 s = i.getText();
230 break;
231 }
232 case ANON:
233 {
234 AST tmp5_AST_in = (AST)_t;
235 match(_t,ANON);
236 _t = _t.getNextSibling();
237 break;
238 }
239 default:
240 {
241 throw new NoViableAltException(_t);
242 }
243 }
244 _retTree = _t;
245 return s;
246 }
247
248 protected final String optionKV(AST _t) throws RecognitionException {
249 String result = null;
250
251 AST optionKV_AST_in = (_t == ASTNULL) ? null : (AST)_t;
252 AST c = null;
253 AST s = null;
254 AST n = null;
255 AST i = null;
256
257 if (_t==null) _t=ASTNULL;
258 switch ( _t.getType()) {
259 case CHAR_LITERAL:
260 {
261 c = (AST)_t;
262 match(_t,CHAR_LITERAL);
263 _t = _t.getNextSibling();
264 result = c.getText();
265 break;
266 }
267 case STRING_LITERAL:
268 {
269 s = (AST)_t;
270 match(_t,STRING_LITERAL);
271 _t = _t.getNextSibling();
272 result = s.getText();
273 break;
274 }
275 case NUMBER:
276 {
277 n = (AST)_t;
278 match(_t,NUMBER);
279 _t = _t.getNextSibling();
280 result = n.getText();
281 break;
282 }
283 case IDENT:
284 {
285 i = (AST)_t;
286 match(_t,IDENT);
287 _t = _t.getNextSibling();
288 result = i.getText();
289 break;
290 }
291 default:
292 {
293 throw new NoViableAltException(_t);
294 }
295 }
296 _retTree = _t;
297 return result;
298 }
299
300 protected final Entity entity(AST _t) throws RecognitionException {
301 Entity e = null;
302
303 AST entity_AST_in = (_t == ASTNULL) ? null : (AST)_t;
304
305 if (_t==null) _t=ASTNULL;
306 switch ( _t.getType()) {
307 case ARRAY:
308 {
309 e=array(_t);
310 _t = _retTree;
311 break;
312 }
313 case FIELD:
314 {
315 e=field(_t);
316 _t = _retTree;
317 break;
318 }
319 case MAP:
320 {
321 e=map(_t);
322 _t = _retTree;
323 break;
324 }
325 case TYPEREF:
326 {
327 e=typeRef(_t);
328 _t = _retTree;
329 break;
330 }
331 default:
332 {
333 throw new NoViableAltException(_t);
334 }
335 }
336 _retTree = _t;
337 return e;
338 }
339
340 protected final IndexedEntityCollection array(AST _t) throws RecognitionException {
341 IndexedEntityCollection a = null;
342
343 AST array_AST_in = (_t == ASTNULL) ? null : (AST)_t;
344 AST l = null;
345 AST m = null;
346 AST n = null;
347 Entity prototype = null, e = null; Integer len = null, min = null, max = null;
348
349 AST __t22 = _t;
350 AST tmp6_AST_in = (AST)_t;
351 match(_t,ARRAY);
352 _t = _t.getFirstChild();
353 {
354 if (_t==null) _t=ASTNULL;
355 switch ( _t.getType()) {
356 case LENGTH:
357 {
358 l = (AST)_t;
359 match(_t,LENGTH);
360 _t = _t.getNextSibling();
361 len = Integer.valueOf(l.getText());
362 break;
363 }
364 case RANGE:
365 {
366 AST __t24 = _t;
367 AST tmp7_AST_in = (AST)_t;
368 match(_t,RANGE);
369 _t = _t.getFirstChild();
370 {
371 if (_t==null) _t=ASTNULL;
372 switch ( _t.getType()) {
373 case MIN:
374 {
375 m = (AST)_t;
376 match(_t,MIN);
377 _t = _t.getNextSibling();
378 min = Integer.valueOf(m.getText());
379 break;
380 }
381 case 3:
382 case MAX:
383 {
384 break;
385 }
386 default:
387 {
388 throw new NoViableAltException(_t);
389 }
390 }
391 }
392 {
393 if (_t==null) _t=ASTNULL;
394 switch ( _t.getType()) {
395 case MAX:
396 {
397 n = (AST)_t;
398 match(_t,MAX);
399 _t = _t.getNextSibling();
400 max = Integer.valueOf(n.getText());
401 break;
402 }
403 case 3:
404 {
405 break;
406 }
407 default:
408 {
409 throw new NoViableAltException(_t);
410 }
411 }
412 }
413 _t = __t24;
414 _t = _t.getNextSibling();
415 break;
416 }
417 case PROTOTYPE:
418 {
419 break;
420 }
421 default:
422 {
423 throw new NoViableAltException(_t);
424 }
425 }
426 }
427 AST __t27 = _t;
428 AST tmp8_AST_in = (AST)_t;
429 match(_t,PROTOTYPE);
430 _t = _t.getFirstChild();
431 prototype=entity(_t);
432 _t = _retTree;
433 _t = __t27;
434 _t = _t.getNextSibling();
435 a = new EntityArray(prototype);
436 if (len != null) {
437 ((EntityArray) a).setSize(len.intValue());
438 } else {
439 if (min != null) {
440 ((EntityArray) a).setMinimumSize(min.intValue());
441 }
442 if (max != null) {
443 ((EntityArray) a).setMaximumSize(max.intValue());
444 }
445 }
446
447 {
448 if (_t==null) _t=ASTNULL;
449 switch ( _t.getType()) {
450 case OPTIONS:
451 {
452 entityOptions(_t,a);
453 _t = _retTree;
454 break;
455 }
456 case 3:
457 case VALUE:
458 case ALL:
459 {
460 break;
461 }
462 default:
463 {
464 throw new NoViableAltException(_t);
465 }
466 }
467 }
468 {
469 if (_t==null) _t=ASTNULL;
470 switch ( _t.getType()) {
471 case VALUE:
472 case ALL:
473 {
474 e=value(_t,a);
475 _t = _retTree;
476 a = (IndexedEntityCollection) e;
477 break;
478 }
479 case 3:
480 {
481 break;
482 }
483 default:
484 {
485 throw new NoViableAltException(_t);
486 }
487 }
488 }
489 _t = __t22;
490 _t = _t.getNextSibling();
491 _retTree = _t;
492 return a;
493 }
494
495 protected final Entity field(AST _t) throws RecognitionException {
496 Entity e = null;
497
498 AST field_AST_in = (_t == ASTNULL) ? null : (AST)_t;
499
500 AST __t34 = _t;
501 AST tmp9_AST_in = (AST)_t;
502 match(_t,FIELD);
503 _t = _t.getFirstChild();
504 e=fieldDef(_t);
505 _t = _retTree;
506 _t = __t34;
507 _t = _t.getNextSibling();
508 _retTree = _t;
509 return e;
510 }
511
512 protected final NamedEntityCollection map(AST _t) throws RecognitionException {
513 NamedEntityCollection m = new EntityMap();
514
515 AST map_AST_in = (_t == ASTNULL) ? null : (AST)_t;
516 String name = null; Entity temp = null;
517
518 AST __t45 = _t;
519 AST tmp10_AST_in = (AST)_t;
520 match(_t,MAP);
521 _t = _t.getFirstChild();
522 {
523 int _cnt48=0;
524 _loop48:
525 do {
526 if (_t==null) _t=ASTNULL;
527 if ((_t.getType()==ASSIGN)) {
528 AST __t47 = _t;
529 AST tmp11_AST_in = (AST)_t;
530 match(_t,ASSIGN);
531 _t = _t.getFirstChild();
532 name=name(_t);
533 _t = _retTree;
534 temp=entity(_t);
535 _t = _retTree;
536 ((EntityMap) m).add(name, temp);
537 _t = __t47;
538 _t = _t.getNextSibling();
539 }
540 else {
541 if ( _cnt48>=1 ) { break _loop48; } else {throw new NoViableAltException(_t);}
542 }
543
544 _cnt48++;
545 } while (true);
546 }
547 {
548 if (_t==null) _t=ASTNULL;
549 switch ( _t.getType()) {
550 case OPTIONS:
551 {
552 entityOptions(_t,m);
553 _t = _retTree;
554 break;
555 }
556 case 3:
557 case VALUE:
558 case ALL:
559 {
560 break;
561 }
562 default:
563 {
564 throw new NoViableAltException(_t);
565 }
566 }
567 }
568 {
569 if (_t==null) _t=ASTNULL;
570 switch ( _t.getType()) {
571 case VALUE:
572 case ALL:
573 {
574 temp=value(_t,m);
575 _t = _retTree;
576 m = (NamedEntityCollection) temp;
577 break;
578 }
579 case 3:
580 {
581 break;
582 }
583 default:
584 {
585 throw new NoViableAltException(_t);
586 }
587 }
588 }
589 _t = __t45;
590 _t = _t.getNextSibling();
591 _retTree = _t;
592 return m;
593 }
594
595 protected final Entity typeRef(AST _t) throws RecognitionException {
596 Entity e = null;
597
598 AST typeRef_AST_in = (_t == ASTNULL) ? null : (AST)_t;
599 AST t = null;
600
601 AST __t18 = _t;
602 t = _t==ASTNULL ? null :(AST)_t;
603 match(_t,TYPEREF);
604 _t = _t.getFirstChild();
605 e = getEntityFactory().getEntity(t.getText());
606 {
607 if (_t==null) _t=ASTNULL;
608 switch ( _t.getType()) {
609 case OPTIONS:
610 {
611 entityOptions(_t,e);
612 _t = _retTree;
613 break;
614 }
615 case 3:
616 case VALUE:
617 case ALL:
618 {
619 break;
620 }
621 default:
622 {
623 throw new NoViableAltException(_t);
624 }
625 }
626 }
627 {
628 if (_t==null) _t=ASTNULL;
629 switch ( _t.getType()) {
630 case VALUE:
631 case ALL:
632 {
633 e=value(_t,e);
634 _t = _retTree;
635 break;
636 }
637 case 3:
638 {
639 break;
640 }
641 default:
642 {
643 throw new NoViableAltException(_t);
644 }
645 }
646 }
647 _t = __t18;
648 _t = _t.getNextSibling();
649 _retTree = _t;
650 return e;
651 }
652
653 protected final void entityOptions(AST _t,
654 Entity e
655 ) throws RecognitionException {
656
657 AST entityOptions_AST_in = (_t == ASTNULL) ? null : (AST)_t;
658
659 AST __t53 = _t;
660 AST tmp12_AST_in = (AST)_t;
661 match(_t,OPTIONS);
662 _t = _t.getFirstChild();
663 {
664 int _cnt55=0;
665 _loop55:
666 do {
667 if (_t==null) _t=ASTNULL;
668 if ((_t.getType()==ASSIGN)) {
669 entityOption(_t,e);
670 _t = _retTree;
671 }
672 else {
673 if ( _cnt55>=1 ) { break _loop55; } else {throw new NoViableAltException(_t);}
674 }
675
676 _cnt55++;
677 } while (true);
678 }
679 _t = __t53;
680 _t = _t.getNextSibling();
681 _retTree = _t;
682 }
683
684 protected final Entity value(AST _t,
685 Entity e
686 ) throws RecognitionException {
687 Entity result = e;
688
689 AST value_AST_in = (_t == ASTNULL) ? null : (AST)_t;
690 AST a = null;
691 AST v = null;
692
693 try {
694 {
695 if (_t==null) _t=ASTNULL;
696 switch ( _t.getType()) {
697 case ALL:
698 {
699 a = (AST)_t;
700 match(_t,ALL);
701 _t = _t.getNextSibling();
702 e.fill(getBytes(a.getText())[0]);
703 break;
704 }
705 case VALUE:
706 {
707 v = (AST)_t;
708 match(_t,VALUE);
709 _t = _t.getNextSibling();
710 e.setValue(getBytes(v.getText()));
711 break;
712 }
713 default:
714 {
715 throw new NoViableAltException(_t);
716 }
717 }
718 }
719 {
720 if (_t==null) _t=ASTNULL;
721 switch ( _t.getType()) {
722 case IMMUTABLE:
723 {
724 result=immutable(_t,e);
725 _t = _retTree;
726 break;
727 }
728 case 3:
729 {
730 break;
731 }
732 default:
733 {
734 throw new NoViableAltException(_t);
735 }
736 }
737 }
738 }
739 catch (IOException exc) {
740
741 throw new RuntimeException(exc);
742
743 }
744 _retTree = _t;
745 return result;
746 }
747
748 protected final Entity immutable(AST _t,
749 Entity e
750 ) throws RecognitionException {
751 Entity result = null;
752
753 AST immutable_AST_in = (_t == ASTNULL) ? null : (AST)_t;
754
755 AST tmp13_AST_in = (AST)_t;
756 match(_t,IMMUTABLE);
757 _t = _t.getNextSibling();
758 result = ImmutableEntity.of(e);
759 _retTree = _t;
760 return result;
761 }
762
763 protected final Entity fieldDef(AST _t) throws RecognitionException {
764 Entity e = null;
765
766 AST fieldDef_AST_in = (_t == ASTNULL) ? null : (AST)_t;
767 AST l = null;
768 AST v = null;
769 AST n = null;
770 AST x = null;
771 AST v2 = null;
772
773 {
774 if (_t==null) _t=ASTNULL;
775 switch ( _t.getType()) {
776 case LENGTH:
777 {
778 l = (AST)_t;
779 match(_t,LENGTH);
780 _t = _t.getNextSibling();
781 e = getEntityFactory().createField(Integer.parseInt(l.getText()));
782 {
783 if (_t==null) _t=ASTNULL;
784 switch ( _t.getType()) {
785 case OPTIONS:
786 {
787 entityOptions(_t,e);
788 _t = _retTree;
789 break;
790 }
791 case 3:
792 case VALUE:
793 case ALL:
794 {
795 break;
796 }
797 default:
798 {
799 throw new NoViableAltException(_t);
800 }
801 }
802 }
803 {
804 if (_t==null) _t=ASTNULL;
805 switch ( _t.getType()) {
806 case VALUE:
807 case ALL:
808 {
809 e=value(_t,e);
810 _t = _retTree;
811 break;
812 }
813 case 3:
814 {
815 break;
816 }
817 default:
818 {
819 throw new NoViableAltException(_t);
820 }
821 }
822 }
823 break;
824 }
825 case VALUE:
826 {
827 v = (AST)_t;
828 match(_t,VALUE);
829 _t = _t.getNextSibling();
830 e = getEntityFactory().createField(getBytes(v.getText()));
831 {
832 if (_t==null) _t=ASTNULL;
833 switch ( _t.getType()) {
834 case IMMUTABLE:
835 {
836 e=immutable(_t,e);
837 _t = _retTree;
838 break;
839 }
840 case 3:
841 {
842 break;
843 }
844 default:
845 {
846 throw new NoViableAltException(_t);
847 }
848 }
849 }
850 break;
851 }
852 case RANGE:
853 {
854 AST __t40 = _t;
855 AST tmp14_AST_in = (AST)_t;
856 match(_t,RANGE);
857 _t = _t.getFirstChild();
858 e = getEntityFactory().createDynamicField();
859 {
860 if (_t==null) _t=ASTNULL;
861 switch ( _t.getType()) {
862 case MIN:
863 {
864 n = (AST)_t;
865 match(_t,MIN);
866 _t = _t.getNextSibling();
867 ((DynamicField) e).getBounds().setMinimum(Integer.parseInt(n.getText()));
868 break;
869 }
870 case 3:
871 case MAX:
872 {
873 break;
874 }
875 default:
876 {
877 throw new NoViableAltException(_t);
878 }
879 }
880 }
881 {
882 if (_t==null) _t=ASTNULL;
883 switch ( _t.getType()) {
884 case MAX:
885 {
886 x = (AST)_t;
887 match(_t,MAX);
888 _t = _t.getNextSibling();
889 ((DynamicField) e).getBounds().setMaximum(Integer.parseInt(x.getText()));
890 break;
891 }
892 case 3:
893 {
894 break;
895 }
896 default:
897 {
898 throw new NoViableAltException(_t);
899 }
900 }
901 }
902 _t = __t40;
903 _t = _t.getNextSibling();
904 {
905 if (_t==null) _t=ASTNULL;
906 switch ( _t.getType()) {
907 case VALUE:
908 {
909 v2 = (AST)_t;
910 match(_t,VALUE);
911 _t = _t.getNextSibling();
912 e.setValue(getBytes(v2.getText()));
913 break;
914 }
915 case 3:
916 {
917 break;
918 }
919 default:
920 {
921 throw new NoViableAltException(_t);
922 }
923 }
924 }
925 break;
926 }
927 default:
928 {
929 throw new NoViableAltException(_t);
930 }
931 }
932 }
933 _retTree = _t;
934 return e;
935 }
936
937 protected final void entityOption(AST _t,
938 Entity e
939 ) throws RecognitionException {
940
941 AST entityOption_AST_in = (_t == ASTNULL) ? null : (AST)_t;
942 String key = null, value = null;
943
944 AST __t57 = _t;
945 AST tmp15_AST_in = (AST)_t;
946 match(_t,ASSIGN);
947 _t = _t.getFirstChild();
948 key=optionKV(_t);
949 _t = _retTree;
950 value=optionKV(_t);
951 _t = _retTree;
952 ApplyOptions.apply(e, key, value);
953 _t = __t57;
954 _t = _t.getNextSibling();
955 _retTree = _t;
956 }
957
958
959 public static final String[] _tokenNames = {
960 "<0>",
961 "EOF",
962 "<2>",
963 "NULL_TREE_LOOKAHEAD",
964 "ROOT",
965 "CHECK",
966 "VALUE",
967 "ALL",
968 "FIELD",
969 "LENGTH",
970 "ARRAY",
971 "IMMUTABLE",
972 "MAP",
973 "PROTOTYPE",
974 "OPTIONS",
975 "MIN",
976 "MAX",
977 "OPTION_BLOCK",
978 "SEMI",
979 "IDENT",
980 "ANON",
981 "COLON",
982 "TYPEREF",
983 "LBRACK",
984 "RBRACK",
985 "CHAR_LITERAL",
986 "STAR",
987 "STRING_LITERAL",
988 "BANG",
989 "LPAREN",
990 "RPAREN",
991 "LCURLY",
992 "COMMA",
993 "RCURLY",
994 "NUMBER",
995 "RANGE",
996 "ASSIGN",
997 "WS",
998 "SL_COMMENT",
999 "ML_COMMENT",
1000 "NL",
1001 "PTIDENT",
1002 "CHAR_BODY",
1003 "STRING_BODY",
1004 "ESC",
1005 "UNICODE",
1006 "OCTAL",
1007 "HEX_DIGIT"
1008 };
1009
1010 }
1011