View difference between Paste ID: PUrcSfH2 and pS4ZPQkS
SHOW: | | - or go back to the newest paste.
1
/**
2
 * Adding support for Inform 6 language.
3
 *
4
 * Douglas "logicmoo" Miles 02/2014
5
 * ===================================================================
6
 * Added support for Java 8 language constructs.
7
 *
8
 * Andreas Dangel 01/2014
9
 * ===================================================================
10
 * Fix ForStatement to allow Annotations within the initializer.
11
 *
12
 * Andreas Dangel 01/2013
13
 * ===================================================================
14
 * Fix wrong consumption of modifiers (e.g. "final") in a for-each loop.
15
 * Check for wrong java usage when catching multiple exceptions.
16
 *
17
 * Andreas Dangel 12/2012
18
 * ===================================================================
19
 * Enhance grammar to use LocalVariableDeclaration in a for-each loop.
20
 * This enhances the symbol table to recognize variables declared in such
21
 * a for-each loop.
22
 *
23
 * Andreas Dangel 10/2012
24
 * ===================================================================
25
 * Fix parser problem #3530124 with generics
26
 *
27
 * Modified the grammar, so that the different usages of generics work.
28
 * Adjusted the rules, that use "super", as super is no longer a PrimarySuffix.
29
 * It's now either a ExplicitConstructorInvocation or a PrimaryPrefix.
30
 * See also test case ParserCornersTest/testParsersCases
31
 *
32
 * Andreas Dangel 05/2012
33
 * ===================================================================
34
 * Added support for Java 7 language constructs
35
 *
36
 * Dinesh Bolkensteyn (SonarSource), 10/2011
37
 * ===================================================================
38
 * Changed the CastLookahead production to use 3 lookaheads for primitive types as suggested by Andreas Dangel
39
 *
40
 * Brian Remedios 07/2011
41
 * ===================================================================
42
 * Added in support for assert as a name using lookaheads
43
 *
44
 * Tom Copeland, 09/03
45
 * ===================================================================
46
 * Copied over the changes made by Andrea Gini and Marco Savard to
47
 * support JDK 1.4 language constructs, i.e., asserts.
48
 * See the java1_4c.jj distributed in the javacc2.1/examples/JavaGrammers directory.
49
 * Made numerous other modifications to support PMD.
50
 *
51
 * Tom Copeland, 6/02
52
 * ===================================================================
53
 * This file is a modified version of one originally found in the
54
 * VTransformer Examples directory of JavaCC1_1. It has been
55
 * modified to accept Java source code for Java 1.2. Basically,
56
 * this means a new key word was added, 'strictfp', and that keyword
57
 * added to the appropriate productions and LOOKAHEADs (where other,
58
 * similar keywords are listed as possible choices). This involved
59
 * changing 11 lines.
60
 *
61
 * Some other minor changes were made, which can be found by doing
62
 * a search on 'DW, 7/99'.
63
 *
64
 * The goal of this effort was for the grammar to be able to parse
65
 * any legal Java 1.2 source code. It does not reject all illegal
66
 * cases, but neither did the original. Plus, when it comes to
67
 * the new 'strictfp' keyword, the Java Compiler from Sun (JDK1.2.1)
68
 * also does not reject all illegal cases, as defined by the
69
 * "Updates" document found at
70
 *       http://java.sun.com/docs/books/jls/strictfp-changes.pdf
71
 * (see the testcases.txt file for details).
72
 *
73
 * David Williams, 7/99
74
 * ===================================================================
75
 *
76
 *
77
 * Copyright (C) 1996, 1997 Sun Microsystems Inc.
78
 *
79
 * Use of this file and the system it is part of is constrained by the
80
 * file COPYRIGHT in the root directory of this system.  You may, however,
81
 * make any modifications you wish to this file.
82
 *
83
 * Java files generated by running JavaCC on this file (or modified versions
84
 * of this file) may be used in exactly the same manner as Java files
85
 * generated from any grammar developed by you.
86
 *
87
 * Author: Sriram Sankar
88
 * Date: 3/5/97
89
 *
90
 * This file contains a Java grammar and actions that implement a front-end.
91
 */
92
93
options {
94
  JAVA_UNICODE_ESCAPE = true;
95
  CACHE_TOKENS = true;
96
  STATIC = false;
97
  USER_CHAR_STREAM = true;
98
  JDK_VERSION = "1.5";
99
  
100
  MULTI = true;
101
  VISITOR = true;
102
  NODE_USES_PARSER = true;
103
  NODE_PACKAGE="net.sourceforge.pmd.lang.java.ast";
104
105
  DEBUG_PARSER = true;
106
  DEBUG_LOOKAHEAD = true;
107
}
108
PARSER_BEGIN(JavaParser)
109
package net.sourceforge.pmd.lang.java.ast;
110
import java.util.ArrayList;
111
import java.util.List;
112
import java.util.Map;
113
//extends net.sourceforge.pmd.lang.ast.AbstractTokenManager
114
import net.sourceforge.pmd.lang.ast.AbstractTokenManager;
115
import net.sourceforge.pmd.lang.ast.CharStream;
116
import net.sourceforge.pmd.lang.ast.TokenMgrError;
117
import net.sourceforge.pmd.lang.ast.Node;
118
119
public class JavaParser {
120
121
  private int jdkVersion = 0;
122
123
  public void setJdkVersion(int jdkVersion) {
124
   this.jdkVersion = jdkVersion;
125
  }
126
127
  private void throwParseException(String message) {
128
    int line = -1;
129
    int col = -1;
130
    if (jj_lastpos != null) {
131
      line = jj_lastpos.beginLine;
132
      col = jj_lastpos.beginColumn;
133
    }
134
    throw new ParseException("Line " + line + ", Column " + col + ": " + message);
135
  }
136
137
  private void checkForBadAssertUsage(String in, String usage) {
138
    if (jdkVersion > 3 && in.equals("assert")) {
139
      throwParseException("Can't use 'assert' as " + usage + " when running in JDK 1.4 mode!");
140
    }
141
  }
142
143
  private void checkForBadStaticImportUsage() {
144
    if (jdkVersion < 5) {
145
      throwParseException("Can't use static imports when running in JDK 1.4 mode!");
146
    }
147
  }
148
149
  private void checkForBadAnnotationUsage() {
150
    if (jdkVersion < 5) {
151
      throwParseException("Can't use annotations when running in JDK 1.4 mode!");
152
    }
153
  }
154
155
  private void checkForBadGenericsUsage() {
156
    if (jdkVersion < 5) {
157
      throwParseException("Can't use generics unless running in JDK 1.5 mode!");
158
    }
159
  }
160
161
  private void checkForBadVariableArgumentsUsage() {
162
    if (jdkVersion < 5) {
163
      throwParseException("Can't use variable arguments (varargs) when running in JDK 1.4 mode!");
164
    }
165
  }
166
167
  private void checkForBadJDK15ForLoopSyntaxArgumentsUsage() {
168
    if (jdkVersion < 5) {
169
      throwParseException("Can't use JDK 1.5 for loop syntax when running in JDK 1.4 mode!");
170
    }
171
  }
172
173
  private void checkForBadEnumUsage(String in, String usage) {
174
    if (jdkVersion >= 5 && in.equals("enum")) {
175
      throwParseException("Can't use 'enum' as " + usage + " when running in JDK 1.5 mode!");
176
    }
177
  }
178
179
  private void checkForBadHexFloatingPointLiteral() {
180
    if (jdkVersion < 5) {
181
      throwParseException("Can't use hexadecimal floating point literals in pre-JDK 1.5 target");
182
    }
183
  }
184
  
185
  private void checkForBadNumericalLiteralslUsage(Token token) {
186
    if (jdkVersion < 7) {
187
      if (token.image.contains("_")) {
188
        throwParseException("Can't use underscores in numerical literals when running in JDK inferior to 1.7 mode!");
189
      }
190
      	
191
      if (token.image.startsWith("0b") || token.image.startsWith("0B")) {
192
        throwParseException("Can't use binary numerical literals when running in JDK inferior to 1.7 mode!");	
193
      }
194
    }
195
  }
196
  
197
  private void checkForBadDiamondUsage() {
198
  	if (jdkVersion < 7) {
199
      throwParseException("Cannot use the diamond generic notation when running in JDK inferior to 1.7 mode!");
200
  	}
201
  }
202
  
203
  private void checkForBadTryWithResourcesUsage() {
204
  	if (jdkVersion < 7) {
205
      throwParseException("Cannot use the try-with-resources notation when running in JDK inferior to 1.7 mode!");
206
  	}
207
  }
208
209
  private void checkForBadMultipleExceptionsCatching() {
210
  	if (jdkVersion < 7) {
211
      throwParseException("Cannot catch multiple exceptions when running in JDK inferior to 1.7 mode!");
212
  	}
213
  }
214
215
  private void checkForBadLambdaUsage() {
216
    if (jdkVersion < 8) {
217
      throwParseException("Cannot use lambda expressions when running in JDK inferior to 1.8 mode!");
218
    }
219
  }
220
  private void checkForBadMethodReferenceUsage() {
221
    if (jdkVersion < 8) {
222
      throwParseException("Cannot use method references when running in JDK inferior to 1.8 mode!");
223
    }
224
  }
225
  private void checkForBadDefaultImplementationUsage() {
226
    if (jdkVersion < 8) {
227
      throwParseException("Cannot use default implementations in interfaces when running in JDK inferior to 1.8 mode!");
228
    }
229
  }
230
  private void checkForBadIntersectionTypesInCasts() {
231
    if (jdkVersion < 8) {
232
      throwParseException("Cannot use intersection types in casts when running in JDK inferior to 1.8 mode!");
233
    }
234
  }
235
  private void checkForBadTypeAnnotations() {
236
    if (jdkVersion < 8) {
237
      throwParseException("Cannot use type annotations when running in JDK inferior to 1.8 mode!");
238
    }
239
  }
240
241
  // This is a semantic LOOKAHEAD to determine if we're dealing with an assert
242
  // Note that this can't be replaced with a syntactic lookahead
243
  // since "assert" isn't a string literal token
244
  private boolean isNextTokenAnAssert() {
245
    boolean res = getToken(1).image.equals("assert");
246
    if (res && jdkVersion <= 3 && getToken(2).image.equals("(")) {
247
     res = false;
248
    }
249
    return res;
250
  }
251
252
  private boolean isPrecededByComment(Token tok) {
253
      boolean res = false;
254
      while (!res && tok.specialToken != null) {
255
          tok = tok.specialToken;
256
          res = tok.kind == SINGLE_LINE_COMMENT ||
257
                tok.kind == FORMAL_COMMENT ||
258
                tok.kind == MULTI_LINE_COMMENT;
259
      }
260
      return res;
261
  }
262
263
  public Map<Integer, String> getSuppressMap() {
264
    return token_source.getSuppressMap();
265
  }
266
267
  public void setSuppressMarker(String marker) {
268
    token_source.setSuppressMarker(marker);
269
  }
270
271
272
}
273
PARSER_END(JavaParser)
274
275
TOKEN_MGR_DECLS :
276
{
277
  
278
     
279
   // public class JavaParserTokenManager extends net.sourceforge.pmd.lang.ast.AbstractTokenManager implements JavaParserConstants {
280
   
281
    protected List<Comment> comments = new ArrayList<Comment>(); 
282
283
}
284
285
/* WHITE SPACE */
286
287
SPECIAL_TOKEN :
288
{
289
  " " | "\t" | "\n" | "\r" | "\f"
290
}
291
292
SPECIAL_TOKEN :  /* ! = inform6   #! = beanshell  */
293
{
294
< SINGLE_LINE_COMMENT: ("//"|"! "|"#!")(~["\n","\r"])* ("\n"|"\r"|"\r\n")? >
295
    {
296
        int startOfNOPMD = matchedToken.image.indexOf(suppressMarker);
297
        if (startOfNOPMD != -1) {
298
            suppressMap.put(matchedToken.beginLine, matchedToken.image.substring(startOfNOPMD + suppressMarker.length()));
299
        }
300
        comments.add(new SingleLineComment(matchedToken));
301
    }
302
}
303
304
/* COMMENTS */
305
306
MORE :
307
{
308
  <"/**" ~["/"]> { input_stream.backup(1); } : IN_FORMAL_COMMENT
309
|
310
  "/*" : IN_MULTI_LINE_COMMENT
311
}
312
313
<IN_FORMAL_COMMENT>
314
SPECIAL_TOKEN :
315
{
316
  <FORMAL_COMMENT: "*/" > { comments.add(new FormalComment(matchedToken)); } : DEFAULT
317
}
318
319
<IN_MULTI_LINE_COMMENT>
320
SPECIAL_TOKEN :
321
{
322
  <MULTI_LINE_COMMENT: "*/" > { comments.add(new MultiLineComment(matchedToken)); } : DEFAULT
323
}
324
325
<IN_FORMAL_COMMENT,IN_MULTI_LINE_COMMENT>
326
MORE :
327
{
328
  < ~[] >
329
}
330
331
332
SKIP :
333
{
334
  "\r\n"
335
|
336
  "#" : PREPROCESSOR_OUTPUT
337
}
338
339
<IN_LINE_COMMENT> SKIP:
340
{
341
   "\n" : DEFAULT
342
}
343
344
<IN_LINE_COMMENT> MORE:
345
{
346
  < ~[] >
347
}
348
349
<IN_COMMENT> SKIP:
350
{ "*/" : DEFAULT }
351
352
<IN_COMMENT,IN_PREPROCESSOR_OUTPUT_COMMENT> MORE:
353
{ < ~[] > }
354
355
<IN_PREPROCESSOR_OUTPUT_COMMENT> SKIP:
356
{ "*/" : PREPROCESSOR_OUTPUT }
357
358
<PREPROCESSOR_OUTPUT> SKIP:
359
{
360
   "\n" : DEFAULT
361
   | "/*" : IN_PREPROCESSOR_OUTPUT_COMMENT
362
}
363
364
<PREPROCESSOR_OUTPUT> MORE:
365
{
366
  "\\\n"
367
  |
368
  "\\\r\n"
369
  |
370
  < ~[] >
371
}
372
373
374
/* RESERVED WORDS AND LITERALS */
375
376
TOKEN :
377
{
378
  < ABSTRACT: "abstract" >
379
| < OR: "or" >  
380
| < PRINT: "print" >
381
| < PRINT_RET: "print_ret" >
382
| < H_INCLUDE: "#include" >
383
| < H_INCLUDE_PC: "#Include" >
384
| < INCLUDE: "include" >
385
| < INCLUDE_PC: "Include" >
386
| < SWITCHES: "switches" >
387
| < SWITCHES_PC: "Switches" >
388
| < RELEASE: "release" >
389
| < RELEASE_PC: "Release" >
390
| < VERSION: "version" >
391
| < VERSION_PC: "Verson" >
392
| < ARRAY_PC: "Array" >
393
| < ARRAY: "array" >
394
| < CONSTANT: "constant" >
395
| < GLOBAL: "global" >
396
| < GLOBAL_PC: "Global" >
397
| < CONSTANT_PC: "Constant" >
398
| < RTRUE: "rtrue" >
399
| < RFALSE: "rfalse" >
400
| < BOOLEAN: "boolean" >
401
| < BREAK: "break" >
402
| < BYTE: "byte" >
403
| < CASE: "case" >
404
| < CATCH: "catch" >
405
| < CHAR: "char" >
406
| < CLASS: "class" >
407
| < CONST: "const" >
408
| < CONTINUE: "continue" >
409
| < _DEFAULT: "default" >
410
| < DO: "do" >
411
| < DOUBLE: "double" >
412
| < ELSE: "else" >
413
| < EXTENDS: "extends" >
414
| < FALSE: "false" >
415
| < FINAL: "final" >
416
| < FINALLY: "finally" >
417
| < FLOAT: "float" >
418
| < FOR: "for" >
419
| < GOTO: "goto" >
420
| < IF: "if" >
421
| < IMPLEMENTS: "implements" >
422
| < IMPORT: "import" >
423
| < INSTANCEOF: "instanceof" >
424
| < INT: "int" >
425
| < INTERFACE: "interface" >
426
| < LONG: "long" >
427
| < NATIVE: "native" >
428
| < NEW: "new" >
429
| < NULL: "null" >
430
| < PACKAGE: "package">
431
| < PRIVATE: "private" >
432
| < PROTECTED: "protected" >
433
| < PUBLIC: "public" >
434
| < RETURN: "return" >
435
| < SHORT: "short" >
436
| < STATIC: "static" >
437
| < SUPER: "super" >
438
| < SWITCH: "switch" >
439
| < SYNCHRONIZED: "synchronized" >
440
| < THIS: "this" >
441
| < THROW: "throw" >
442
| < THROWS: "throws" >
443
| < TRANSIENT: "transient" >
444
| < TRUE: "true" >
445
| < TRY: "try" >
446
| < VOID: "void" >
447
| < VOLATILE: "volatile" >
448
| < WHILE: "while" >
449
| < STRICTFP: "strictfp" >
450
}
451
452
/* LITERALS */
453
454
TOKEN :
455
{
456
  < INTEGER_LITERAL:
457
        <DECIMAL_LITERAL> (["l","L"])?
458
      | <HEX_LITERAL> (["l","L"])?
459
      | <BINARY_LITERAL> (["l","L"])?
460
      | <OCTAL_LITERAL> (["l","L"])?
461
  >
462
|
463
  < #DECIMAL_LITERAL: (["0"-"9"]((["0"-"9","_"])*["0"-"9"])?) >
464
|
465
  < #HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"]((["0"-"9","a"-"f","A"-"F","_"])*["0"-"9","a"-"f","A"-"F"])?) >
466
|
467
  < #BINARY_LITERAL: "0" ["b","B"] (["0","1"]((["0","1","_"])*["0","1"])?) >
468
|
469
  < #OCTAL_LITERAL: "0" (["0"-"7"]((["0"-"7","_"])*["0"-"7"])?) >
470
|
471
  < FLOATING_POINT_LITERAL:
472
        (["0"-"9"]((["0"-"9","_"])*["0"-"9"])?) "." (["0"-"9"]((["0"-"9","_"])*["0"-"9"])?)? (<EXPONENT>)? (["f","F","d","D"])?
473
      | "." (["0"-"9"]((["0"-"9","_"])*["0"-"9"])?) (<EXPONENT>)? (["f","F","d","D"])?
474
      | (["0"-"9"]((["0"-"9","_"])*["0"-"9"])?) <EXPONENT> (["f","F","d","D"])?
475
      | (["0"-"9"]((["0"-"9","_"])*["0"-"9"])?) (<EXPONENT>)? ["f","F","d","D"]
476
  >
477
|
478
  < HEX_FLOATING_POINT_LITERAL:
479
      (<HEX_LITERAL> (".")? | "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"]((["0"-"9","a"-"f","A"-"F","_"])*["0"-"9","a"-"f","A"-"F"])?)? "." (["0"-"9","a"-"f","A"-"F"]((["0"-"9","a"-"f","A"-"F","_"])*["0"-"9","a"-"f","A"-"F"])?)) ["p","P"] (["+","-"])? (["0"-"9"]((["0"-"9","_"])*["0"-"9"])?) (["f","F","d","D"])?
