antlr3 1.8.0 → 1.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
;
|