antlr3 1.8.0 → 1.8.2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +35 -0
- data/Manifest.txt +73 -0
- data/README.txt +6 -13
- data/java/RubyTarget.java +43 -19
- data/java/antlr-full-3.2.1.jar +0 -0
- data/lib/antlr3/debug.rb +2 -0
- data/lib/antlr3/debug/event-hub.rb +55 -55
- data/lib/antlr3/debug/record-event-listener.rb +2 -2
- data/lib/antlr3/debug/rule-tracer.rb +14 -14
- data/lib/antlr3/debug/socket.rb +47 -47
- data/lib/antlr3/debug/trace-event-listener.rb +8 -8
- data/lib/antlr3/main.rb +29 -9
- data/lib/antlr3/modes/ast-builder.rb +7 -7
- data/lib/antlr3/modes/filter.rb +19 -17
- data/lib/antlr3/profile.rb +34 -6
- data/lib/antlr3/recognizers.rb +50 -1
- data/lib/antlr3/streams.rb +19 -15
- data/lib/antlr3/streams/rewrite.rb +241 -229
- data/lib/antlr3/template/group-file-lexer.rb +6 -8
- data/lib/antlr3/template/group-file-parser.rb +16 -16
- data/lib/antlr3/template/group-file.rb +1 -1
- data/lib/antlr3/test/call-stack.rb +13 -13
- data/lib/antlr3/test/core-extensions.rb +69 -69
- data/lib/antlr3/test/functional.rb +0 -4
- data/lib/antlr3/test/grammar.rb +70 -70
- data/lib/antlr3/token.rb +41 -17
- data/lib/antlr3/tree.rb +11 -14
- data/lib/antlr3/tree/debug.rb +53 -53
- data/lib/antlr3/tree/visitor.rb +11 -11
- data/lib/antlr3/tree/wizard.rb +35 -35
- data/lib/antlr3/util.rb +18 -0
- data/lib/antlr3/version.rb +1 -1
- data/rakefile +1 -0
- data/samples/ANTLRv3Grammar.g +3 -3
- data/samples/JavaScript.g +702 -0
- data/samples/standard/C/C.g +543 -0
- data/samples/standard/C/C.tokens +175 -0
- data/samples/standard/C/C__testrig.st +0 -0
- data/samples/standard/C/c.rb +12 -0
- data/samples/standard/C/input +3479 -0
- data/samples/standard/C/output +171 -0
- data/samples/standard/LL-star/LLStar.g +101 -0
- data/samples/standard/LL-star/input +12 -0
- data/samples/standard/LL-star/ll-star.rb +12 -0
- data/samples/standard/LL-star/output +2 -0
- data/samples/standard/calc/Calculator.g +47 -0
- data/samples/standard/calc/Calculator.py +16 -0
- data/samples/standard/calc/Calculator.rb +28 -0
- data/samples/standard/cminus/CMinus.g +141 -0
- data/samples/standard/cminus/bytecode.group +80 -0
- data/samples/standard/cminus/cminus.rb +16 -0
- data/samples/standard/cminus/input +9 -0
- data/samples/standard/cminus/java.group +91 -0
- data/samples/standard/cminus/output +11 -0
- data/samples/standard/cminus/python.group +48 -0
- data/samples/standard/dynamic-scope/DynamicScopes.g +50 -0
- data/samples/standard/dynamic-scope/dynamic-scopes.rb +12 -0
- data/samples/standard/dynamic-scope/input +7 -0
- data/samples/standard/dynamic-scope/output +4 -0
- data/samples/standard/fuzzy/FuzzyJava.g +89 -0
- data/samples/standard/fuzzy/fuzzy.py +11 -0
- data/samples/standard/fuzzy/fuzzy.rb +9 -0
- data/samples/standard/fuzzy/input +13 -0
- data/samples/standard/fuzzy/output +12 -0
- data/samples/standard/hoisted-predicates/HoistedPredicates.g +40 -0
- data/samples/standard/hoisted-predicates/hoisted-predicates.rb +13 -0
- data/samples/standard/hoisted-predicates/input +1 -0
- data/samples/standard/hoisted-predicates/output +1 -0
- data/samples/standard/island-grammar/Javadoc.g +46 -0
- data/samples/standard/island-grammar/Simple.g +104 -0
- data/samples/standard/island-grammar/input +11 -0
- data/samples/standard/island-grammar/island.rb +12 -0
- data/samples/standard/island-grammar/output +16 -0
- data/samples/standard/java/Java.g +827 -0
- data/samples/standard/java/input +80 -0
- data/samples/standard/java/java.rb +13 -0
- data/samples/standard/java/output +1 -0
- data/samples/standard/python/Python.g +718 -0
- data/samples/standard/python/PythonTokenSource.rb +107 -0
- data/samples/standard/python/input +210 -0
- data/samples/standard/python/output +24 -0
- data/samples/standard/python/python.rb +14 -0
- data/samples/standard/rakefile +18 -0
- data/samples/standard/scopes/SymbolTable.g +66 -0
- data/samples/standard/scopes/input +12 -0
- data/samples/standard/scopes/output +3 -0
- data/samples/standard/scopes/scopes.rb +12 -0
- data/samples/standard/simplecTreeParser/SimpleC.g +113 -0
- data/samples/standard/simplecTreeParser/SimpleCWalker.g +64 -0
- data/samples/standard/simplecTreeParser/input +12 -0
- data/samples/standard/simplecTreeParser/output +1 -0
- data/samples/standard/simplecTreeParser/simplec.rb +18 -0
- data/samples/standard/treeparser/Lang.g +24 -0
- data/samples/standard/treeparser/LangDumpDecl.g +17 -0
- data/samples/standard/treeparser/input +1 -0
- data/samples/standard/treeparser/output +2 -0
- data/samples/standard/treeparser/treeparser.rb +18 -0
- data/samples/standard/tweak/Tweak.g +68 -0
- data/samples/standard/tweak/input +9 -0
- data/samples/standard/tweak/output +16 -0
- data/samples/standard/tweak/tweak.rb +13 -0
- data/samples/standard/xml/README +16 -0
- data/samples/standard/xml/XML.g +123 -0
- data/samples/standard/xml/input +21 -0
- data/samples/standard/xml/output +39 -0
- data/samples/standard/xml/xml.rb +9 -0
- data/templates/Ruby.stg +4 -4
- data/test/functional/ast-output/auto-ast.rb +0 -5
- data/test/functional/ast-output/rewrites.rb +4 -4
- data/test/unit/test-scope.rb +45 -0
- metadata +96 -8
@@ -0,0 +1,13 @@
|
|
1
|
+
import org.antlr.runtime.*;
|
2
|
+
|
3
|
+
public class Main {
|
4
|
+
public static void main(String[] args) throws Exception {
|
5
|
+
for (int i=0; i<args.length; i++) {
|
6
|
+
CharStream input = new ANTLRFileStream(args[i]);
|
7
|
+
FuzzyJava lex = new FuzzyJava(input);
|
8
|
+
TokenStream tokens = new CommonTokenStream(lex);
|
9
|
+
tokens.toString();
|
10
|
+
//System.out.println(tokens);
|
11
|
+
}
|
12
|
+
}
|
13
|
+
}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
found class Main
|
2
|
+
found method main
|
3
|
+
found var i
|
4
|
+
found var input
|
5
|
+
found call ANTLRFileStream
|
6
|
+
found var lex
|
7
|
+
found call FuzzyJava
|
8
|
+
found var tokens
|
9
|
+
found call CommonTokenStream
|
10
|
+
found call tokens.toString
|
11
|
+
found // comment //System.out.println(tokens);
|
12
|
+
|
@@ -0,0 +1,40 @@
|
|
1
|
+
/** Demonstrates how semantic predicates get hoisted out of the rule in
|
2
|
+
* which they are found and used in other decisions. This grammar illustrates
|
3
|
+
* how predicates can be used to distinguish between enum as a keyword and
|
4
|
+
* an ID *dynamically*. :)
|
5
|
+
|
6
|
+
* Run "java org.antlr.Tool -dfa t.g" to generate DOT (graphviz) files. See
|
7
|
+
* the T_dec-1.dot file to see the predicates in action.
|
8
|
+
*/
|
9
|
+
grammar HoistedPredicates;
|
10
|
+
options { language = Ruby; }
|
11
|
+
|
12
|
+
/* With this true, enum is seen as a keyword. False, it's an identifier */
|
13
|
+
@init { @enable_enum = false }
|
14
|
+
|
15
|
+
stat: identifier { puts( "enum is an ID" ) }
|
16
|
+
| enum_as_keyword { puts( "enum is a keyword" ) }
|
17
|
+
;
|
18
|
+
|
19
|
+
identifier
|
20
|
+
: ID
|
21
|
+
| enum_as_id
|
22
|
+
;
|
23
|
+
|
24
|
+
enum_as_keyword : { @enable_enum }? 'enum' ;
|
25
|
+
|
26
|
+
enum_as_id : { ! @enableEnum }? 'enum' ;
|
27
|
+
|
28
|
+
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
|
29
|
+
;
|
30
|
+
|
31
|
+
INT : ('0'..'9')+
|
32
|
+
;
|
33
|
+
|
34
|
+
WS : ( ' '
|
35
|
+
| '\t'
|
36
|
+
| '\r'
|
37
|
+
| '\n'
|
38
|
+
)+
|
39
|
+
{$channel=HIDDEN}
|
40
|
+
;
|
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
$:.unshift( File.dirname( __FILE__ ) )
|
5
|
+
require 'HoistedPredicatesLexer'
|
6
|
+
require 'HoistedPredicatesParser'
|
7
|
+
|
8
|
+
for file in ARGV
|
9
|
+
input = ANTLR3::FileStream.new( file )
|
10
|
+
lexer = HoistedPredicates::Lexer.new( input )
|
11
|
+
parser = HoistedPredicates::Parser.new( lexer )
|
12
|
+
parser.stat
|
13
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
enum
|
@@ -0,0 +1 @@
|
|
1
|
+
enum is an ID
|
@@ -0,0 +1,46 @@
|
|
1
|
+
grammar Javadoc;
|
2
|
+
|
3
|
+
options {
|
4
|
+
language = Ruby;
|
5
|
+
}
|
6
|
+
|
7
|
+
@lexer::members {
|
8
|
+
def error_header( e )
|
9
|
+
"#{ self.class }: #{ super }"
|
10
|
+
end
|
11
|
+
}
|
12
|
+
|
13
|
+
comment : ( author )* ;
|
14
|
+
|
15
|
+
author : '@author' ID { puts( "author #{ $ID.text }" ) };
|
16
|
+
|
17
|
+
ID : ('a'..'z'|'A'..'Z')+
|
18
|
+
;
|
19
|
+
|
20
|
+
SIMPLE : '{'
|
21
|
+
{
|
22
|
+
puts( "enter embedded Simple escape" )
|
23
|
+
require 'SimpleLexer'
|
24
|
+
require 'SimpleParser'
|
25
|
+
lexer = Simple::Lexer.new( @input, :embedded => true )
|
26
|
+
parser = Simple::Parser.new( lexer )
|
27
|
+
parser.statement
|
28
|
+
$channel = HIDDEN
|
29
|
+
}
|
30
|
+
;
|
31
|
+
|
32
|
+
/** When the javadoc parser sees end-of-comment it just says 'I'm done', which
|
33
|
+
* consumes the tokens and forces this javadoc parser (feeding
|
34
|
+
* off the input stream currently) to exit. It returns from
|
35
|
+
* method comment(), which was called from JAVADOC action in the
|
36
|
+
* Simple parser's lexer.
|
37
|
+
*/
|
38
|
+
STOP : '*/'
|
39
|
+
{
|
40
|
+
$type = EOF
|
41
|
+
puts( "exit javadoc" )
|
42
|
+
}
|
43
|
+
;
|
44
|
+
|
45
|
+
WS : (' '|'\t'|'\n')+ { $channel = HIDDEN }
|
46
|
+
;
|
@@ -0,0 +1,104 @@
|
|
1
|
+
grammar Simple;
|
2
|
+
|
3
|
+
options { language = Ruby; }
|
4
|
+
|
5
|
+
@lexer::members {
|
6
|
+
def error_header( e )
|
7
|
+
"#{ self.class }: #{ super }"
|
8
|
+
end
|
9
|
+
}
|
10
|
+
|
11
|
+
@lexer::header {
|
12
|
+
JAVADOC_CHANNEL = 1
|
13
|
+
}
|
14
|
+
|
15
|
+
@lexer::init {
|
16
|
+
@embedded = options[ :embedded ]
|
17
|
+
@nesting = @embedded ? 1 : 0
|
18
|
+
}
|
19
|
+
|
20
|
+
/** This example is meant to illustrate how ANTLR can handle so-called "island
|
21
|
+
* grammars", which are just embedded languages. I chose a particularly
|
22
|
+
* nasty problem. A simple programming language with javadoc-style
|
23
|
+
* comments with the usual embedded @author tag but also with embedded
|
24
|
+
* Simple code actions in curlies such as {x=3}. Now that is a stupid
|
25
|
+
* thing maybe from a language design point of view, but is hard because it's
|
26
|
+
* a language (Simple) embedded within another language (JavaDoc) embedded
|
27
|
+
* within the innermost language (Simple) again. See the input file.
|
28
|
+
* So the Simple lexer invokes the javadoc lexer which invokes the Simple
|
29
|
+
* lexer again. The key seems to be returning an EOF token when you
|
30
|
+
* see the "final" token.
|
31
|
+
*
|
32
|
+
* This example is made nasty further by using valid characters of Simple
|
33
|
+
* (the curlies) to delimit it inside the Javadoc comments. The problem is
|
34
|
+
* that '}' may be a regular curly inside a Simple statement or it could
|
35
|
+
* be the signal that the embedded action is over. You must count the
|
36
|
+
* curly nesting level to decide if it's time to stop the embedded action.
|
37
|
+
* consider every "island grammar input chunk" such as javadoc or
|
38
|
+
* embedded Simple statements as a separate "file". So, when I hit the
|
39
|
+
* last delimiter token that says to bail out, I just return EOF. Then
|
40
|
+
* there is no need for an explicit stack of input streams.
|
41
|
+
*
|
42
|
+
* Finally, this grammar illustrates how to share input streams as all
|
43
|
+
* the grammars pull from the same input stream.
|
44
|
+
*
|
45
|
+
* A key point to notice is that since I create a new token stream when
|
46
|
+
* I go off to recognize javadoc comments, the lookahead for the Simple
|
47
|
+
* parser is not messed up in any way.
|
48
|
+
*/
|
49
|
+
program : (variable)*
|
50
|
+
(method)+
|
51
|
+
;
|
52
|
+
variable: 'int' ID ('=' expr)? ';'
|
53
|
+
;
|
54
|
+
method : 'method' ID '(' ')' { puts( "enter method #{ $ID.text }" ) }
|
55
|
+
block
|
56
|
+
;
|
57
|
+
|
58
|
+
block : LCURLY
|
59
|
+
(variable)*
|
60
|
+
(statement)+
|
61
|
+
RCURLY
|
62
|
+
;
|
63
|
+
|
64
|
+
statement
|
65
|
+
: ID '=' expr ';' { puts( "assignment to #{ $ID.text }" ) }
|
66
|
+
| 'return' expr ';'
|
67
|
+
| block
|
68
|
+
;
|
69
|
+
|
70
|
+
expr : ID
|
71
|
+
| INT
|
72
|
+
;
|
73
|
+
|
74
|
+
ID : ('a'..'z'|'A'..'Z')+ ;
|
75
|
+
INT : ('0'..'9')+ ;
|
76
|
+
WS : (' '|'\t'|'\n')+ {$channel=HIDDEN}
|
77
|
+
;
|
78
|
+
LCURLY : '{'
|
79
|
+
{ @nesting += 1 }
|
80
|
+
;
|
81
|
+
/** If we have a '}' with nesting level 0 then it must match the '{'
|
82
|
+
* (unseen by this grammar) that started an embedded Simple statement
|
83
|
+
* block within a javadoc comment.
|
84
|
+
*/
|
85
|
+
RCURLY : '}'
|
86
|
+
{
|
87
|
+
@nesting -= 1
|
88
|
+
if @nesting <= 0
|
89
|
+
@embedded and $type = EOF
|
90
|
+
puts "exiting embedded simple"
|
91
|
+
end
|
92
|
+
}
|
93
|
+
;
|
94
|
+
|
95
|
+
JAVADOC : '/**'
|
96
|
+
{
|
97
|
+
puts( "enter javadoc" )
|
98
|
+
require 'JavadocLexer'
|
99
|
+
require 'JavadocParser'
|
100
|
+
lexer = Javadoc::Lexer.new( @input )
|
101
|
+
Javadoc::Parser.new( lexer ).comment
|
102
|
+
$channel = JAVADOC_CHANNEL
|
103
|
+
}
|
104
|
+
;
|
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
# encoding: utf-8
|
3
|
+
$:.unshift( File.dirname( __FILE__ ) )
|
4
|
+
require 'SimpleLexer'
|
5
|
+
require 'SimpleParser'
|
6
|
+
|
7
|
+
for file in ARGV
|
8
|
+
input = ANTLR3::FileStream.new( file )
|
9
|
+
lexer = Simple::Lexer.new( input )
|
10
|
+
parser = Simple::Parser.new( lexer )
|
11
|
+
parser.program
|
12
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
enter javadoc
|
2
|
+
enter embedded Simple escape
|
3
|
+
exiting embedded simple
|
4
|
+
assignment to z
|
5
|
+
assignment to q
|
6
|
+
enter embedded Simple escape
|
7
|
+
exiting embedded simple
|
8
|
+
assignment to yy
|
9
|
+
exit javadoc
|
10
|
+
author foo
|
11
|
+
enter javadoc
|
12
|
+
exit javadoc
|
13
|
+
author bar
|
14
|
+
enter method foo
|
15
|
+
assignment to i
|
16
|
+
enter method zero
|
@@ -0,0 +1,827 @@
|
|
1
|
+
/** A Java 1.5 grammar for ANTLR v3 derived from the spec
|
2
|
+
*
|
3
|
+
* This is a very close representation of the spec; the changes
|
4
|
+
* are comestic (remove left recursion) and also fixes (the spec
|
5
|
+
* isn't exactly perfect). I have run this on the 1.4.2 source
|
6
|
+
* and some nasty looking enums from 1.5, but have not really
|
7
|
+
* tested for 1.5 compatibility.
|
8
|
+
*
|
9
|
+
* I built this with: java -Xmx100M org.antlr.Tool java.g
|
10
|
+
* and got two errors that are ok (for now):
|
11
|
+
* java.g:691:9: Decision can match input such as
|
12
|
+
* "'0'..'9'{'E', 'e'}{'+', '-'}'0'..'9'{'D', 'F', 'd', 'f'}"
|
13
|
+
* using multiple alternatives: 3, 4
|
14
|
+
* As a result, alternative(s) 4 were disabled for that input
|
15
|
+
* java.g:734:35: Decision can match input such as "{'$', 'A'..'Z',
|
16
|
+
* '_', 'a'..'z', '\u00C0'..'\u00D6', '\u00D8'..'\u00F6',
|
17
|
+
* '\u00F8'..'\u1FFF', '\u3040'..'\u318F', '\u3300'..'\u337F',
|
18
|
+
* '\u3400'..'\u3D2D', '\u4E00'..'\u9FFF', '\uF900'..'\uFAFF'}"
|
19
|
+
* using multiple alternatives: 1, 2
|
20
|
+
* As a result, alternative(s) 2 were disabled for that input
|
21
|
+
*
|
22
|
+
* You can turn enum on/off as a keyword :)
|
23
|
+
*
|
24
|
+
* Version 1.0 -- initial release July 5, 2006 (requires 3.0b2 or higher)
|
25
|
+
*
|
26
|
+
* Primary author: Terence Parr, July 2006
|
27
|
+
*
|
28
|
+
* Version 1.0.1 -- corrections by Koen Vanderkimpen & Marko van Dooren,
|
29
|
+
* October 25, 2006;
|
30
|
+
* fixed normalInterfaceDeclaration: now uses typeParameters instead
|
31
|
+
* of typeParameter (according to JLS, 3rd edition)
|
32
|
+
* fixed castExpression: no longer allows expression next to type
|
33
|
+
* (according to semantics in JLS, in contrast with syntax in JLS)
|
34
|
+
*
|
35
|
+
* Version 1.0.2 -- Terence Parr, Nov 27, 2006
|
36
|
+
* java spec I built this from had some bizarre for-loop control.
|
37
|
+
* Looked weird and so I looked elsewhere...Yep, it's messed up.
|
38
|
+
* simplified.
|
39
|
+
*/
|
40
|
+
grammar Java;
|
41
|
+
options {
|
42
|
+
language=Ruby;
|
43
|
+
k=2;
|
44
|
+
backtrack=true;
|
45
|
+
memoize=true;
|
46
|
+
}
|
47
|
+
|
48
|
+
@lexer::init {
|
49
|
+
@enum_is_keyword = false
|
50
|
+
}
|
51
|
+
|
52
|
+
// starting point for parsing a java file
|
53
|
+
compilationUnit
|
54
|
+
: annotations?
|
55
|
+
packageDeclaration?
|
56
|
+
importDeclaration*
|
57
|
+
typeDeclaration*
|
58
|
+
;
|
59
|
+
|
60
|
+
packageDeclaration
|
61
|
+
: 'package' qualifiedName ';'
|
62
|
+
;
|
63
|
+
|
64
|
+
importDeclaration
|
65
|
+
: 'import' 'static'? Identifier ('.' Identifier)* ('.' '*')? ';'
|
66
|
+
;
|
67
|
+
|
68
|
+
typeDeclaration
|
69
|
+
: classOrInterfaceDeclaration
|
70
|
+
| ';'
|
71
|
+
;
|
72
|
+
|
73
|
+
classOrInterfaceDeclaration
|
74
|
+
: modifier* (classDeclaration | interfaceDeclaration)
|
75
|
+
;
|
76
|
+
|
77
|
+
classDeclaration
|
78
|
+
: normalClassDeclaration
|
79
|
+
| enumDeclaration
|
80
|
+
;
|
81
|
+
|
82
|
+
normalClassDeclaration
|
83
|
+
: 'class' Identifier (typeParameters)?
|
84
|
+
('extends' type)?
|
85
|
+
('implements' typeList)?
|
86
|
+
classBody
|
87
|
+
;
|
88
|
+
|
89
|
+
typeParameters
|
90
|
+
: '<' typeParameter (',' typeParameter)* '>'
|
91
|
+
;
|
92
|
+
|
93
|
+
typeParameter
|
94
|
+
: Identifier ('extends' bound)?
|
95
|
+
;
|
96
|
+
|
97
|
+
bound
|
98
|
+
: type ('&' type)*
|
99
|
+
;
|
100
|
+
|
101
|
+
enumDeclaration
|
102
|
+
: ENUM Identifier ('implements' typeList)? enumBody
|
103
|
+
;
|
104
|
+
|
105
|
+
enumBody
|
106
|
+
: '{' enumConstants? ','? enumBodyDeclarations? '}'
|
107
|
+
;
|
108
|
+
|
109
|
+
enumConstants
|
110
|
+
: enumConstant (',' enumConstant)*
|
111
|
+
;
|
112
|
+
|
113
|
+
enumConstant
|
114
|
+
: annotations? Identifier (arguments)? (classBody)?
|
115
|
+
;
|
116
|
+
|
117
|
+
enumBodyDeclarations
|
118
|
+
: ';' (classBodyDeclaration)*
|
119
|
+
;
|
120
|
+
|
121
|
+
interfaceDeclaration
|
122
|
+
: normalInterfaceDeclaration
|
123
|
+
| annotationTypeDeclaration
|
124
|
+
;
|
125
|
+
|
126
|
+
normalInterfaceDeclaration
|
127
|
+
: 'interface' Identifier typeParameters? ('extends' typeList)? interfaceBody
|
128
|
+
;
|
129
|
+
|
130
|
+
typeList
|
131
|
+
: type (',' type)*
|
132
|
+
;
|
133
|
+
|
134
|
+
classBody
|
135
|
+
: '{' classBodyDeclaration* '}'
|
136
|
+
;
|
137
|
+
|
138
|
+
interfaceBody
|
139
|
+
: '{' interfaceBodyDeclaration* '}'
|
140
|
+
;
|
141
|
+
|
142
|
+
classBodyDeclaration
|
143
|
+
: ';'
|
144
|
+
| 'static'? block
|
145
|
+
| modifier* memberDecl
|
146
|
+
;
|
147
|
+
|
148
|
+
memberDecl
|
149
|
+
: genericMethodOrConstructorDecl
|
150
|
+
| methodDeclaration
|
151
|
+
| fieldDeclaration
|
152
|
+
| 'void' Identifier voidMethodDeclaratorRest
|
153
|
+
| Identifier constructorDeclaratorRest
|
154
|
+
| interfaceDeclaration
|
155
|
+
| classDeclaration
|
156
|
+
;
|
157
|
+
|
158
|
+
genericMethodOrConstructorDecl
|
159
|
+
: typeParameters genericMethodOrConstructorRest
|
160
|
+
;
|
161
|
+
|
162
|
+
genericMethodOrConstructorRest
|
163
|
+
: (type | 'void') Identifier methodDeclaratorRest
|
164
|
+
| Identifier constructorDeclaratorRest
|
165
|
+
;
|
166
|
+
|
167
|
+
methodDeclaration
|
168
|
+
: type Identifier methodDeclaratorRest
|
169
|
+
;
|
170
|
+
|
171
|
+
fieldDeclaration
|
172
|
+
: type variableDeclarators ';'
|
173
|
+
;
|
174
|
+
|
175
|
+
interfaceBodyDeclaration
|
176
|
+
: modifier* interfaceMemberDecl
|
177
|
+
| ';'
|
178
|
+
;
|
179
|
+
|
180
|
+
interfaceMemberDecl
|
181
|
+
: interfaceMethodOrFieldDecl
|
182
|
+
| interfaceGenericMethodDecl
|
183
|
+
| 'void' Identifier voidInterfaceMethodDeclaratorRest
|
184
|
+
| interfaceDeclaration
|
185
|
+
| classDeclaration
|
186
|
+
;
|
187
|
+
|
188
|
+
interfaceMethodOrFieldDecl
|
189
|
+
: type Identifier interfaceMethodOrFieldRest
|
190
|
+
;
|
191
|
+
|
192
|
+
interfaceMethodOrFieldRest
|
193
|
+
: constantDeclaratorsRest ';'
|
194
|
+
| interfaceMethodDeclaratorRest
|
195
|
+
;
|
196
|
+
|
197
|
+
methodDeclaratorRest
|
198
|
+
: formalParameters ('[' ']')*
|
199
|
+
('throws' qualifiedNameList)?
|
200
|
+
( methodBody
|
201
|
+
| ';'
|
202
|
+
)
|
203
|
+
;
|
204
|
+
|
205
|
+
voidMethodDeclaratorRest
|
206
|
+
: formalParameters ('throws' qualifiedNameList)?
|
207
|
+
( methodBody
|
208
|
+
| ';'
|
209
|
+
)
|
210
|
+
;
|
211
|
+
|
212
|
+
interfaceMethodDeclaratorRest
|
213
|
+
: formalParameters ('[' ']')* ('throws' qualifiedNameList)? ';'
|
214
|
+
;
|
215
|
+
|
216
|
+
interfaceGenericMethodDecl
|
217
|
+
: typeParameters (type | 'void') Identifier
|
218
|
+
interfaceMethodDeclaratorRest
|
219
|
+
;
|
220
|
+
|
221
|
+
voidInterfaceMethodDeclaratorRest
|
222
|
+
: formalParameters ('throws' qualifiedNameList)? ';'
|
223
|
+
;
|
224
|
+
|
225
|
+
constructorDeclaratorRest
|
226
|
+
: formalParameters ('throws' qualifiedNameList)? methodBody
|
227
|
+
;
|
228
|
+
|
229
|
+
constantDeclarator
|
230
|
+
: Identifier constantDeclaratorRest
|
231
|
+
;
|
232
|
+
|
233
|
+
variableDeclarators
|
234
|
+
: variableDeclarator (',' variableDeclarator)*
|
235
|
+
;
|
236
|
+
|
237
|
+
variableDeclarator
|
238
|
+
: Identifier variableDeclaratorRest
|
239
|
+
;
|
240
|
+
|
241
|
+
variableDeclaratorRest
|
242
|
+
: ('[' ']')+ ('=' variableInitializer)?
|
243
|
+
| '=' variableInitializer
|
244
|
+
|
|
245
|
+
;
|
246
|
+
|
247
|
+
constantDeclaratorsRest
|
248
|
+
: constantDeclaratorRest (',' constantDeclarator)*
|
249
|
+
;
|
250
|
+
|
251
|
+
constantDeclaratorRest
|
252
|
+
: ('[' ']')* '=' variableInitializer
|
253
|
+
;
|
254
|
+
|
255
|
+
variableDeclaratorId
|
256
|
+
: Identifier ('[' ']')*
|
257
|
+
;
|
258
|
+
|
259
|
+
variableInitializer
|
260
|
+
: arrayInitializer
|
261
|
+
| expression
|
262
|
+
;
|
263
|
+
|
264
|
+
arrayInitializer
|
265
|
+
: '{' (variableInitializer (',' variableInitializer)* (',')? )? '}'
|
266
|
+
;
|
267
|
+
|
268
|
+
modifier
|
269
|
+
: annotation
|
270
|
+
| 'public'
|
271
|
+
| 'protected'
|
272
|
+
| 'private'
|
273
|
+
| 'static'
|
274
|
+
| 'abstract'
|
275
|
+
| 'final'
|
276
|
+
| 'native'
|
277
|
+
| 'synchronized'
|
278
|
+
| 'transient'
|
279
|
+
| 'volatile'
|
280
|
+
| 'strictfp'
|
281
|
+
;
|
282
|
+
|
283
|
+
packageOrTypeName
|
284
|
+
: Identifier ('.' Identifier)*
|
285
|
+
;
|
286
|
+
|
287
|
+
enumConstantName
|
288
|
+
: Identifier
|
289
|
+
;
|
290
|
+
|
291
|
+
typeName
|
292
|
+
: Identifier
|
293
|
+
| packageOrTypeName '.' Identifier
|
294
|
+
;
|
295
|
+
|
296
|
+
type
|
297
|
+
: Identifier (typeArguments)? ('.' Identifier (typeArguments)? )* ('[' ']')*
|
298
|
+
| primitiveType ('[' ']')*
|
299
|
+
;
|
300
|
+
|
301
|
+
primitiveType
|
302
|
+
: 'boolean'
|
303
|
+
| 'char'
|
304
|
+
| 'byte'
|
305
|
+
| 'short'
|
306
|
+
| 'int'
|
307
|
+
| 'long'
|
308
|
+
| 'float'
|
309
|
+
| 'double'
|
310
|
+
;
|
311
|
+
|
312
|
+
variableModifier
|
313
|
+
: 'final'
|
314
|
+
| annotation
|
315
|
+
;
|
316
|
+
|
317
|
+
typeArguments
|
318
|
+
: '<' typeArgument (',' typeArgument)* '>'
|
319
|
+
;
|
320
|
+
|
321
|
+
typeArgument
|
322
|
+
: type
|
323
|
+
| '?' (('extends' | 'super') type)?
|
324
|
+
;
|
325
|
+
|
326
|
+
qualifiedNameList
|
327
|
+
: qualifiedName (',' qualifiedName)*
|
328
|
+
;
|
329
|
+
|
330
|
+
formalParameters
|
331
|
+
: '(' formalParameterDecls? ')'
|
332
|
+
;
|
333
|
+
|
334
|
+
formalParameterDecls
|
335
|
+
: 'final'? annotations? type formalParameterDeclsRest?
|
336
|
+
;
|
337
|
+
|
338
|
+
formalParameterDeclsRest
|
339
|
+
: variableDeclaratorId (',' formalParameterDecls)?
|
340
|
+
| '...' variableDeclaratorId
|
341
|
+
;
|
342
|
+
|
343
|
+
methodBody
|
344
|
+
: block
|
345
|
+
;
|
346
|
+
|
347
|
+
qualifiedName
|
348
|
+
: Identifier ('.' Identifier)*
|
349
|
+
;
|
350
|
+
|
351
|
+
literal
|
352
|
+
: integerLiteral
|
353
|
+
| FloatingPointLiteral
|
354
|
+
| CharacterLiteral
|
355
|
+
| StringLiteral
|
356
|
+
| booleanLiteral
|
357
|
+
| 'null'
|
358
|
+
;
|
359
|
+
|
360
|
+
integerLiteral
|
361
|
+
: HexLiteral
|
362
|
+
| OctalLiteral
|
363
|
+
| DecimalLiteral
|
364
|
+
;
|
365
|
+
|
366
|
+
booleanLiteral
|
367
|
+
: 'true'
|
368
|
+
| 'false'
|
369
|
+
;
|
370
|
+
|
371
|
+
// ANNOTATIONS
|
372
|
+
|
373
|
+
annotations
|
374
|
+
: annotation+
|
375
|
+
;
|
376
|
+
|
377
|
+
annotation
|
378
|
+
: '@' typeName ('(' (Identifier '=')? elementValue ')')?
|
379
|
+
;
|
380
|
+
|
381
|
+
elementValue
|
382
|
+
: conditionalExpression
|
383
|
+
| annotation
|
384
|
+
| elementValueArrayInitializer
|
385
|
+
;
|
386
|
+
|
387
|
+
elementValueArrayInitializer
|
388
|
+
: '{' (elementValue)? (',')? '}'
|
389
|
+
;
|
390
|
+
|
391
|
+
annotationTypeDeclaration
|
392
|
+
: '@' 'interface' Identifier annotationTypeBody
|
393
|
+
;
|
394
|
+
|
395
|
+
annotationTypeBody
|
396
|
+
: '{' (annotationTypeElementDeclarations)? '}'
|
397
|
+
;
|
398
|
+
|
399
|
+
annotationTypeElementDeclarations
|
400
|
+
: (annotationTypeElementDeclaration) (annotationTypeElementDeclaration)*
|
401
|
+
;
|
402
|
+
|
403
|
+
annotationTypeElementDeclaration
|
404
|
+
: (modifier)* annotationTypeElementRest
|
405
|
+
;
|
406
|
+
|
407
|
+
annotationTypeElementRest
|
408
|
+
: type Identifier annotationMethodOrConstantRest ';'
|
409
|
+
| classDeclaration
|
410
|
+
| interfaceDeclaration
|
411
|
+
| enumDeclaration
|
412
|
+
| annotationTypeDeclaration
|
413
|
+
;
|
414
|
+
|
415
|
+
annotationMethodOrConstantRest
|
416
|
+
: annotationMethodRest
|
417
|
+
| annotationConstantRest
|
418
|
+
;
|
419
|
+
|
420
|
+
annotationMethodRest
|
421
|
+
: '(' ')' (defaultValue)?
|
422
|
+
;
|
423
|
+
|
424
|
+
annotationConstantRest
|
425
|
+
: variableDeclarators
|
426
|
+
;
|
427
|
+
|
428
|
+
defaultValue
|
429
|
+
: 'default' elementValue
|
430
|
+
;
|
431
|
+
|
432
|
+
// STATEMENTS / BLOCKS
|
433
|
+
|
434
|
+
block
|
435
|
+
: '{' blockStatement* '}'
|
436
|
+
;
|
437
|
+
|
438
|
+
blockStatement
|
439
|
+
: localVariableDeclaration
|
440
|
+
| classOrInterfaceDeclaration
|
441
|
+
| statement
|
442
|
+
;
|
443
|
+
|
444
|
+
localVariableDeclaration
|
445
|
+
: ('final')? type variableDeclarators ';'
|
446
|
+
;
|
447
|
+
|
448
|
+
statement
|
449
|
+
: block
|
450
|
+
| 'assert' expression (':' expression)? ';'
|
451
|
+
| 'if' parExpression statement ('else' statement)?
|
452
|
+
| 'for' '(' forControl ')' statement
|
453
|
+
| 'while' parExpression statement
|
454
|
+
| 'do' statement 'while' parExpression ';'
|
455
|
+
| 'try' block
|
456
|
+
( catches 'finally' block
|
457
|
+
| catches
|
458
|
+
| 'finally' block
|
459
|
+
)
|
460
|
+
| 'switch' parExpression '{' switchBlockStatementGroups '}'
|
461
|
+
| 'synchronized' parExpression block
|
462
|
+
| 'return' expression? ';'
|
463
|
+
| 'throw' expression ';'
|
464
|
+
| 'break' Identifier? ';'
|
465
|
+
| 'continue' Identifier? ';'
|
466
|
+
| ';'
|
467
|
+
| statementExpression ';'
|
468
|
+
| Identifier ':' statement
|
469
|
+
;
|
470
|
+
|
471
|
+
catches
|
472
|
+
: catchClause (catchClause)*
|
473
|
+
;
|
474
|
+
|
475
|
+
catchClause
|
476
|
+
: 'catch' '(' formalParameter ')' block
|
477
|
+
;
|
478
|
+
|
479
|
+
formalParameter
|
480
|
+
: variableModifier* type variableDeclaratorId
|
481
|
+
;
|
482
|
+
|
483
|
+
switchBlockStatementGroups
|
484
|
+
: (switchBlockStatementGroup)*
|
485
|
+
;
|
486
|
+
|
487
|
+
switchBlockStatementGroup
|
488
|
+
: switchLabel blockStatement*
|
489
|
+
;
|
490
|
+
|
491
|
+
switchLabel
|
492
|
+
: 'case' constantExpression ':'
|
493
|
+
| 'case' enumConstantName ':'
|
494
|
+
| 'default' ':'
|
495
|
+
;
|
496
|
+
|
497
|
+
moreStatementExpressions
|
498
|
+
: (',' statementExpression)*
|
499
|
+
;
|
500
|
+
|
501
|
+
forControl
|
502
|
+
options {k=3;} // be efficient for common case: for (ID ID : ID) ...
|
503
|
+
: forVarControl
|
504
|
+
| forInit? ';' expression? ';' forUpdate?
|
505
|
+
;
|
506
|
+
|
507
|
+
forInit
|
508
|
+
: 'final'? (annotation)? type variableDeclarators
|
509
|
+
| expressionList
|
510
|
+
;
|
511
|
+
|
512
|
+
forVarControl
|
513
|
+
: 'final'? type Identifier ':' expression
|
514
|
+
;
|
515
|
+
|
516
|
+
forUpdate
|
517
|
+
: expressionList
|
518
|
+
;
|
519
|
+
|
520
|
+
// EXPRESSIONS
|
521
|
+
|
522
|
+
parExpression
|
523
|
+
: '(' expression ')'
|
524
|
+
;
|
525
|
+
|
526
|
+
expressionList
|
527
|
+
: expression (',' expression)*
|
528
|
+
;
|
529
|
+
|
530
|
+
statementExpression
|
531
|
+
: expression
|
532
|
+
;
|
533
|
+
|
534
|
+
constantExpression
|
535
|
+
: expression
|
536
|
+
;
|
537
|
+
|
538
|
+
expression
|
539
|
+
: conditionalExpression (assignmentOperator expression)?
|
540
|
+
;
|
541
|
+
|
542
|
+
assignmentOperator
|
543
|
+
: '='
|
544
|
+
| '+='
|
545
|
+
| '-='
|
546
|
+
| '*='
|
547
|
+
| '/='
|
548
|
+
| '&='
|
549
|
+
| '|='
|
550
|
+
| '^='
|
551
|
+
| '%='
|
552
|
+
| '<' '<' '='
|
553
|
+
| '>' '>' '='
|
554
|
+
| '>' '>' '>' '='
|
555
|
+
;
|
556
|
+
|
557
|
+
conditionalExpression
|
558
|
+
: conditionalOrExpression ( '?' expression ':' expression )?
|
559
|
+
;
|
560
|
+
|
561
|
+
conditionalOrExpression
|
562
|
+
: conditionalAndExpression ( '||' conditionalAndExpression )*
|
563
|
+
;
|
564
|
+
|
565
|
+
conditionalAndExpression
|
566
|
+
: inclusiveOrExpression ( '&&' inclusiveOrExpression )*
|
567
|
+
;
|
568
|
+
|
569
|
+
inclusiveOrExpression
|
570
|
+
: exclusiveOrExpression ( '|' exclusiveOrExpression )*
|
571
|
+
;
|
572
|
+
|
573
|
+
exclusiveOrExpression
|
574
|
+
: andExpression ( '^' andExpression )*
|
575
|
+
;
|
576
|
+
|
577
|
+
andExpression
|
578
|
+
: equalityExpression ( '&' equalityExpression )*
|
579
|
+
;
|
580
|
+
|
581
|
+
equalityExpression
|
582
|
+
: instanceOfExpression ( ('==' | '!=') instanceOfExpression )*
|
583
|
+
;
|
584
|
+
|
585
|
+
instanceOfExpression
|
586
|
+
: relationalExpression ('instanceof' type)?
|
587
|
+
;
|
588
|
+
|
589
|
+
relationalExpression
|
590
|
+
: shiftExpression ( relationalOp shiftExpression )*
|
591
|
+
;
|
592
|
+
|
593
|
+
relationalOp
|
594
|
+
: ('<' '=' | '>' '=' | '<' | '>')
|
595
|
+
;
|
596
|
+
|
597
|
+
shiftExpression
|
598
|
+
: additiveExpression ( shiftOp additiveExpression )*
|
599
|
+
;
|
600
|
+
|
601
|
+
// TODO: need a sem pred to check column on these >>>
|
602
|
+
shiftOp
|
603
|
+
: ('<' '<' | '>' '>' '>' | '>' '>')
|
604
|
+
;
|
605
|
+
|
606
|
+
|
607
|
+
additiveExpression
|
608
|
+
: multiplicativeExpression ( ('+' | '-') multiplicativeExpression )*
|
609
|
+
;
|
610
|
+
|
611
|
+
multiplicativeExpression
|
612
|
+
: unaryExpression ( ( '*' | '/' | '%' ) unaryExpression )*
|
613
|
+
;
|
614
|
+
|
615
|
+
unaryExpression
|
616
|
+
: '+' unaryExpression
|
617
|
+
| '-' unaryExpression
|
618
|
+
| '++' primary
|
619
|
+
| '--' primary
|
620
|
+
| unaryExpressionNotPlusMinus
|
621
|
+
;
|
622
|
+
|
623
|
+
unaryExpressionNotPlusMinus
|
624
|
+
: '~' unaryExpression
|
625
|
+
| '!' unaryExpression
|
626
|
+
| castExpression
|
627
|
+
| primary selector* ('++'|'--')?
|
628
|
+
;
|
629
|
+
|
630
|
+
castExpression
|
631
|
+
: '(' primitiveType ')' unaryExpression
|
632
|
+
| '(' (expression | type) ')' unaryExpressionNotPlusMinus
|
633
|
+
;
|
634
|
+
|
635
|
+
primary
|
636
|
+
: parExpression
|
637
|
+
| nonWildcardTypeArguments
|
638
|
+
(explicitGenericInvocationSuffix | 'this' arguments)
|
639
|
+
| 'this' (arguments)?
|
640
|
+
| 'super' superSuffix
|
641
|
+
| literal
|
642
|
+
| 'new' creator
|
643
|
+
| Identifier ('.' Identifier)* (identifierSuffix)?
|
644
|
+
| primitiveType ('[' ']')* '.' 'class'
|
645
|
+
| 'void' '.' 'class'
|
646
|
+
;
|
647
|
+
|
648
|
+
identifierSuffix
|
649
|
+
: ('[' ']')+ '.' 'class'
|
650
|
+
| ('[' expression ']')+ // can also be matched by selector, but do here
|
651
|
+
| arguments
|
652
|
+
| '.' 'class'
|
653
|
+
| '.' explicitGenericInvocation
|
654
|
+
| '.' 'this'
|
655
|
+
| '.' 'super' arguments
|
656
|
+
| '.' 'new' (nonWildcardTypeArguments)? innerCreator
|
657
|
+
;
|
658
|
+
|
659
|
+
creator
|
660
|
+
: nonWildcardTypeArguments? createdName
|
661
|
+
(arrayCreatorRest | classCreatorRest)
|
662
|
+
;
|
663
|
+
|
664
|
+
createdName
|
665
|
+
: Identifier nonWildcardTypeArguments?
|
666
|
+
('.' Identifier nonWildcardTypeArguments?)*
|
667
|
+
| primitiveType
|
668
|
+
;
|
669
|
+
|
670
|
+
innerCreator
|
671
|
+
: Identifier classCreatorRest
|
672
|
+
;
|
673
|
+
|
674
|
+
arrayCreatorRest
|
675
|
+
: '['
|
676
|
+
( ']' ('[' ']')* arrayInitializer
|
677
|
+
| expression ']' ('[' expression ']')* ('[' ']')*
|
678
|
+
)
|
679
|
+
;
|
680
|
+
|
681
|
+
classCreatorRest
|
682
|
+
: arguments classBody?
|
683
|
+
;
|
684
|
+
|
685
|
+
explicitGenericInvocation
|
686
|
+
: nonWildcardTypeArguments explicitGenericInvocationSuffix
|
687
|
+
;
|
688
|
+
|
689
|
+
nonWildcardTypeArguments
|
690
|
+
: '<' typeList '>'
|
691
|
+
;
|
692
|
+
|
693
|
+
explicitGenericInvocationSuffix
|
694
|
+
: 'super' superSuffix
|
695
|
+
| Identifier arguments
|
696
|
+
;
|
697
|
+
|
698
|
+
selector
|
699
|
+
: '.' Identifier (arguments)?
|
700
|
+
| '.' 'this'
|
701
|
+
| '.' 'super' superSuffix
|
702
|
+
| '.' 'new' (nonWildcardTypeArguments)? innerCreator
|
703
|
+
| '[' expression ']'
|
704
|
+
;
|
705
|
+
|
706
|
+
superSuffix
|
707
|
+
: arguments
|
708
|
+
| '.' Identifier (arguments)?
|
709
|
+
;
|
710
|
+
|
711
|
+
arguments
|
712
|
+
: '(' expressionList? ')'
|
713
|
+
;
|
714
|
+
|
715
|
+
// LEXER
|
716
|
+
|
717
|
+
HexLiteral : '0' ('x'|'X') HexDigit+ IntegerTypeSuffix? ;
|
718
|
+
|
719
|
+
DecimalLiteral : ('0' | '1'..'9' '0'..'9'*) IntegerTypeSuffix? ;
|
720
|
+
|
721
|
+
OctalLiteral : '0' ('0'..'7')+ IntegerTypeSuffix? ;
|
722
|
+
|
723
|
+
fragment
|
724
|
+
HexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ;
|
725
|
+
|
726
|
+
fragment
|
727
|
+
IntegerTypeSuffix : ('l'|'L') ;
|
728
|
+
|
729
|
+
FloatingPointLiteral
|
730
|
+
: ('0'..'9')+ '.' ('0'..'9')* Exponent? FloatTypeSuffix?
|
731
|
+
| '.' ('0'..'9')+ Exponent? FloatTypeSuffix?
|
732
|
+
| ('0'..'9')+ Exponent FloatTypeSuffix?
|
733
|
+
| ('0'..'9')+ Exponent? FloatTypeSuffix
|
734
|
+
;
|
735
|
+
|
736
|
+
fragment
|
737
|
+
Exponent : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;
|
738
|
+
|
739
|
+
fragment
|
740
|
+
FloatTypeSuffix : ('f'|'F'|'d'|'D') ;
|
741
|
+
|
742
|
+
CharacterLiteral
|
743
|
+
: '\'' ( EscapeSequence | ~('\''|'\\') ) '\''
|
744
|
+
;
|
745
|
+
|
746
|
+
StringLiteral
|
747
|
+
: '"' ( EscapeSequence | ~('\\'|'"') )* '"'
|
748
|
+
;
|
749
|
+
|
750
|
+
fragment
|
751
|
+
EscapeSequence
|
752
|
+
: '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
|
753
|
+
| UnicodeEscape
|
754
|
+
| OctalEscape
|
755
|
+
;
|
756
|
+
|
757
|
+
fragment
|
758
|
+
OctalEscape
|
759
|
+
: '\\' ('0'..'3') ('0'..'7') ('0'..'7')
|
760
|
+
| '\\' ('0'..'7') ('0'..'7')
|
761
|
+
| '\\' ('0'..'7')
|
762
|
+
;
|
763
|
+
|
764
|
+
fragment
|
765
|
+
UnicodeEscape
|
766
|
+
: '\\' 'u' HexDigit HexDigit HexDigit HexDigit
|
767
|
+
;
|
768
|
+
|
769
|
+
ENUM: 'enum'
|
770
|
+
{
|
771
|
+
@enum_is_keyword or $type = Identifier
|
772
|
+
}
|
773
|
+
;
|
774
|
+
|
775
|
+
Identifier
|
776
|
+
: Letter (Letter|JavaIDDigit)*
|
777
|
+
;
|
778
|
+
|
779
|
+
/**I found this char range in JavaCC's grammar, but Letter and Digit overlap.
|
780
|
+
Still works, but...
|
781
|
+
*/
|
782
|
+
fragment
|
783
|
+
Letter
|
784
|
+
: '\u0024' |
|
785
|
+
'\u0041'..'\u005a' |
|
786
|
+
'\u005f' |
|
787
|
+
'\u0061'..'\u007a' |
|
788
|
+
'\u00c0'..'\u00d6' |
|
789
|
+
'\u00d8'..'\u00f6' |
|
790
|
+
'\u00f8'..'\u00ff' |
|
791
|
+
'\u0100'..'\u1fff' |
|
792
|
+
'\u3040'..'\u318f' |
|
793
|
+
'\u3300'..'\u337f' |
|
794
|
+
'\u3400'..'\u3d2d' |
|
795
|
+
'\u4e00'..'\u9fff' |
|
796
|
+
'\uf900'..'\ufaff'
|
797
|
+
;
|
798
|
+
|
799
|
+
fragment
|
800
|
+
JavaIDDigit
|
801
|
+
: '\u0030'..'\u0039' |
|
802
|
+
'\u0660'..'\u0669' |
|
803
|
+
'\u06f0'..'\u06f9' |
|
804
|
+
'\u0966'..'\u096f' |
|
805
|
+
'\u09e6'..'\u09ef' |
|
806
|
+
'\u0a66'..'\u0a6f' |
|
807
|
+
'\u0ae6'..'\u0aef' |
|
808
|
+
'\u0b66'..'\u0b6f' |
|
809
|
+
'\u0be7'..'\u0bef' |
|
810
|
+
'\u0c66'..'\u0c6f' |
|
811
|
+
'\u0ce6'..'\u0cef' |
|
812
|
+
'\u0d66'..'\u0d6f' |
|
813
|
+
'\u0e50'..'\u0e59' |
|
814
|
+
'\u0ed0'..'\u0ed9' |
|
815
|
+
'\u1040'..'\u1049'
|
816
|
+
;
|
817
|
+
|
818
|
+
WS : (' '|'\r'|'\t'|'\u000C'|'\n') { $channel=HIDDEN }
|
819
|
+
;
|
820
|
+
|
821
|
+
COMMENT
|
822
|
+
: '/*' ( options {greedy=false;} : . )* '*/' { $channel=HIDDEN }
|
823
|
+
;
|
824
|
+
|
825
|
+
LINE_COMMENT
|
826
|
+
: '//' ~('\n'|'\r')* '\r'? '\n' { $channel=HIDDEN }
|
827
|
+
;
|