480
  >
481
|
482
  < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"]((["0"-"9","_"])*["0"-"9"])?) >
483
|
484
  < CHARACTER_LITERAL:
485
      "'"
486
      (   (~["'","\\","\n","\r"])
487
        | ("\\"
488
            ( ["n","t","b","r","f","\\","'","\""]
489
            | ["0"-"7"] ( ["0"-"7"] )?
490
            | ["0"-"3"] ["0"-"7"] ["0"-"7"]
491
            )
492
          )
493
      )
494
      "'"
495
  >
496
|
497
  < STRING_LITERAL:
498
      "\""
499
      (   (~["\"","\\","\n","\r"])
500
        | ("\\"
501
            ( ["n","t","b","r","f","\\","'","\""]
502
            | ["0"-"7"] ( ["0"-"7"] )?
503
            | ["0"-"3"] ["0"-"7"] ["0"-"7"]
504
            )
505
          )
506
      )*
507
      "\""
508
  >
509
|
510
  < STRING_LITERAL_SQ:
511
      "'"
512
      (   (~["'","\\","\n","\r"])
513
        | ("\\"
514
            ( ["n","t","b","r","f","\\","'","\""]
515
            | ["0"-"7"] ( ["0"-"7"] )?
516
            | ["0"-"3"] ["0"-"7"] ["0"-"7"]
517
            )
518
          )
519
      )*
520
      "'"
521
  >
