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,171 @@
|
|
1
|
+
define type size_t
|
2
|
+
define type wchar_t
|
3
|
+
define type _Bool
|
4
|
+
define type div_t
|
5
|
+
define type ldiv_t
|
6
|
+
define type __u_char
|
7
|
+
define type __u_short
|
8
|
+
define type __u_int
|
9
|
+
define type __u_long
|
10
|
+
define type __int8_t
|
11
|
+
define type __uint8_t
|
12
|
+
define type __int16_t
|
13
|
+
define type __uint16_t
|
14
|
+
define type __int32_t
|
15
|
+
define type __uint32_t
|
16
|
+
define type __int64_t
|
17
|
+
define type __uint64_t
|
18
|
+
define type __quad_t
|
19
|
+
define type __u_quad_t
|
20
|
+
define type __dev_t
|
21
|
+
define type __uid_t
|
22
|
+
define type __gid_t
|
23
|
+
define type __ino_t
|
24
|
+
define type __ino64_t
|
25
|
+
define type __mode_t
|
26
|
+
define type __nlink_t
|
27
|
+
define type __off_t
|
28
|
+
define type __off64_t
|
29
|
+
define type __pid_t
|
30
|
+
define type __fsid_t
|
31
|
+
define type __clock_t
|
32
|
+
define type __rlim_t
|
33
|
+
define type __rlim64_t
|
34
|
+
define type __id_t
|
35
|
+
define type __time_t
|
36
|
+
define type __useconds_t
|
37
|
+
define type __suseconds_t
|
38
|
+
define type __daddr_t
|
39
|
+
define type __swblk_t
|
40
|
+
define type __key_t
|
41
|
+
define type __clockid_t
|
42
|
+
define type __timer_t
|
43
|
+
define type __blksize_t
|
44
|
+
define type __blkcnt_t
|
45
|
+
define type __blkcnt64_t
|
46
|
+
define type __fsblkcnt_t
|
47
|
+
define type __fsblkcnt64_t
|
48
|
+
define type __fsfilcnt_t
|
49
|
+
define type __fsfilcnt64_t
|
50
|
+
define type __ssize_t
|
51
|
+
define type __loff_t
|
52
|
+
define type __qaddr_t
|
53
|
+
define type __caddr_t
|
54
|
+
define type __intptr_t
|
55
|
+
define type __socklen_t
|
56
|
+
define type u_char
|
57
|
+
define type u_short
|
58
|
+
define type u_int
|
59
|
+
define type u_long
|
60
|
+
define type quad_t
|
61
|
+
define type u_quad_t
|
62
|
+
define type fsid_t
|
63
|
+
define type loff_t
|
64
|
+
define type ino_t
|
65
|
+
define type dev_t
|
66
|
+
define type gid_t
|
67
|
+
define type mode_t
|
68
|
+
define type nlink_t
|
69
|
+
define type uid_t
|
70
|
+
define type off_t
|
71
|
+
define type pid_t
|
72
|
+
define type id_t
|
73
|
+
define type ssize_t
|
74
|
+
define type daddr_t
|
75
|
+
define type caddr_t
|
76
|
+
define type key_t
|
77
|
+
define type time_t
|
78
|
+
define type clockid_t
|
79
|
+
define type timer_t
|
80
|
+
define type ulong
|
81
|
+
define type ushort
|
82
|
+
define type uint
|
83
|
+
define type int8_t
|
84
|
+
define type int16_t
|
85
|
+
define type int32_t
|
86
|
+
define type int64_t
|
87
|
+
define type u_int8_t
|
88
|
+
define type u_int16_t
|
89
|
+
define type u_int32_t
|
90
|
+
define type u_int64_t
|
91
|
+
define type register_t
|
92
|
+
define type __sig_atomic_t
|
93
|
+
define type __sigset_t
|
94
|
+
define type sigset_t
|
95
|
+
define type suseconds_t
|
96
|
+
define type __fd_mask
|
97
|
+
define type fd_set
|
98
|
+
define type fd_mask
|
99
|
+
define type blkcnt_t
|
100
|
+
define type fsblkcnt_t
|
101
|
+
define type fsfilcnt_t
|
102
|
+
define type _pthread_descr
|
103
|
+
define type pthread_attr_t
|
104
|
+
define type __pthread_cond_align_t
|
105
|
+
define type pthread_cond_t
|
106
|
+
define type pthread_condattr_t
|
107
|
+
define type pthread_key_t
|
108
|
+
define type pthread_mutex_t
|
109
|
+
define type pthread_mutexattr_t
|
110
|
+
define type pthread_once_t
|
111
|
+
define type pthread_t
|
112
|
+
define type __compar_fn_t
|
113
|
+
define type sig_atomic_t
|
114
|
+
define type __sighandler_t
|
115
|
+
define type sig_t
|
116
|
+
define type sigval_t
|
117
|
+
define type siginfo_t
|
118
|
+
define type sigevent_t
|
119
|
+
define type stack_t
|
120
|
+
define type chtype
|
121
|
+
define type FILE
|
122
|
+
define type __FILE
|
123
|
+
define type wint_t
|
124
|
+
define type __mbstate_t
|
125
|
+
define type _G_fpos_t
|
126
|
+
define type _G_fpos64_t
|
127
|
+
define type __gconv_fct
|
128
|
+
define type __gconv_btowc_fct
|
129
|
+
define type __gconv_init_fct
|
130
|
+
define type __gconv_end_fct
|
131
|
+
define type __gconv_trans_fct
|
132
|
+
define type __gconv_trans_context_fct
|
133
|
+
define type __gconv_trans_query_fct
|
134
|
+
define type __gconv_trans_init_fct
|
135
|
+
define type __gconv_trans_end_fct
|
136
|
+
define type __gconv_t
|
137
|
+
define type _G_iconv_t
|
138
|
+
define type _G_int16_t
|
139
|
+
define type _G_int32_t
|
140
|
+
define type _G_uint16_t
|
141
|
+
define type _G_uint32_t
|
142
|
+
define type __gnuc_va_list
|
143
|
+
define type _IO_lock_t
|
144
|
+
define type _IO_FILE
|
145
|
+
define type __io_read_fn
|
146
|
+
define type __cookie
|
147
|
+
define type __buf
|
148
|
+
define type __nbytes
|
149
|
+
define type __io_write_fn
|
150
|
+
define type __cookie
|
151
|
+
define type __buf
|
152
|
+
define type __n
|
153
|
+
define type __io_seek_fn
|
154
|
+
define type __cookie
|
155
|
+
define type __pos
|
156
|
+
define type __w
|
157
|
+
define type __io_close_fn
|
158
|
+
define type __cookie
|
159
|
+
define type fpos_t
|
160
|
+
define type va_list
|
161
|
+
define type NCURSES_BOOL
|
162
|
+
define type SCREEN
|
163
|
+
define type WINDOW
|
164
|
+
define type attr_t
|
165
|
+
define type mmask_t
|
166
|
+
define type MEVENT
|
167
|
+
define type cc_t
|
168
|
+
define type speed_t
|
169
|
+
define type tcflag_t
|
170
|
+
define type TERMTYPE
|
171
|
+
define type TERMINAL
|
@@ -0,0 +1,101 @@
|
|
1
|
+
grammar LLStar;
|
2
|
+
|
3
|
+
options { language = Ruby; }
|
4
|
+
|
5
|
+
program
|
6
|
+
: declaration+
|
7
|
+
;
|
8
|
+
|
9
|
+
/** In this rule, the functionHeader left prefix on the last two
|
10
|
+
* alternatives is not LL(k) for a fixed k. However, it is
|
11
|
+
* LL(*). The LL(*) algorithm simply scans ahead until it sees
|
12
|
+
* either the ';' or the '{' of the block and then it picks
|
13
|
+
* the appropriate alternative. Lookhead can be arbitrarily
|
14
|
+
* long in theory, but is <=10 in most cases. Works great.
|
15
|
+
* Use ANTLRWorks to see the look use (step by Location)
|
16
|
+
* and look for blue tokens in the input window pane. :)
|
17
|
+
*/
|
18
|
+
declaration
|
19
|
+
: variable
|
20
|
+
| functionHeader ';'
|
21
|
+
{ puts( $functionHeader.name + " is a declaration") }
|
22
|
+
| functionHeader block
|
23
|
+
{ puts( $functionHeader.name + " is a definition") }
|
24
|
+
;
|
25
|
+
|
26
|
+
variable
|
27
|
+
: type declarator ';'
|
28
|
+
;
|
29
|
+
|
30
|
+
declarator
|
31
|
+
: ID
|
32
|
+
;
|
33
|
+
|
34
|
+
functionHeader returns [name]
|
35
|
+
: type ID '(' ( formalParameter ( ',' formalParameter )* )? ')'
|
36
|
+
{$name = $ID.text}
|
37
|
+
;
|
38
|
+
|
39
|
+
formalParameter
|
40
|
+
: type declarator
|
41
|
+
;
|
42
|
+
|
43
|
+
type
|
44
|
+
: 'int'
|
45
|
+
| 'char'
|
46
|
+
| 'void'
|
47
|
+
| ID
|
48
|
+
;
|
49
|
+
|
50
|
+
block
|
51
|
+
: '{'
|
52
|
+
variable*
|
53
|
+
stat*
|
54
|
+
'}'
|
55
|
+
;
|
56
|
+
|
57
|
+
stat: forStat
|
58
|
+
| expr ';'
|
59
|
+
| block
|
60
|
+
| assignStat ';'
|
61
|
+
| ';'
|
62
|
+
;
|
63
|
+
|
64
|
+
forStat
|
65
|
+
: 'for' '(' assignStat ';' expr ';' assignStat ')' block
|
66
|
+
;
|
67
|
+
|
68
|
+
assignStat
|
69
|
+
: ID '=' expr
|
70
|
+
;
|
71
|
+
|
72
|
+
expr: condExpr
|
73
|
+
;
|
74
|
+
|
75
|
+
condExpr
|
76
|
+
: aexpr ( ('==' | '<') aexpr )?
|
77
|
+
;
|
78
|
+
|
79
|
+
aexpr
|
80
|
+
: atom ( '+' atom )*
|
81
|
+
;
|
82
|
+
|
83
|
+
atom
|
84
|
+
: ID
|
85
|
+
| INT
|
86
|
+
| '(' expr ')'
|
87
|
+
;
|
88
|
+
|
89
|
+
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
|
90
|
+
;
|
91
|
+
|
92
|
+
INT : ('0'..'9')+
|
93
|
+
;
|
94
|
+
|
95
|
+
WS : ( ' '
|
96
|
+
| '\t'
|
97
|
+
| '\r'
|
98
|
+
| '\n'
|
99
|
+
)+
|
100
|
+
{$channel=HIDDEN}
|
101
|
+
;
|
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
# encoding: utf-8
|
3
|
+
$:.unshift( File.dirname( __FILE__ ) )
|
4
|
+
require 'LLStarLexer'
|
5
|
+
require 'LLStarParser'
|
6
|
+
|
7
|
+
for file in ARGV
|
8
|
+
input = ANTLR3::FileStream.new( file )
|
9
|
+
lexer = LLStar::Lexer.new( input )
|
10
|
+
parser = LLStar::Parser.new( lexer )
|
11
|
+
parser.program
|
12
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
grammar Calculator;
|
2
|
+
options {
|
3
|
+
language = Ruby;
|
4
|
+
}
|
5
|
+
|
6
|
+
evaluate returns [result]
|
7
|
+
: r=expression { $result = $r.result }
|
8
|
+
;
|
9
|
+
|
10
|
+
expression returns [result]
|
11
|
+
: r=mult
|
12
|
+
( '+' r2=mult { $r.result += $r2.result }
|
13
|
+
| '-' r2=mult { $r.result -= $r2.result }
|
14
|
+
)* { $result = $r.result }
|
15
|
+
;
|
16
|
+
|
17
|
+
mult returns [result]
|
18
|
+
: r=log
|
19
|
+
( '*' r2=log { $r.result *= $r2.result }
|
20
|
+
| '/' r2=log { $r.result /= $r2.result } //
|
21
|
+
)* { $result = $r.result };
|
22
|
+
|
23
|
+
log returns [result]
|
24
|
+
: 'ln' r=exp { $result = Math.log( r ) }
|
25
|
+
| r=exp { $result = $r.result }
|
26
|
+
;
|
27
|
+
|
28
|
+
exp returns [result]
|
29
|
+
: r=atom ( '^' r2=atom { $r.result **= $r2.result } )? { $result = $r.result }
|
30
|
+
;
|
31
|
+
|
32
|
+
atom returns [result]
|
33
|
+
: n=INTEGER { $result = Integer( $n.text ) }
|
34
|
+
| n=DECIMAL { $result = $n.text.to_f }
|
35
|
+
| '(' r=expression { $result = $r.result } ')'
|
36
|
+
| 'PI' { $result = Math::PI }
|
37
|
+
| 'E' { $result = Math::E }
|
38
|
+
;
|
39
|
+
|
40
|
+
INTEGER: DIGIT+;
|
41
|
+
|
42
|
+
DECIMAL: DIGIT+ '.' DIGIT+;
|
43
|
+
|
44
|
+
fragment
|
45
|
+
DIGIT: '0'..'9';
|
46
|
+
|
47
|
+
WS: (' ' | '\n' | '\t')+ { $channel = HIDDEN };
|
@@ -0,0 +1,16 @@
|
|
1
|
+
import antlr3
|
2
|
+
from CalculatorLexer import CalculatorLexer
|
3
|
+
from CalculatorParser import CalculatorParser
|
4
|
+
|
5
|
+
|
6
|
+
while True:
|
7
|
+
expr = raw_input('>>> ')
|
8
|
+
if expr == '':
|
9
|
+
break
|
10
|
+
|
11
|
+
cStream = antlr3.StringStream(expr)
|
12
|
+
lexer = CalculatorLexer(cStream)
|
13
|
+
tStream = antlr3.CommonTokenStream(lexer)
|
14
|
+
parser = CalculatorParser(tStream)
|
15
|
+
result = parser.evaluate()
|
16
|
+
print result
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
$:.unshift( File.dirname( __FILE__ ) )
|
5
|
+
require 'CalculatorLexer'
|
6
|
+
require 'CalculatorParser'
|
7
|
+
|
8
|
+
fetch =
|
9
|
+
begin
|
10
|
+
require 'readline'
|
11
|
+
proc do
|
12
|
+
Readline.readline( ">>> ", true )
|
13
|
+
end
|
14
|
+
rescue LoadError
|
15
|
+
proc do
|
16
|
+
print( ">>> " )
|
17
|
+
l = $stdin.gets and l.chomp
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
puts( "enter calculator expressions or `quit' to exit")
|
22
|
+
loop do
|
23
|
+
case line = fetch.call
|
24
|
+
when /q(uit)?/i, /e(xit)?/i, nil then break
|
25
|
+
else
|
26
|
+
printf( "\t=> %s\n", Calculator::Parser.new( line ).evaluate )
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
grammar CMinus;
|
2
|
+
options {
|
3
|
+
language = Ruby;
|
4
|
+
output = template;
|
5
|
+
}
|
6
|
+
|
7
|
+
scope slist {
|
8
|
+
locals;
|
9
|
+
stats;
|
10
|
+
}
|
11
|
+
|
12
|
+
@members {
|
13
|
+
load_templates( 'java.group' )
|
14
|
+
}
|
15
|
+
|
16
|
+
program
|
17
|
+
scope {
|
18
|
+
globals;
|
19
|
+
functions;
|
20
|
+
}
|
21
|
+
@init {
|
22
|
+
$program::globals = []
|
23
|
+
$program::functions = []
|
24
|
+
}
|
25
|
+
: declaration+
|
26
|
+
-> program(globals={$program::globals},functions={$program::functions})
|
27
|
+
;
|
28
|
+
|
29
|
+
declaration
|
30
|
+
: variable { $program::globals << $variable.st }
|
31
|
+
| f=function { $program::functions << $f.st }
|
32
|
+
;
|
33
|
+
|
34
|
+
// ack is $function.st ambig? It can mean the rule's dyn scope or
|
35
|
+
// the ref in this rule. Ack.
|
36
|
+
|
37
|
+
variable
|
38
|
+
: type declarator ';'
|
39
|
+
-> { $function.length > 0 and $function::name.nil? }?
|
40
|
+
globalVariable(type={$type.st},name={$declarator.st})
|
41
|
+
-> variable(type={$type.st},name={$declarator.st})
|
42
|
+
;
|
43
|
+
|
44
|
+
declarator
|
45
|
+
: ID -> { $ID.text }
|
46
|
+
;
|
47
|
+
|
48
|
+
function
|
49
|
+
scope {
|
50
|
+
name;
|
51
|
+
}
|
52
|
+
scope slist;
|
53
|
+
@init {
|
54
|
+
$slist::locals = []
|
55
|
+
$slist::stats = []
|
56
|
+
}
|
57
|
+
: type ID { $function::name = $ID.text }
|
58
|
+
'(' ( p+=formalParameter ( ',' p+=formalParameter )* )? ')'
|
59
|
+
block
|
60
|
+
-> function(type={$type.st}, name={$function::name},
|
61
|
+
locals={$slist::locals},
|
62
|
+
stats={$slist::stats},
|
63
|
+
args={$p})
|
64
|
+
;
|
65
|
+
|
66
|
+
formalParameter
|
67
|
+
: type declarator
|
68
|
+
-> parameter(type={$type.st},name={$declarator.st})
|
69
|
+
;
|
70
|
+
|
71
|
+
type
|
72
|
+
: 'int' -> type_int()
|
73
|
+
| 'char' -> type_char()
|
74
|
+
| ID -> type_user_object(name={$ID.text})
|
75
|
+
;
|
76
|
+
|
77
|
+
block
|
78
|
+
: '{'
|
79
|
+
( variable { $slist::locals << $variable.st } )*
|
80
|
+
( stat { $slist::stats << $stat.st } )*
|
81
|
+
'}'
|
82
|
+
;
|
83
|
+
|
84
|
+
stat
|
85
|
+
scope slist;
|
86
|
+
@init {
|
87
|
+
$slist::locals = []
|
88
|
+
$slist::stats = []
|
89
|
+
}
|
90
|
+
: forStat -> { $forStat.st }
|
91
|
+
| expr ';' -> statement( expr={$expr.st} )
|
92
|
+
| block -> statementList( locals={$slist::locals}, stats={$slist::stats} )
|
93
|
+
| assignStat ';' -> { $assignStat.st }
|
94
|
+
| ';' -> { ';' }
|
95
|
+
;
|
96
|
+
|
97
|
+
forStat
|
98
|
+
scope slist;
|
99
|
+
@init {
|
100
|
+
$slist::locals = []
|
101
|
+
$slist::stats = []
|
102
|
+
}
|
103
|
+
: 'for' '(' e1=assignStat ';' e2=expr ';' e3=assignStat ')' block
|
104
|
+
-> forLoop(e1={$e1.st},e2={$e2.st},e3={$e3.st},locals={$slist::locals}, stats={$slist::stats})
|
105
|
+
;
|
106
|
+
|
107
|
+
assignStat
|
108
|
+
: ID '=' expr -> assign(lhs={$ID.text}, rhs={$expr.st})
|
109
|
+
;
|
110
|
+
|
111
|
+
expr: condExpr -> {$condExpr.st}
|
112
|
+
;
|
113
|
+
|
114
|
+
condExpr
|
115
|
+
: a=aexpr
|
116
|
+
( ( '==' b=aexpr -> equals(left={$a.st},right={$b.st})
|
117
|
+
| '<' b=aexpr -> lessThan(left={$a.st},right={$b.st})
|
118
|
+
)
|
119
|
+
| -> {$a.st} // else just aexpr
|
120
|
+
)
|
121
|
+
;
|
122
|
+
|
123
|
+
aexpr
|
124
|
+
: (a=atom -> {$a.st})
|
125
|
+
( '+' b=atom -> add(left={$aexpr.st}, right={$b.st}) )*
|
126
|
+
;
|
127
|
+
|
128
|
+
atom
|
129
|
+
: ID -> refVar(id={$ID.text})
|
130
|
+
| INT -> iconst(value={$INT.text})
|
131
|
+
| '(' expr ')' -> {$expr.st}
|
132
|
+
;
|
133
|
+
|
134
|
+
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
|
135
|
+
;
|
136
|
+
|
137
|
+
INT : ('0'..'9')+
|
138
|
+
;
|
139
|
+
|
140
|
+
WS : (' ' | '\t' | '\r' | '\n')+ {$channel=HIDDEN;}
|
141
|
+
;
|