cast 0.0.1 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,174 +0,0 @@
1
- $: << File.expand_path('../lib')
2
- require 'cast'
3
- require 'test/unit'
4
-
5
- if true
6
- class C::Node
7
- def pretty_print q
8
- q.text self.to_debug
9
- end
10
- end
11
- end
12
-
13
- class Array
14
- def same_list? other
15
- self.length == other.length or
16
- return false
17
- self.zip(other).all? do |mine, yours|
18
- mine.equal? yours or
19
- return false
20
- end
21
- end
22
- end
23
-
24
- class Integer
25
- ###
26
- ### Return a `self'-element array containing the result of the given
27
- ### block.
28
- ###
29
- def of &blk
30
- Array.new(self, &blk)
31
- end
32
- end
33
-
34
- module Test::Unit::Assertions
35
- ###
36
- ### Assert that the given ast's nodes' parents are correct, and
37
- ### there aren't non-Nodes where there shouldn't be.
38
- ###
39
- def assert_tree ast
40
- meth = 'unknown method'
41
- caller.each do |line|
42
- if line =~ /in `(test_.*?)'/ #`
43
- meth = $1
44
- break
45
- end
46
- end
47
- filename = "#{self.class}_#{meth}.out"
48
- begin
49
- assert_tree1(ast, nil)
50
- assert(true)
51
- rescue BadTreeError => e
52
- require 'pp'
53
- open("#{filename}", 'w'){|f| PP.pp(ast, f)}
54
- flunk("#{e.message}. Output dumped to `#{filename}'.")
55
- end
56
- end
57
- ###
58
- def assert_tree1 x, parent
59
- if x.is_a? C::Node
60
- parent.equal? x.parent or
61
- raise BadTreeError, "#{x.class}:0x#{(x.id << 1).to_s(16)} has #{x.parent ? 'wrong' : 'no'} parent"
62
- x.fields.each do |field|
63
- next if !field.child?
64
- val = x.send(field.reader)
65
- next if val.nil?
66
- val.is_a? C::Node or
67
- raise BadTreeError, "#{x.class}:0x#{(x.id << 1).to_s(16)} is a non-Node child"
68
- assert_tree1(val, x)
69
- end
70
- end
71
- end
72
- class BadTreeError < StandardError; end
73
- ###
74
- ### Assert that `arg' is a C::NodeList.
75
- ###
76
- def assert_list arg
77
- assert_kind_of(C::NodeList, arg)
78
- end
79
- ###
80
- ### Assert that `arg' is an empty C::NodeList.
81
- ###
82
- def assert_empty_list arg
83
- assert_list arg
84
- assert(arg.empty?)
85
- end
86
- ###
87
- ### Assert that the elements of exp are the same as those of out,
88
- ### and are in the same order.
89
- ###
90
- def assert_same_list exp, out
91
- assert_equal(exp.length, out.length, "Checking length")
92
- (0...exp.length).each do |i|
93
- assert_same(exp[i], out[i], "At index #{i} (of 0...#{exp.length})")
94
- end
95
- end
96
- ###
97
- ### Assert that out is ==, but not the same as exp (i.e., it is a
98
- ### copy).
99
- ###
100
- def assert_copy exp, out
101
- assert_not_same exp, out
102
- assert_equal exp, out
103
- end
104
- ###
105
- ### Assert the invariants of `node'.
106
- ###
107
- def assert_invariants node
108
- node.assert_invariants(self)
109
- end
110
- ###
111
- ### Return a not-too-trivial C program string.
112
- ###
113
- def prog
114
- return <<EOS
115
- int main(int argc, char **argv) {
116
- struct S {
117
- int i, j;
118
- float f, g;
119
- } x;
120
- x.i = (int)argv[2][5];
121
- return 0;
122
- }
123
- EOS
124
- end
125
- end
126
-
127
- module CheckAst
128
- INDENT = ' '
129
-
130
- ParseError = C::ParseError
131
-
132
- def check_ast test_data
133
- inp, exp = test_data.split(/^----+\n/)
134
- ast = yield(inp)
135
- assert_tree(ast)
136
- assert ast.is_a?(C::Node)
137
- out = ast.to_debug
138
- assert_equal_debug_strs(exp, out)
139
- end
140
-
141
- def assert_equal_debug_strs exp, out
142
- ## remove EOL space
143
- out = out.gsub(/ *$/, '')
144
- exp = exp.gsub(/ *$/, '')
145
-
146
- ## normalize BOL space
147
- exp.gsub!(%r'^#{INDENT}*') do |s|
148
- levels = s.length / INDENT.length
149
- C::Node::TO_DEBUG_TAB*levels
150
- end
151
-
152
- ## compare
153
- meth = 'unknown method'
154
- caller.each do |line|
155
- if line =~ /in `(test_.*?)'/ #`
156
- meth = $1
157
- break
158
- end
159
- end
160
-
161
- filename_prefix = "#{self.class}_#{meth}"
162
-
163
- assert_block("Debug strings unequal. Output dumped to #{filename_prefix}.{exp,out}") do
164
- if out == exp
165
- true
166
- else
167
- classname = self.class.name.split(/::/)[-1]
168
- open("#{filename_prefix}.out", 'w'){|f| f.print(out)}
169
- open("#{filename_prefix}.exp", 'w'){|f| f.print(exp)}
170
- false
171
- end
172
- end
173
- end
174
- end
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- Dir.new(Dir.pwd).grep(/^test_/) do |filename|
4
- require "#{Dir.pwd}/#{filename}"
5
- end
@@ -1,160 +0,0 @@
1
- require 'common'
2
-
3
- ###
4
- ### ##################################################################
5
- ###
6
- ### Tests for miscellaneous methods specific to individual Node
7
- ### classes.
8
- ###
9
- ### ##################################################################
10
- ###
11
- class MiscTests < Test::Unit::TestCase
12
- include CheckAst
13
-
14
- ###
15
- ### ----------------------------------------------------------------
16
- ### Declarator#
17
- ### declaration type
18
- ### ----------------------------------------------------------------
19
- ###
20
-
21
- def test_declarator_declaration
22
- tor = C::Declarator.new(nil, 'x')
23
- assert_nil(tor.declaration)
24
-
25
- list = C::NodeArray[tor]
26
- assert_nil(tor.declaration)
27
-
28
- tion = C::Declaration.new(C::Int.new, list)
29
- assert_same(tion, tor.declaration)
30
-
31
- list.detach
32
- assert_nil(tor.declaration)
33
- end
34
-
35
- def test_declarator_type
36
- ## int i, *j, k[], l(), *m[10];
37
- decl = C::Declaration.new(C::Int.new)
38
- decl.declarators << C::Declarator.new(nil, 'i')
39
- decl.declarators << C::Declarator.new(C::Pointer.new, 'j')
40
- decl.declarators << C::Declarator.new(C::Array.new, 'k')
41
- decl.declarators << C::Declarator.new(C::Function.new, 'l')
42
- arr = C::Array.new(C::Pointer.new, C::IntLiteral.new(10))
43
- decl.declarators << C::Declarator.new(arr, 'm')
44
-
45
- assert_equal_debug_strs(decl.declarators[0].type.to_debug, <<EOS)
46
- Int
47
- EOS
48
- assert_equal_debug_strs(decl.declarators[1].type.to_debug, <<EOS)
49
- Pointer
50
- type: Int
51
- EOS
52
- assert_equal_debug_strs(decl.declarators[2].type.to_debug, <<EOS)
53
- Array
54
- type: Int
55
- EOS
56
- assert_equal_debug_strs(decl.declarators[3].type.to_debug, <<EOS)
57
- Function
58
- type: Int
59
- EOS
60
- assert_equal_debug_strs(decl.declarators[4].type.to_debug, <<EOS)
61
- Array
62
- type: Pointer
63
- type: Int
64
- length: IntLiteral
65
- val: 10
66
- EOS
67
- end
68
-
69
- ###
70
- ### ----------------------------------------------------------------
71
- ### DirectType#
72
- ### direct_type indirect_type
73
- ### IndirectType#
74
- ### direct_type indirect_type direct_type=
75
- ### ----------------------------------------------------------------
76
- ###
77
-
78
- def test_type_direct_type
79
- d = C::Int.new
80
- t = C::Pointer.new(d)
81
- assert_same(d, t.direct_type)
82
-
83
- d = C::Float.new
84
- t = C::Pointer.new(C::Pointer.new(d))
85
- assert_same(d, t.direct_type)
86
-
87
- d = C::Struct.new('S')
88
- t = C::Array.new(d)
89
- assert_same(d, t.direct_type)
90
-
91
- d = C::CustomType.new('T')
92
- t = C::Function.new(d)
93
- assert_same(d, t.direct_type)
94
-
95
- t = C::Pointer.new(nil)
96
- assert_nil(t.direct_type)
97
-
98
- t = C::Int.new
99
- assert_same(t, t.direct_type)
100
- end
101
-
102
- def test_type_indirect_type
103
- d = C::Int.new
104
- t = C::Pointer.new(d)
105
- assert_equal(C::Pointer.new, t.indirect_type)
106
-
107
- d = C::Float.new
108
- t = C::Pointer.new(C::Pointer.new(d))
109
- assert_equal(C::Pointer.new(C::Pointer.new), t.indirect_type)
110
-
111
- d = C::Struct.new('S')
112
- t = C::Array.new(d, C::IntLiteral.new(10))
113
- assert_equal(C::Array.new(nil, C::IntLiteral.new(10)), t.indirect_type)
114
-
115
- d = C::CustomType.new('T')
116
- t = C::Function.new(d)
117
- assert_equal(C::Function.new, t.indirect_type)
118
-
119
- t = C::Pointer.new(nil)
120
- assert_copy(t, t.indirect_type)
121
-
122
- t = C::Int.new
123
- assert_nil(t.indirect_type)
124
- end
125
-
126
- def test_type_set_direct_type
127
- d = C::Int.new
128
- t = C::Pointer.new(d)
129
- x = C::Int.new
130
- t.direct_type = x
131
- assert_same(x, t.type)
132
-
133
- d = C::Float.new
134
- t = C::Pointer.new(C::Pointer.new(d))
135
- x = C::Float.new
136
- t.direct_type = x
137
- assert_same(x, t.type.type)
138
-
139
- d = C::Struct.new('S')
140
- t = C::Array.new(d)
141
- x = C::Struct.new('T')
142
- t.direct_type = x
143
- assert_same(x, t.type)
144
-
145
- d = C::CustomType.new('T')
146
- t = C::Function.new(d)
147
- x = C::Void.new
148
- t.direct_type = x
149
- assert_same(x, t.type)
150
-
151
- t = C::Pointer.new(nil)
152
- x = C::Imaginary.new
153
- t.direct_type = x
154
- assert_same(x, t.type)
155
-
156
- t = C::Int.new
157
- x = C::Void.new
158
- assert_raise(NoMethodError){t.direct_type = x}
159
- end
160
- end
@@ -1,2014 +0,0 @@
1
- ###
2
- ### ##################################################################
3
- ###
4
- ### Tests for the parse methods.
5
- ###
6
- ### ##################################################################
7
- ###
8
-
9
- require 'common'
10
-
11
- class MatchTest < Test::Unit::TestCase
12
- def setup
13
- C.default_parser = C::Parser.new
14
- end
15
- def test_node_matches
16
- i = C::Int.new
17
- assert_same(true, i.match?(i))
18
- assert_same(true, i.match?('int'))
19
-
20
- l = C::IntLiteral.new(10)
21
- assert_same(true, l.match?(l))
22
- assert_same(true, l.match?(10))
23
-
24
- i = C::Int.new
25
- assert_same(false, i.match?('unsigned int'))
26
- assert_same(false, i.match?('long int'))
27
- assert_same(false, i.match?('no int here')) # shouldn't raise!
28
-
29
- l = C::IntLiteral.new(10)
30
- assert_same(false, i.match?(10.0))
31
-
32
- t = C::CustomType.new('T')
33
- ##
34
- assert_same(false, t.match?('T'))
35
- ##
36
- parser = C::Parser.new
37
- parser.type_names << 'T'
38
- assert_same(true, t.match?('T', parser))
39
- ##
40
- assert_same(false, t.match?('T'))
41
- ##
42
- C.default_parser.type_names << 'T'
43
- assert_same(true, t.match?('T'))
44
- end
45
-
46
- def test_nodelist_match
47
- list = C::NodeArray[]
48
- assert_same(true, list.match?(list))
49
- assert_same(true, list.match?([]))
50
-
51
- list = C::NodeArray[C::Int.new, C::IntLiteral.new(10)]
52
- list2 = C::NodeChain[C::Int.new, C::IntLiteral.new(10)]
53
- assert_same(true, list.match?(list))
54
- assert_same(true, list.match?(list2))
55
- assert_same(true, list.match?(['int', 10]))
56
-
57
- list = C::NodeArray[C::NodeArray[C::Int.new], C::NodeChain[]]
58
- list2 = C::NodeChain[C::NodeChain[C::Int.new], C::NodeArray[]]
59
- assert_same(true, list.match?(list))
60
- assert_same(true, list.match?(list2))
61
- assert_same(true, list.match?([['int'], []]))
62
- assert_same(false, list.match?([[], ['int']]))
63
- assert_same(false, list.match?(['int']))
64
- assert_same(false, list.match?([['int']]))
65
-
66
- t = C::NodeArray[C::CustomType.new('T')]
67
- ##
68
- assert_same(false, t.match?(['T']))
69
- ##
70
- parser = C::Parser.new
71
- parser.type_names << 'T'
72
- assert_same(true, t.match?(['T'], parser))
73
- ##
74
- assert_same(false, t.match?(['T']))
75
- ##
76
- C.default_parser.type_names << 'T'
77
- assert_same(true, t.match?(['T']))
78
- end
79
- end
80
-
81
- class ParseTests < Test::Unit::TestCase
82
- include CheckAst
83
- def check klass, s
84
- check_ast(s){|inp| klass.parse(inp)}
85
- end
86
-
87
- def test_translation_unit
88
- check C::TranslationUnit, <<EOS
89
- int i;
90
- void (*f)(void *);
91
- ----
92
- TranslationUnit
93
- entities:
94
- - Declaration
95
- type: Int
96
- declarators:
97
- - Declarator
98
- name: "i"
99
- - Declaration
100
- type: Void
101
- declarators:
102
- - Declarator
103
- indirect_type: Pointer
104
- type: Function
105
- params:
106
- - Parameter
107
- type: Pointer
108
- type: Void
109
- name: "f"
110
- EOS
111
- assert_raise(ParseError){C::TranslationUnit.parse('')}
112
- end
113
-
114
- def test_declaration
115
- check C::Declaration, <<EOS
116
- int i;
117
- ----
118
- Declaration
119
- type: Int
120
- declarators:
121
- - Declarator
122
- name: "i"
123
- EOS
124
- check C::Declaration, <<EOS
125
- int i, j;
126
- ----
127
- Declaration
128
- type: Int
129
- declarators:
130
- - Declarator
131
- name: "i"
132
- - Declarator
133
- name: "j"
134
- EOS
135
- assert_raise(ParseError){C::Declaration.parse('int i; int j;')}
136
- assert_raise(ParseError){C::Declaration.parse('int f() {}')}
137
- assert_raise(ParseError){C::Declaration.parse('')}
138
- end
139
-
140
- def test_parameter
141
- check C::Parameter, <<EOS
142
- int i
143
- ----
144
- Parameter
145
- type: Int
146
- name: "i"
147
- EOS
148
- check C::Parameter, <<EOS
149
- int
150
- ----
151
- Parameter
152
- type: Int
153
- EOS
154
- check C::Parameter, <<EOS
155
- i
156
- ----
157
- Parameter
158
- name: "i"
159
- EOS
160
- check C::Parameter, <<EOS
161
- void
162
- ----
163
- Parameter
164
- type: Void
165
- EOS
166
- assert_raise(ParseError){C::Parameter.parse('...')}
167
- assert_raise(ParseError){C::Parameter.parse(') {} void (')}
168
- assert_raise(ParseError){C::Parameter.parse('); void(')}
169
- assert_raise(ParseError){C::Parameter.parse('i,j')}
170
- assert_raise(ParseError){C::Parameter.parse('int,float')}
171
- assert_raise(ParseError){C::Parameter.parse('')}
172
- end
173
-
174
- def test_declarator
175
- check C::Declarator, <<EOS
176
- x
177
- ----
178
- Declarator
179
- name: "x"
180
- EOS
181
- check C::Declarator, <<EOS
182
- *x
183
- ----
184
- Declarator
185
- indirect_type: Pointer
186
- name: "x"
187
- EOS
188
- check C::Declarator, <<EOS
189
- x[10]
190
- ----
191
- Declarator
192
- indirect_type: Array
193
- length: IntLiteral
194
- val: 10
195
- name: "x"
196
- EOS
197
- check C::Declarator, <<EOS
198
- *x(int argc, char **argv)
199
- ----
200
- Declarator
201
- indirect_type: Function
202
- type: Pointer
203
- params:
204
- - Parameter
205
- type: Int
206
- name: "argc"
207
- - Parameter
208
- type: Pointer
209
- type: Pointer
210
- type: Char
211
- name: "argv"
212
- name: "x"
213
- EOS
214
- assert_raise(ParseError){C::Declarator.parse('f; int f;')}
215
- assert_raise(ParseError){C::Declarator.parse('i,j')}
216
- assert_raise(ParseError){C::Declarator.parse(';')}
217
- assert_raise(ParseError){C::Declarator.parse('')}
218
- end
219
-
220
- def test_function_def
221
- check C::FunctionDef, <<EOS
222
- int f() {}
223
- ----
224
- FunctionDef
225
- type: Function
226
- type: Int
227
- name: "f"
228
- EOS
229
- check C::FunctionDef, <<EOS
230
- void *f(void *) {}
231
- ----
232
- FunctionDef
233
- type: Function
234
- type: Pointer
235
- type: Void
236
- params:
237
- - Parameter
238
- type: Pointer
239
- type: Void
240
- name: "f"
241
- EOS
242
- assert_raise(ParseError){C::FunctionDef.parse('void f(); void g();')}
243
- assert_raise(ParseError){C::FunctionDef.parse('int i;')}
244
- assert_raise(ParseError){C::FunctionDef.parse('void f();')}
245
- assert_raise(ParseError){C::FunctionDef.parse(';')}
246
- assert_raise(ParseError){C::FunctionDef.parse('')}
247
- end
248
-
249
- def test_enumerator
250
- check C::Enumerator, <<EOS
251
- X
252
- ----
253
- Enumerator
254
- name: "X"
255
- EOS
256
- check C::Enumerator, <<EOS
257
- X=10
258
- ----
259
- Enumerator
260
- name: "X"
261
- val: IntLiteral
262
- val: 10
263
- EOS
264
- assert_raise(ParseError){C::Enumerator.parse('} enum {')}
265
- assert_raise(ParseError){C::Enumerator.parse('} f() {')}
266
- assert_raise(ParseError){C::Enumerator.parse('X, Y')}
267
- assert_raise(ParseError){C::Enumerator.parse('')}
268
- end
269
-
270
- def test_member_initializer
271
- check C::MemberInit, <<EOS
272
- 1
273
- ----
274
- MemberInit
275
- init: IntLiteral
276
- val: 1
277
- EOS
278
- check C::MemberInit, <<EOS
279
- 1,
280
- ----
281
- MemberInit
282
- init: IntLiteral
283
- val: 1
284
- EOS
285
- check C::MemberInit, <<EOS
286
- i
287
- ----
288
- MemberInit
289
- init: Variable
290
- name: "i"
291
- EOS
292
- check C::MemberInit, <<EOS
293
- .i = i
294
- ----
295
- MemberInit
296
- member:
297
- - Member
298
- name: "i"
299
- init: Variable
300
- name: "i"
301
- EOS
302
- check C::MemberInit, <<EOS
303
- .i [5] = 10.0
304
- ----
305
- MemberInit
306
- member:
307
- - Member
308
- name: "i"
309
- - IntLiteral
310
- val: 5
311
- init: FloatLiteral
312
- val: 10.0
313
- EOS
314
- assert_raise(ParseError){C::MemberInit.parse('} int f() {')}
315
- assert_raise(ParseError){C::MemberInit.parse('}} f() {{')}
316
- assert_raise(ParseError){C::MemberInit.parse('1}; x = {1')}
317
- assert_raise(ParseError){C::MemberInit.parse('1}, y')}
318
- assert_raise(ParseError){C::MemberInit.parse('1, 2')}
319
- assert_raise(ParseError){C::MemberInit.parse('')}
320
- end
321
-
322
- def test_block
323
- check C::Block, <<EOS
324
- {}
325
- ----
326
- Block
327
- EOS
328
- check C::Block, <<EOS
329
- {{}}
330
- ----
331
- Block
332
- stmts:
333
- - Block
334
- EOS
335
- assert_raise(ParseError){C::Block.parse('} void f() {')}
336
- assert_raise(ParseError){C::Block.parse(';;')}
337
- assert_raise(ParseError){C::Block.parse('int i;')}
338
- assert_raise(ParseError){C::Block.parse(';')}
339
- assert_raise(ParseError){C::Block.parse('')}
340
- end
341
-
342
- def test_if
343
- check C::If, <<EOS
344
- if (1) 10;
345
- ----
346
- If
347
- cond: IntLiteral
348
- val: 1
349
- then: ExpressionStatement
350
- expr: IntLiteral
351
- val: 10
352
- EOS
353
- check C::If, <<EOS
354
- if (1) 10; else 20;
355
- ----
356
- If
357
- cond: IntLiteral
358
- val: 1
359
- then: ExpressionStatement
360
- expr: IntLiteral
361
- val: 10
362
- else: ExpressionStatement
363
- expr: IntLiteral
364
- val: 20
365
- EOS
366
- assert_raise(ParseError){C::If.parse('} void f() {')}
367
- assert_raise(ParseError){C::If.parse(';;')}
368
- assert_raise(ParseError){C::If.parse('int i;')}
369
- assert_raise(ParseError){C::If.parse(';')}
370
- assert_raise(ParseError){C::If.parse('')}
371
- end
372
-
373
- def test_switch
374
- check C::Switch, <<EOS
375
- switch (x);
376
- ----
377
- Switch
378
- cond: Variable
379
- name: "x"
380
- stmt: ExpressionStatement
381
- EOS
382
- assert_raise(ParseError){C::Switch.parse('} void f() {')}
383
- assert_raise(ParseError){C::Switch.parse(';;')}
384
- assert_raise(ParseError){C::Switch.parse('int i;')}
385
- assert_raise(ParseError){C::Switch.parse(';')}
386
- assert_raise(ParseError){C::Switch.parse('')}
387
- end
388
-
389
- def test_while
390
- check C::While, <<EOS
391
- while (1);
392
- ----
393
- While
394
- cond: IntLiteral
395
- val: 1
396
- stmt: ExpressionStatement
397
- EOS
398
- check C::While, <<EOS
399
- do ; while (1);
400
- ----
401
- While (do)
402
- cond: IntLiteral
403
- val: 1
404
- stmt: ExpressionStatement
405
- EOS
406
- assert_raise(ParseError){C::While.parse('} void f() {')}
407
- assert_raise(ParseError){C::While.parse(';;')}
408
- assert_raise(ParseError){C::While.parse('int i;')}
409
- assert_raise(ParseError){C::While.parse(';')}
410
- assert_raise(ParseError){C::While.parse('')}
411
- end
412
-
413
- def test_for
414
- check C::For, <<EOS
415
- for (;;);
416
- ----
417
- For
418
- stmt: ExpressionStatement
419
- EOS
420
- check C::For, <<EOS
421
- for (int i; ; );
422
- ----
423
- For
424
- init: Declaration
425
- type: Int
426
- declarators:
427
- - Declarator
428
- name: "i"
429
- stmt: ExpressionStatement
430
- EOS
431
- assert_raise(ParseError){C::For.parse('} void f() {')}
432
- assert_raise(ParseError){C::For.parse(';;')}
433
- assert_raise(ParseError){C::For.parse('int i;')}
434
- assert_raise(ParseError){C::For.parse(';')}
435
- assert_raise(ParseError){C::For.parse('')}
436
- end
437
-
438
- def test_goto
439
- check C::Goto, <<EOS
440
- goto x;
441
- ----
442
- Goto
443
- target: "x"
444
- EOS
445
- assert_raise(ParseError){C::Goto.parse('} void f() {')}
446
- assert_raise(ParseError){C::Goto.parse(';;')}
447
- assert_raise(ParseError){C::Goto.parse('int i;')}
448
- assert_raise(ParseError){C::Goto.parse(';')}
449
- assert_raise(ParseError){C::Goto.parse('')}
450
- end
451
-
452
- def test_continue
453
- check C::Continue, <<EOS
454
- continue;
455
- ----
456
- Continue
457
- EOS
458
- assert_raise(ParseError){C::Continue.parse('} void f() {')}
459
- assert_raise(ParseError){C::Continue.parse(';;')}
460
- assert_raise(ParseError){C::Continue.parse('int i;')}
461
- assert_raise(ParseError){C::Continue.parse(';')}
462
- assert_raise(ParseError){C::Continue.parse('')}
463
- end
464
-
465
- def test_break
466
- check C::Break, <<EOS
467
- break;
468
- ----
469
- Break
470
- EOS
471
- assert_raise(ParseError){C::Break.parse('} void f() {')}
472
- assert_raise(ParseError){C::Break.parse(';;')}
473
- assert_raise(ParseError){C::Break.parse('int i;')}
474
- assert_raise(ParseError){C::Break.parse(';')}
475
- assert_raise(ParseError){C::Break.parse('')}
476
- end
477
-
478
- def test_return
479
- check C::Return, <<EOS
480
- return;
481
- ----
482
- Return
483
- EOS
484
- check C::Return, <<EOS
485
- return 10;
486
- ----
487
- Return
488
- expr: IntLiteral
489
- val: 10
490
- EOS
491
- assert_raise(ParseError){C::Return.parse('} void f() {')}
492
- assert_raise(ParseError){C::Return.parse(';;')}
493
- assert_raise(ParseError){C::Return.parse('int i;')}
494
- assert_raise(ParseError){C::Return.parse(';')}
495
- assert_raise(ParseError){C::Return.parse('')}
496
- end
497
-
498
- def test_expression_statement
499
- check C::ExpressionStatement, <<EOS
500
- ;
501
- ----
502
- ExpressionStatement
503
- EOS
504
- check C::ExpressionStatement, <<EOS
505
- 10;
506
- ----
507
- ExpressionStatement
508
- expr: IntLiteral
509
- val: 10
510
- EOS
511
- assert_raise(ParseError){C::ExpressionStatement.parse('} void f() {')}
512
- assert_raise(ParseError){C::ExpressionStatement.parse(';;')}
513
- assert_raise(ParseError){C::ExpressionStatement.parse('int i;')}
514
- assert_raise(ParseError){C::ExpressionStatement.parse('return;')}
515
- assert_raise(ParseError){C::ExpressionStatement.parse('')}
516
- end
517
-
518
- def test_statement
519
- check C::Statement, <<EOS
520
- {}
521
- ----
522
- Block
523
- EOS
524
- check C::Statement, <<EOS
525
- if (1) 10; else 20;
526
- ----
527
- If
528
- cond: IntLiteral
529
- val: 1
530
- then: ExpressionStatement
531
- expr: IntLiteral
532
- val: 10
533
- else: ExpressionStatement
534
- expr: IntLiteral
535
- val: 20
536
- EOS
537
- check C::Statement, <<EOS
538
- switch (x);
539
- ----
540
- Switch
541
- cond: Variable
542
- name: "x"
543
- stmt: ExpressionStatement
544
- EOS
545
- check C::Statement, <<EOS
546
- while (1) ;
547
- ----
548
- While
549
- cond: IntLiteral
550
- val: 1
551
- stmt: ExpressionStatement
552
- EOS
553
- check C::Statement, <<EOS
554
- do ; while (1);
555
- ----
556
- While (do)
557
- cond: IntLiteral
558
- val: 1
559
- stmt: ExpressionStatement
560
- EOS
561
- check C::Statement, <<EOS
562
- for (;;) ;
563
- ----
564
- For
565
- stmt: ExpressionStatement
566
- EOS
567
- check C::Statement, <<EOS
568
- goto x;
569
- ----
570
- Goto
571
- target: "x"
572
- EOS
573
- check C::Statement, <<EOS
574
- continue;
575
- ----
576
- Continue
577
- EOS
578
- check C::Statement, <<EOS
579
- break;
580
- ----
581
- Break
582
- EOS
583
- check C::Statement, <<EOS
584
- return;
585
- ----
586
- Return
587
- EOS
588
- check C::Statement, <<EOS
589
- ;
590
- ----
591
- ExpressionStatement
592
- EOS
593
- assert_raise(ParseError){C::Statement.parse('} void f() {')}
594
- assert_raise(ParseError){C::Statement.parse(';;')}
595
- assert_raise(ParseError){C::Statement.parse('int i;')}
596
- assert_raise(ParseError){C::Statement.parse('')}
597
- end
598
-
599
- def test_plain_label
600
- check C::PlainLabel, <<EOS
601
- x:
602
- ----
603
- PlainLabel
604
- name: "x"
605
- EOS
606
- assert_raise(ParseError){C::PlainLabel.parse('} void f() {')}
607
- assert_raise(ParseError){C::PlainLabel.parse(';')}
608
- assert_raise(ParseError){C::PlainLabel.parse('')}
609
- assert_raise(ParseError){C::PlainLabel.parse('x')}
610
- assert_raise(ParseError){C::PlainLabel.parse('case 1:')}
611
- assert_raise(ParseError){C::PlainLabel.parse('default:')}
612
- end
613
-
614
- def test_default
615
- check C::Default, <<EOS
616
- default:
617
- ----
618
- Default
619
- EOS
620
- assert_raise(ParseError){C::Default.parse('} void f() {')}
621
- assert_raise(ParseError){C::Default.parse(';')}
622
- assert_raise(ParseError){C::Default.parse('')}
623
- assert_raise(ParseError){C::Default.parse('x')}
624
- assert_raise(ParseError){C::Default.parse('x:')}
625
- assert_raise(ParseError){C::Default.parse('case 1:')}
626
- end
627
-
628
- def test_case
629
- check C::Case, <<EOS
630
- case 1:
631
- ----
632
- Case
633
- expr: IntLiteral
634
- val: 1
635
- EOS
636
- assert_raise(ParseError){C::Case.parse('} void f() {')}
637
- assert_raise(ParseError){C::Case.parse(';')}
638
- assert_raise(ParseError){C::Case.parse('')}
639
- assert_raise(ParseError){C::Case.parse('x:')}
640
- assert_raise(ParseError){C::Case.parse('default:')}
641
- end
642
-
643
- def test_label
644
- check C::Label, <<EOS
645
- x:
646
- ----
647
- PlainLabel
648
- name: "x"
649
- EOS
650
- check C::Label, <<EOS
651
- default:
652
- ----
653
- Default
654
- EOS
655
- check C::Label, <<EOS
656
- case 1:
657
- ----
658
- Case
659
- expr: IntLiteral
660
- val: 1
661
- EOS
662
- assert_raise(ParseError){C::Label.parse('} void f() {')}
663
- assert_raise(ParseError){C::Label.parse(';')}
664
- assert_raise(ParseError){C::Label.parse('')}
665
- assert_raise(ParseError){C::Label.parse('x')}
666
- end
667
-
668
- def test_comma
669
- check C::Comma, <<EOS
670
- ++i, ++j
671
- ----
672
- Comma
673
- exprs:
674
- - PreInc
675
- expr: Variable
676
- name: "i"
677
- - PreInc
678
- expr: Variable
679
- name: "j"
680
- EOS
681
- check C::Comma, <<EOS
682
- (++i, ++j)
683
- ----
684
- Comma
685
- exprs:
686
- - PreInc
687
- expr: Variable
688
- name: "i"
689
- - PreInc
690
- expr: Variable
691
- name: "j"
692
- EOS
693
- assert_raise(ParseError){C::Comma.parse('} void f() {')}
694
- assert_raise(ParseError){C::Comma.parse(';')}
695
- assert_raise(ParseError){C::Comma.parse('int i')}
696
- assert_raise(ParseError){C::Comma.parse('int')}
697
- assert_raise(ParseError){C::Comma.parse('if (0)')}
698
- assert_raise(ParseError){C::Comma.parse('switch (0)')}
699
- assert_raise(ParseError){C::Comma.parse('for (;;)')}
700
- assert_raise(ParseError){C::Comma.parse('goto')}
701
- assert_raise(ParseError){C::Comma.parse('return')}
702
- end
703
-
704
- def test_conditional
705
- check C::Conditional, <<EOS
706
- 1 ? 10 : 20
707
- ----
708
- Conditional
709
- cond: IntLiteral
710
- val: 1
711
- then: IntLiteral
712
- val: 10
713
- else: IntLiteral
714
- val: 20
715
- EOS
716
- assert_raise(ParseError){C::Conditional.parse('} void f() {')}
717
- assert_raise(ParseError){C::Conditional.parse(';')}
718
- assert_raise(ParseError){C::Conditional.parse('int i')}
719
- assert_raise(ParseError){C::Conditional.parse('int')}
720
- assert_raise(ParseError){C::Conditional.parse('if (0)')}
721
- assert_raise(ParseError){C::Conditional.parse('switch (0)')}
722
- assert_raise(ParseError){C::Conditional.parse('for (;;)')}
723
- assert_raise(ParseError){C::Conditional.parse('goto')}
724
- assert_raise(ParseError){C::Conditional.parse('return')}
725
- end
726
-
727
- def test_cast
728
- check C::Cast, <<EOS
729
- (int)10.0
730
- ----
731
- Cast
732
- type: Int
733
- expr: FloatLiteral
734
- val: 10.0
735
- EOS
736
- assert_raise(ParseError){C::Cast.parse('} void f() {')}
737
- assert_raise(ParseError){C::Cast.parse(';')}
738
- assert_raise(ParseError){C::Cast.parse('int i')}
739
- assert_raise(ParseError){C::Cast.parse('int')}
740
- assert_raise(ParseError){C::Cast.parse('if (0)')}
741
- assert_raise(ParseError){C::Cast.parse('switch (0)')}
742
- assert_raise(ParseError){C::Cast.parse('for (;;)')}
743
- assert_raise(ParseError){C::Cast.parse('goto')}
744
- assert_raise(ParseError){C::Cast.parse('return')}
745
- end
746
-
747
- def test_address
748
- check C::Address, <<EOS
749
- &x
750
- ----
751
- Address
752
- expr: Variable
753
- name: "x"
754
- EOS
755
- assert_raise(ParseError){C::Address.parse('} void f() {')}
756
- assert_raise(ParseError){C::Address.parse(';')}
757
- assert_raise(ParseError){C::Address.parse('int i')}
758
- assert_raise(ParseError){C::Address.parse('int')}
759
- assert_raise(ParseError){C::Address.parse('if (0)')}
760
- assert_raise(ParseError){C::Address.parse('switch (0)')}
761
- assert_raise(ParseError){C::Address.parse('for (;;)')}
762
- assert_raise(ParseError){C::Address.parse('goto')}
763
- assert_raise(ParseError){C::Address.parse('return')}
764
- end
765
-
766
- def test_dereference
767
- check C::Dereference, <<EOS
768
- *x
769
- ----
770
- Dereference
771
- expr: Variable
772
- name: "x"
773
- EOS
774
- assert_raise(ParseError){C::Dereference.parse('} void f() {')}
775
- assert_raise(ParseError){C::Dereference.parse(';')}
776
- assert_raise(ParseError){C::Dereference.parse('int i')}
777
- assert_raise(ParseError){C::Dereference.parse('int')}
778
- assert_raise(ParseError){C::Dereference.parse('if (0)')}
779
- assert_raise(ParseError){C::Dereference.parse('switch (0)')}
780
- assert_raise(ParseError){C::Dereference.parse('for (;;)')}
781
- assert_raise(ParseError){C::Dereference.parse('goto')}
782
- assert_raise(ParseError){C::Dereference.parse('return')}
783
- end
784
-
785
- def test_sizeof
786
- check C::Sizeof, <<EOS
787
- sizeof i
788
- ----
789
- Sizeof
790
- expr: Variable
791
- name: "i"
792
- EOS
793
- check C::Sizeof, <<EOS
794
- sizeof(int)
795
- ----
796
- Sizeof
797
- expr: Int
798
- EOS
799
- assert_raise(ParseError){C::Sizeof.parse('} void f() {')}
800
- assert_raise(ParseError){C::Sizeof.parse(';')}
801
- assert_raise(ParseError){C::Sizeof.parse('int i')}
802
- assert_raise(ParseError){C::Sizeof.parse('int')}
803
- assert_raise(ParseError){C::Sizeof.parse('if (0)')}
804
- assert_raise(ParseError){C::Sizeof.parse('switch (0)')}
805
- assert_raise(ParseError){C::Sizeof.parse('for (;;)')}
806
- assert_raise(ParseError){C::Sizeof.parse('goto')}
807
- assert_raise(ParseError){C::Sizeof.parse('return')}
808
- end
809
-
810
- def test_index
811
- check C::Index, <<EOS
812
- x[10][20]
813
- ----
814
- Index
815
- expr: Index
816
- expr: Variable
817
- name: "x"
818
- index: IntLiteral
819
- val: 10
820
- index: IntLiteral
821
- val: 20
822
- EOS
823
- assert_raise(ParseError){C::Index.parse('} void f() {')}
824
- assert_raise(ParseError){C::Index.parse(';')}
825
- assert_raise(ParseError){C::Index.parse('int i')}
826
- assert_raise(ParseError){C::Index.parse('int')}
827
- assert_raise(ParseError){C::Index.parse('if (0)')}
828
- assert_raise(ParseError){C::Index.parse('switch (0)')}
829
- assert_raise(ParseError){C::Index.parse('for (;;)')}
830
- assert_raise(ParseError){C::Index.parse('goto')}
831
- assert_raise(ParseError){C::Index.parse('return')}
832
- end
833
-
834
- def test_call
835
- check C::Call, <<EOS
836
- x(10, 20)()
837
- ----
838
- Call
839
- expr: Call
840
- expr: Variable
841
- name: "x"
842
- args:
843
- - IntLiteral
844
- val: 10
845
- - IntLiteral
846
- val: 20
847
- EOS
848
- assert_raise(ParseError){C::Call.parse('} void f() {')}
849
- assert_raise(ParseError){C::Call.parse(';')}
850
- assert_raise(ParseError){C::Call.parse('int i')}
851
- assert_raise(ParseError){C::Call.parse('int')}
852
- assert_raise(ParseError){C::Call.parse('if (0)')}
853
- assert_raise(ParseError){C::Call.parse('switch (0)')}
854
- assert_raise(ParseError){C::Call.parse('for (;;)')}
855
- assert_raise(ParseError){C::Call.parse('goto')}
856
- assert_raise(ParseError){C::Call.parse('return')}
857
- end
858
-
859
- def test_arrow
860
- check C::Arrow, <<EOS
861
- x->y
862
- ----
863
- Arrow
864
- expr: Variable
865
- name: "x"
866
- member: Member
867
- name: "y"
868
- EOS
869
- assert_raise(ParseError){C::Arrow.parse('} void f() {')}
870
- assert_raise(ParseError){C::Arrow.parse(';')}
871
- assert_raise(ParseError){C::Arrow.parse('int i')}
872
- assert_raise(ParseError){C::Arrow.parse('int')}
873
- assert_raise(ParseError){C::Arrow.parse('if (0)')}
874
- assert_raise(ParseError){C::Arrow.parse('switch (0)')}
875
- assert_raise(ParseError){C::Arrow.parse('for (;;)')}
876
- assert_raise(ParseError){C::Arrow.parse('goto')}
877
- assert_raise(ParseError){C::Arrow.parse('return')}
878
- end
879
-
880
- def test_dot
881
- check C::Dot, <<EOS
882
- x.y
883
- ----
884
- Dot
885
- expr: Variable
886
- name: "x"
887
- member: Member
888
- name: "y"
889
- EOS
890
- assert_raise(ParseError){C::Dot.parse('} void f() {')}
891
- assert_raise(ParseError){C::Dot.parse(';')}
892
- assert_raise(ParseError){C::Dot.parse('int i')}
893
- assert_raise(ParseError){C::Dot.parse('int')}
894
- assert_raise(ParseError){C::Dot.parse('if (0)')}
895
- assert_raise(ParseError){C::Dot.parse('switch (0)')}
896
- assert_raise(ParseError){C::Dot.parse('for (;;)')}
897
- assert_raise(ParseError){C::Dot.parse('goto')}
898
- assert_raise(ParseError){C::Dot.parse('return')}
899
- end
900
-
901
- def test_positive
902
- check C::Positive, <<EOS
903
- +1
904
- ----
905
- Positive
906
- expr: IntLiteral
907
- val: 1
908
- EOS
909
- assert_raise(ParseError){C::Positive.parse('} void f() {')}
910
- assert_raise(ParseError){C::Positive.parse(';')}
911
- assert_raise(ParseError){C::Positive.parse('int i')}
912
- assert_raise(ParseError){C::Positive.parse('int')}
913
- assert_raise(ParseError){C::Positive.parse('if (0)')}
914
- assert_raise(ParseError){C::Positive.parse('switch (0)')}
915
- assert_raise(ParseError){C::Positive.parse('for (;;)')}
916
- assert_raise(ParseError){C::Positive.parse('goto')}
917
- assert_raise(ParseError){C::Positive.parse('return')}
918
- end
919
-
920
- def test_negative
921
- check C::Negative, <<EOS
922
- -1
923
- ----
924
- Negative
925
- expr: IntLiteral
926
- val: 1
927
- EOS
928
- assert_raise(ParseError){C::Negative.parse('} void f() {')}
929
- assert_raise(ParseError){C::Negative.parse(';')}
930
- assert_raise(ParseError){C::Negative.parse('int i')}
931
- assert_raise(ParseError){C::Negative.parse('int')}
932
- assert_raise(ParseError){C::Negative.parse('if (0)')}
933
- assert_raise(ParseError){C::Negative.parse('switch (0)')}
934
- assert_raise(ParseError){C::Negative.parse('for (;;)')}
935
- assert_raise(ParseError){C::Negative.parse('goto')}
936
- assert_raise(ParseError){C::Negative.parse('return')}
937
- end
938
-
939
- def test_add
940
- check C::Add, <<EOS
941
- 1 + 10
942
- ----
943
- Add
944
- expr1: IntLiteral
945
- val: 1
946
- expr2: IntLiteral
947
- val: 10
948
- EOS
949
- assert_raise(ParseError){C::Add.parse('} void f() {')}
950
- assert_raise(ParseError){C::Add.parse(';')}
951
- assert_raise(ParseError){C::Add.parse('int i')}
952
- assert_raise(ParseError){C::Add.parse('int')}
953
- assert_raise(ParseError){C::Add.parse('if (0)')}
954
- assert_raise(ParseError){C::Add.parse('switch (0)')}
955
- assert_raise(ParseError){C::Add.parse('for (;;)')}
956
- assert_raise(ParseError){C::Add.parse('goto')}
957
- assert_raise(ParseError){C::Add.parse('return')}
958
- end
959
-
960
- def test_subtract
961
- check C::Subtract, <<EOS
962
- 1 - 10
963
- ----
964
- Subtract
965
- expr1: IntLiteral
966
- val: 1
967
- expr2: IntLiteral
968
- val: 10
969
- EOS
970
- assert_raise(ParseError){C::Subtract.parse('} void f() {')}
971
- assert_raise(ParseError){C::Subtract.parse(';')}
972
- assert_raise(ParseError){C::Subtract.parse('int i')}
973
- assert_raise(ParseError){C::Subtract.parse('int')}
974
- assert_raise(ParseError){C::Subtract.parse('if (0)')}
975
- assert_raise(ParseError){C::Subtract.parse('switch (0)')}
976
- assert_raise(ParseError){C::Subtract.parse('for (;;)')}
977
- assert_raise(ParseError){C::Subtract.parse('goto')}
978
- assert_raise(ParseError){C::Subtract.parse('return')}
979
- end
980
-
981
- def test_multiply
982
- check C::Multiply, <<EOS
983
- 1 * 10
984
- ----
985
- Multiply
986
- expr1: IntLiteral
987
- val: 1
988
- expr2: IntLiteral
989
- val: 10
990
- EOS
991
- assert_raise(ParseError){C::Multiply.parse('} void f() {')}
992
- assert_raise(ParseError){C::Multiply.parse(';')}
993
- assert_raise(ParseError){C::Multiply.parse('int i')}
994
- assert_raise(ParseError){C::Multiply.parse('int')}
995
- assert_raise(ParseError){C::Multiply.parse('if (0)')}
996
- assert_raise(ParseError){C::Multiply.parse('switch (0)')}
997
- assert_raise(ParseError){C::Multiply.parse('for (;;)')}
998
- assert_raise(ParseError){C::Multiply.parse('goto')}
999
- assert_raise(ParseError){C::Multiply.parse('return')}
1000
- end
1001
-
1002
- def test_divide
1003
- check C::Divide, <<EOS
1004
- 1 / 10
1005
- ----
1006
- Divide
1007
- expr1: IntLiteral
1008
- val: 1
1009
- expr2: IntLiteral
1010
- val: 10
1011
- EOS
1012
- assert_raise(ParseError){C::Divide.parse('} void f() {')}
1013
- assert_raise(ParseError){C::Divide.parse(';')}
1014
- assert_raise(ParseError){C::Divide.parse('int i')}
1015
- assert_raise(ParseError){C::Divide.parse('int')}
1016
- assert_raise(ParseError){C::Divide.parse('if (0)')}
1017
- assert_raise(ParseError){C::Divide.parse('switch (0)')}
1018
- assert_raise(ParseError){C::Divide.parse('for (;;)')}
1019
- assert_raise(ParseError){C::Divide.parse('goto')}
1020
- assert_raise(ParseError){C::Divide.parse('return')}
1021
- end
1022
-
1023
- def test_mod
1024
- check C::Mod, <<EOS
1025
- 1 % 10
1026
- ----
1027
- Mod
1028
- expr1: IntLiteral
1029
- val: 1
1030
- expr2: IntLiteral
1031
- val: 10
1032
- EOS
1033
- assert_raise(ParseError){C::Mod.parse('} void f() {')}
1034
- assert_raise(ParseError){C::Mod.parse(';')}
1035
- assert_raise(ParseError){C::Mod.parse('int i')}
1036
- assert_raise(ParseError){C::Mod.parse('int')}
1037
- assert_raise(ParseError){C::Mod.parse('if (0)')}
1038
- assert_raise(ParseError){C::Mod.parse('switch (0)')}
1039
- assert_raise(ParseError){C::Mod.parse('for (;;)')}
1040
- assert_raise(ParseError){C::Mod.parse('goto')}
1041
- assert_raise(ParseError){C::Mod.parse('return')}
1042
- end
1043
-
1044
- def test_pre_inc
1045
- check C::PreInc, <<EOS
1046
- ++i
1047
- ----
1048
- PreInc
1049
- expr: Variable
1050
- name: "i"
1051
- EOS
1052
- assert_raise(ParseError){C::PreInc.parse('} void f() {')}
1053
- assert_raise(ParseError){C::PreInc.parse(';')}
1054
- assert_raise(ParseError){C::PreInc.parse('int i')}
1055
- assert_raise(ParseError){C::PreInc.parse('int')}
1056
- assert_raise(ParseError){C::PreInc.parse('if (0)')}
1057
- assert_raise(ParseError){C::PreInc.parse('switch (0)')}
1058
- assert_raise(ParseError){C::PreInc.parse('for (;;)')}
1059
- assert_raise(ParseError){C::PreInc.parse('goto')}
1060
- assert_raise(ParseError){C::PreInc.parse('return')}
1061
- end
1062
-
1063
- def test_post_inc
1064
- check C::PostInc, <<EOS
1065
- i++
1066
- ----
1067
- PostInc
1068
- expr: Variable
1069
- name: "i"
1070
- EOS
1071
- assert_raise(ParseError){C::PostInc.parse('} void f() {')}
1072
- assert_raise(ParseError){C::PostInc.parse(';')}
1073
- assert_raise(ParseError){C::PostInc.parse('int i')}
1074
- assert_raise(ParseError){C::PostInc.parse('int')}
1075
- assert_raise(ParseError){C::PostInc.parse('if (0)')}
1076
- assert_raise(ParseError){C::PostInc.parse('switch (0)')}
1077
- assert_raise(ParseError){C::PostInc.parse('for (;;)')}
1078
- assert_raise(ParseError){C::PostInc.parse('goto')}
1079
- assert_raise(ParseError){C::PostInc.parse('return')}
1080
- end
1081
-
1082
- def test_pre_dec
1083
- check C::PreDec, <<EOS
1084
- --i
1085
- ----
1086
- PreDec
1087
- expr: Variable
1088
- name: "i"
1089
- EOS
1090
- assert_raise(ParseError){C::PreDec.parse('} void f() {')}
1091
- assert_raise(ParseError){C::PreDec.parse(';')}
1092
- assert_raise(ParseError){C::PreDec.parse('int i')}
1093
- assert_raise(ParseError){C::PreDec.parse('int')}
1094
- assert_raise(ParseError){C::PreDec.parse('if (0)')}
1095
- assert_raise(ParseError){C::PreDec.parse('switch (0)')}
1096
- assert_raise(ParseError){C::PreDec.parse('for (;;)')}
1097
- assert_raise(ParseError){C::PreDec.parse('goto')}
1098
- assert_raise(ParseError){C::PreDec.parse('return')}
1099
- end
1100
-
1101
- def test_post_dec
1102
- check C::PostDec, <<EOS
1103
- i--
1104
- ----
1105
- PostDec
1106
- expr: Variable
1107
- name: "i"
1108
- EOS
1109
- assert_raise(ParseError){C::PostDec.parse('} void f() {')}
1110
- assert_raise(ParseError){C::PostDec.parse(';')}
1111
- assert_raise(ParseError){C::PostDec.parse('int i')}
1112
- assert_raise(ParseError){C::PostDec.parse('int')}
1113
- assert_raise(ParseError){C::PostDec.parse('if (0)')}
1114
- assert_raise(ParseError){C::PostDec.parse('switch (0)')}
1115
- assert_raise(ParseError){C::PostDec.parse('for (;;)')}
1116
- assert_raise(ParseError){C::PostDec.parse('goto')}
1117
- assert_raise(ParseError){C::PostDec.parse('return')}
1118
- end
1119
-
1120
- def test_equal
1121
- check C::Equal, <<EOS
1122
- 1 == 10
1123
- ----
1124
- Equal
1125
- expr1: IntLiteral
1126
- val: 1
1127
- expr2: IntLiteral
1128
- val: 10
1129
- EOS
1130
- assert_raise(ParseError){C::Equal.parse('} void f() {')}
1131
- assert_raise(ParseError){C::Equal.parse(';')}
1132
- assert_raise(ParseError){C::Equal.parse('int i')}
1133
- assert_raise(ParseError){C::Equal.parse('int')}
1134
- assert_raise(ParseError){C::Equal.parse('if (0)')}
1135
- assert_raise(ParseError){C::Equal.parse('switch (0)')}
1136
- assert_raise(ParseError){C::Equal.parse('for (;;)')}
1137
- assert_raise(ParseError){C::Equal.parse('goto')}
1138
- assert_raise(ParseError){C::Equal.parse('return')}
1139
- end
1140
-
1141
- def test_not_equal
1142
- check C::NotEqual, <<EOS
1143
- 1 != 10
1144
- ----
1145
- NotEqual
1146
- expr1: IntLiteral
1147
- val: 1
1148
- expr2: IntLiteral
1149
- val: 10
1150
- EOS
1151
- assert_raise(ParseError){C::NotEqual.parse('} void f() {')}
1152
- assert_raise(ParseError){C::NotEqual.parse(';')}
1153
- assert_raise(ParseError){C::NotEqual.parse('int i')}
1154
- assert_raise(ParseError){C::NotEqual.parse('int')}
1155
- assert_raise(ParseError){C::NotEqual.parse('if (0)')}
1156
- assert_raise(ParseError){C::NotEqual.parse('switch (0)')}
1157
- assert_raise(ParseError){C::NotEqual.parse('for (;;)')}
1158
- assert_raise(ParseError){C::NotEqual.parse('goto')}
1159
- assert_raise(ParseError){C::NotEqual.parse('return')}
1160
- end
1161
-
1162
- def test_less
1163
- check C::Less, <<EOS
1164
- 1 < 10
1165
- ----
1166
- Less
1167
- expr1: IntLiteral
1168
- val: 1
1169
- expr2: IntLiteral
1170
- val: 10
1171
- EOS
1172
- assert_raise(ParseError){C::Less.parse('} void f() {')}
1173
- assert_raise(ParseError){C::Less.parse(';')}
1174
- assert_raise(ParseError){C::Less.parse('int i')}
1175
- assert_raise(ParseError){C::Less.parse('int')}
1176
- assert_raise(ParseError){C::Less.parse('if (0)')}
1177
- assert_raise(ParseError){C::Less.parse('switch (0)')}
1178
- assert_raise(ParseError){C::Less.parse('for (;;)')}
1179
- assert_raise(ParseError){C::Less.parse('goto')}
1180
- assert_raise(ParseError){C::Less.parse('return')}
1181
- end
1182
-
1183
- def test_more
1184
- check C::More, <<EOS
1185
- 1 > 10
1186
- ----
1187
- More
1188
- expr1: IntLiteral
1189
- val: 1
1190
- expr2: IntLiteral
1191
- val: 10
1192
- EOS
1193
- assert_raise(ParseError){C::More.parse('} void f() {')}
1194
- assert_raise(ParseError){C::More.parse(';')}
1195
- assert_raise(ParseError){C::More.parse('int i')}
1196
- assert_raise(ParseError){C::More.parse('int')}
1197
- assert_raise(ParseError){C::More.parse('if (0)')}
1198
- assert_raise(ParseError){C::More.parse('switch (0)')}
1199
- assert_raise(ParseError){C::More.parse('for (;;)')}
1200
- assert_raise(ParseError){C::More.parse('goto')}
1201
- assert_raise(ParseError){C::More.parse('return')}
1202
- end
1203
-
1204
- def test_less_or_equal
1205
- check C::LessOrEqual, <<EOS
1206
- 1 <= 10
1207
- ----
1208
- LessOrEqual
1209
- expr1: IntLiteral
1210
- val: 1
1211
- expr2: IntLiteral
1212
- val: 10
1213
- EOS
1214
- assert_raise(ParseError){C::LessOrEqual.parse('} void f() {')}
1215
- assert_raise(ParseError){C::LessOrEqual.parse(';')}
1216
- assert_raise(ParseError){C::LessOrEqual.parse('int i')}
1217
- assert_raise(ParseError){C::LessOrEqual.parse('int')}
1218
- assert_raise(ParseError){C::LessOrEqual.parse('if (0)')}
1219
- assert_raise(ParseError){C::LessOrEqual.parse('switch (0)')}
1220
- assert_raise(ParseError){C::LessOrEqual.parse('for (;;)')}
1221
- assert_raise(ParseError){C::LessOrEqual.parse('goto')}
1222
- assert_raise(ParseError){C::LessOrEqual.parse('return')}
1223
- end
1224
-
1225
- def test_more_or_equal
1226
- check C::MoreOrEqual, <<EOS
1227
- 1 >= 10
1228
- ----
1229
- MoreOrEqual
1230
- expr1: IntLiteral
1231
- val: 1
1232
- expr2: IntLiteral
1233
- val: 10
1234
- EOS
1235
- assert_raise(ParseError){C::MoreOrEqual.parse('} void f() {')}
1236
- assert_raise(ParseError){C::MoreOrEqual.parse(';')}
1237
- assert_raise(ParseError){C::MoreOrEqual.parse('int i')}
1238
- assert_raise(ParseError){C::MoreOrEqual.parse('int')}
1239
- assert_raise(ParseError){C::MoreOrEqual.parse('if (0)')}
1240
- assert_raise(ParseError){C::MoreOrEqual.parse('switch (0)')}
1241
- assert_raise(ParseError){C::MoreOrEqual.parse('for (;;)')}
1242
- assert_raise(ParseError){C::MoreOrEqual.parse('goto')}
1243
- assert_raise(ParseError){C::MoreOrEqual.parse('return')}
1244
- end
1245
-
1246
- def test_bit_and
1247
- check C::BitAnd, <<EOS
1248
- 1 & 10
1249
- ----
1250
- BitAnd
1251
- expr1: IntLiteral
1252
- val: 1
1253
- expr2: IntLiteral
1254
- val: 10
1255
- EOS
1256
- assert_raise(ParseError){C::BitAnd.parse('} void f() {')}
1257
- assert_raise(ParseError){C::BitAnd.parse(';')}
1258
- assert_raise(ParseError){C::BitAnd.parse('int i')}
1259
- assert_raise(ParseError){C::BitAnd.parse('int')}
1260
- assert_raise(ParseError){C::BitAnd.parse('if (0)')}
1261
- assert_raise(ParseError){C::BitAnd.parse('switch (0)')}
1262
- assert_raise(ParseError){C::BitAnd.parse('for (;;)')}
1263
- assert_raise(ParseError){C::BitAnd.parse('goto')}
1264
- assert_raise(ParseError){C::BitAnd.parse('return')}
1265
- end
1266
-
1267
- def test_bit_or
1268
- check C::BitOr, <<EOS
1269
- 1 | 10
1270
- ----
1271
- BitOr
1272
- expr1: IntLiteral
1273
- val: 1
1274
- expr2: IntLiteral
1275
- val: 10
1276
- EOS
1277
- assert_raise(ParseError){C::BitOr.parse('} void f() {')}
1278
- assert_raise(ParseError){C::BitOr.parse(';')}
1279
- assert_raise(ParseError){C::BitOr.parse('int i')}
1280
- assert_raise(ParseError){C::BitOr.parse('int')}
1281
- assert_raise(ParseError){C::BitOr.parse('if (0)')}
1282
- assert_raise(ParseError){C::BitOr.parse('switch (0)')}
1283
- assert_raise(ParseError){C::BitOr.parse('for (;;)')}
1284
- assert_raise(ParseError){C::BitOr.parse('goto')}
1285
- assert_raise(ParseError){C::BitOr.parse('return')}
1286
- end
1287
-
1288
- def test_bit_xor
1289
- check C::BitXor, <<EOS
1290
- 1 ^ 10
1291
- ----
1292
- BitXor
1293
- expr1: IntLiteral
1294
- val: 1
1295
- expr2: IntLiteral
1296
- val: 10
1297
- EOS
1298
- assert_raise(ParseError){C::BitXor.parse('} void f() {')}
1299
- assert_raise(ParseError){C::BitXor.parse(';')}
1300
- assert_raise(ParseError){C::BitXor.parse('int i')}
1301
- assert_raise(ParseError){C::BitXor.parse('int')}
1302
- assert_raise(ParseError){C::BitXor.parse('if (0)')}
1303
- assert_raise(ParseError){C::BitXor.parse('switch (0)')}
1304
- assert_raise(ParseError){C::BitXor.parse('for (;;)')}
1305
- assert_raise(ParseError){C::BitXor.parse('goto')}
1306
- assert_raise(ParseError){C::BitXor.parse('return')}
1307
- end
1308
-
1309
- def test_bit_not
1310
- check C::BitNot, <<EOS
1311
- ~i
1312
- ----
1313
- BitNot
1314
- expr: Variable
1315
- name: "i"
1316
- EOS
1317
- assert_raise(ParseError){C::BitNot.parse('} void f() {')}
1318
- assert_raise(ParseError){C::BitNot.parse(';')}
1319
- assert_raise(ParseError){C::BitNot.parse('int i')}
1320
- assert_raise(ParseError){C::BitNot.parse('int')}
1321
- assert_raise(ParseError){C::BitNot.parse('if (0)')}
1322
- assert_raise(ParseError){C::BitNot.parse('switch (0)')}
1323
- assert_raise(ParseError){C::BitNot.parse('for (;;)')}
1324
- assert_raise(ParseError){C::BitNot.parse('goto')}
1325
- assert_raise(ParseError){C::BitNot.parse('return')}
1326
- end
1327
-
1328
- def test_shift_left
1329
- check C::ShiftLeft, <<EOS
1330
- 1 << 10
1331
- ----
1332
- ShiftLeft
1333
- expr1: IntLiteral
1334
- val: 1
1335
- expr2: IntLiteral
1336
- val: 10
1337
- EOS
1338
- assert_raise(ParseError){C::ShiftLeft.parse('} void f() {')}
1339
- assert_raise(ParseError){C::ShiftLeft.parse(';')}
1340
- assert_raise(ParseError){C::ShiftLeft.parse('int i')}
1341
- assert_raise(ParseError){C::ShiftLeft.parse('int')}
1342
- assert_raise(ParseError){C::ShiftLeft.parse('if (0)')}
1343
- assert_raise(ParseError){C::ShiftLeft.parse('switch (0)')}
1344
- assert_raise(ParseError){C::ShiftLeft.parse('for (;;)')}
1345
- assert_raise(ParseError){C::ShiftLeft.parse('goto')}
1346
- assert_raise(ParseError){C::ShiftLeft.parse('return')}
1347
- end
1348
-
1349
- def test_shift_right
1350
- check C::ShiftRight, <<EOS
1351
- 1 >> 10
1352
- ----
1353
- ShiftRight
1354
- expr1: IntLiteral
1355
- val: 1
1356
- expr2: IntLiteral
1357
- val: 10
1358
- EOS
1359
- assert_raise(ParseError){C::ShiftRight.parse('} void f() {')}
1360
- assert_raise(ParseError){C::ShiftRight.parse(';')}
1361
- assert_raise(ParseError){C::ShiftRight.parse('int i')}
1362
- assert_raise(ParseError){C::ShiftRight.parse('int')}
1363
- assert_raise(ParseError){C::ShiftRight.parse('if (0)')}
1364
- assert_raise(ParseError){C::ShiftRight.parse('switch (0)')}
1365
- assert_raise(ParseError){C::ShiftRight.parse('for (;;)')}
1366
- assert_raise(ParseError){C::ShiftRight.parse('goto')}
1367
- assert_raise(ParseError){C::ShiftRight.parse('return')}
1368
- end
1369
-
1370
- def test_and
1371
- check C::And, <<EOS
1372
- 1 && 10
1373
- ----
1374
- And
1375
- expr1: IntLiteral
1376
- val: 1
1377
- expr2: IntLiteral
1378
- val: 10
1379
- EOS
1380
- assert_raise(ParseError){C::And.parse('} void f() {')}
1381
- assert_raise(ParseError){C::And.parse(';')}
1382
- assert_raise(ParseError){C::And.parse('int i')}
1383
- assert_raise(ParseError){C::And.parse('int')}
1384
- assert_raise(ParseError){C::And.parse('if (0)')}
1385
- assert_raise(ParseError){C::And.parse('switch (0)')}
1386
- assert_raise(ParseError){C::And.parse('for (;;)')}
1387
- assert_raise(ParseError){C::And.parse('goto')}
1388
- assert_raise(ParseError){C::And.parse('return')}
1389
- end
1390
-
1391
- def test_or
1392
- check C::Or, <<EOS
1393
- 1 || 10
1394
- ----
1395
- Or
1396
- expr1: IntLiteral
1397
- val: 1
1398
- expr2: IntLiteral
1399
- val: 10
1400
- EOS
1401
- assert_raise(ParseError){C::Or.parse('} void f() {')}
1402
- assert_raise(ParseError){C::Or.parse(';')}
1403
- assert_raise(ParseError){C::Or.parse('int i')}
1404
- assert_raise(ParseError){C::Or.parse('int')}
1405
- assert_raise(ParseError){C::Or.parse('if (0)')}
1406
- assert_raise(ParseError){C::Or.parse('switch (0)')}
1407
- assert_raise(ParseError){C::Or.parse('for (;;)')}
1408
- assert_raise(ParseError){C::Or.parse('goto')}
1409
- assert_raise(ParseError){C::Or.parse('return')}
1410
- end
1411
-
1412
- def test_not
1413
- check C::Not, <<EOS
1414
- !i
1415
- ----
1416
- Not
1417
- expr: Variable
1418
- name: "i"
1419
- EOS
1420
- assert_raise(ParseError){C::Not.parse('} void f() {')}
1421
- assert_raise(ParseError){C::Not.parse(';')}
1422
- assert_raise(ParseError){C::Not.parse('int i')}
1423
- assert_raise(ParseError){C::Not.parse('int')}
1424
- assert_raise(ParseError){C::Not.parse('if (0)')}
1425
- assert_raise(ParseError){C::Not.parse('switch (0)')}
1426
- assert_raise(ParseError){C::Not.parse('for (;;)')}
1427
- assert_raise(ParseError){C::Not.parse('goto')}
1428
- assert_raise(ParseError){C::Not.parse('return')}
1429
- end
1430
-
1431
- def test_assign
1432
- check C::Assign, <<EOS
1433
- x = 10
1434
- ----
1435
- Assign
1436
- lval: Variable
1437
- name: "x"
1438
- rval: IntLiteral
1439
- val: 10
1440
- EOS
1441
- assert_raise(ParseError){C::Assign.parse('} void f() {')}
1442
- assert_raise(ParseError){C::Assign.parse(';')}
1443
- assert_raise(ParseError){C::Assign.parse('int i')}
1444
- assert_raise(ParseError){C::Assign.parse('int')}
1445
- assert_raise(ParseError){C::Assign.parse('if (0)')}
1446
- assert_raise(ParseError){C::Assign.parse('switch (0)')}
1447
- assert_raise(ParseError){C::Assign.parse('for (;;)')}
1448
- assert_raise(ParseError){C::Assign.parse('goto')}
1449
- assert_raise(ParseError){C::Assign.parse('return')}
1450
- end
1451
-
1452
- def test_multiply_assign
1453
- check C::MultiplyAssign, <<EOS
1454
- x *= 10
1455
- ----
1456
- MultiplyAssign
1457
- lval: Variable
1458
- name: "x"
1459
- rval: IntLiteral
1460
- val: 10
1461
- EOS
1462
- assert_raise(ParseError){C::MultiplyAssign.parse('} void f() {')}
1463
- assert_raise(ParseError){C::MultiplyAssign.parse(';')}
1464
- assert_raise(ParseError){C::MultiplyAssign.parse('int i')}
1465
- assert_raise(ParseError){C::MultiplyAssign.parse('int')}
1466
- assert_raise(ParseError){C::MultiplyAssign.parse('if (0)')}
1467
- assert_raise(ParseError){C::MultiplyAssign.parse('switch (0)')}
1468
- assert_raise(ParseError){C::MultiplyAssign.parse('for (;;)')}
1469
- assert_raise(ParseError){C::MultiplyAssign.parse('goto')}
1470
- assert_raise(ParseError){C::MultiplyAssign.parse('return')}
1471
- end
1472
-
1473
- def test_divide_assign
1474
- check C::DivideAssign, <<EOS
1475
- x /= 10
1476
- ----
1477
- DivideAssign
1478
- lval: Variable
1479
- name: "x"
1480
- rval: IntLiteral
1481
- val: 10
1482
- EOS
1483
- assert_raise(ParseError){C::DivideAssign.parse('} void f() {')}
1484
- assert_raise(ParseError){C::DivideAssign.parse(';')}
1485
- assert_raise(ParseError){C::DivideAssign.parse('int i')}
1486
- assert_raise(ParseError){C::DivideAssign.parse('int')}
1487
- assert_raise(ParseError){C::DivideAssign.parse('if (0)')}
1488
- assert_raise(ParseError){C::DivideAssign.parse('switch (0)')}
1489
- assert_raise(ParseError){C::DivideAssign.parse('for (;;)')}
1490
- assert_raise(ParseError){C::DivideAssign.parse('goto')}
1491
- assert_raise(ParseError){C::DivideAssign.parse('return')}
1492
- end
1493
-
1494
- def test_mod_assign
1495
- check C::ModAssign, <<EOS
1496
- x %= 10
1497
- ----
1498
- ModAssign
1499
- lval: Variable
1500
- name: "x"
1501
- rval: IntLiteral
1502
- val: 10
1503
- EOS
1504
- assert_raise(ParseError){C::ModAssign.parse('} void f() {')}
1505
- assert_raise(ParseError){C::ModAssign.parse(';')}
1506
- assert_raise(ParseError){C::ModAssign.parse('int i')}
1507
- assert_raise(ParseError){C::ModAssign.parse('int')}
1508
- assert_raise(ParseError){C::ModAssign.parse('if (0)')}
1509
- assert_raise(ParseError){C::ModAssign.parse('switch (0)')}
1510
- assert_raise(ParseError){C::ModAssign.parse('for (;;)')}
1511
- assert_raise(ParseError){C::ModAssign.parse('goto')}
1512
- assert_raise(ParseError){C::ModAssign.parse('return')}
1513
- end
1514
-
1515
- def test_add_assign
1516
- check C::AddAssign, <<EOS
1517
- x += 10
1518
- ----
1519
- AddAssign
1520
- lval: Variable
1521
- name: "x"
1522
- rval: IntLiteral
1523
- val: 10
1524
- EOS
1525
- assert_raise(ParseError){C::AddAssign.parse('} void f() {')}
1526
- assert_raise(ParseError){C::AddAssign.parse(';')}
1527
- assert_raise(ParseError){C::AddAssign.parse('int i')}
1528
- assert_raise(ParseError){C::AddAssign.parse('int')}
1529
- assert_raise(ParseError){C::AddAssign.parse('if (0)')}
1530
- assert_raise(ParseError){C::AddAssign.parse('switch (0)')}
1531
- assert_raise(ParseError){C::AddAssign.parse('for (;;)')}
1532
- assert_raise(ParseError){C::AddAssign.parse('goto')}
1533
- assert_raise(ParseError){C::AddAssign.parse('return')}
1534
- end
1535
-
1536
- def test_subtract_assign
1537
- check C::SubtractAssign, <<EOS
1538
- x -= 10
1539
- ----
1540
- SubtractAssign
1541
- lval: Variable
1542
- name: "x"
1543
- rval: IntLiteral
1544
- val: 10
1545
- EOS
1546
- assert_raise(ParseError){C::SubtractAssign.parse('} void f() {')}
1547
- assert_raise(ParseError){C::SubtractAssign.parse(';')}
1548
- assert_raise(ParseError){C::SubtractAssign.parse('int i')}
1549
- assert_raise(ParseError){C::SubtractAssign.parse('int')}
1550
- assert_raise(ParseError){C::SubtractAssign.parse('if (0)')}
1551
- assert_raise(ParseError){C::SubtractAssign.parse('switch (0)')}
1552
- assert_raise(ParseError){C::SubtractAssign.parse('for (;;)')}
1553
- assert_raise(ParseError){C::SubtractAssign.parse('goto')}
1554
- assert_raise(ParseError){C::SubtractAssign.parse('return')}
1555
- end
1556
-
1557
- def test_shift_left_assign
1558
- check C::ShiftLeftAssign, <<EOS
1559
- x <<= 10
1560
- ----
1561
- ShiftLeftAssign
1562
- lval: Variable
1563
- name: "x"
1564
- rval: IntLiteral
1565
- val: 10
1566
- EOS
1567
- assert_raise(ParseError){C::ShiftLeftAssign.parse('} void f() {')}
1568
- assert_raise(ParseError){C::ShiftLeftAssign.parse(';')}
1569
- assert_raise(ParseError){C::ShiftLeftAssign.parse('int i')}
1570
- assert_raise(ParseError){C::ShiftLeftAssign.parse('int')}
1571
- assert_raise(ParseError){C::ShiftLeftAssign.parse('if (0)')}
1572
- assert_raise(ParseError){C::ShiftLeftAssign.parse('switch (0)')}
1573
- assert_raise(ParseError){C::ShiftLeftAssign.parse('for (;;)')}
1574
- assert_raise(ParseError){C::ShiftLeftAssign.parse('goto')}
1575
- assert_raise(ParseError){C::ShiftLeftAssign.parse('return')}
1576
- end
1577
-
1578
- def test_shift_right_assign
1579
- check C::ShiftRightAssign, <<EOS
1580
- x >>= 10
1581
- ----
1582
- ShiftRightAssign
1583
- lval: Variable
1584
- name: "x"
1585
- rval: IntLiteral
1586
- val: 10
1587
- EOS
1588
- assert_raise(ParseError){C::ShiftRightAssign.parse('} void f() {')}
1589
- assert_raise(ParseError){C::ShiftRightAssign.parse(';')}
1590
- assert_raise(ParseError){C::ShiftRightAssign.parse('int i')}
1591
- assert_raise(ParseError){C::ShiftRightAssign.parse('int')}
1592
- assert_raise(ParseError){C::ShiftRightAssign.parse('if (0)')}
1593
- assert_raise(ParseError){C::ShiftRightAssign.parse('switch (0)')}
1594
- assert_raise(ParseError){C::ShiftRightAssign.parse('for (;;)')}
1595
- assert_raise(ParseError){C::ShiftRightAssign.parse('goto')}
1596
- assert_raise(ParseError){C::ShiftRightAssign.parse('return')}
1597
- end
1598
-
1599
- def test_bit_and_assign
1600
- check C::BitAndAssign, <<EOS
1601
- x &= 10
1602
- ----
1603
- BitAndAssign
1604
- lval: Variable
1605
- name: "x"
1606
- rval: IntLiteral
1607
- val: 10
1608
- EOS
1609
- assert_raise(ParseError){C::BitAndAssign.parse('} void f() {')}
1610
- assert_raise(ParseError){C::BitAndAssign.parse(';')}
1611
- assert_raise(ParseError){C::BitAndAssign.parse('int i')}
1612
- assert_raise(ParseError){C::BitAndAssign.parse('int')}
1613
- assert_raise(ParseError){C::BitAndAssign.parse('if (0)')}
1614
- assert_raise(ParseError){C::BitAndAssign.parse('switch (0)')}
1615
- assert_raise(ParseError){C::BitAndAssign.parse('for (;;)')}
1616
- assert_raise(ParseError){C::BitAndAssign.parse('goto')}
1617
- assert_raise(ParseError){C::BitAndAssign.parse('return')}
1618
- end
1619
-
1620
- def test_bit_xor_assign
1621
- check C::BitXorAssign, <<EOS
1622
- x ^= 10
1623
- ----
1624
- BitXorAssign
1625
- lval: Variable
1626
- name: "x"
1627
- rval: IntLiteral
1628
- val: 10
1629
- EOS
1630
- assert_raise(ParseError){C::BitXorAssign.parse('} void f() {')}
1631
- assert_raise(ParseError){C::BitXorAssign.parse(';')}
1632
- assert_raise(ParseError){C::BitXorAssign.parse('int i')}
1633
- assert_raise(ParseError){C::BitXorAssign.parse('int')}
1634
- assert_raise(ParseError){C::BitXorAssign.parse('if (0)')}
1635
- assert_raise(ParseError){C::BitXorAssign.parse('switch (0)')}
1636
- assert_raise(ParseError){C::BitXorAssign.parse('for (;;)')}
1637
- assert_raise(ParseError){C::BitXorAssign.parse('goto')}
1638
- assert_raise(ParseError){C::BitXorAssign.parse('return')}
1639
- end
1640
-
1641
- def test_bit_or_assign
1642
- check C::BitOrAssign, <<EOS
1643
- x |= 10
1644
- ----
1645
- BitOrAssign
1646
- lval: Variable
1647
- name: "x"
1648
- rval: IntLiteral
1649
- val: 10
1650
- EOS
1651
- assert_raise(ParseError){C::BitOrAssign.parse('} void f() {')}
1652
- assert_raise(ParseError){C::BitOrAssign.parse(';')}
1653
- assert_raise(ParseError){C::BitOrAssign.parse('int i')}
1654
- assert_raise(ParseError){C::BitOrAssign.parse('int')}
1655
- assert_raise(ParseError){C::BitOrAssign.parse('if (0)')}
1656
- assert_raise(ParseError){C::BitOrAssign.parse('switch (0)')}
1657
- assert_raise(ParseError){C::BitOrAssign.parse('for (;;)')}
1658
- assert_raise(ParseError){C::BitOrAssign.parse('goto')}
1659
- assert_raise(ParseError){C::BitOrAssign.parse('return')}
1660
- end
1661
-
1662
- def test_pointer
1663
- check C::Pointer, <<EOS
1664
- int *
1665
- ----
1666
- Pointer
1667
- type: Int
1668
- EOS
1669
- check C::Pointer, <<EOS
1670
- const volatile unsigned int*
1671
- ----
1672
- Pointer
1673
- type: Int (const volatile unsigned)
1674
- EOS
1675
- assert_raise(ParseError){C::Pointer.parse('1);} void f() {(int')}
1676
- assert_raise(ParseError){C::Pointer.parse('1); (int')}
1677
- assert_raise(ParseError){C::Pointer.parse('void')}
1678
- end
1679
-
1680
- def test_array
1681
- check C::Array, <<EOS
1682
- int[]
1683
- ----
1684
- Array
1685
- type: Int
1686
- EOS
1687
- check C::Array, <<EOS
1688
- const volatile unsigned int[10]
1689
- ----
1690
- Array
1691
- type: Int (const volatile unsigned)
1692
- length: IntLiteral
1693
- val: 10
1694
- EOS
1695
- assert_raise(ParseError){C::Array.parse('1);} void f() {(int')}
1696
- assert_raise(ParseError){C::Array.parse('1); (int')}
1697
- assert_raise(ParseError){C::Array.parse('void')}
1698
- end
1699
-
1700
- def test_function
1701
- check C::Function, <<EOS
1702
- void()
1703
- ----
1704
- Function
1705
- type: Void
1706
- EOS
1707
- check C::Function, <<EOS
1708
- const volatile unsigned int(int x, int y)
1709
- ----
1710
- Function
1711
- type: Int (const volatile unsigned)
1712
- params:
1713
- - Parameter
1714
- type: Int
1715
- name: "x"
1716
- - Parameter
1717
- type: Int
1718
- name: "y"
1719
- EOS
1720
- assert_raise(ParseError){C::Function.parse('1);} void f() {(int')}
1721
- assert_raise(ParseError){C::Function.parse('1); (int')}
1722
- assert_raise(ParseError){C::Function.parse('void')}
1723
- end
1724
-
1725
- def test_struct
1726
- check C::Struct, <<EOS
1727
- struct s
1728
- ----
1729
- Struct
1730
- name: "s"
1731
- EOS
1732
- check C::Struct, <<EOS
1733
- const struct {int i, j : 4;}
1734
- ----
1735
- Struct (const)
1736
- members:
1737
- - Declaration
1738
- type: Int
1739
- declarators:
1740
- - Declarator
1741
- name: "i"
1742
- - Declarator
1743
- name: "j"
1744
- num_bits: IntLiteral
1745
- val: 4
1746
- EOS
1747
- assert_raise(ParseError){C::Struct.parse('1);} void f() {(int')}
1748
- assert_raise(ParseError){C::Struct.parse('1); (int')}
1749
- assert_raise(ParseError){C::Struct.parse('void')}
1750
- end
1751
-
1752
- def test_union
1753
- check C::Union, <<EOS
1754
- union s
1755
- ----
1756
- Union
1757
- name: "s"
1758
- EOS
1759
- check C::Union, <<EOS
1760
- const union {int i, j : 4;}
1761
- ----
1762
- Union (const)
1763
- members:
1764
- - Declaration
1765
- type: Int
1766
- declarators:
1767
- - Declarator
1768
- name: "i"
1769
- - Declarator
1770
- name: "j"
1771
- num_bits: IntLiteral
1772
- val: 4
1773
- EOS
1774
- assert_raise(ParseError){C::Union.parse('1);} void f() {(int')}
1775
- assert_raise(ParseError){C::Union.parse('1); (int')}
1776
- assert_raise(ParseError){C::Union.parse('void')}
1777
- end
1778
-
1779
- def test_enum
1780
- check C::Enum, <<EOS
1781
- enum s
1782
- ----
1783
- Enum
1784
- name: "s"
1785
- EOS
1786
- check C::Enum, <<EOS
1787
- const enum {X = 10, Y, Z}
1788
- ----
1789
- Enum (const)
1790
- members:
1791
- - Enumerator
1792
- name: "X"
1793
- val: IntLiteral
1794
- val: 10
1795
- - Enumerator
1796
- name: "Y"
1797
- - Enumerator
1798
- name: "Z"
1799
- EOS
1800
- assert_raise(ParseError){C::Enum.parse('1);} void f() {(int')}
1801
- assert_raise(ParseError){C::Enum.parse('1); (int')}
1802
- assert_raise(ParseError){C::Enum.parse('void')}
1803
- end
1804
-
1805
- def test_custom_type
1806
- assert_raise(ParseError){C::CustomType.parse('1);} void f() {(int')}
1807
- assert_raise(ParseError){C::CustomType.parse('1); (int')}
1808
- assert_raise(ParseError){C::CustomType.parse('void')}
1809
- end
1810
-
1811
- def test_void
1812
- check C::Void, <<EOS
1813
- const void
1814
- ----
1815
- Void (const)
1816
- EOS
1817
- assert_raise(ParseError){C::Void.parse('1);} void f() {(int')}
1818
- assert_raise(ParseError){C::Void.parse('1); (int')}
1819
- assert_raise(ParseError){C::Void.parse('int')}
1820
- end
1821
-
1822
- def test_int
1823
- check C::Int, <<EOS
1824
- const int
1825
- ----
1826
- Int (const)
1827
- EOS
1828
- assert_raise(ParseError){C::Int.parse('1);} void f() {(int')}
1829
- assert_raise(ParseError){C::Int.parse('1); (int')}
1830
- assert_raise(ParseError){C::Int.parse('void')}
1831
- end
1832
-
1833
- def test_float
1834
- check C::Float, <<EOS
1835
- const float
1836
- ----
1837
- Float (const)
1838
- EOS
1839
- assert_raise(ParseError){C::Float.parse('1);} void f() {(int')}
1840
- assert_raise(ParseError){C::Float.parse('1); (int')}
1841
- assert_raise(ParseError){C::Float.parse('void')}
1842
- end
1843
-
1844
- def test_char
1845
- check C::Char, <<EOS
1846
- const char
1847
- ----
1848
- Char (const)
1849
- EOS
1850
- assert_raise(ParseError){C::Char.parse('1);} void f() {(int')}
1851
- assert_raise(ParseError){C::Char.parse('1); (int')}
1852
- assert_raise(ParseError){C::Char.parse('void')}
1853
- end
1854
-
1855
- def test_bool
1856
- check C::Bool, <<EOS
1857
- const _Bool
1858
- ----
1859
- Bool (const)
1860
- EOS
1861
- assert_raise(ParseError){C::Bool.parse('1);} void f() {(int')}
1862
- assert_raise(ParseError){C::Bool.parse('1); (int')}
1863
- assert_raise(ParseError){C::Bool.parse('void')}
1864
- end
1865
-
1866
- def test_complex
1867
- check C::Complex, <<EOS
1868
- const _Complex float
1869
- ----
1870
- Complex (const)
1871
- EOS
1872
- assert_raise(ParseError){C::Complex.parse('1);} void f() {(int')}
1873
- assert_raise(ParseError){C::Complex.parse('1); (int')}
1874
- assert_raise(ParseError){C::Complex.parse('void')}
1875
- end
1876
-
1877
- def test_imaginary
1878
- check C::Imaginary, <<EOS
1879
- const _Imaginary float
1880
- ----
1881
- Imaginary (const)
1882
- EOS
1883
- assert_raise(ParseError){C::Imaginary.parse('1);} void f() {(int')}
1884
- assert_raise(ParseError){C::Imaginary.parse('1); (int')}
1885
- assert_raise(ParseError){C::Imaginary.parse('void')}
1886
- end
1887
-
1888
- def test_string_literal
1889
- check C::StringLiteral, <<EOS
1890
- "hello"
1891
- ----
1892
- StringLiteral
1893
- val: "hello"
1894
- EOS
1895
- assert_raise(ParseError){C::StringLiteral.parse('} void f() {')}
1896
- assert_raise(ParseError){C::StringLiteral.parse(';')}
1897
- assert_raise(ParseError){C::StringLiteral.parse('int i')}
1898
- assert_raise(ParseError){C::StringLiteral.parse('int')}
1899
- assert_raise(ParseError){C::StringLiteral.parse('if (0)')}
1900
- assert_raise(ParseError){C::StringLiteral.parse('switch (0)')}
1901
- assert_raise(ParseError){C::StringLiteral.parse('for (;;)')}
1902
- assert_raise(ParseError){C::StringLiteral.parse('goto')}
1903
- assert_raise(ParseError){C::StringLiteral.parse('return')}
1904
- end
1905
-
1906
- def test_char_literal
1907
- check C::CharLiteral, <<EOS
1908
- 'x'
1909
- ----
1910
- CharLiteral
1911
- val: "x"
1912
- EOS
1913
- assert_raise(ParseError){C::CharLiteral.parse('} void f() {')}
1914
- assert_raise(ParseError){C::CharLiteral.parse(';')}
1915
- assert_raise(ParseError){C::CharLiteral.parse('int i')}
1916
- assert_raise(ParseError){C::CharLiteral.parse('int')}
1917
- assert_raise(ParseError){C::CharLiteral.parse('if (0)')}
1918
- assert_raise(ParseError){C::CharLiteral.parse('switch (0)')}
1919
- assert_raise(ParseError){C::CharLiteral.parse('for (;;)')}
1920
- assert_raise(ParseError){C::CharLiteral.parse('goto')}
1921
- assert_raise(ParseError){C::CharLiteral.parse('return')}
1922
- end
1923
-
1924
- def test_compound_literal
1925
- check C::CompoundLiteral, <<EOS
1926
- (struct s){.x [0] = 10, .y = 20, 30}
1927
- ----
1928
- CompoundLiteral
1929
- type: Struct
1930
- name: "s"
1931
- member_inits:
1932
- - MemberInit
1933
- member:
1934
- - Member
1935
- name: "x"
1936
- - IntLiteral
1937
- val: 0
1938
- init: IntLiteral
1939
- val: 10
1940
- - MemberInit
1941
- member:
1942
- - Member
1943
- name: "y"
1944
- init: IntLiteral
1945
- val: 20
1946
- - MemberInit
1947
- init: IntLiteral
1948
- val: 30
1949
- EOS
1950
- assert_raise(ParseError){C::CompoundLiteral.parse('} void f() {')}
1951
- assert_raise(ParseError){C::CompoundLiteral.parse(';')}
1952
- assert_raise(ParseError){C::CompoundLiteral.parse('int i')}
1953
- assert_raise(ParseError){C::CompoundLiteral.parse('int')}
1954
- assert_raise(ParseError){C::CompoundLiteral.parse('if (0)')}
1955
- assert_raise(ParseError){C::CompoundLiteral.parse('switch (0)')}
1956
- assert_raise(ParseError){C::CompoundLiteral.parse('for (;;)')}
1957
- assert_raise(ParseError){C::CompoundLiteral.parse('goto')}
1958
- assert_raise(ParseError){C::CompoundLiteral.parse('return')}
1959
- end
1960
-
1961
- def test_int_literal
1962
- check C::IntLiteral, <<EOS
1963
- 1
1964
- ----
1965
- IntLiteral
1966
- val: 1
1967
- EOS
1968
- assert_raise(ParseError){C::IntLiteral.parse('} void f() {')}
1969
- assert_raise(ParseError){C::IntLiteral.parse(';')}
1970
- assert_raise(ParseError){C::IntLiteral.parse('int i')}
1971
- assert_raise(ParseError){C::IntLiteral.parse('int')}
1972
- assert_raise(ParseError){C::IntLiteral.parse('if (0)')}
1973
- assert_raise(ParseError){C::IntLiteral.parse('switch (0)')}
1974
- assert_raise(ParseError){C::IntLiteral.parse('for (;;)')}
1975
- assert_raise(ParseError){C::IntLiteral.parse('goto')}
1976
- assert_raise(ParseError){C::IntLiteral.parse('return')}
1977
- end
1978
-
1979
- def test_float_literal
1980
- check C::FloatLiteral, <<EOS
1981
- 1.0
1982
- ----
1983
- FloatLiteral
1984
- val: 1.0
1985
- EOS
1986
- assert_raise(ParseError){C::FloatLiteral.parse('} void f() {')}
1987
- assert_raise(ParseError){C::FloatLiteral.parse(';')}
1988
- assert_raise(ParseError){C::FloatLiteral.parse('int i')}
1989
- assert_raise(ParseError){C::FloatLiteral.parse('int')}
1990
- assert_raise(ParseError){C::FloatLiteral.parse('if (0)')}
1991
- assert_raise(ParseError){C::FloatLiteral.parse('switch (0)')}
1992
- assert_raise(ParseError){C::FloatLiteral.parse('for (;;)')}
1993
- assert_raise(ParseError){C::FloatLiteral.parse('goto')}
1994
- assert_raise(ParseError){C::FloatLiteral.parse('return')}
1995
- end
1996
-
1997
- def test_variable
1998
- check C::Variable, <<EOS
1999
- x
2000
- ----
2001
- Variable
2002
- name: "x"
2003
- EOS
2004
- assert_raise(ParseError){C::Variable.parse('} void f() {')}
2005
- assert_raise(ParseError){C::Variable.parse(';')}
2006
- assert_raise(ParseError){C::Variable.parse('int i')}
2007
- assert_raise(ParseError){C::Variable.parse('int')}
2008
- assert_raise(ParseError){C::Variable.parse('if (0)')}
2009
- assert_raise(ParseError){C::Variable.parse('switch (0)')}
2010
- assert_raise(ParseError){C::Variable.parse('for (;;)')}
2011
- assert_raise(ParseError){C::Variable.parse('goto')}
2012
- assert_raise(ParseError){C::Variable.parse('return')}
2013
- end
2014
- end