522
}
523
524
/* IDENTIFIERS */
525
526
527
TOKEN :
528
{
529
  < ULXCODE: "@" <LETTER> (<PART_LETTER>)* >
530
|
531
  < IDENTIFIER: <LETTER> (<PART_LETTER>)* >
532
|
533
  < #LETTER:
534
      [  // all chars for which Character.isIdentifierStart is true
535
         "$",
536
         "A"-"Z",
537
         "_",
538
         "a"-"z",
539
         "\u00a2"-"\u00a5",
540
         "\u00aa",
541
         "\u00b5",
542
         "\u00ba",
543
         "\u00c0"-"\u00d6",
544
         "\u00d8"-"\u00f6",
545
         "\u00f8"-"\u021f",
546
         "\u0222"-"\u0233",
547
         "\u0250"-"\u02ad",
548
         "\u02b0"-"\u02b8",
549
         "\u02bb"-"\u02c1",
550
         "\u02d0"-"\u02d1",
551
         "\u02e0"-"\u02e4",
552
         "\u02ee",
553
         "\u037a",
554
         "\u0386",
555
         "\u0388"-"\u038a",
556
         "\u038c",
557
         "\u038e"-"\u03a1",
558
         "\u03a3"-"\u03ce",
559
         "\u03d0"-"\u03d7",
560
         "\u03da"-"\u03f3",
561
         "\u0400"-"\u0481",
562
         "\u048c"-"\u04c4",
563
         "\u04c7"-"\u04c8",
564
         "\u04cb"-"\u04cc",
565
         "\u04d0"-"\u04f5",
566
         "\u04f8"-"\u04f9",
567
         "\u0531"-"\u0556",
568
         "\u0559",
569
         "\u0561"-"\u0587",
570
         "\u05d0"-"\u05ea",
571
         "\u05f0"-"\u05f2",
572
         "\u0621"-"\u063a",
573
         "\u0640"-"\u064a",
574
         "\u0671"-"\u06d3",
575
         "\u06d5",
576
         "\u06e5"-"\u06e6",
577
         "\u06fa"-"\u06fc",
578
         "\u0710",
579
         "\u0712"-"\u072c",
580
         "\u0780"-"\u07a5",
581
         "\u0905"-"\u0939",
582
         "\u093d",
583
         "\u0950",
584
         "\u0958"-"\u0961",
585
         "\u0985"-"\u098c",
586
         "\u098f"-"\u0990",
587
         "\u0993"-"\u09a8",
588
         "\u09aa"-"\u09b0",
589
         "\u09b2",
590
         "\u09b6"-"\u09b9",
591
         "\u09dc"-"\u09dd",
592
         "\u09df"-"\u09e1",
593
         "\u09f0"-"\u09f3",
594
         "\u0a05"-"\u0a0a",
595
         "\u0a0f"-"\u0a10",
596
         "\u0a13"-"\u0a28",
597
         "\u0a2a"-"\u0a30",
598
         "\u0a32"-"\u0a33",
599
         "\u0a35"-"\u0a36",
600
         "\u0a38"-"\u0a39",
601
         "\u0a59"-"\u0a5c",
602
         "\u0a5e",
603
         "\u0a72"-"\u0a74",
604
         "\u0a85"-"\u0a8b",
605
         "\u0a8d",
606
         "\u0a8f"-"\u0a91",
607
         "\u0a93"-"\u0aa8",
608
         "\u0aaa"-"\u0ab0",
609
         "\u0ab2"-"\u0ab3",
610
         "\u0ab5"-"\u0ab9",
611
         "\u0abd",
612
         "\u0ad0",
613
         "\u0ae0",
614
         "\u0b05"-"\u0b0c",
615
         "\u0b0f"-"\u0b10",
616
         "\u0b13"-"\u0b28",
617
         "\u0b2a"-"\u0b30",
618
         "\u0b32"-"\u0b33",
619
         "\u0b36"-"\u0b39",
620
         "\u0b3d",
621
         "\u0b5c"-"\u0b5d",
622
         "\u0b5f"-"\u0b61",
623
         "\u0b85"-"\u0b8a",
624
         "\u0b8e"-"\u0b90",
625
         "\u0b92"-"\u0b95",
626
         "\u0b99"-"\u0b9a",
627
         "\u0b9c",
628
         "\u0b9e"-"\u0b9f",
629
         "\u0ba3"-"\u0ba4",
630
         "\u0ba8"-"\u0baa",
631
         "\u0bae"-"\u0bb5",
632
         "\u0bb7"-"\u0bb9",
633
         "\u0c05"-"\u0c0c",
634
         "\u0c0e"-"\u0c10",
635
         "\u0c12"-"\u0c28",
636
         "\u0c2a"-"\u0c33",
637
         "\u0c35"-"\u0c39",
638
         "\u0c60"-"\u0c61",
639
         "\u0c85"-"\u0c8c",
640
         "\u0c8e"-"\u0c90",
641
         "\u0c92"-"\u0ca8",
642
         "\u0caa"-"\u0cb3",
643
         "\u0cb5"-"\u0cb9",
644
         "\u0cde",
645
         "\u0ce0"-"\u0ce1",
646
         "\u0d05"-"\u0d0c",
647
         "\u0d0e"-"\u0d10",
648
         "\u0d12"-"\u0d28",
649
         "\u0d2a"-"\u0d39",
650
         "\u0d60"-"\u0d61",
651
         "\u0d85"-"\u0d96",
652
         "\u0d9a"-"\u0db1",
653
         "\u0db3"-"\u0dbb",
654
         "\u0dbd",
655
         "\u0dc0"-"\u0dc6",
656
         "\u0e01"-"\u0e30",
657
         "\u0e32"-"\u0e33",
658
         "\u0e3f"-"\u0e46",
659
         "\u0e81"-"\u0e82",
660
         "\u0e84",
661
         "\u0e87"-"\u0e88",
662
         "\u0e8a",
663
         "\u0e8d",
664
         "\u0e94"-"\u0e97",
665
         "\u0e99"-"\u0e9f",
666
         "\u0ea1"-"\u0ea3",
667
         "\u0ea5",
668
         "\u0ea7",
669
         "\u0eaa"-"\u0eab",
670
         "\u0ead"-"\u0eb0",
671
         "\u0eb2"-"\u0eb3",
672
         "\u0ebd",
673
         "\u0ec0"-"\u0ec4",
674
         "\u0ec6",
675
         "\u0edc"-"\u0edd",
676
         "\u0f00",
677
         "\u0f40"-"\u0f47",
678
         "\u0f49"-"\u0f6a",
679
         "\u0f88"-"\u0f8b",
680
         "\u1000"-"\u1021",
681
         "\u1023"-"\u1027",
682
         "\u1029"-"\u102a",
683
         "\u1050"-"\u1055",
684
         "\u10a0"-"\u10c5",
685
         "\u10d0"-"\u10f6",
686
         "\u1100"-"\u1159",
687
         "\u115f"-"\u11a2",
688
         "\u11a8"-"\u11f9",
689
         "\u1200"-"\u1206",
690
         "\u1208"-"\u1246",
691
         "\u1248",
692
         "\u124a"-"\u124d",
693
         "\u1250"-"\u1256",
694
         "\u1258",
695
         "\u125a"-"\u125d",
696
         "\u1260"-"\u1286",
697
         "\u1288",
698
         "\u128a"-"\u128d",
699
         "\u1290"-"\u12ae",
700
         "\u12b0",
701
         "\u12b2"-"\u12b5",
702
         "\u12b8"-"\u12be",
703
         "\u12c0",
704
         "\u12c2"-"\u12c5",
705
         "\u12c8"-"\u12ce",
706
         "\u12d0"-"\u12d6",
707
         "\u12d8"-"\u12ee",
708
         "\u12f0"-"\u130e",
709
         "\u1310",
710
         "\u1312"-"\u1315",
711
         "\u1318"-"\u131e",
712
         "\u1320"-"\u1346",
713
         "\u1348"-"\u135a",
714
         "\u13a0"-"\u13f4",
715
         "\u1401"-"\u166c",
716
         "\u166f"-"\u1676",
717
         "\u1681"-"\u169a",
718
         "\u16a0"-"\u16ea",
719
         "\u1780"-"\u17b3",
720
         "\u17db",
721
         "\u1820"-"\u1877",
722
         "\u1880"-"\u18a8",
723
         "\u1e00"-"\u1e9b",
724
         "\u1ea0"-"\u1ef9",
725
         "\u1f00"-"\u1f15",
726
         "\u1f18"-"\u1f1d",
727
         "\u1f20"-"\u1f45",
728
         "\u1f48"-"\u1f4d",
729
         "\u1f50"-"\u1f57",
730
         "\u1f59",
731
         "\u1f5b",
732
         "\u1f5d",
733
         "\u1f5f"-"\u1f7d",
734
         "\u1f80"-"\u1fb4",
735
         "\u1fb6"-"\u1fbc",
736
         "\u1fbe",
737
         "\u1fc2"-"\u1fc4",
738
         "\u1fc6"-"\u1fcc",
739
         "\u1fd0"-"\u1fd3",
740
         "\u1fd6"-"\u1fdb",
741
         "\u1fe0"-"\u1fec",
742
         "\u1ff2"-"\u1ff4",
743
         "\u1ff6"-"\u1ffc",
744
         "\u203f"-"\u2040",
745
         "\u207f",
746
         "\u20a0"-"\u20af",
747
         "\u2102",
748
         "\u2107",
749
         "\u210a"-"\u2113",
750
         "\u2115",
751
         "\u2119"-"\u211d",
752
         "\u2124",
753
         "\u2126",
754
         "\u2128",
755
         "\u212a"-"\u212d",
756
         "\u212f"-"\u2131",
757
         "\u2133"-"\u2139",
758
         "\u2160"-"\u2183",
759
         "\u3005"-"\u3007",
760
         "\u3021"-"\u3029",
761
         "\u3031"-"\u3035",
762
         "\u3038"-"\u303a",
763
         "\u3041"-"\u3094",
764
         "\u309d"-"\u309e",
765
         "\u30a1"-"\u30fe",
766
         "\u3105"-"\u312c",
767
         "\u3131"-"\u318e",
768
         "\u31a0"-"\u31b7",
769
         "\u3400"-"\u4db5",
770
         "\u4e00"-"\u9fa5",
771
         "\ua000"-"\ua48c",
772
         "\uac00"-"\ud7a3",
773
         "\uf900"-"\ufa2d",
774
         "\ufb00"-"\ufb06",
775
         "\ufb13"-"\ufb17",
776
         "\ufb1d",
777
         "\ufb1f"-"\ufb28",
778
         "\ufb2a"-"\ufb36",
779
         "\ufb38"-"\ufb3c",
780
         "\ufb3e",
781
         "\ufb40"-"\ufb41",
782
         "\ufb43"-"\ufb44",
783
         "\ufb46"-"\ufbb1",
784
         "\ufbd3"-"\ufd3d",
785
         "\ufd50"-"\ufd8f",
786
         "\ufd92"-"\ufdc7",
787
         "\ufdf0"-"\ufdfb",
788
         "\ufe33"-"\ufe34",
789
         "\ufe4d"-"\ufe4f",
790
         "\ufe69",
791
         "\ufe70"-"\ufe72",
792
         "\ufe74",
793
         "\ufe76"-"\ufefc",
794
         "\uff04",
795
         "\uff21"-"\uff3a",
796
         "\uff3f",
797
         "\uff41"-"\uff5a",
798
         "\uff65"-"\uffbe",
799
         "\uffc2"-"\uffc7",
800
         "\uffca"-"\uffcf",
801
         "\uffd2"-"\uffd7",
802
         "\uffda"-"\uffdc",
803
         "\uffe0"-"\uffe1",
804
         "\uffe5"-"\uffe6"
805
      ]
806
  >
807
|
808
  < #PART_LETTER:
809
      [  // all chars for which Character.isIdentifierPart is true
810
         "\u0000"-"\u0008",
811
         "\u000e"-"\u001b",
812
         "$",
813
         "0"-"9",
814
         "A"-"Z",
815
         "_",
816
         "a"-"z",
817
         "\u007f"-"\u009f",
818
         "\u00a2"-"\u00a5",
819
         "\u00aa",
820
         "\u00b5",
821
         "\u00ba",
822
         "\u00c0"-"\u00d6",
823
         "\u00d8"-"\u00f6",
824
         "\u00f8"-"\u021f",
825
         "\u0222"-"\u0233",
826
         "\u0250"-"\u02ad",
827
         "\u02b0"-"\u02b8",
828
         "\u02bb"-"\u02c1",
829
         "\u02d0"-"\u02d1",
830
         "\u02e0"-"\u02e4",
831
         "\u02ee",
832
         "\u0300"-"\u034e",
833
         "\u0360"-"\u0362",
834
         "\u037a",
835
         "\u0386",
836
         "\u0388"-"\u038a",
837
         "\u038c",
838
         "\u038e"-"\u03a1",
839
         "\u03a3"-"\u03ce",
840
         "\u03d0"-"\u03d7",
841
         "\u03da"-"\u03f3",
842
         "\u0400"-"\u0481",
843
         "\u0483"-"\u0486",
844
         "\u048c"-"\u04c4",
845
         "\u04c7"-"\u04c8",
846
         "\u04cb"-"\u04cc",
847
         "\u04d0"-"\u04f5",
848
         "\u04f8"-"\u04f9",
849
         "\u0531"-"\u0556",
850
         "\u0559",
851
         "\u0561"-"\u0587",
852
         "\u0591"-"\u05a1",
853
         "\u05a3"-"\u05b9",
854
         "\u05bb"-"\u05bd",
855
         "\u05bf",
856
         "\u05c1"-"\u05c2",
857
         "\u05c4",
858
         "\u05d0"-"\u05ea",
859
         "\u05f0"-"\u05f2",
860
         "\u0621"-"\u063a",
861
         "\u0640"-"\u0655",
862
         "\u0660"-"\u0669",
863
         "\u0670"-"\u06d3",
864
         "\u06d5"-"\u06dc",
865
         "\u06df"-"\u06e8",
866
         "\u06ea"-"\u06ed",
867
         "\u06f0"-"\u06fc",
868
         "\u070f"-"\u072c",
869
         "\u0730"-"\u074a",
870
         "\u0780"-"\u07b0",
871
         "\u0901"-"\u0903",
872
         "\u0905"-"\u0939",
873
         "\u093c"-"\u094d",
874
         "\u0950"-"\u0954",
875
         "\u0958"-"\u0963",
876
         "\u0966"-"\u096f",
877
         "\u0981"-"\u0983",
878
         "\u0985"-"\u098c",
879
         "\u098f"-"\u0990",
880
         "\u0993"-"\u09a8",
881
         "\u09aa"-"\u09b0",
882
         "\u09b2",
883
         "\u09b6"-"\u09b9",
884
         "\u09bc",
885
         "\u09be"-"\u09c4",
886
         "\u09c7"-"\u09c8",
887
         "\u09cb"-"\u09cd",
888
         "\u09d7",
889
         "\u09dc"-"\u09dd",
890
         "\u09df"-"\u09e3",
891
         "\u09e6"-"\u09f3",
892
         "\u0a02",
893
         "\u0a05"-"\u0a0a",
894
         "\u0a0f"-"\u0a10",
895
         "\u0a13"-"\u0a28",
896
         "\u0a2a"-"\u0a30",
897
         "\u0a32"-"\u0a33",
898
         "\u0a35"-"\u0a36",
899
         "\u0a38"-"\u0a39",
900
         "\u0a3c",
901
         "\u0a3e"-"\u0a42",
902
         "\u0a47"-"\u0a48",
903
         "\u0a4b"-"\u0a4d",
904
         "\u0a59"-"\u0a5c",
905
         "\u0a5e",
906
         "\u0a66"-"\u0a74",
907
         "\u0a81"-"\u0a83",
908
         "\u0a85"-"\u0a8b",
909
         "\u0a8d",
910
         "\u0a8f"-"\u0a91",
911
         "\u0a93"-"\u0aa8",
912
         "\u0aaa"-"\u0ab0",
913
         "\u0ab2"-"\u0ab3",
914
         "\u0ab5"-"\u0ab9",
915
         "\u0abc"-"\u0ac5",
916
         "\u0ac7"-"\u0ac9",
917
         "\u0acb"-"\u0acd",
918
         "\u0ad0",
919
         "\u0ae0",
920
         "\u0ae6"-"\u0aef",
921
         "\u0b01"-"\u0b03",
922
         "\u0b05"-"\u0b0c",
923
         "\u0b0f"-"\u0b10",
924
         "\u0b13"-"\u0b28",
925
         "\u0b2a"-"\u0b30",
926
         "\u0b32"-"\u0b33",
927
         "\u0b36"-"\u0b39",
928
         "\u0b3c"-"\u0b43",
929
         "\u0b47"-"\u0b48",
930
         "\u0b4b"-"\u0b4d",
931
         "\u0b56"-"\u0b57",
932
         "\u0b5c"-"\u0b5d",
933
         "\u0b5f"-"\u0b61",
934
         "\u0b66"-"\u0b6f",
935
         "\u0b82"-"\u0b83",
936
         "\u0b85"-"\u0b8a",
937
         "\u0b8e"-"\u0b90",
938
         "\u0b92"-"\u0b95",
939
         "\u0b99"-"\u0b9a",
940
         "\u0b9c",
941
         "\u0b9e"-"\u0b9f",
942
         "\u0ba3"-"\u0ba4",
943
         "\u0ba8"-"\u0baa",
944
         "\u0bae"-"\u0bb5",
945
         "\u0bb7"-"\u0bb9",
946
         "\u0bbe"-"\u0bc2",
947
         "\u0bc6"-"\u0bc8",
948
         "\u0bca"-"\u0bcd",
949
         "\u0bd7",
950
         "\u0be7"-"\u0bef",
951
         "\u0c01"-"\u0c03",
952
         "\u0c05"-"\u0c0c",
953
         "\u0c0e"-"\u0c10",
954
         "\u0c12"-"\u0c28",
955
         "\u0c2a"-"\u0c33",
956
         "\u0c35"-"\u0c39",
957
         "\u0c3e"-"\u0c44",
958
         "\u0c46"-"\u0c48",
959
         "\u0c4a"-"\u0c4d",
960
         "\u0c55"-"\u0c56",
961
         "\u0c60"-"\u0c61",
962
         "\u0c66"-"\u0c6f",
963
         "\u0c82"-"\u0c83",
964
         "\u0c85"-"\u0c8c",
965
         "\u0c8e"-"\u0c90",
966
         "\u0c92"-"\u0ca8",
967
         "\u0caa"-"\u0cb3",
968
         "\u0cb5"-"\u0cb9",
969
         "\u0cbe"-"\u0cc4",
970
         "\u0cc6"-"\u0cc8",
971
         "\u0cca"-"\u0ccd",
972
         "\u0cd5"-"\u0cd6",
973
         "\u0cde",
974
         "\u0ce0"-"\u0ce1",
975
         "\u0ce6"-"\u0cef",
976
         "\u0d02"-"\u0d03",
977
         "\u0d05"-"\u0d0c",
978
         "\u0d0e"-"\u0d10",
979
         "\u0d12"-"\u0d28",
980
         "\u0d2a"-"\u0d39",
981
         "\u0d3e"-"\u0d43",
982
         "\u0d46"-"\u0d48",
983
         "\u0d4a"-"\u0d4d",
984
         "\u0d57",
985
         "\u0d60"-"\u0d61",
986
         "\u0d66"-"\u0d6f",
987
         "\u0d82"-"\u0d83",
988
         "\u0d85"-"\u0d96",
989
         "\u0d9a"-"\u0db1",
990
         "\u0db3"-"\u0dbb",
991
         "\u0dbd",
992
         "\u0dc0"-"\u0dc6",
993
         "\u0dca",
994
         "\u0dcf"-"\u0dd4",
995
         "\u0dd6",
996
         "\u0dd8"-"\u0ddf",
997
         "\u0df2"-"\u0df3",
998
         "\u0e01"-"\u0e3a",
999
         "\u0e3f"-"\u0e4e",
1000
         "\u0e50"-"\u0e59",
1001
         "\u0e81"-"\u0e82",
1002
         "\u0e84",
1003
         "\u0e87"-"\u0e88",
1004
         "\u0e8a",
1005
         "\u0e8d",
1006
         "\u0e94"-"\u0e97",
1007
         "\u0e99"-"\u0e9f",
1008
         "\u0ea1"-"\u0ea3",
1009
         "\u0ea5",
1010
         "\u0ea7",
1011
         "\u0eaa"-"\u0eab",
1012
         "\u0ead"-"\u0eb9",
1013
         "\u0ebb"-"\u0ebd",
1014
         "\u0ec0"-"\u0ec4",
1015
         "\u0ec6",
1016
         "\u0ec8"-"\u0ecd",
1017
         "\u0ed0"-"\u0ed9",
1018
         "\u0edc"-"\u0edd",
1019
         "\u0f00",
1020
         "\u0f18"-"\u0f19",
1021
         "\u0f20"-"\u0f29",
1022
         "\u0f35",
1023
         "\u0f37",
1024
         "\u0f39",
1025
         "\u0f3e"-"\u0f47",
1026
         "\u0f49"-"\u0f6a",
1027
         "\u0f71"-"\u0f84",
1028
         "\u0f86"-"\u0f8b",
1029
         "\u0f90"-"\u0f97",
1030
         "\u0f99"-"\u0fbc",
1031
         "\u0fc6",
1032
         "\u1000"-"\u1021",
1033
         "\u1023"-"\u1027",
1034
         "\u1029"-"\u102a",
1035
         "\u102c"-"\u1032",
1036
         "\u1036"-"\u1039",
1037
         "\u1040"-"\u1049",
1038
         "\u1050"-"\u1059",
1039
         "\u10a0"-"\u10c5",
1040
         "\u10d0"-"\u10f6",
1041
         "\u1100"-"\u1159",
1042
         "\u115f"-"\u11a2",
1043
         "\u11a8"-"\u11f9",
1044
         "\u1200"-"\u1206",
1045
         "\u1208"-"\u1246",
1046
         "\u1248",
1047
         "\u124a"-"\u124d",
1048
         "\u1250"-"\u1256",
1049
         "\u1258",
1050
         "\u125a"-"\u125d",
1051
         "\u1260"-"\u1286",
1052
         "\u1288",
1053
         "\u128a"-"\u128d",
1054
         "\u1290"-"\u12ae",
1055
         "\u12b0",
1056
         "\u12b2"-"\u12b5",
1057
         "\u12b8"-"\u12be",
1058
         "\u12c0",
1059
         "\u12c2"-"\u12c5",
1060
         "\u12c8"-"\u12ce",
1061
         "\u12d0"-"\u12d6",
1062
         "\u12d8"-"\u12ee",
1063
         "\u12f0"-"\u130e",
1064
         "\u1310",
1065
         "\u1312"-"\u1315",
1066
         "\u1318"-"\u131e",
1067
         "\u1320"-"\u1346",
1068
         "\u1348"-"\u135a",
1069
         "\u1369"-"\u1371",
1070
         "\u13a0"-"\u13f4",
1071
         "\u1401"-"\u166c",
1072
         "\u166f"-"\u1676",
1073
         "\u1681"-"\u169a",
1074
         "\u16a0"-"\u16ea",
1075
         "\u1780"-"\u17d3",
1076
         "\u17db",
1077
         "\u17e0"-"\u17e9",
1078
         "\u180b"-"\u180e",
1079
         "\u1810"-"\u1819",
1080
         "\u1820"-"\u1877",
1081
         "\u1880"-"\u18a9",
1082
         "\u1e00"-"\u1e9b",
1083
         "\u1ea0"-"\u1ef9",
1084
         "\u1f00"-"\u1f15",
1085
         "\u1f18"-"\u1f1d",
1086
         "\u1f20"-"\u1f45",
1087
         "\u1f48"-"\u1f4d",
1088
         "\u1f50"-"\u1f57",
1089
         "\u1f59",
1090
         "\u1f5b",
1091
         "\u1f5d",
1092
         "\u1f5f"-"\u1f7d",
1093
         "\u1f80"-"\u1fb4",
1094
         "\u1fb6"-"\u1fbc",
1095
         "\u1fbe",
1096
         "\u1fc2"-"\u1fc4",
1097
         "\u1fc6"-"\u1fcc",
1098
         "\u1fd0"-"\u1fd3",
1099
         "\u1fd6"-"\u1fdb",
1100
         "\u1fe0"-"\u1fec",
1101
         "\u1ff2"-"\u1ff4",
1102
         "\u1ff6"-"\u1ffc",
1103
         "\u200c"-"\u200f",
1104
         "\u202a"-"\u202e",
1105
         "\u203f"-"\u2040",
1106
         "\u206a"-"\u206f",
1107
         "\u207f",
1108
         "\u20a0"-"\u20af",
1109
         "\u20d0"-"\u20dc",
1110
         "\u20e1",
1111
         "\u2102",
1112
         "\u2107",
1113
         "\u210a"-"\u2113",
1114
         "\u2115",
1115
         "\u2119"-"\u211d",
1116
         "\u2124",
1117
         "\u2126",
1118
         "\u2128",
1119
         "\u212a"-"\u212d",
1120
         "\u212f"-"\u2131",
1121
         "\u2133"-"\u2139",
1122
         "\u2160"-"\u2183",
1123
         "\u3005"-"\u3007",
1124
         "\u3021"-"\u302f",
1125
         "\u3031"-"\u3035",
1126
         "\u3038"-"\u303a",
1127
         "\u3041"-"\u3094",
1128
         "\u3099"-"\u309a",
1129
         "\u309d"-"\u309e",
1130
         "\u30a1"-"\u30fe",
1131
         "\u3105"-"\u312c",
1132
         "\u3131"-"\u318e",
1133
         "\u31a0"-"\u31b7",
1134
         "\u3400"-"\u4db5",
1135
         "\u4e00"-"\u9fa5",
1136
         "\ua000"-"\ua48c",
1137
         "\uac00"-"\ud7a3",
1138
         "\uf900"-"\ufa2d",
1139
         "\ufb00"-"\ufb06",
1140
         "\ufb13"-"\ufb17",
1141
         "\ufb1d"-"\ufb28",
1142
         "\ufb2a"-"\ufb36",
1143
         "\ufb38"-"\ufb3c",
1144
         "\ufb3e",
1145
         "\ufb40"-"\ufb41",
1146
         "\ufb43"-"\ufb44",
1147
         "\ufb46"-"\ufbb1",
1148
         "\ufbd3"-"\ufd3d",
1149
         "\ufd50"-"\ufd8f",
1150
         "\ufd92"-"\ufdc7",
1151
         "\ufdf0"-"\ufdfb",
1152
         "\ufe20"-"\ufe23",
1153
         "\ufe33"-"\ufe34",
1154
         "\ufe4d"-"\ufe4f",
1155
         "\ufe69",
1156
         "\ufe70"-"\ufe72",
1157
         "\ufe74",
1158
         "\ufe76"-"\ufefc",
1159
         "\ufeff",
1160
         "\uff04",
1161
         "\uff10"-"\uff19",
1162
         "\uff21"-"\uff3a",
1163
         "\uff3f",
1164
         "\uff41"-"\uff5a",
1165
         "\uff65"-"\uffbe",
1166
         "\uffc2"-"\uffc7",
1167
         "\uffca"-"\uffcf",
1168
         "\uffd2"-"\uffd7",
1169
         "\uffda"-"\uffdc",
1170
         "\uffe0"-"\uffe1",
1171
         "\uffe5"-"\uffe6",
1172
         "\ufff9"-"\ufffb"
1173
      ]
1174
  >
1175
}
1176
1177
/* SEPARATORS */
1178
1179
TOKEN :
1180
{
1181
  < LPAREN: "(" >
1182
| < RPAREN: ")" >
1183
| < LBRACE: "{" >
1184
| < RBRACE: "}" >
1185
| < LBRACKET: "[" >
1186
| < RBRACKET: "]" >
1187
| < SEMICOLON: ";" >
1188
| < COMMA: "," >
1189
| < DOT: "." >
1190
| < AT: "@" >
1191
}
1192
1193
/* OPERATORS */
1194
1195
TOKEN :
1196
{
1197
  < ASSIGN: "=" >
1198
| < LT: "<" >
1199
| < BANG: "!" >
1200
| < TILDE: "~" >
1201
| < HOOK: "?" >
1202
| < COLON: ":" >
1203
| < EQ: "==" >
1204
| < LE: "<=" >
1205
| < GE: ">=" >
1206
| < NE: "!=" >
1207
| < SC_OR: "||" >
1208
| < SC_AND: "&&" >
1209
| < INCR: "++" >
1210
| < DECR: "--" >
1211
| < PLUS: "+" >
1212
| < MINUS: "-" >
1213
| < STAR: "*" >
1214
| < SLASH: "/" >
1215
| < BIT_AND: "&" >
1216
| < BIT_OR: "|" >
1217
| < XOR: "^" >
1218
| < REM: "%" >
1219
| < LSHIFT: "<<" >
1220
| < PLUSASSIGN: "+=" >
1221
| < MINUSASSIGN: "-=" >
1222
| < NOTASSIGN: "~=" >
1223
| < STARASSIGN: "*=" >
1224
| < SLASHASSIGN: "/=" >
1225
| < ANDASSIGN: "&=" >
1226
| < ORASSIGN: "|=" >
1227
| < XORASSIGN: "^=" >
1228
| < REMASSIGN: "%=" >
1229
| < LSHIFTASSIGN: "<<=" >
1230
| < RSIGNEDSHIFTASSIGN: ">>=" >
1231
| < RUNSIGNEDSHIFTASSIGN: ">>>=" >
1232
| < ELLIPSIS: "..." >
1233
| < LAMBDA: "->" >
1234
| < ARRAY_IDX: "-->" >
1235
| < METHOD_REF: "::" >
1236
}
1237
1238
/* >'s need special attention due to generics syntax. */
1239
TOKEN :
1240
{
1241
  < RUNSIGNEDSHIFT: ">>>" >
1242
  {
1243
     matchedToken.kind = GT;
1244
     ((Token.GTToken)matchedToken).realKind = RUNSIGNEDSHIFT;
1245
     input_stream.backup(2);
1246
     matchedToken.image = ">";
1247
  }
1248
| < RSIGNEDSHIFT: ">>" >
1249
  {
1250
     matchedToken.kind = GT;
1251
     ((Token.GTToken)matchedToken).realKind = RSIGNEDSHIFT;
1252
     input_stream.backup(1);
1253
     matchedToken.image = ">";
1254
  }
1255
| < GT: ">" >
1256
}
1257
1258
/*****************************************
1259
 * THE JAVA LANGUAGE GRAMMAR STARTS HERE *
1260
 *****************************************/
1261
1262
/*
1263
 * Program structuring syntax follows.
1264
 */
1265
1266
ASTCompilationUnit CompilationUnit() :
1267
{}
1268
{
1269
  [ LOOKAHEAD( ( Annotation() )* "package" ) PackageDeclaration() ]
1270
  ( ImportDeclaration() )*
1271
  ( TypeDeclaration() )*
1272
  ( < "\u001a" > )?
1273
  ( < "~[]" > )?
1274
  <EOF>
1275
{
1276
 jjtThis.setComments(token_source.comments);
1277
 return jjtThis;
1278
}
1279
}
1280
1281
void PackageDeclaration() :
1282
{}
1283
{
1284
  ( Annotation() )* "package" Name() ";"
1285
}
1286
1287
void ImportDeclaration() :
1288
{}
1289
{
1290
  "import" [ "static" {checkForBadStaticImportUsage();jjtThis.setStatic();} ] Name() [ "." "*" {jjtThis.setImportOnDemand();} ] ";"
1291
}
1292
1293
/*
1294
 * Modifiers. We match all modifiers in a single rule to reduce the chances of
1295
 * syntax errors for simple modifier mistakes. It will also enable us to give
1296
 * better error messages.
1297
 */
1298
int Modifiers() #void:
1299
{
1300
   int modifiers = 0;
1301
}
1302
{
1303
 (
1304
  LOOKAHEAD(2)
1305
  (
1306
   "public" { modifiers |= AccessNode.PUBLIC; }
1307
  | "static" { modifiers |= AccessNode.STATIC; }
1308
  | "protected" { modifiers |= AccessNode.PROTECTED; }
1309
  | "private" { modifiers |= AccessNode.PRIVATE; }
1310
  | "final" { modifiers |= AccessNode.FINAL; }
1311
  | "abstract" { modifiers |= AccessNode.ABSTRACT; }
1312
  | "synchronized" { modifiers |= AccessNode.SYNCHRONIZED; }
1313
  | "native" { modifiers |= AccessNode.NATIVE; }
1314
  | "transient" { modifiers |= AccessNode.TRANSIENT; }
1315
  | "volatile" { modifiers |= AccessNode.VOLATILE; }
1316
  | "strictfp" { modifiers |= AccessNode.STRICTFP; }
1317
  | "default" { modifiers |= AccessNode.DEFAULT; checkForBadDefaultImplementationUsage(); }
1318
  | Annotation()
1319
  )
1320
 )*
1321
 {
1322
    return modifiers;
1323
 }
1324
}
1325
1326
/*
1327
 * Declaration syntax follows.
1328
 */
1329
void TypeDeclaration():
1330
{
1331
   int modifiers;
1332
}
1333
{
1334
  ";"
1335
|
1336
  modifiers = Modifiers()
1337
  (
1338
     ClassOrInterfaceDeclaration(modifiers)
1339
   |
1340
     EnumDeclaration(modifiers)
1341
   |
1342
     AnnotationTypeDeclaration(modifiers)
1343
  )
1344
}
1345
1346
void ClassOrInterfaceDeclaration(int modifiers):
1347
{
1348
Token t = null;
1349
jjtThis.setModifiers(modifiers);
1350
}
1351
{
1352
1353
  ( /* See note about this optional final modifier in BlockStatement */ ["final"|"abstract"] "class" | "interface" { jjtThis.setInterface(); } )
1354
  t=<IDENTIFIER> { jjtThis.setImage(t.image); }
1355
  [ TypeParameters() ]
1356
  [ ExtendsList() ]
1357
  [ ImplementsList() ]
1358
  ClassOrInterfaceBody()
1359
}
1360
1361
void ExtendsList():
1362
{
1363
   boolean extendsMoreThanOne = false;
1364
}
1365
{
1366
   "extends" (Annotation() {checkForBadTypeAnnotations();})* ClassOrInterfaceType()
1367
   ( "," (Annotation() {checkForBadTypeAnnotations();})* ClassOrInterfaceType() { extendsMoreThanOne = true; } )*
1368
}
1369
1370
void ImplementsList():
1371
{}
1372
{
1373
   "implements" (Annotation() {checkForBadTypeAnnotations();})* ClassOrInterfaceType()
1374
   ( "," (Annotation() {checkForBadTypeAnnotations();})* ClassOrInterfaceType() )*
1375
}
1376
1377
void EnumDeclaration(int modifiers):
1378
{
1379
1380
Token t;
1381
jjtThis.setModifiers(modifiers);
1382
}
1383
{
1384
  t = <IDENTIFIER> {
1385
    if (!t.image.equals("enum")) {
1386
      throw new ParseException("ERROR: expecting enum");
1387
    }
1388
1389
    if (jdkVersion < 5) {
1390
      throw new ParseException("ERROR: Can't use enum as a keyword in pre-JDK 1.5 target");
1391
    }
1392
  }
1393
  t=<IDENTIFIER> {jjtThis.setImage(t.image);}
1394
  [ ImplementsList() ]
1395
  EnumBody()
1396
}
1397
1398
void EnumBody():
1399
{}
1400
{
1401
   "{"
1402
   [( Annotation() )* EnumConstant() ( LOOKAHEAD(2) "," ( Annotation() )* EnumConstant() )* ]
1403
	[ "," ]
1404
   [ ";" ( ClassOrInterfaceBodyDeclaration() )* ]
1405
   "}"
1406
}
1407
1408
void EnumConstant():
1409
{Token t;}
1410
{
1411
  t=<IDENTIFIER> {jjtThis.setImage(t.image);} [ Arguments() ] [ ClassOrInterfaceBody() ]
1412
}
1413
1414
void TypeParameters():
1415
{}
1416
{
1417
   "<" {checkForBadGenericsUsage();} TypeParameter() ( "," TypeParameter() )* ">"
1418
}
1419
1420
void TypeParameter():
1421
{Token t;}
1422
{
1423
   (Annotation() {checkForBadTypeAnnotations();})*
1424
   t=<IDENTIFIER> {jjtThis.setImage(t.image);} [ TypeBound() ]
1425
}
1426
1427
void TypeBound():
1428
{}
1429
{
1430
   "extends" ClassOrInterfaceType() ( "&" ClassOrInterfaceType() )*
1431
}
1432
1433
void ClassOrInterfaceBody():
1434
{}
1435
{
1436
  "{" ( ClassOrInterfaceBodyDeclaration() )* "}"
1437
}
1438
1439
void ClassOrInterfaceBodyDeclaration():
1440
{
1441
   int modifiers;
1442
}
1443
{ LOOKAHEAD(["static"] "{" ) Initializer()
1444
|  modifiers = Modifiers()
1445
  ( LOOKAHEAD(3) ClassOrInterfaceDeclaration(modifiers)
1446
    | LOOKAHEAD(3) EnumDeclaration(modifiers)
1447
    | LOOKAHEAD( [ TypeParameters() ] <IDENTIFIER> "(" ) ConstructorDeclaration(modifiers)
1448
    | LOOKAHEAD( Type() <IDENTIFIER> ( "[" "]" )* ( "," | "=" | ";" | "->" | "-->" ) )  FieldDeclaration(modifiers)
1449
    | MethodDeclaration(modifiers)
1450
    | AnnotationTypeDeclaration(modifiers)    
1451
  )
1452
|
1453
  ";"
1454
}
1455
1456
void FieldDeclaration(int modifiers) :
1457
{jjtThis.setModifiers(modifiers);}
1458
{
1459
  Type() VariableDeclarator() ( "," VariableDeclarator() )* ";"
1460
}
1461
1462
void VariableDeclarator() :
1463
{}
1464
{
1465
  VariableDeclaratorId() [ ( "=" | "-->" | "->" ) VariableInitializer() ]
1466
}
1467
1468
void VariableDeclaratorId() :
1469
{Token t;}
1470
{
1471
  t=<IDENTIFIER>
1472
  ( "[" "]"  { jjtThis.bumpArrayDepth(); })*
1473
  {
1474
    checkForBadAssertUsage(t.image, "a variable name");
1475
    checkForBadEnumUsage(t.image, "a variable name");
1476
    jjtThis.setImage( t.image );
1477
  }
1478
}
1479
1480
void VariableInitializer() :
1481
{}
1482
{
1483
  ArrayInitializer()
1484
| Expression()
1485
}
1486
1487
void ArrayInitializer() :
1488
{}
1489
{
1490
  "{" [ VariableInitializer() ( LOOKAHEAD(2) "," VariableInitializer() )* ] [ "," ] "}"
1491
}
1492
1493
void MethodDeclaration(int modifiers) :
1494
{jjtThis.setModifiers(modifiers);}
1495
{
1496
  [ TypeParameters() ]
1497
  ResultType() MethodDeclarator() [ "throws" NameList() ]
1498
  ( Block() | ";" )
1499
}
1500
1501
void MethodDeclarator() :
1502
{Token t;}
1503
{
1504
  t=<IDENTIFIER>
1505
  {
1506
    checkForBadAssertUsage(t.image, "a method name");
1507
    checkForBadEnumUsage(t.image, "a method name");
1508
    jjtThis.setImage( t.image );
1509
  }
1510
  FormalParameters() ( "[" "]" )*
1511
}
1512
1513
1514
void FormalParameters() :
1515
{}
1516
{
1517
  "(" [ FormalParameter() ( "," FormalParameter() )* ] ")"
1518
}
1519
1520
void FormalParameter() :
1521
{
1522
}
1523
{
1524
   ( "final" {jjtThis.setFinal(true);} | Annotation() )*
1525
   Type() ("|" {checkForBadMultipleExceptionsCatching();} Type())*
1526
   [ "..." {checkForBadVariableArgumentsUsage();} {jjtThis.setVarargs();} ]
1527
   VariableDeclaratorId()
1528
}
1529
1530
void ConstructorDeclaration(int modifiers) :
1531
{jjtThis.setModifiers(modifiers);
1532
Token t;}
1533
{
1534
    [ TypeParameters() ]
1535
  <IDENTIFIER> FormalParameters() [ "throws" NameList() ]
1536
  "{"
1537
    [ LOOKAHEAD(ExplicitConstructorInvocation()) ExplicitConstructorInvocation() ]
1538
    ( BlockStatement() )*
1539
  t = "}" { if (isPrecededByComment(t)) { jjtThis.setContainsComment(); } }
1540
}
1541
1542
void ExplicitConstructorInvocation() :
1543
{}
1544
{
1545
  LOOKAHEAD("this" Arguments() ";") "this" {jjtThis.setIsThis();} Arguments() ";"
1546
|
1547
  LOOKAHEAD(TypeArguments() "this" Arguments() ";") TypeArguments() "this" {jjtThis.setIsThis();} Arguments() ";"
1548
|
1549
  [ LOOKAHEAD(PrimaryExpression() ".") PrimaryExpression() "." ] [ TypeArguments() ] "super" {jjtThis.setIsSuper();} Arguments() ";"
1550
}
1551
1552
void Initializer() :
1553
{}
1554
{
1555
  [ "static" {jjtThis.setStatic();} ] Block()
1556
}
1557
1558
1559
/*
1560
 * Type, name and expression syntax follows.
1561
 */
1562
void Type():
1563
{}
1564
{
1565
   LOOKAHEAD(2) ReferenceType()
1566
 |
1567
   PrimitiveType()
1568
}
1569
1570
void ReferenceType():
1571
{}
1572
{
1573
   PrimitiveType() ( LOOKAHEAD(2) "[" "]" { jjtThis.bumpArrayDepth(); })+
1574
  |
1575
   ( ClassOrInterfaceType() ) ( LOOKAHEAD(2) "[" "]" { jjtThis.bumpArrayDepth(); })*
1576
}
1577
1578
void ClassOrInterfaceType():
1579
{
1580
  StringBuffer s = new StringBuffer();
1581
  Token t;
1582
}
1583
{
1584
  t=<IDENTIFIER> {s.append(t.image);}
1585
  [ LOOKAHEAD(2) TypeArguments() ]
1586
  ( LOOKAHEAD(2) "." t=<IDENTIFIER> {s.append('.').append(t.image);} [ LOOKAHEAD(2) TypeArguments() ] )*
1587
  {jjtThis.setImage(s.toString());}
1588
}
1589
1590
void TypeArguments():
1591
{}
1592
{
1593
   LOOKAHEAD(2)
1594
   "<" {checkForBadGenericsUsage();} TypeArgument() ( "," TypeArgument() )* ">"
1595
 |
1596
   "<" {checkForBadDiamondUsage();} ">"
1597
}
1598
1599
void TypeArgument():
1600
{}
1601
{
1602
   (Annotation() {checkForBadTypeAnnotations();})* ReferenceType()
1603
 |
1604
   "?" [ WildcardBounds() ]
1605
}
1606
1607
void WildcardBounds():
1608
{}
1609
{
1610
   "extends" (Annotation() {checkForBadTypeAnnotations();})* ReferenceType()
1611
 |
1612
   "super" (Annotation() {checkForBadTypeAnnotations();})* ReferenceType()
1613
}
1614
1615
void PrimitiveType() :
1616
{}
1617
{
1618
  "boolean" {jjtThis.setImage("boolean");}
1619
| "char" {jjtThis.setImage("char");}
1620
| "byte" {jjtThis.setImage("byte");}
1621
| "short" {jjtThis.setImage("short");}
1622
| "int" {jjtThis.setImage("int");}
1623
| "long" {jjtThis.setImage("long");}
1624
| "float" {jjtThis.setImage("float");}
1625
| "double" {jjtThis.setImage("double");}
1626
}
1627
1628
1629
void ResultType() :
1630
{}
1631
{
1632
  "void" | Type()
1633
}
1634
1635
void Name() :
1636
/*
1637
 * A lookahead of 2 is required below since "Name" can be followed
1638
 * by a ".*" when used in the context of an "ImportDeclaration".
1639
 */
1640
{
1641
  StringBuffer s = new StringBuffer();
1642
  Token t;
1643
}
1644
{
1645
  t=<IDENTIFIER>
1646
  {
1647
    jjtThis.testingOnly__setBeginLine( t.beginLine);
1648
    jjtThis.testingOnly__setBeginColumn( t.beginColumn);
1649
    s.append(t.image);
1650
  }
1651
  ( LOOKAHEAD(2) "." t=<IDENTIFIER>
1652
    {s.append('.').append(t.image);}
1653
  )*
1654
  {jjtThis.setImage(s.toString());}
1655
}
1656
1657
void NameList() :
1658
{}
1659
{
1660
  (Annotation() {checkForBadTypeAnnotations();})* Name()
1661
  ( "," (Annotation() {checkForBadTypeAnnotations();})* Name()
1662
  )*
1663
}
1664
1665
1666
/*
1667
 * Expression syntax follows.
1668
 */
1669
1670
void Expression() :
1671
/*
1672
 * This expansion has been written this way instead of:
1673
 *   Assignment() | ConditionalExpression()
1674
 * for performance reasons.
1675
 * However, it is a weakening of the grammar for it allows the LHS of
1676
 * assignments to be any conditional expression whereas it can only be
1677
 * a primary expression.  Consider adding a semantic predicate to work
1678
 * around this.
1679
 */
1680
{}
1681
{
1682
  ConditionalExpression()
1683
  [
1684
    LOOKAHEAD(2) AssignmentOperator() Expression()
1685
  ]
1686
}
1687
1688
void AssignmentOperator() :
1689
{}
1690
{
1691
      "="     {jjtThis.setImage("=");}
1692
    | "*="    {jjtThis.setImage("*="); jjtThis.setCompound();}
1693
    | "/="    {jjtThis.setImage("/="); jjtThis.setCompound();}
1694
    | "%="    {jjtThis.setImage("%="); jjtThis.setCompound();}
1695
    | "+="    {jjtThis.setImage("+="); jjtThis.setCompound();}
1696
    | "-="    {jjtThis.setImage("-="); jjtThis.setCompound();}
1697
    | "~="    {jjtThis.setImage("-="); jjtThis.setCompound();}
1698
    | "<<="   {jjtThis.setImage("<<="); jjtThis.setCompound();}
1699
    | ">>="   {jjtThis.setImage(">>="); jjtThis.setCompound();}
1700
    | ">>>="  {jjtThis.setImage(">>>="); jjtThis.setCompound();}
1701
    | "&="    {jjtThis.setImage("&="); jjtThis.setCompound();}
1702
    | "^="    {jjtThis.setImage("^="); jjtThis.setCompound();}
1703
    | "|="    {jjtThis.setImage("|="); jjtThis.setCompound();}
1704
    | "->"    {jjtThis.setImage("-="); jjtThis.setCompound();}
1705
    | "-->"    {jjtThis.setImage("-="); jjtThis.setCompound();}
1706
}
1707
1708
void ConditionalExpression() #ConditionalExpression(>1) :
1709
{}
1710
{
1711
  ConditionalOrExpression() [ LOOKAHEAD(2) "?" {jjtThis.setTernary();} Expression() ":" ConditionalExpression() ]
1712
}
1713
1714
void ConditionalOrExpression() #ConditionalOrExpression(>1):
1715
{}
1716
{
1717
  ConditionalAndExpression() ( LOOKAHEAD(2) "||" ConditionalAndExpression() )*
1718
}
1719
1720
void ConditionalAndExpression() #ConditionalAndExpression(>1):
1721
{}
1722
{
1723
  InclusiveOrExpression() ( LOOKAHEAD(2) "&&" InclusiveOrExpression() )*
1724
}
1725
1726
void InclusiveOrExpression() #InclusiveOrExpression(>1) :
1727
{}
1728
{
1729
  ExclusiveOrExpression() ( LOOKAHEAD(2) "|" ExclusiveOrExpression() )*
1730
}
1731
1732
void ExclusiveOrExpression() #ExclusiveOrExpression(>1) :
1733
{}
1734
{
1735
  AndExpression()  ( LOOKAHEAD(2) "^" AndExpression() )*
1736
}
1737
1738
void AndExpression() #AndExpression(>1):
1739
{}
1740
{
1741
  EqualityExpression() ( LOOKAHEAD(2) "&" EqualityExpression() )*
1742
}
1743
1744
void EqualityExpression() #EqualityExpression(>1):
1745
{}
1746
{
1747
  InstanceOfExpression()  ( LOOKAHEAD(2) ( "==" {jjtThis.setImage("==");} | "!=" {jjtThis.setImage("!=");} ) InstanceOfExpression()  )*
1748
}
1749
1750
void InstanceOfExpression() #InstanceOfExpression(>1):
1751
{}
1752
{
1753
  RelationalExpression() [ LOOKAHEAD(2) "instanceof" Type() ]
1754
}
1755
1756
void RelationalExpression() #RelationalExpression(>1):
1757
{}
1758
{
1759
  ShiftExpression()
1760
   ( LOOKAHEAD(2)
1761
    ( "<" {jjtThis.setImage("<");}
1762
     | ">" {jjtThis.setImage(">");}
1763
     | "<=" {jjtThis.setImage("<=");}
1764
     | ">=" {jjtThis.setImage(">=");}
1765
    ) ShiftExpression() )*
1766
}
1767
1768
void ShiftExpression() #ShiftExpression(>1):
1769
{}
1770
{
1771
  AdditiveExpression() 
1772
   ( LOOKAHEAD(2)
1773
    ( "<<" { jjtThis.setImage("<<");}
1774
     | RSIGNEDSHIFT()
1775
     | RUNSIGNEDSHIFT()
1776
    ) AdditiveExpression() )*
1777
}
1778
1779
void AdditiveExpression() #AdditiveExpression(>1):
1780
{}
1781
{
1782
  MultiplicativeExpression() ( LOOKAHEAD(2) ( "+" {jjtThis.setImage("+");} | "or" {jjtThis.setImage("or");} | "-" {jjtThis.setImage("-");} ) MultiplicativeExpression() )*
1783
}
1784
1785
void MultiplicativeExpression() #MultiplicativeExpression(>1):
1786
{}
1787
{
1788
  UnaryExpression() ( LOOKAHEAD(2) ( "*" {jjtThis.setImage("*");} | "/" {jjtThis.setImage("/");} | "%" {jjtThis.setImage("%");}) UnaryExpression() )*
1789
}
1790
1791
void UnaryExpression() #UnaryExpression((jjtn000.getImage() != null)):
1792
{}
1793
{
1794
  ("+" {jjtThis.setImage("+");} | "-" {jjtThis.setImage("-");}) UnaryExpression()
1795
  | PreIncrementExpression()
1796
  | PreDecrementExpression()
1797
  | UnaryExpressionNotPlusMinus()
1798
}
1799
1800
void PreIncrementExpression() :
1801
{}
1802
{
1803
  "++" PrimaryExpression()
1804
}
1805
1806
void PreDecrementExpression() :
1807
{}
1808
{
1809
  "--" PrimaryExpression()
1810
}
1811
1812
void UnaryExpressionNotPlusMinus() #UnaryExpressionNotPlusMinus((jjtn000.getImage() != null)):
1813
{}
1814
{
1815
 ( "~" {jjtThis.setImage("~");} | "!" {jjtThis.setImage("!");} ) UnaryExpression()
1816
| LOOKAHEAD( CastExpression() ) CastExpression()
1817
| PostfixExpression()
1818
}
1819
1820
void PostfixExpression() #PostfixExpression((jjtn000.getImage() != null)):
1821
{}
1822
{
1823
  PrimaryExpression() [ "++" {jjtThis.setImage("++");} | "--" {jjtThis.setImage("--");} ]
1824
}
1825
1826
void CastExpression() #CastExpression(>1):
1827
{}
1828
{
1829
  LOOKAHEAD("(" (Annotation())* Type() ")") "(" (Annotation() {checkForBadTypeAnnotations();})* Type() ")" UnaryExpression()
1830
| LOOKAHEAD("(" (Annotation())* Type() "&") "(" (Annotation() {checkForBadTypeAnnotations();})* Type() ( "&" {checkForBadIntersectionTypesInCasts(); jjtThis.setIntersectionTypes(true);} ReferenceType() )+ ")" UnaryExpressionNotPlusMinus()
1831
| "(" (Annotation() {checkForBadTypeAnnotations();})* Type() ")" UnaryExpressionNotPlusMinus()
1832
}
1833
1834
void PrimaryExpression() :
1835
{}
1836
{
1837
  PrimaryPrefix() ( LOOKAHEAD(2) PrimarySuffix() )*
1838
}
1839
1840
void MemberSelector():
1841
{
1842
Token t;
1843
}
1844
{
1845
  "." TypeArguments() t=<IDENTIFIER> {jjtThis.setImage(t.image);}
1846
| MethodReference()
1847
}
1848
1849
void MethodReference() :
1850
{Token t; checkForBadMethodReferenceUsage();}
1851
{
1852
  "::" ("new" {jjtThis.setImage("new");} | t=<IDENTIFIER> {jjtThis.setImage(t.image);} )
1853
}
1854
1855
void PrimaryPrefix() :
1856
{Token t;}
1857
{
1858
  Literal()
1859
| "this" {jjtThis.setUsesThisModifier();}
1860
| "super" {jjtThis.setUsesSuperModifier();}
1861
| LOOKAHEAD( LambdaExpression() ) LambdaExpression()
1862
| LOOKAHEAD( <IDENTIFIER> "->" ) LambdaExpression()
1863
| LOOKAHEAD(3) "(" Expression() ")"
1864
| AllocationExpression()
1865
| LOOKAHEAD( ResultType() "." "class" ) ResultType() "." "class"
1866
| LOOKAHEAD( ReferenceType() MethodReference() ) ReferenceType() MethodReference()
1867
| Name()
1868
}
1869
1870
void LambdaExpression() :
1871
{ checkForBadLambdaUsage(); }
1872
{
1873
  VariableDeclaratorId() "->" ( Expression() | Block() )
1874
| LOOKAHEAD(3) FormalParameters() "->" ( Expression() | Block() )
1875
| LOOKAHEAD(3) "(" VariableDeclaratorId() ( "," VariableDeclaratorId() )* ")" "->" ( Expression() | Block() )
1876
}
1877
1878
void PrimarySuffix() :
1879
{Token t;}
1880
{ LOOKAHEAD(2) "." "this"
1881
| LOOKAHEAD(2) "." "super"
1882
| LOOKAHEAD(2) "." AllocationExpression()
1883
| LOOKAHEAD(3) MemberSelector()
1884
| "[" Expression() "]" {jjtThis.setIsArrayDereference();}
1885
| "." t=<IDENTIFIER> {jjtThis.setImage(t.image);}
1886
| Arguments() {jjtThis.setIsArguments();}
1887
}
1888
1889
void Literal() :
1890
{}
1891
{
1892
{ Token t;}
1893
  t=<INTEGER_LITERAL> { checkForBadNumericalLiteralslUsage(t); jjtThis.setImage(t.image); jjtThis.setIntLiteral();}
1894
| t=<FLOATING_POINT_LITERAL> { checkForBadNumericalLiteralslUsage(t); jjtThis.setImage(t.image); jjtThis.setFloatLiteral();}
1895
| t=<HEX_FLOATING_POINT_LITERAL> { checkForBadHexFloatingPointLiteral(); checkForBadNumericalLiteralslUsage(t); jjtThis.setImage(t.image); jjtThis.setFloatLiteral();}
1896
| t=<CHARACTER_LITERAL> {jjtThis.setImage(t.image); jjtThis.setCharLiteral();}
1897
| t=<STRING_LITERAL> {jjtThis.setImage(t.image); jjtThis.setStringLiteral();}
1898
| t=<STRING_LITERAL_SQ> {jjtThis.setImage(t.image); jjtThis.setStringLiteral();}
1899
| BooleanLiteral()
1900
| NullLiteral()
1901
}
1902
1903
void BooleanLiteral() :
1904
{}
1905
{
1906
  "true" { jjtThis.setTrue(); } | "false"
1907
}
1908
1909
void NullLiteral() :
1910
{}
1911
{ "null" }
1912
1913
void Arguments() :
1914
{}
1915
{
1916
  "(" [ ArgumentList() ] ")"
1917
}
1918
1919
void ArgumentList() :
1920
{}
1921
{
1922
  Expression() ( "," Expression() )*
1923
}
1924
1925
void AllocationExpression():
1926
{}
1927
{
1928
  "new" (Annotation() {checkForBadTypeAnnotations();})*
1929
  (LOOKAHEAD(2)
1930
    PrimitiveType() ArrayDimsAndInits()
1931
  |
1932
    ClassOrInterfaceType() [ TypeArguments() ]
1933
     (
1934
      ArrayDimsAndInits()
1935
     |
1936
      Arguments() [ ClassOrInterfaceBody() ]
1937
     )
1938
  )
1939
}
1940
1941
/*
1942
 * The second LOOKAHEAD specification below is to parse to PrimarySuffix
1943
 * if there is an expression between the "[...]".
1944
 */
1945
void ArrayDimsAndInits() :
1946
{}
1947
{
1948
  LOOKAHEAD(2)
1949
  ( LOOKAHEAD(2) "[" Expression() "]" )+ ( LOOKAHEAD(2) "[" "]" )*
1950
|
1951
  ( "[" "]" )+ ArrayInitializer()
1952
}
1953
1954
1955
/*
1956
 * Statement syntax follows.
1957
 */
1958
1959
void Statement() :
1960
{}
1961
{
1962
  LOOKAHEAD( { isNextTokenAnAssert() } ) AssertStatement()
1963
| LOOKAHEAD(2) LabeledStatement()
1964
| Block()
1965
| EmptyStatement()
1966
| I6ToplevelDeclaration()
1967
| I6SpecificStatement()
1968
| StatementExpression() ";"
1969
| SwitchStatement()
1970
| IfStatement()
1971
| WhileStatement()
1972
| DoStatement()
1973
| ForStatement()
1974
| BreakStatement()
1975
| ContinueStatement()
1976
| ReturnStatement()
1977
| ThrowStatement()
1978
| SynchronizedStatement()
1979
| TryStatement()
1980
}
1981
1982
void LabeledStatement() :
1983
{Token t;}
1984
{
1985
  t=<IDENTIFIER> {jjtThis.setImage(t.image);} ":" Statement()
1986
}
1987
1988
void Block() :
1989
{Token t;}
1990
{
1991
      "{"
1992
       
1993
      ( BlockStatement() )* t = "}" { if (isPrecededByComment(t)) { jjtThis.setContainsComment(); } }
1994
}
1995
1996
void BlockStatement():
1997
{}
1998
{
1999
  LOOKAHEAD( { isNextTokenAnAssert() } ) AssertStatement()
2000
|
2001
  LOOKAHEAD(( "final" | Annotation() )* Type() <IDENTIFIER>)
2002
  LocalVariableDeclaration() ";"
2003
|
2004
  Statement()
2005
|
2006
  /*
2007
  TODO: Seems like we should be discarding the "final"
2008
  after using it in the lookahead; I added a ["final|abstract"] inside
2009
  ClassOrInterfaceDeclaration, but that seems like a hack that
2010
  could break other things...
2011
  */
2012
  LOOKAHEAD( [Annotation()] ["final"|"abstract"] "class") [Annotation()] ClassOrInterfaceDeclaration(0)
2013
}
2014
2015
void LocalVariableDeclaration() :
2016
{}
2017
{
2018
  ( "final" {jjtThis.setFinal(true);} | Annotation() )*
2019
  Type()
2020
  VariableDeclarator()
2021
  ( "," VariableDeclarator() )*
2022
}
2023
2024
void EmptyStatement() :
2025
{}
2026
{
2027
  ";"
2028
}
2029
2030
void StatementExpression() :
2031
{}
2032
{
2033
  PreIncrementExpression()
2034
|
2035
  PreDecrementExpression()
2036
|
2037
  LOOKAHEAD( PrimaryExpression() ("++" | "--") ) PostfixExpression()
2038
|
2039
  PrimaryExpression()
2040
  [
2041
  AssignmentOperator() Expression()
2042
  ]
2043
}
2044
2045
void SwitchStatement() :
2046
{}
2047
{
2048
  "switch" "(" Expression() ")" "{"
2049
    ( SwitchLabel() ( BlockStatement() )* )*
2050
  "}"
2051
}
2052
2053
void SwitchLabel() :
2054
{}
2055
{
2056
  ["case"] Expression() ":"
2057
|
2058
  "default" {jjtThis.setDefault();} ":"
2059
}
2060
2061
void IfStatement() :
2062
/*
2063
 * The disambiguating algorithm of JavaCC automatically binds dangling
2064
 * else's to the innermost if statement.  The LOOKAHEAD specification
2065
 * is to tell JavaCC that we know what we are doing.
2066
 */
2067
{}
2068
{
2069
  "if" "(" Expression() ")" Statement() [ LOOKAHEAD(1) "else" {jjtThis.setHasElse();} Statement() ]
2070
{}
2071
}
2072
2073
void WhileStatement() :
2074
{}
2075
{
2076
  "while" "(" Expression() ")" Statement()
2077
}
2078
2079
void DoStatement() :
2080
{}
2081
{
2082
  "do" Statement() "while" "(" Expression() ")" ";"
2083
}
2084
2085
2086
void ForStatement() :
2087
{}
2088
{ "for" "("
2089
(   
2090
  LOOKAHEAD(LocalVariableDeclaration() ":")   {checkForBadJDK15ForLoopSyntaxArgumentsUsage();}  LocalVariableDeclaration() ":" Expression()
2091
|
2092
  [ ForInit() ] (";" | ":")   [ Expression() ] (";" | ":") [ ForUpdate() ]
2093
)
2094
 ")" Statement()
2095
}
2096
2097
void ForInit() :
2098
{}
2099
{
2100
  LOOKAHEAD( LocalVariableDeclaration() )
2101
  LocalVariableDeclaration()
2102
|
2103
  StatementExpressionList()
2104
}
2105
2106
void StatementExpressionList() :
2107
{}
2108
{
2109
  StatementExpression() ( "," StatementExpression() )*
2110
}
2111
2112
void ForUpdate() :
2113
{}
2114
{
2115
  StatementExpressionList()
2116
}
2117
2118
void BreakStatement() :
2119
{Token t;}
2120
{
2121
  "break" [ t=<IDENTIFIER> {jjtThis.setImage(t.image);} ] ";"
2122
}
2123
2124
void ContinueStatement() :
2125
{Token t;}
2126
{
2127
  "continue" [ t=<IDENTIFIER> {jjtThis.setImage(t.image);} ] ";"
2128
}
2129
2130
void ReturnStatement() :
2131
{}
2132
{
2133
  "return" [ Expression() ] ";"
2134
}
2135
2136
void ThrowStatement() :
2137
{}
2138
{
2139
  "throw" Expression() ";"
2140
}
2141
2142
void SynchronizedStatement() :
2143
{}
2144
{
2145
  "synchronized" "(" Expression() ")" Block()
2146
}
2147
2148
void TryStatement() :
2149
/*
2150
 * Semantic check required here to make sure that at least one
2151
 * resource/finally/catch is present.
2152
 */
2153
{}
2154
{
2155
  "try" (ResourceSpecification())? Block()
2156
  ( CatchStatement() )*
2157
  [ FinallyStatement() ]
2158
}
2159
2160
void ResourceSpecification() :
2161
{}
2162
{
2163
    {checkForBadTryWithResourcesUsage();}
2164
	"("
2165
	Resources()
2166
	(LOOKAHEAD(2) ";")?
2167
	")"	
2168
}
2169
2170
void Resources() :
2171
{}
2172
{
2173
	Resource() (LOOKAHEAD(2) ";" Resource())*
2174
}
2175
2176
void Resource() :
2177
{}
2178
{
2179
	( "final" | Annotation() )*
2180
	Type()
2181
	VariableDeclaratorId()
2182
	"="
2183
	Expression()
2184
}
2185
2186
void CatchStatement() :
2187
{}
2188
{
2189
  "catch"
2190
  "(" FormalParameter() ")"
2191
  Block()
2192
}
2193
2194
void FinallyStatement() :
2195
{}
2196
{
2197
    "finally" Block()
2198
}
2199
2200
void AssertStatement() :
2201
{
2202
    if (jdkVersion <= 3) {
2203
        throw new ParseException("Can't use 'assert' as a keyword when running in JDK 1.3 mode!");
2204
    }
2205
}
2206
{
2207
  <IDENTIFIER> Expression() [ ":" Expression() ] ";"
2208
}
2209
2210
/* We use productions to match >>>, >> and > so that we can keep the
2211
 * type declaration syntax with generics clean
2212
 */
2213
2214
void RUNSIGNEDSHIFT():
2215
{}
2216
{
2217
  ( LOOKAHEAD({ getToken(1).kind == GT &&
2218
                ((Token.GTToken)getToken(1)).realKind == RUNSIGNEDSHIFT} )
2219
   ">" ">" ">"
2220
  )
2221
}
2222
2223
void RSIGNEDSHIFT():
2224
{}
2225
{
2226
  ( LOOKAHEAD({ getToken(1).kind == GT &&
2227
                ((Token.GTToken)getToken(1)).realKind == RSIGNEDSHIFT} )
2228
  ">" ">"
2229
  )
2230
}
2231
2232
/* Annotation syntax follows. */
2233
2234
void Annotation():
2235
{}
2236
{
2237
   LOOKAHEAD( "@" Name() "(" ( <IDENTIFIER> "=" | ")" ))
2238
   NormalAnnotation()
2239
 |
2240
   LOOKAHEAD( "@" Name() "(" )
2241
   SingleMemberAnnotation()
2242
 |
2243
   MarkerAnnotation()
2244
}
2245
2246
void NormalAnnotation():
2247
{}
2248
{
2249
   "@" Name() "(" [ MemberValuePairs() ] ")" {checkForBadAnnotationUsage();}
2250
}
2251
2252
void MarkerAnnotation():
2253
{}
2254
{
2255
  "@" Name() {checkForBadAnnotationUsage();}
2256
}
2257
2258
void SingleMemberAnnotation():
2259
{}
2260
{
2261
  "@" Name() "(" MemberValue() ")" {checkForBadAnnotationUsage();}
2262
}
2263
2264
void MemberValuePairs():
2265
{}
2266
{
2267
   MemberValuePair() ( "," MemberValuePair() )*
2268
}
2269
2270
void MemberValuePair():
2271
{Token t;}
2272
{
2273
    t=<IDENTIFIER> { jjtThis.setImage(t.image); } "=" MemberValue()
2274
}
2275
2276
void MemberValue():
2277
{}
2278
{
2279
   Annotation()
2280
 |
2281
   MemberValueArrayInitializer()
2282
 |
2283
   ConditionalExpression()
2284
}
2285
2286
void  MemberValueArrayInitializer():
2287
{}
2288
{
2289
  "{" (MemberValue() ( LOOKAHEAD(2) "," MemberValue() )* [ "," ])? "}"
2290
}
2291
2292
2293
/* Annotation Types. */
2294
2295
void AnnotationTypeDeclaration(int modifiers):
2296
{
2297
Token t;
2298
jjtThis.setModifiers(modifiers);
2299
}
2300
{
2301
  "@" "interface" t=<IDENTIFIER> {checkForBadAnnotationUsage();jjtThis.setImage(t.image);} AnnotationTypeBody()
2302
}
2303
2304
void AnnotationTypeBody():
2305
{}
2306
{
2307
  "{" ( AnnotationTypeMemberDeclaration() )* "}"
2308
}
2309
2310
void AnnotationTypeMemberDeclaration():
2311
{
2312
   int modifiers;
2313
}
2314
{
2315
 modifiers = Modifiers()
2316
 (
2317
   LOOKAHEAD(3) AnnotationMethodDeclaration(modifiers)
2318
  |
2319
   ClassOrInterfaceDeclaration(modifiers)
2320
  |
2321
   LOOKAHEAD(3) EnumDeclaration(modifiers)
2322
  |
2323
   AnnotationTypeDeclaration(modifiers)
2324
  |
2325
   FieldDeclaration(modifiers)
2326
 )
2327
 |
2328
   ( ";" )
2329
}
2330
2331
void AnnotationMethodDeclaration(int modifiers):
2332
{
2333
  Token t;
2334
  jjtThis.setModifiers(modifiers);
2335
}
2336
{
2337
  Type() t=<IDENTIFIER> "(" ")"  [ DefaultValue() ] ";"
2338
  {
2339
    jjtThis.setImage(t.image);
2340
  }
2341
}
2342
2343
void DefaultValue():
2344
{}
2345
{
2346
  "default" MemberValue()
2347
}
2348
2349
2350
/*INFORM6 BEGIN */
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
/*
2367
	Thanks to Sreenivasa Viswanadha for suggesting how to get rid of expensive
2368
	lookahead here.
2369
*/
2370
boolean Line() :
2371
{}
2372
{
2373
  <EOF> { 
2374
	//Interpreter.debug("End of File!"); 
2375
	return true; 
2376
  }
2377
|
2378
  BlockStatement() {
2379
     
2380
	return false; 
2381
  }
2382
}
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
void  I6PrintStatement() #I6PrintStatement :
2394
{}
2395
{
2396
  ( "print" | "print_ret" ) I6Expressions() ";"
2397
}
2398
2399
2400
void I6FormalParameters() #I6FormalParameters :
2401
{}
2402
{
2403
    (  I6FormalParameter() )* 
2404
}
2405
2406
void I6FormalParameter() #I6FormalParameter :
2407
{ Token t; }
2408
{
2409
  // added [] to Type for ish.  Removed [ final ] - is that legal?
2410
  LOOKAHEAD(2) t=<IDENTIFIER> { jjtThis.name = t.image; }
2411
|
2412
  t=<IDENTIFIER> { jjtThis.name = t.image; }
2413
} 
2414
2415
void I6Expressions() #I6Expressions :
2416
{}
2417
{
2418
   I6Expression() ( [","] I6Expression() )* 
2419
}
2420
2421
void I6Expression() #I6Expression :
2422
{  }
2423
{
2424
     Expression()
2425
	//Arguments()
2426
}
2427
2428
void I6MethodDeclaration() #I6MethodDeclaration :
2429
{ Token t; }
2430
{
2431
	"[" t=<IDENTIFIER>  I6FormalParameters() ";"  I6Block()  "]" ";"
2432
	{
2433
	    jjtThis.name = t.image; 
2434
	}
2435
}
2436
2437
2438
void I6Block() #I6Block :
2439
{}
2440
{
2441
  ( BlockStatement() )* 
2442
}
2443
2444
/*
2445
void I6ForStatement() #I6ForStatement :
2446
{ Token t = null; }
2447
{
2448
  "for"
2449
  "("
2450
   [ I6ForInit() { jjtThis.hasForInit=true; } ]
2451
    (":"|";") [ I6ForExpression() { jjtThis.hasExpression=true; } ]
2452
    (":"|";") [ I6ForUpdate() { jjtThis.hasForUpdate=true; } ]
2453
    ")"
2454
    Statement()
2455
}
2456
2457
2458
2459
void I6ForStatement() #I6ForStatement :
2460
{  }
2461
{
2462
  "for"  "("    [ I6ForInit()  ]  ":" [ I6ForExpression()  ]   ":" [ I6ForUpdate() ]  ")"  Statement()
2463
}
2464
2465
 
2466
2467
void I6ForInit() #I6ForInit :
2468
{}
2469
{
2470
  ForInit()
2471
  } 
2472
void I6ForUpdate() #I6ForUpdate :
2473
{}{
2474
  ForUpdate()
2475
  } 
2476
void I6ForExpression() #I6ForExpression :
2477
{}{
2478
	 Expression()
2479
  } 
2480
 */
2481
2482
void RTrueStatement() #RTrueStatement(true) :
2483
{}
2484
{
2485
  "rtrue" ";" 
2486
}
2487
2488
void RFalseStatement() #RFalseStatement :
2489
{}
2490
{
2491
  "rfalse" ";"
2492
}
2493
2494
void PushToLabel() #PushToLabel :
2495
{}
2496
{
2497
   ["-->" <IDENTIFIER>]
2498
}
2499
2500
 
2501
void AsmStatement() #AsmStatement :
2502
{}
2503
{
2504
  (
2505
    <ULXCODE> I6Expressions()  ";"
2506
| 
2507
  "@"Expression() I6Expressions() ";"
2508
)
2509
}
2510
2511
2512
2513
void I6ToplevelDeclaration() #I6TopevelDeclaration :
2514
{}
2515
{
2516
  	I6MethodDeclaration()
2517
 | 
2518
  	I6ClassDeclaration()
2519
}
2520
2521
2522
2523
void I6ClassDeclaration() #I6ClassDeclaration :
2524
{}
2525
{
2526
  "CLASS DEF"
2527
}
2528
2529
2530
void i6FileDirective() #i6FileDirective :
2531
{}
2532
{
2533
  (
2534
    "release" | "switches" | "include" | "#include"
2535
    "Release" | "Switches" | "Include" | "#Include"
2536
   ) Literal() ";" 
2537
}
2538
2539
2540
void I6SpecificStatement() #I6SpecificStatement :
2541
{}
2542
{
2543
 (
2544
 AsmStatement()
2545
 |
2546
  /*LOOKAHEAD ("for" "("   [ I6ForInit() ] 
2547
    ":" [ I6ForExpression() ]
2548
    ":" [ I6ForUpdate() ] ")" )
2549
  	I6ForStatement()
2550
 |*/
2551
   
2552
  ("Array"| "array") <IDENTIFIER> [("-->" | "->" ) I6Expressions()] ";"
2553
| 
2554
  ("Constant"| "constant") <IDENTIFIER> ["=" Expression()] ";"
2555
| 
2556
  ("Global"| "global") <IDENTIFIER> ["=" Expression()] ";"
2557
//| 
2558
// i6FileDirective()
2559
| 
2560
 I6PrintStatement()
2561
| 
2562
 RFalseStatement()
2563
 |
2564
 RTrueStatement()
2565
)
2566
}
2567
2568
2569
2570
/*INFORM6 END */