cast 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README ADDED
@@ -0,0 +1,6 @@
1
+ Installation: ruby install.rb
2
+ Uninstallation: ruby install.rb remove
3
+ Gem install: gem install cast
4
+ Documentation: See doc/index.html. Latest version at
5
+ http://cast.rubyforge.org.
6
+ Licence: Ruby's.
@@ -0,0 +1,2513 @@
1
+ <!-- Whoa, hand-written HTML? How 1995! -->
2
+ <html>
3
+ <head>
4
+ <title>CAST -- Ruby's C parsing dog. Woof.</title>
5
+ </head>
6
+ <body>
7
+ <style>
8
+ body {
9
+ }
10
+ ul {
11
+ line-height: 1.5em;
12
+ list-style-type: square;
13
+ margin: 0.3em 0 0 1.5em;
14
+ padding:0;
15
+ list-style-image: url("bullet.gif");
16
+ }
17
+ li { margin-bottom: 0.1em; }
18
+ li.node_classes {
19
+ color: #447744;
20
+ }
21
+ span.node_classes_abstract {
22
+ color: #447744;
23
+ font-weight: bolder;
24
+ }
25
+ span.node_classes_concrete {
26
+ color: #447744;
27
+ }
28
+ tt {
29
+ }
30
+ h1 {
31
+ color: #447744;
32
+ text-align: center;
33
+ }
34
+ h2 {
35
+ color: #447744;
36
+ border-bottom-style: solid;
37
+ border-bottom-width: 1;
38
+ border-bottom-color: #447744;
39
+ }
40
+ h3 {
41
+ color: #447744;
42
+ }
43
+ pre.code_snippet {
44
+ border-style: solid;
45
+ border-color: #000000;
46
+ border-width: 2;
47
+ padding: 4;
48
+ background-color: #ffffcc;
49
+ }
50
+ span.code_comment {
51
+ color: #447744;
52
+ font-style: oblique;
53
+ }
54
+ span.code_highlight {
55
+ color: #ff0000;
56
+ }
57
+ div.node_classes {
58
+ border-style: solid;
59
+ border-color: #000000;
60
+ border-width: 2;
61
+ background-color: #ffffcc;
62
+ color: #447744;
63
+ }
64
+ table.node_desc {
65
+ border-style: solid;
66
+ border-color: #000000;
67
+ border-width: 2;
68
+ }
69
+ thead {
70
+ font-weight: bolder;
71
+ }
72
+ tr.node_desc_header {
73
+ }
74
+ tr.node_desc_oddrow {
75
+ background-color: #ddffdd;
76
+ }
77
+ tr.node_desc_evenrow {
78
+ background-color: #ffffcc;
79
+ }
80
+ a.links {
81
+ color: #885500;
82
+ }
83
+ td.links {
84
+ padding: 5;
85
+ background-color: #bbddff;
86
+ vertical-align: top;
87
+ border-right-style: solid;
88
+ border-color: #000000;
89
+ border-width: 5;
90
+ color: #ffffff;
91
+ }
92
+ td.nd_class {
93
+ vertical-align: center;
94
+ }
95
+ td.nd_field {
96
+ vertical-align: top;
97
+ }
98
+ td.nd_child {
99
+ vertical-align: top;
100
+ text-align: center;
101
+ }
102
+ td.nd_values {
103
+ vertical-align: top;
104
+ }
105
+ td.nd_default {
106
+ vertical-align: top;
107
+ }
108
+ td.nd_comments {
109
+ vertical-align: top;
110
+ }
111
+ </style>
112
+
113
+ <table><tr><td class="links"> <!-- frame table -->
114
+
115
+ <ul>
116
+ <li><a class="links" href="http://rubyforge.org/projects/cast/">RubyForge</a></li>
117
+ <li><a class="links" href="http://rubyforge.org/frs/?group_id=561">Download</a></li>
118
+ </ul>
119
+
120
+ </td><td> <!-- frame table -->
121
+
122
+ <h1>CAST</h1>
123
+
124
+ <h2>What Is</h2>
125
+ <p>
126
+ CAST parses C code into an abstract syntax tree (AST), lets you
127
+ break it, then vomit it out as code. The parser does C99.
128
+ </p>
129
+
130
+ <h2>Library Overview</h2>
131
+
132
+ <p>Everything is in the module <tt>C</tt>.</p>
133
+ <ul>
134
+ <li>There's the parser (<tt>Parser</tt>).</li>
135
+ <li>There's the tree (<tt>Node</tt> and its subclasses).</li>
136
+ <li>That's it.</li>
137
+ </ul>
138
+
139
+ <h3>Usage</h3>
140
+
141
+ <p>
142
+ You call <tt>Parser#parse</tt>, and it gives you a tree of
143
+ <tt>Node</tt> objects. Watch:
144
+ </p>
145
+
146
+ <pre class="code_snippet">
147
+ require 'cast/cast'
148
+
149
+ <span class="code_comment">## create a parser</span>
150
+ parser = C::Parser.new
151
+
152
+ <span class="code_comment">## (optional) set some settings...</span>
153
+ parser.pos.filename = "toy.c" <span class="code_comment"># used for error messages</span>
154
+ parser.type_names << 'LinkedList' <span class="code_comment"># treat these words as types</span>
155
+
156
+ <span class="code_comment">## gimme a tree</span>
157
+ ugly_c_code = open("toy.c"){|f| f.read}
158
+ tree = parser.parse(ugly_c_code)
159
+
160
+ <span class="code_comment">## what's the tree look like?</span>
161
+ puts tree.to_debug
162
+ </pre>
163
+
164
+ <p>
165
+ If there's a parse error, <tt>#parse</tt> raises a
166
+ <tt>ParseError</tt> (which has a nice error message in
167
+ <tt>#message</tt>).
168
+ </p>
169
+
170
+ <a name="the_parser"></a><h2>The Parser</h2>
171
+
172
+ <p>
173
+ Here's a quiz: what does "<tt>a * b;</tt>" do?
174
+ </p>
175
+ <p>
176
+ I bet you said "why you l4m3r n00b, that's a statement that
177
+ multiplies <tt>a</tt> by <tt>b</tt> and throws away the answer --
178
+ now go take your meaningless snippetage to your computing 101 class
179
+ and let me finish hurting this Java<sup>TM</sup> programmer." Well,
180
+ you'd be both mean and wrong. It was, of course, a trick question.
181
+ I didn't say if any of <tt>a</tt> and <tt>b</tt> are types! If only
182
+ <tt>a</tt> is a type, it's actually a declaration. And if
183
+ <tt>b</tt> is a type, it's a syntax error.
184
+ </p>
185
+ <p>
186
+ So, the parser's gonna need to know which identifiers are type
187
+ names. This is one of the bits of state that a <tt>Parser</tt>
188
+ keeps. Here's the complete list (um, of two):
189
+ </p>
190
+ <ul>
191
+ <li>
192
+ <tt>#type_names</tt> -- a <tt>Set</tt> of <tt>String</tt>s.
193
+ </li>
194
+ <li>
195
+ <tt>#pos</tt> -- the <tt>Node::Pos</tt> this parser will start
196
+ parsing at.
197
+ </li>
198
+ </ul>
199
+
200
+ <p>
201
+ A <tt>Node::Pos</tt> has three read-write atts: <tt>#filename</tt>,
202
+ <tt>#line_num</tt>, <tt>#col_num</tt>. Default is <tt>nil</tt>, 1,
203
+ 0.
204
+ </p>
205
+
206
+ <a name="the_nodes"></a><h2>The Nodes</h2>
207
+
208
+ <p>There are a couple of Node classes:</p>
209
+
210
+ <div class="node_classes"><table><tr>
211
+ <td>
212
+ <ul>
213
+ <li class="node_classes"><span class="node_classes_abstract">Node</span><ul>
214
+ <li class="node_classes"><span class="node_classes_concrete">TranslationUnit</span></li>
215
+ <li class="node_classes"><span class="node_classes_concrete">Declaration</span></li>
216
+ <li class="node_classes"><span class="node_classes_concrete">Declarator</span></li>
217
+ <li class="node_classes"><span class="node_classes_concrete">FunctionDef</span></li>
218
+ <li class="node_classes"><span class="node_classes_concrete">Parameter</span></li>
219
+ <li class="node_classes"><span class="node_classes_concrete">Enumerator</span></li>
220
+ <li class="node_classes"><span class="node_classes_concrete">MemberInit</span></li>
221
+ <li class="node_classes"><span class="node_classes_concrete">Member</span></li>
222
+ <li class="node_classes"><span class="node_classes_abstract">Statement</span><ul>
223
+ <li class="node_classes"><span class="node_classes_concrete">Block</span></li>
224
+ <li class="node_classes"><span class="node_classes_concrete">If</span></li>
225
+ <li class="node_classes"><span class="node_classes_concrete">Switch</span></li>
226
+ <li class="node_classes"><span class="node_classes_concrete">While</span></li>
227
+ <li class="node_classes"><span class="node_classes_concrete">For</span></li>
228
+ <li class="node_classes"><span class="node_classes_concrete">Goto</span></li>
229
+ <li class="node_classes"><span class="node_classes_concrete">Continue</span></li>
230
+ <li class="node_classes"><span class="node_classes_concrete">Break</span></li>
231
+ <li class="node_classes"><span class="node_classes_concrete">Return</span></li>
232
+ <li class="node_classes"><span class="node_classes_concrete">ExpressionStatement</span></li>
233
+ </ul></li>
234
+ <li class="node_classes"><span class="node_classes_abstract">Label</span><ul>
235
+ <li class="node_classes"><span class="node_classes_concrete">PlainLabel</span></li>
236
+ <li class="node_classes"><span class="node_classes_concrete">Default</span></li>
237
+ <li class="node_classes"><span class="node_classes_concrete">Case</span></li>
238
+ </ul></li>
239
+ </ul></li>
240
+ </ul>
241
+ </td><td>
242
+ <ul>
243
+ <li class="node_classes"><span class="node_classes_abstract">Node</span><ul>
244
+ <li class="node_classes"><span class="node_classes_abstract">Expression</span><ul>
245
+ <li class="node_classes"><span class="node_classes_concrete">Comma</span></li>
246
+ <li class="node_classes"><span class="node_classes_concrete">Conditional</span></li>
247
+ <li class="node_classes"><span class="node_classes_concrete">Variable</span></li>
248
+ <li class="node_classes"><span class="node_classes_abstract">UnaryExpression</span><ul>
249
+ <li class="node_classes"><span class="node_classes_abstract">PostfixExpression</span><ul>
250
+ <li class="node_classes"><span class="node_classes_concrete">Index</span></li>
251
+ <li class="node_classes"><span class="node_classes_concrete">Call</span></li>
252
+ <li class="node_classes"><span class="node_classes_concrete">Dot</span></li>
253
+ <li class="node_classes"><span class="node_classes_concrete">Arrow</span></li>
254
+ <li class="node_classes"><span class="node_classes_concrete">PostInc</span></li>
255
+ <li class="node_classes"><span class="node_classes_concrete">PostDec</span></li>
256
+ </ul></li>
257
+ <li class="node_classes"><span class="node_classes_abstract">PrefixExpression</span><ul>
258
+ <li class="node_classes"><span class="node_classes_concrete">Cast</span></li>
259
+ <li class="node_classes"><span class="node_classes_concrete">Address</span></li>
260
+ <li class="node_classes"><span class="node_classes_concrete">Dereference</span></li>
261
+ <li class="node_classes"><span class="node_classes_concrete">Sizeof</span></li>
262
+ <li class="node_classes"><span class="node_classes_concrete">Plus</span></li>
263
+ <li class="node_classes"><span class="node_classes_concrete">Minus</span></li>
264
+ <li class="node_classes"><span class="node_classes_concrete">PreInc</span></li>
265
+ <li class="node_classes"><span class="node_classes_concrete">PreDec</span></li>
266
+ <li class="node_classes"><span class="node_classes_concrete">BitNot</span></li>
267
+ <li class="node_classes"><span class="node_classes_concrete">Not</span></li>
268
+ </ul></li>
269
+ </ul></li>
270
+ </ul></li>
271
+ </ul></li>
272
+ </ul>
273
+ </td><td>
274
+ <ul>
275
+ <li class="node_classes"><span class="node_classes_abstract">Node</span><ul>
276
+ <li class="node_classes"><span class="node_classes_abstract">Expression</span><ul>
277
+ <li class="node_classes"><span class="node_classes_abstract">BinaryExpression</span><ul>
278
+ <li class="node_classes"><span class="node_classes_concrete">Add</span></li>
279
+ <li class="node_classes"><span class="node_classes_concrete">Subtract</span></li>
280
+ <li class="node_classes"><span class="node_classes_concrete">Multiply</span></li>
281
+ <li class="node_classes"><span class="node_classes_concrete">Divide</span></li>
282
+ <li class="node_classes"><span class="node_classes_concrete">Mod</span></li>
283
+ <li class="node_classes"><span class="node_classes_concrete">Equal</span></li>
284
+ <li class="node_classes"><span class="node_classes_concrete">NotEqual</span></li>
285
+ <li class="node_classes"><span class="node_classes_concrete">Less</span></li>
286
+ <li class="node_classes"><span class="node_classes_concrete">More</span></li>
287
+ <li class="node_classes"><span class="node_classes_concrete">LessOrEqual</span></li>
288
+ <li class="node_classes"><span class="node_classes_concrete">MoreOrEqual</span></li>
289
+ <li class="node_classes"><span class="node_classes_concrete">BitAnd</span></li>
290
+ <li class="node_classes"><span class="node_classes_concrete">BitOr</span></li>
291
+ <li class="node_classes"><span class="node_classes_concrete">BitXor</span></li>
292
+ <li class="node_classes"><span class="node_classes_concrete">ShiftLeft</span></li>
293
+ <li class="node_classes"><span class="node_classes_concrete">ShiftRight</span></li>
294
+ <li class="node_classes"><span class="node_classes_concrete">And</span></li>
295
+ <li class="node_classes"><span class="node_classes_concrete">Or</span></li>
296
+ </ul></li>
297
+ </ul></li>
298
+ </ul></li>
299
+ </ul>
300
+ </td><td>
301
+ <ul>
302
+ <li class="node_classes"><span class="node_classes_abstract">Node</span><ul>
303
+ <li class="node_classes"><span class="node_classes_abstract">Expression</span><ul>
304
+ <li class="node_classes"><span class="node_classes_abstract">AssignmentExpression</span><ul>
305
+ <li class="node_classes"><span class="node_classes_concrete">Assign</span></li>
306
+ <li class="node_classes"><span class="node_classes_concrete">MultiplyAssign</span></li>
307
+ <li class="node_classes"><span class="node_classes_concrete">DivideAssign</span></li>
308
+ <li class="node_classes"><span class="node_classes_concrete">ModAssign</span></li>
309
+ <li class="node_classes"><span class="node_classes_concrete">AddAssign</span></li>
310
+ <li class="node_classes"><span class="node_classes_concrete">SubtractAssign</span></li>
311
+ <li class="node_classes"><span class="node_classes_concrete">ShiftLeftAssign</span></li>
312
+ <li class="node_classes"><span class="node_classes_concrete">ShiftRightAssign</span></li>
313
+ <li class="node_classes"><span class="node_classes_concrete">BitAndAssign</span></li>
314
+ <li class="node_classes"><span class="node_classes_concrete">BitXorAssign</span></li>
315
+ <li class="node_classes"><span class="node_classes_concrete">BitOrAssign</span></li>
316
+ </ul></li>
317
+ <li class="node_classes"><span class="node_classes_abstract">Literal</span><ul>
318
+ <li class="node_classes"><span class="node_classes_concrete">StringLiteral</span></li>
319
+ <li class="node_classes"><span class="node_classes_concrete">CharLiteral</span></li>
320
+ <li class="node_classes"><span class="node_classes_concrete">CompoundLiteral</span></li>
321
+ <li class="node_classes"><span class="node_classes_concrete">IntLiteral</span></li>
322
+ <li class="node_classes"><span class="node_classes_concrete">FloatLiteral</span></li>
323
+ </ul></li>
324
+ </ul></li>
325
+ </ul></li>
326
+ </ul>
327
+ </td><td>
328
+ <ul>
329
+ <li class="node_classes"><span class="node_classes_abstract">Node</span><ul>
330
+ <li class="node_classes"><span class="node_classes_abstract">Type</span><ul>
331
+ <li class="node_classes"><span class="node_classes_abstract">IndirectType</span><ul>
332
+ <li class="node_classes"><span class="node_classes_concrete">Pointer</span></li>
333
+ <li class="node_classes"><span class="node_classes_concrete">Array</span></li>
334
+ <li class="node_classes"><span class="node_classes_concrete">Function</span></li>
335
+ </ul></li>
336
+ <li class="node_classes"><span class="node_classes_abstract">DirectType</span><ul>
337
+ <li class="node_classes"><span class="node_classes_concrete">Struct</span></li>
338
+ <li class="node_classes"><span class="node_classes_concrete">Union</span></li>
339
+ <li class="node_classes"><span class="node_classes_concrete">Enum</span></li>
340
+ <li class="node_classes"><span class="node_classes_concrete">CustomType</span></li>
341
+ <li class="node_classes"><span class="node_classes_abstract">PrimitiveType</span><ul>
342
+ <li class="node_classes"><span class="node_classes_concrete">Void</span></li>
343
+ <li class="node_classes"><span class="node_classes_concrete">Int</span></li>
344
+ <li class="node_classes"><span class="node_classes_concrete">Float</span></li>
345
+ <li class="node_classes"><span class="node_classes_concrete">Char</span></li>
346
+ <li class="node_classes"><span class="node_classes_concrete">Bool</span></li>
347
+ <li class="node_classes"><span class="node_classes_concrete">Complex</span></li>
348
+ <li class="node_classes"><span class="node_classes_concrete">Imaginary</span></li>
349
+ </ul></li>
350
+ </ul></li>
351
+ </ul></li>
352
+ <li class="node_classes"><span class="node_classes_abstract">NodeList</span><ul>
353
+ <li class="node_classes"><span class="node_classes_concrete">NodeArray</span></li>
354
+ <li class="node_classes"><span class="node_classes_concrete">NodeChain</span></li>
355
+ </ul></li>
356
+ </ul></li>
357
+ </ul>
358
+ </td></tr>
359
+ </table></div>
360
+
361
+ <p>
362
+ The <b>bold</b> ones are abstract.
363
+ </p>
364
+ <p>
365
+ The last 2 (the <tt>NodeList</tt>s) represent lists of nodes.
366
+ Methodwise, they try to behave like normal ruby <tt>::Array</tt>s.
367
+ Implementationwise, a <tt>NodeChain</tt> is a doubly linked list,
368
+ whereas a <tt>NodeArray</tt> is an array. <tt>NodeChain</tt>s may
369
+ be more efficient when adding things at the beginning of a LARGE
370
+ list.
371
+ </p>
372
+
373
+ <h3>Attributes</h3>
374
+
375
+ <p>Each <tt>Node</tt> object has:</p>
376
+
377
+ <ul>
378
+ <li>
379
+ <tt>#parent</tt> -- return the parent in the tree (a <tt>Node</tt>
380
+ or <tt>nil</tt>).
381
+ </li>
382
+ <li>
383
+ <tt>#pos</tt>, <tt>#pos=</tt> -- the position in the source file
384
+ (a <tt>Node::Pos</tt>).
385
+ </li>
386
+ <li>
387
+ <tt>#to_s</tt> -- return the code for the tree (a
388
+ <tt>String</tt>).
389
+ </li>
390
+ <li>
391
+ <tt>#to_debug</tt> -- return a pretty string for inspection.
392
+ <b>Try it</b>.
393
+ </li>
394
+ <li>
395
+ <tt>#match?(str)</tt>, <tt>#=~(str)</tt> -- return true iff
396
+ <tt>str</tt> parses as a <tt>Node</tt> equal to this one.
397
+ </li>
398
+ <li>
399
+ <tt>#detach</tt> -- remove this node from the tree (parent becomes
400
+ nil) and return it.
401
+ </li>
402
+ <li>
403
+ <tt>#detached?</tt>, <tt>#attached?</tt> -- return true if parent
404
+ is nil or non-nil respectively.
405
+ </li>
406
+ <li>
407
+ <tt>#replace_with(node)</tt> -- replace this node with
408
+ <tt>node</tt> in the tree.
409
+ </li>
410
+ <li>
411
+ <tt>#swap_with(node)</tt> -- exchange this node with <tt>node</tt>
412
+ in their trees.
413
+ </li>
414
+ <li>
415
+ <tt>#insert_prev(*<tt>nodes</tt>)</tt>,
416
+ <tt>#insert_next(*nodes)</tt> -- insert <tt>nodes</tt> before this
417
+ node in the parent list. Parent must be a <tt>NodeList</tt>!
418
+ Useful for adding statements before a node in a block, for
419
+ example.
420
+ </li>
421
+ <li>
422
+ <tt>#<i>Foo</i>?</tt> -- (where <tt><i>Foo</i></tt> is a module
423
+ name) return <tt>self.is_a?(<em>Foo</em>)</tt>.
424
+ </li>
425
+ </ul>
426
+
427
+ <!--<p>
428
+ Now the <tt>Foo?</tt> method above probably gave all the duck typing
429
+ purists heart attacks, so I should prepare my defence. CAST pays
430
+ close attention to the classes of <tt>Node</tt>s. That means if you
431
+ dress up a <tt>Thingy</tt> as a <tt>FunctionDef</tt> and smuggle it
432
+ into the tree, don't expect the pacemaker you're using this for to
433
+ function correctly. Basic methods like <tt>Node#==</tt> check that
434
+ the classes match.
435
+ </p>-->
436
+
437
+ <p>
438
+ The <tt>#<i>Foo</i>?</tt> method is a convienience for a common
439
+ need. Example:
440
+ </p>
441
+ <pre class="code_snippet">
442
+ <span class="code_comment">## make a tree</span>
443
+ ast = C::Parser.new.parse(code_string)
444
+
445
+ <span class="code_comment">## print all global variables</span>
446
+ ast.entities.each do |node|
447
+ node.<span class="code_highlight">Declaration?</span> or next
448
+ node.declarators.each do |decl|
449
+ unless decl.type.<span class="code_highlight">Function?</span>
450
+ puts "#{decl.name}: #{decl.type}"
451
+ end
452
+ end
453
+ end
454
+ </pre>
455
+
456
+ <p>
457
+ If you're a duck-typing purist, then sorry for the cardiac arrest
458
+ you're now experiencing. CAST <b>does</b> pay attention to the
459
+ class of <tt>Node</tt> objects for quite a few things. This is the
460
+ cleanest way to distinguish, e.g., an <tt>Add</tt> from a
461
+ <tt>Subtract</tt> (which both have the same methods but represent
462
+ very different things). It just seems impractical (and unnecessary)
463
+ to allow duck typing in this situation.
464
+ </p>
465
+
466
+ <p>
467
+ The <tt>#=~</tt> method lets you do:
468
+ </p>
469
+
470
+ <pre class="code_snippet">
471
+ if declarator.type <span class="code_highlight">=~</span> 'const int *'
472
+ puts "Ooh, a const int pointer!"
473
+ end
474
+ </pre>
475
+
476
+ <p>
477
+ This is <b>not</b> the same as "<tt>declarator.type.to_s == 'const
478
+ int *'</tt>"; that'd require you to guess how to_s formats its
479
+ strings (most notably, the whitespace).
480
+ </p>
481
+
482
+ <h3>Fields and children</h3>
483
+
484
+ <p>
485
+ Each concrete <tt>Node</tt> class has a member for each bit of
486
+ important C stuff it pertains to. I know you peeked at the big list
487
+ below, so you know the kind of thing I mean.
488
+ </p>
489
+
490
+ <p>
491
+ But these aren't defined as <tt>attr</tt>s as you normally do in
492
+ Ruby -- they're <strong>field</strong>s. If a node has a field
493
+ <tt>foo</tt>, it means there's a setter <tt>#foo=</tt> and getter
494
+ <tt>#foo</tt>. (A field <tt>foo?</tt> means the setter is
495
+ <tt>#foo=</tt> and the getter is <tt>#foo?</tt>.) Some fields are
496
+ even more special: <strong>child</strong> fields. These form the
497
+ tree structure, and always have a <tt>Node</tt> or <tt>nil</tt>
498
+ value.
499
+ </p>
500
+
501
+ <p>
502
+ Why divulge these bizarre internal secrets? Because these
503
+ <tt>Node</tt> methods are defined in terms of fields and children:
504
+ </p>
505
+ <ul>
506
+ <li>
507
+ <tt>#==</tt>, <tt>#eql?</tt> -- Equality is checked recursively.
508
+ That is, all fields (including children) must be equal.
509
+ </li>
510
+ <li>
511
+ <tt>#dup</tt>, <tt>#clone</tt> -- Children are copied recursively
512
+ (other fields and attrs as normal).
513
+ </li>
514
+ </ul>
515
+
516
+ <p>
517
+ Then there's the tree-twiddling methods, which only ever
518
+ yield/return/affect (non-nil) children.
519
+ </p>
520
+ <ul>
521
+ <li>
522
+ <tt>#next, #prev </tt> -- return the next/prev sibling.
523
+ </li>
524
+ <li>
525
+ <tt>#list_next</tt>, <tt>#list_prev </tt> -- like
526
+ <tt>#next</tt>/<tt>#prev</tt>, but also requires the parent to be
527
+ <tt>NodeList</tt>. I'll be honest; I don't remember why I added
528
+ these methods. They may well suddenly disappear.
529
+ </li>
530
+ <li>
531
+ <tt>#each</tt>, <tt>#reverse_each</tt> -- Yield all (non-nil)
532
+ children. Node includes <tt>Enumerable</tt>, so you get the free
533
+ chocolates too.
534
+ </li>
535
+ <li>
536
+ <tt>#depth_first</tt>, <tt>#reverse_depth_first </tt> -- Walk the
537
+ tree in that order, yielding two args (<tt>event, node</tt>) at
538
+ each node. <tt>event</tt> is <tt>:down</tt> on the way down,
539
+ <tt>:up</tt> on the way up. If the block <tt>throw</tt>s
540
+ <tt>:prune</tt>, it won't descend any further.
541
+ </li>
542
+ <li>
543
+ <tt>#preorder</tt>, <tt>#reverse_preorder</tt>,
544
+ <tt>#postorder</tt>, <tt>#reverse_postorder</tt> -- Walk the tree
545
+ depth first, yielding nodes in the given order. For the
546
+ preorders, if the block throws <tt>:prune</tt>, it won't descend
547
+ any further.
548
+ </li>
549
+ <li>
550
+ <tt>#node_after(child)</tt>, <tt>#node_before(child) </tt> --
551
+ return the node before/after <tt>child</tt> (same as
552
+ <tt>child.next</tt>).
553
+ </li>
554
+ <li>
555
+ <tt>#remove_node(child)</tt> -- remove <tt>child</tt> from this
556
+ node (same as <tt>child.detach</tt>).
557
+ </li>
558
+ <li>
559
+ <tt>#replace_node(child, new_child) </tt> -- replace
560
+ <tt>child</tt> with yeah you guessed it (same as
561
+ <tt>child.replace_with(newchild)</tt>).
562
+ </li>
563
+ </ul>
564
+
565
+ <p>
566
+ If you're walking the tree looking for nodes to move around, don't
567
+ forget that modifying the tree during traversal is a criminal
568
+ offence.
569
+ </p>
570
+
571
+ <p>
572
+ And now, the episode you've been waiting for: THE FIELD LIST! (Cue
573
+ music and dim lights.)
574
+ </p>
575
+
576
+ <p>Notes about the table:
577
+ <ul>
578
+ <li>
579
+ If no default is listed, it is <tt>false</tt> if the field name
580
+ ends in a '?', <tt>nil</tt> otherwise.
581
+ </li>
582
+ <li>
583
+ <tt>nil</tt> is <b>always</b> allowed for a child field.
584
+ </li>
585
+ <li>
586
+ There are some conventions we follow religiously to help you:
587
+ <ul>
588
+ <li>
589
+ Field names that end in '?' are <b>always</b> true-or-false.
590
+ </li>
591
+ <li>
592
+ <tt>NodeList</tt>-valued fields <b>always</b> default to an
593
+ empty <tt>NodeArray</tt> or <tt>NodeChain</tt>, so you can
594
+ tack things on there with <tt>&lt;&lt;</tt>, without worrying
595
+ about needing to create the list first.
596
+ </li>
597
+ <li>
598
+ A field is <tt>Node</tt>-valued <b>if and only if</b> it is
599
+ a child field.
600
+ </li>
601
+ <li>
602
+ The rows go yellow, green, yellow, green, ... .
603
+ </li>
604
+ </ul>
605
+ </li>
606
+ </ul>
607
+ </p>
608
+
609
+ <table class="node_desc">
610
+ <thead><tr>
611
+ </tr></thead>
612
+
613
+ <thead><tr class="node_desc_header">
614
+ <td align="center">Class</td>
615
+ <td align="center">Field</td>
616
+ <td align="center">Child?</td>
617
+ <td align="center">Type or possible values</td>
618
+ <td align="center">Default</td>
619
+ <td align="center">Comments</td>
620
+ </tr></thead>
621
+
622
+ <tbody>
623
+ <tr class="node_desc_evenrow">
624
+ <td class="nd_class" rowspan="1"><tt>TranslationUnit</tt></td>
625
+ <td class="nd_field"><tt>entities</tt></td>
626
+ <td class="nd_child">Y</td>
627
+ <td class="nd_values"><tt>NodeList</tt></td>
628
+ <td class="nd_default"><tt>NodeChain[]</tt></td>
629
+ <td class="nd_comments" rowspan="1">
630
+ He lives at the root of a parsed file.
631
+ </td>
632
+ </tr>
633
+
634
+ <tr class="node_desc_oddrow">
635
+ <td class="nd_class" rowspan="4"><tt>Declaration</tt></td>
636
+ <td class="nd_field"><tt>storage</tt></td>
637
+ <td class="nd_child"></td>
638
+ <td class="nd_values"><tt>:typedef</tt>, <tt>:extern</tt>, <tt>:static</tt>, <tt>:auto</tt>, <tt>:register</tt></td>
639
+ <td class="nd_default"></td>
640
+ <td class="nd_comments" rowspan="4">
641
+ There are also methods to query the storage more humanely:
642
+ <ul>
643
+ <li><tt>#typedef? </tt> -- true iff <tt>storage == :typedef </tt></li>
644
+ <li><tt>#extern? </tt> -- true iff <tt>storage == :extern </tt></li>
645
+ <li><tt>#static? </tt> -- true iff <tt>storage == :static </tt></li>
646
+ <li><tt>#auto? </tt> -- true iff <tt>storage == :auto </tt></li>
647
+ <li><tt>#register?</tt> -- true iff <tt>storage == :register</tt></li>
648
+ </ul>
649
+ </td>
650
+ </tr>
651
+ <tr class="node_desc_oddrow">
652
+ <td class="nd_field"><tt>type</tt></td>
653
+ <td class="nd_child">Y</td>
654
+ <td class="nd_values"><tt>DirectType</tt></td>
655
+ <td class="nd_default"></td>
656
+ </tr>
657
+ <tr class="node_desc_oddrow">
658
+ <td class="nd_field"><tt>declarators</tt></td>
659
+ <td class="nd_child">Y</td>
660
+ <td class="nd_values"><tt>NodeList</tt></td>
661
+ <td class="nd_default"><tt>NodeArray[]</tt></td>
662
+ </tr>
663
+ <tr class="node_desc_oddrow">
664
+ <td class="nd_field"><tt>inline?</tt></td>
665
+ <td class="nd_child"></td>
666
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
667
+ <td class="nd_default"></td>
668
+ </tr>
669
+
670
+ <tr class="node_desc_evenrow">
671
+ <td class="nd_class" rowspan="4"><tt>Declarator</tt></td>
672
+ <td class="nd_field"><tt>indirect_type</tt></td>
673
+ <td class="nd_child">Y</td>
674
+ <td class="nd_values"><tt>IndirectType</tt></td>
675
+ <td class="nd_default"></td>
676
+ <td class="nd_comments" rowspan="4">
677
+ What on earth is a "declarator", you ask? Consider "<tt>int i,
678
+ *ip;</tt>". This is a <tt>Declaration</tt> with two
679
+ <tt>Declarator</tt>s:
680
+ <pre>
681
+ Declaration
682
+ type: Int
683
+ declarators:
684
+ - Declarator
685
+ name: "i"
686
+ - Declarator
687
+ indirect_type: Pointer
688
+ name: "ip"
689
+ </pre>
690
+ The <tt>indirect_type</tt> of the <tt>ip</tt>
691
+ <tt>Declarator</tt> is a <tt>Pointer</tt> to <tt>nil</tt>.
692
+ "'Pointer to nil' my foot -- I want the type of the stupid
693
+ variable!" Here:
694
+ <ul>
695
+ <li>
696
+ <tt>#type</tt> -- return the type, the whole type, and
697
+ nothing but the type. This is a clone; modifying it won't
698
+ modify the tree.
699
+ </li>
700
+ </ul>
701
+ So calling <tt>#type</tt> on the <tt>ip</tt> <tt>Declarator</tt>
702
+ gives:
703
+ <pre>
704
+ Pointer
705
+ type: Int
706
+ </pre>
707
+ </td>
708
+ </tr>
709
+ <tr class="node_desc_evenrow">
710
+ <td class="nd_field"><tt>name</tt></td>
711
+ <td class="nd_child"></td>
712
+ <td class="nd_values"><tt>String</tt></td>
713
+ <td class="nd_default"></td>
714
+ </tr>
715
+ <tr class="node_desc_evenrow">
716
+ <td class="nd_field"><tt>init</tt></td>
717
+ <td class="nd_child">Y</td>
718
+ <td class="nd_values"><tt>Expression</tt></td>
719
+ <td class="nd_default"></td>
720
+ </tr>
721
+ <tr class="node_desc_evenrow">
722
+ <td class="nd_field"><tt>num_bits</tt></td>
723
+ <td class="nd_child">Y</td>
724
+ <td class="nd_values"><tt>Integer</tt></td>
725
+ <td class="nd_default"></td>
726
+ </tr>
727
+
728
+ <tr class="node_desc_oddrow">
729
+ <td class="nd_class" rowspan="6"><tt>FunctionDef</tt></td>
730
+ <td class="nd_field"><tt>storage</tt></td>
731
+ <td class="nd_child"></td>
732
+ <td class="nd_values"><tt>:extern</tt>, <tt>:static</tt></td>
733
+ <td class="nd_default"></td>
734
+ <td class="nd_comments" rowspan="6">
735
+ Just like <tt>Declaration</tt>, there's also:
736
+ <ul>
737
+ <li><tt>#extern?</tt> -- return true iff <tt>storage == :extern</tt></li>
738
+ <li><tt>#static?</tt> -- return true iff <tt>storage == :static</tt></li>
739
+ </ul>
740
+ There's also a pseudo-field:
741
+ <ul>
742
+ <li><tt>#prototype?</tt> -- same as !no_prototype?</li>
743
+ <li><tt>#prototype=(val)</tt> -- same as no_prototype = !val</li>
744
+ </ul>
745
+ <tt>no_prototype?</tt> means that no prototype was given. That means parameter types weren't given in the parens, but in the "old-style" declaration list. Example:
746
+ <table cellpadding="5" width="100%">
747
+ <tr><td>
748
+ <pre>
749
+ int main(argc, argv)
750
+ int argc;
751
+ char **argv;
752
+ {
753
+ return 0;
754
+ }
755
+ </pre>
756
+ </td><td>
757
+ <pre>
758
+ int main(int argc, char **argv) {
759
+ return 0;
760
+ }
761
+ </pre>
762
+ </td></tr><tr><td>
763
+ <b>No prototype.</b>
764
+ </td><td>
765
+ <b>Prototype.</b>
766
+ </td></tr>
767
+ </table>
768
+ Everyone tells you to use prototypes. That's because no type
769
+ checking is done when calling a function declared without a
770
+ prototype.
771
+ </pre>
772
+ </td>
773
+ </tr>
774
+ <tr class="node_desc_oddrow">
775
+ <td class="nd_field"><tt>inline?</tt></td>
776
+ <td class="nd_child"></td>
777
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
778
+ <td class="nd_default"></td>
779
+ </tr>
780
+ <tr class="node_desc_oddrow">
781
+ <td class="nd_field"><tt>type</tt></td>
782
+ <td class="nd_child">Y</td>
783
+ <td class="nd_values"><tt>Type</tt></td>
784
+ <td class="nd_default"></td>
785
+ </tr>
786
+ <tr class="node_desc_oddrow">
787
+ <td class="nd_field"><tt>name</tt></td>
788
+ <td class="nd_child"></td>
789
+ <td class="nd_values"><tt>String</tt></td>
790
+ <td class="nd_default"></td>
791
+ </tr>
792
+ <tr class="node_desc_oddrow">
793
+ <td class="nd_field"><tt>def</tt></td>
794
+ <td class="nd_child">Y</td>
795
+ <td class="nd_values"><tt>Block</tt></td>
796
+ <td class="nd_default"><tt>Block.new</tt></td>
797
+ </tr>
798
+ <tr class="node_desc_oddrow">
799
+ <td class="nd_field"><tt>no_prototype?</tt></td>
800
+ <td class="nd_child"></td>
801
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
802
+ <td class="nd_default"></td>
803
+ </tr>
804
+
805
+ <tr class="node_desc_evenrow">
806
+ <td class="nd_class" rowspan="3"><tt>Parameter</tt></td>
807
+ <td class="nd_field"><tt>register?</tt></td>
808
+ <td class="nd_child"></td>
809
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
810
+ <td class="nd_default"></td>
811
+ <td class="nd_comments" rowspan="3">
812
+ Used in <tt>Function</tt>s.
813
+ </td>
814
+ </tr>
815
+ <tr class="node_desc_evenrow">
816
+ <td class="nd_field"><tt>type</tt></td>
817
+ <td class="nd_child">Y</td>
818
+ <td class="nd_values"><tt>Type</tt></td>
819
+ <td class="nd_default"></td>
820
+ </tr>
821
+ <tr class="node_desc_evenrow">
822
+ <td class="nd_field"><tt>name</tt></td>
823
+ <td class="nd_child"></td>
824
+ <td class="nd_values"><tt>String</tt></td>
825
+ <td class="nd_default"></td>
826
+ </tr>
827
+
828
+ <tr class="node_desc_oddrow">
829
+ <td class="nd_class" rowspan="2"><tt>Enumerator</tt></td>
830
+ <td class="nd_field"><tt>name</tt></td>
831
+ <td class="nd_child"></td>
832
+ <td class="nd_values"><tt>String</tt></td>
833
+ <td class="nd_default"></td>
834
+ <td class="nd_comments" rowspan="2">
835
+ Used in <tt>Enum</tt>s.
836
+ </td>
837
+ </tr>
838
+ <tr class="node_desc_oddrow">
839
+ <td class="nd_field"><tt>val</tt></td>
840
+ <td class="nd_child">Y</td>
841
+ <td class="nd_values"><tt>Expression</tt></td>
842
+ <td class="nd_default"></td>
843
+ </tr>
844
+
845
+ <tr class="node_desc_evenrow">
846
+ <td class="nd_class" rowspan="2"><tt>MemberInit</tt></td>
847
+ <td class="nd_field"><tt>member</tt></td>
848
+ <td class="nd_child">Y</td>
849
+ <td class="nd_values"><tt>NodeList</tt> of <tt>Member</tt>-or-<tt>Expression</tt></td>
850
+ <td class="nd_default"></td>
851
+ <td class="nd_comments" rowspan="2">
852
+ Used in <tt>CompoundLiteral</tt>s.
853
+ </td>
854
+ </tr>
855
+ <tr class="node_desc_evenrow">
856
+ <td class="nd_field"><tt>init</tt></td>
857
+ <td class="nd_child">Y</td>
858
+ <td class="nd_values"><tt>Expression</tt></td>
859
+ <td class="nd_default"></td>
860
+ </tr>
861
+
862
+ <tr class="node_desc_oddrow">
863
+ <td class="nd_class" rowspan="1"><tt>Member</tt></td>
864
+ <td class="nd_field"><tt>name</tt></td>
865
+ <td class="nd_child"></td>
866
+ <td class="nd_values"><tt>String</tt></td>
867
+ <td class="nd_default"></td>
868
+ <td class="nd_comments" rowspan="1">
869
+ Used in <tt>MemberInit</tt>s.
870
+ </td>
871
+ </tr>
872
+
873
+ <tr class="node_desc_evenrow">
874
+ <td class="nd_class" rowspan="2"><tt>Block</tt></td>
875
+ <td class="nd_field"><tt>labels</tt></td>
876
+ <td class="nd_child">Y</td>
877
+ <td class="nd_values"><tt>NodeList</tt> of <tt>Label</tt></td>
878
+ <td class="nd_default"><tt>NodeArray[]</tt></td>
879
+ <td class="nd_comments" rowspan="2">
880
+ </td>
881
+ </tr>
882
+ <tr class="node_desc_evenrow">
883
+ <td class="nd_field"><tt>stmts</tt></td>
884
+ <td class="nd_child">Y</td>
885
+ <td class="nd_values"><tt>NodeList</tt> of <tt>Statement</tt></td>
886
+ <td class="nd_default"><tt>NodeArray[]</tt></td>
887
+ </tr>
888
+
889
+ <tr class="node_desc_oddrow">
890
+ <td class="nd_class" rowspan="4"><tt>If</tt></td>
891
+ <td class="nd_field"><tt>labels</tt></td>
892
+ <td class="nd_child">Y</td>
893
+ <td class="nd_values"><tt>NodeList</tt> of <tt>Label</tt></td>
894
+ <td class="nd_default"><tt>NodeArray[]</tt></td>
895
+ <td class="nd_comments" rowspan="4">
896
+ </td>
897
+ </tr>
898
+ <tr class="node_desc_oddrow">
899
+ <td class="nd_field"><tt>cond</tt></td>
900
+ <td class="nd_child">Y</td>
901
+ <td class="nd_values"><tt>Expression</tt></td>
902
+ <td class="nd_default"></td>
903
+ </tr>
904
+ <tr class="node_desc_oddrow">
905
+ <td class="nd_field"><tt>then</tt></td>
906
+ <td class="nd_child">Y</td>
907
+ <td class="nd_values"><tt>Statement</tt></td>
908
+ <td class="nd_default"></td>
909
+ </tr>
910
+ <tr class="node_desc_oddrow">
911
+ <td class="nd_field"><tt>else</tt></td>
912
+ <td class="nd_child">Y</td>
913
+ <td class="nd_values"><tt>Statement</tt></td>
914
+ <td class="nd_default"></td>
915
+ </tr>
916
+
917
+ <tr class="node_desc_evenrow">
918
+ <td class="nd_class" rowspan="3"><tt>Switch</tt></td>
919
+ <td class="nd_field"><tt>labels</tt></td>
920
+ <td class="nd_child">Y</td>
921
+ <td class="nd_values"><tt>NodeList</tt> of <tt>Label</tt></td>
922
+ <td class="nd_default"><tt>NodeArray[]</tt></td>
923
+ <td class="nd_comments" rowspan="3">
924
+ </td>
925
+ </tr>
926
+ <tr class="node_desc_evenrow">
927
+ <td class="nd_field"><tt>cond</tt></td>
928
+ <td class="nd_child">Y</td>
929
+ <td class="nd_values"><tt>Expression</tt></td>
930
+ <td class="nd_default"></td>
931
+ </tr>
932
+ <tr class="node_desc_evenrow">
933
+ <td class="nd_field"><tt>stmt</tt></td>
934
+ <td class="nd_child">Y</td>
935
+ <td class="nd_values"><tt>Statement</tt></td>
936
+ <td class="nd_default"></td>
937
+ </tr>
938
+
939
+ <tr class="node_desc_oddrow">
940
+ <td class="nd_class" rowspan="4"><tt>While</tt></td>
941
+ <td class="nd_field"><tt>labels</tt></td>
942
+ <td class="nd_child">Y</td>
943
+ <td class="nd_values"><tt>NodeList</tt> of <tt>Label</tt></td>
944
+ <td class="nd_default"><tt>NodeArray[]</tt></td>
945
+ <td class="nd_comments" rowspan="4">
946
+ <tt>do?</tt> means it's a do-while loop.
947
+ </td>
948
+ </tr>
949
+ <tr class="node_desc_oddrow">
950
+ <td class="nd_field"><tt>do?</tt></td>
951
+ <td class="nd_child"></td>
952
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
953
+ <td class="nd_default"></td>
954
+ </tr>
955
+ <tr class="node_desc_oddrow">
956
+ <td class="nd_field"><tt>cond</tt></td>
957
+ <td class="nd_child">Y</td>
958
+ <td class="nd_values"><tt>Expression</tt></td>
959
+ <td class="nd_default"></td>
960
+ </tr>
961
+ <tr class="node_desc_oddrow">
962
+ <td class="nd_field"><tt>stmt</tt></td>
963
+ <td class="nd_child">Y</td>
964
+ <td class="nd_values"><tt>Statement</tt></td>
965
+ <td class="nd_default"></td>
966
+ </tr>
967
+
968
+ <tr class="node_desc_evenrow">
969
+ <td class="nd_class" rowspan="5"><tt>For</tt></td>
970
+ <td class="nd_field"><tt>labels</tt></td>
971
+ <td class="nd_child">Y</td>
972
+ <td class="nd_values"><tt>NodeList</tt> of <tt>Label</tt></td>
973
+ <td class="nd_default"><tt>NodeArray[]</tt></td>
974
+ <td class="nd_comments" rowspan="5">
975
+ </td>
976
+ </tr>
977
+ <tr class="node_desc_evenrow">
978
+ <td class="nd_field"><tt>init</tt></td>
979
+ <td class="nd_child">Y</td>
980
+ <td class="nd_values"><tt>Expression</tt> or <tt>Declaration</tt></td>
981
+ <td class="nd_default"></td>
982
+ </tr>
983
+ <tr class="node_desc_evenrow">
984
+ <td class="nd_field"><tt>cond</tt></td>
985
+ <td class="nd_child">Y</td>
986
+ <td class="nd_values"><tt>Expression</tt></td>
987
+ <td class="nd_default"></td>
988
+ </tr>
989
+ <tr class="node_desc_evenrow">
990
+ <td class="nd_field"><tt>iter</tt></td>
991
+ <td class="nd_child">Y</td>
992
+ <td class="nd_values"><tt>Expression</tt></td>
993
+ <td class="nd_default"></td>
994
+ </tr>
995
+ <tr class="node_desc_evenrow">
996
+ <td class="nd_field"><tt>stmt</tt></td>
997
+ <td class="nd_child">Y</td>
998
+ <td class="nd_values"><tt>Statement</tt></td>
999
+ <td class="nd_default"></td>
1000
+ </tr>
1001
+
1002
+ <tr class="node_desc_oddrow">
1003
+ <td class="nd_class" rowspan="2"><tt>Goto</tt></td>
1004
+ <td class="nd_field"><tt>labels</tt></td>
1005
+ <td class="nd_child">Y</td>
1006
+ <td class="nd_values"><tt>NodeList</tt> of <tt>Label</tt></td>
1007
+ <td class="nd_default"><tt>NodeArray[]</tt></td>
1008
+ <td class="nd_comments" rowspan="2">
1009
+ </td>
1010
+ </tr>
1011
+ <tr class="node_desc_oddrow">
1012
+ <td class="nd_field"><tt>target</tt></td>
1013
+ <td class="nd_child"></td>
1014
+ <td class="nd_values"><tt>String</tt></td>
1015
+ <td class="nd_default"></td>
1016
+ </tr>
1017
+
1018
+ <tr class="node_desc_evenrow">
1019
+ <td class="nd_class" rowspan="1"><tt>Continue</tt></td>
1020
+ <td class="nd_field"><tt>labels</tt></td>
1021
+ <td class="nd_child">Y</td>
1022
+ <td class="nd_values"><tt>NodeList</tt> of <tt>Label</tt></td>
1023
+ <td class="nd_default"><tt>NodeArray[]</tt></td>
1024
+ <td class="nd_comments" rowspan="1">
1025
+ </td>
1026
+ </tr>
1027
+
1028
+ <tr class="node_desc_oddrow">
1029
+ <td class="nd_class" rowspan="1"><tt>Break</tt></td>
1030
+ <td class="nd_field"><tt>labels</tt></td>
1031
+ <td class="nd_child">Y</td>
1032
+ <td class="nd_values"><tt>NodeList</tt> of <tt>Label</tt></td>
1033
+ <td class="nd_default"><tt>NodeArray[]</tt></td>
1034
+ <td class="nd_comments" rowspan="1">
1035
+ </td>
1036
+ </tr>
1037
+
1038
+ <tr class="node_desc_evenrow">
1039
+ <td class="nd_class" rowspan="2"><tt>Return</tt></td>
1040
+ <td class="nd_field"><tt>labels</tt></td>
1041
+ <td class="nd_child">Y</td>
1042
+ <td class="nd_values"><tt>NodeList</tt> of <tt>Label</tt></td>
1043
+ <td class="nd_default"><tt>NodeArray[]</tt></td>
1044
+ <td class="nd_comments" rowspan="2">
1045
+ </td>
1046
+ </tr>
1047
+ <tr class="node_desc_evenrow">
1048
+ <td class="nd_field"><tt>expr</tt></td>
1049
+ <td class="nd_child">Y</td>
1050
+ <td class="nd_values"><tt>Expression</tt></td>
1051
+ <td class="nd_default"></td>
1052
+ </tr>
1053
+
1054
+ <tr class="node_desc_oddrow">
1055
+ <td class="nd_class" rowspan="2"><tt>ExpressionStatement</tt></td>
1056
+ <td class="nd_field"><tt>labels</tt></td>
1057
+ <td class="nd_child">Y</td>
1058
+ <td class="nd_values"><tt>NodeList</tt> of <tt>Label</tt></td>
1059
+ <td class="nd_default"><tt>NodeArray[]</tt></td>
1060
+ <td class="nd_comments" rowspan="2">
1061
+ </td>
1062
+ </tr>
1063
+ <tr class="node_desc_oddrow">
1064
+ <td class="nd_field"><tt>expr</tt></td>
1065
+ <td class="nd_child">Y</td>
1066
+ <td class="nd_values"><tt>Expression</tt></td>
1067
+ <td class="nd_default"></td>
1068
+ </tr>
1069
+
1070
+ <tr class="node_desc_evenrow">
1071
+ <td class="nd_class" rowspan="1"><tt>PlainLabel</tt></td>
1072
+ <td class="nd_field"><tt>name</tt></td>
1073
+ <td class="nd_child"></td>
1074
+ <td class="nd_values"><tt>String</tt></td>
1075
+ <td class="nd_default"></td>
1076
+ <td class="nd_comments" rowspan="1">
1077
+ </td>
1078
+ </tr>
1079
+
1080
+ <tr class="node_desc_oddrow">
1081
+ <td class="nd_class" rowspan="1"><tt>Default</tt></td>
1082
+ <td class="nd_field"></td>
1083
+ <td class="nd_child"></td>
1084
+ <td class="nd_values"></td>
1085
+ <td class="nd_default"></td>
1086
+ <td class="nd_comments" rowspan="1">
1087
+ </td>
1088
+ </tr>
1089
+
1090
+ <tr class="node_desc_evenrow">
1091
+ <td class="nd_class" rowspan="1"><tt>Case</tt></td>
1092
+ <td class="nd_field"><tt>expr</tt></td>
1093
+ <td class="nd_child">Y</td>
1094
+ <td class="nd_values"><tt>Expression</tt></td>
1095
+ <td class="nd_default"></td>
1096
+ <td class="nd_comments" rowspan="1">
1097
+ </td>
1098
+ </tr>
1099
+
1100
+ <tr class="node_desc_oddrow">
1101
+ <td class="nd_class" rowspan="1"><tt>Comma</tt></td>
1102
+ <td class="nd_field"><tt>exprs</tt></td>
1103
+ <td class="nd_child">Y</td>
1104
+ <td class="nd_values"><tt>NodeList</tt> of <tt>Expression</tt></td>
1105
+ <td class="nd_default"></td>
1106
+ <td class="nd_comments" rowspan="1">
1107
+ </td>
1108
+ </tr>
1109
+
1110
+ <tr class="node_desc_evenrow">
1111
+ <td class="nd_class" rowspan="3"><tt>Conditional</tt></td>
1112
+ <td class="nd_field"><tt>cond</tt></td>
1113
+ <td class="nd_child">Y</td>
1114
+ <td class="nd_values"><tt>Expression</tt></td>
1115
+ <td class="nd_default"></td>
1116
+ <td class="nd_comments" rowspan="3">
1117
+ </td>
1118
+ </tr>
1119
+ <tr class="node_desc_evenrow">
1120
+ <td class="nd_field"><tt>then</tt></td>
1121
+ <td class="nd_child">Y</td>
1122
+ <td class="nd_values"><tt>Expression</tt></td>
1123
+ <td class="nd_default"></td>
1124
+ </tr>
1125
+ <tr class="node_desc_evenrow">
1126
+ <td class="nd_field"><tt>else</tt></td>
1127
+ <td class="nd_child">Y</td>
1128
+ <td class="nd_values"><tt>Expression</tt></td>
1129
+ <td class="nd_default"></td>
1130
+ </tr>
1131
+
1132
+ <tr class="node_desc_oddrow">
1133
+ <td class="nd_class" rowspan="1"><tt>Variable</tt></td>
1134
+ <td class="nd_field"><tt>name</tt></td>
1135
+ <td class="nd_child"></td>
1136
+ <td class="nd_values"><tt>String</tt></td>
1137
+ <td class="nd_default"></td>
1138
+ <td class="nd_comments" rowspan="1">
1139
+ </td>
1140
+ </tr>
1141
+
1142
+ <tr class="node_desc_evenrow">
1143
+ <td class="nd_class" rowspan="2"><tt>Index</tt></td>
1144
+ <td class="nd_field"><tt>expr</tt></td>
1145
+ <td class="nd_child">Y</td>
1146
+ <td class="nd_values"><tt>Expression</tt></td>
1147
+ <td class="nd_default"></td>
1148
+ <td class="nd_comments" rowspan="2">
1149
+ </td>
1150
+ </tr>
1151
+ <tr class="node_desc_evenrow">
1152
+ <td class="nd_field"><tt>index</tt></td>
1153
+ <td class="nd_child">Y</td>
1154
+ <td class="nd_values"><tt>Expression</tt></td>
1155
+ <td class="nd_default"></td>
1156
+ </tr>
1157
+
1158
+ <tr class="node_desc_oddrow">
1159
+ <td class="nd_class" rowspan="2"><tt>Call</tt></td>
1160
+ <td class="nd_field"><tt>expr</tt></td>
1161
+ <td class="nd_child">Y</td>
1162
+ <td class="nd_values"><tt>Expression</tt></td>
1163
+ <td class="nd_default"></td>
1164
+ <td class="nd_comments" rowspan="2">
1165
+ </td>
1166
+ </tr>
1167
+ <tr class="node_desc_oddrow">
1168
+ <td class="nd_field"><tt>args</tt></td>
1169
+ <td class="nd_child">Y</td>
1170
+ <td class="nd_values"><tt>NodeList</tt> of <tt>Expression</tt></td>
1171
+ <td class="nd_default"></td>
1172
+ </tr>
1173
+
1174
+ <tr class="node_desc_evenrow">
1175
+ <td class="nd_class" rowspan="2"><tt>Dot</tt></td>
1176
+ <td class="nd_field"><tt>expr</tt></td>
1177
+ <td class="nd_child">Y</td>
1178
+ <td class="nd_values"><tt>Expression</tt></td>
1179
+ <td class="nd_default"></td>
1180
+ <td class="nd_comments" rowspan="2">
1181
+ </td>
1182
+ </tr>
1183
+ <tr class="node_desc_evenrow">
1184
+ <td class="nd_field"><tt>member</tt></td>
1185
+ <td class="nd_child">Y</td>
1186
+ <td class="nd_values"><tt>String</tt></td>
1187
+ <td class="nd_default"></td>
1188
+ </tr>
1189
+
1190
+ <tr class="node_desc_oddrow">
1191
+ <td class="nd_class" rowspan="2"><tt>Arrow</tt></td>
1192
+ <td class="nd_field"><tt>expr</tt></td>
1193
+ <td class="nd_child">Y</td>
1194
+ <td class="nd_values"><tt>Expression</tt></td>
1195
+ <td class="nd_default"></td>
1196
+ <td class="nd_comments" rowspan="2">
1197
+ </td>
1198
+ </tr>
1199
+ <tr class="node_desc_oddrow">
1200
+ <td class="nd_field"><tt>member</tt></td>
1201
+ <td class="nd_child">Y</td>
1202
+ <td class="nd_values"><tt>String</tt></td>
1203
+ <td class="nd_default"></td>
1204
+ </tr>
1205
+
1206
+ <tr class="node_desc_evenrow">
1207
+ <td class="nd_class" rowspan="1"><tt>PostInc</tt></td>
1208
+ <td class="nd_field"><tt>expr</tt></td>
1209
+ <td class="nd_child">Y</td>
1210
+ <td class="nd_values"><tt>Expression</tt></td>
1211
+ <td class="nd_default"></td>
1212
+ <td class="nd_comments" rowspan="1">
1213
+ </td>
1214
+ </tr>
1215
+
1216
+ <tr class="node_desc_oddrow">
1217
+ <td class="nd_class" rowspan="1"><tt>PostDec</tt></td>
1218
+ <td class="nd_field"><tt>expr</tt></td>
1219
+ <td class="nd_child">Y</td>
1220
+ <td class="nd_values"><tt>Expression</tt></td>
1221
+ <td class="nd_default"></td>
1222
+ <td class="nd_comments" rowspan="1">
1223
+ </td>
1224
+ </tr>
1225
+
1226
+ <tr class="node_desc_evenrow">
1227
+ <td class="nd_class" rowspan="2"><tt>Cast</tt></td>
1228
+ <td class="nd_field"><tt>type</tt></td>
1229
+ <td class="nd_child">Y</td>
1230
+ <td class="nd_values"><tt>Type</tt></td>
1231
+ <td class="nd_default"></td>
1232
+ <td class="nd_comments" rowspan="2">
1233
+ </td>
1234
+ </tr>
1235
+ <tr class="node_desc_evenrow">
1236
+ <td class="nd_field"><tt>expr</tt></td>
1237
+ <td class="nd_child">Y</td>
1238
+ <td class="nd_values"><tt>Expression</tt></td>
1239
+ <td class="nd_default"></td>
1240
+ </tr>
1241
+
1242
+ <tr class="node_desc_oddrow">
1243
+ <td class="nd_class" rowspan="1"><tt>Address</tt></td>
1244
+ <td class="nd_field"><tt>expr</tt></td>
1245
+ <td class="nd_child">Y</td>
1246
+ <td class="nd_values"><tt>Expression</tt></td>
1247
+ <td class="nd_default"></td>
1248
+ <td class="nd_comments" rowspan="1">
1249
+ </td>
1250
+ </tr>
1251
+
1252
+ <tr class="node_desc_evenrow">
1253
+ <td class="nd_class" rowspan="1"><tt>Dereference</tt></td>
1254
+ <td class="nd_field"><tt>expr</tt></td>
1255
+ <td class="nd_child">Y</td>
1256
+ <td class="nd_values"><tt>Expression</tt></td>
1257
+ <td class="nd_default"></td>
1258
+ <td class="nd_comments" rowspan="1">
1259
+ </td>
1260
+ </tr>
1261
+
1262
+ <tr class="node_desc_oddrow">
1263
+ <td class="nd_class" rowspan="1"><tt>Sizeof</tt></td>
1264
+ <td class="nd_field"><tt>expr</tt></td>
1265
+ <td class="nd_child">Y</td>
1266
+ <td class="nd_values"><tt>Type</tt> or <tt>Expression</tt></td>
1267
+ <td class="nd_default"></td>
1268
+ <td class="nd_comments" rowspan="1">
1269
+ </td>
1270
+ </tr>
1271
+
1272
+ <tr class="node_desc_evenrow">
1273
+ <td class="nd_class" rowspan="1"><tt>Positive</tt></td>
1274
+ <td class="nd_field"><tt>expr</tt></td>
1275
+ <td class="nd_child">Y</td>
1276
+ <td class="nd_values"><tt>Expression</tt></td>
1277
+ <td class="nd_default"></td>
1278
+ <td class="nd_comments" rowspan="1">
1279
+ </td>
1280
+ </tr>
1281
+
1282
+ <tr class="node_desc_oddrow">
1283
+ <td class="nd_class" rowspan="1"><tt>Negative</tt></td>
1284
+ <td class="nd_field"><tt>expr</tt></td>
1285
+ <td class="nd_child">Y</td>
1286
+ <td class="nd_values"><tt>Expression</tt></td>
1287
+ <td class="nd_default"></td>
1288
+ <td class="nd_comments" rowspan="1">
1289
+ </td>
1290
+ </tr>
1291
+
1292
+ <tr class="node_desc_evenrow">
1293
+ <td class="nd_class" rowspan="1"><tt>PreInc</tt></td>
1294
+ <td class="nd_field"><tt>expr</tt></td>
1295
+ <td class="nd_child">Y</td>
1296
+ <td class="nd_values"><tt>Expression</tt></td>
1297
+ <td class="nd_default"></td>
1298
+ <td class="nd_comments" rowspan="1">
1299
+ </td>
1300
+ </tr>
1301
+
1302
+ <tr class="node_desc_oddrow">
1303
+ <td class="nd_class" rowspan="1"><tt>PreDec</tt></td>
1304
+ <td class="nd_field"><tt>expr</tt></td>
1305
+ <td class="nd_child">Y</td>
1306
+ <td class="nd_values"><tt>Expression</tt></td>
1307
+ <td class="nd_default"></td>
1308
+ <td class="nd_comments" rowspan="1">
1309
+ </td>
1310
+ </tr>
1311
+
1312
+ <tr class="node_desc_evenrow">
1313
+ <td class="nd_class" rowspan="1"><tt>BitNot</tt></td>
1314
+ <td class="nd_field"><tt>expr</tt></td>
1315
+ <td class="nd_child">Y</td>
1316
+ <td class="nd_values"><tt>Expression</tt></td>
1317
+ <td class="nd_default"></td>
1318
+ <td class="nd_comments" rowspan="1">
1319
+ </td>
1320
+ </tr>
1321
+
1322
+ <tr class="node_desc_oddrow">
1323
+ <td class="nd_class" rowspan="1"><tt>Not</tt></td>
1324
+ <td class="nd_field"><tt>expr</tt></td>
1325
+ <td class="nd_child">Y</td>
1326
+ <td class="nd_values"><tt>Expression</tt></td>
1327
+ <td class="nd_default"></td>
1328
+ <td class="nd_comments" rowspan="1">
1329
+ </td>
1330
+ </tr>
1331
+
1332
+ <tr class="node_desc_evenrow">
1333
+ <td class="nd_class" rowspan="2"><tt>Add</tt></td>
1334
+ <td class="nd_field"><tt>expr1</tt></td>
1335
+ <td class="nd_child">Y</td>
1336
+ <td class="nd_values"><tt>Expression</tt></td>
1337
+ <td class="nd_default"></td>
1338
+ <td class="nd_comments" rowspan="2">
1339
+ </td>
1340
+ </tr>
1341
+ <tr class="node_desc_evenrow">
1342
+ <td class="nd_field"><tt>expr2</tt></td>
1343
+ <td class="nd_child">Y</td>
1344
+ <td class="nd_values"><tt>Expression</tt></td>
1345
+ <td class="nd_default"></td>
1346
+ </tr>
1347
+
1348
+ <tr class="node_desc_oddrow">
1349
+ <td class="nd_class" rowspan="2"><tt>Subtract</tt></td>
1350
+ <td class="nd_field"><tt>expr1</tt></td>
1351
+ <td class="nd_child">Y</td>
1352
+ <td class="nd_values"><tt>Expression</tt></td>
1353
+ <td class="nd_default"></td>
1354
+ <td class="nd_comments" rowspan="2">
1355
+ </td>
1356
+ </tr>
1357
+ <tr class="node_desc_oddrow">
1358
+ <td class="nd_field"><tt>expr2</tt></td>
1359
+ <td class="nd_child">Y</td>
1360
+ <td class="nd_values"><tt>Expression</tt></td>
1361
+ <td class="nd_default"></td>
1362
+ </tr>
1363
+
1364
+ <tr class="node_desc_evenrow">
1365
+ <td class="nd_class" rowspan="2"><tt>Multiply</tt></td>
1366
+ <td class="nd_field"><tt>expr1</tt></td>
1367
+ <td class="nd_child">Y</td>
1368
+ <td class="nd_values"><tt>Expression</tt></td>
1369
+ <td class="nd_default"></td>
1370
+ <td class="nd_comments" rowspan="2">
1371
+ </td>
1372
+ </tr>
1373
+ <tr class="node_desc_evenrow">
1374
+ <td class="nd_field"><tt>expr2</tt></td>
1375
+ <td class="nd_child">Y</td>
1376
+ <td class="nd_values"><tt>Expression</tt></td>
1377
+ <td class="nd_default"></td>
1378
+ </tr>
1379
+
1380
+ <tr class="node_desc_oddrow">
1381
+ <td class="nd_class" rowspan="2"><tt>Divide</tt></td>
1382
+ <td class="nd_field"><tt>expr1</tt></td>
1383
+ <td class="nd_child">Y</td>
1384
+ <td class="nd_values"><tt>Expression</tt></td>
1385
+ <td class="nd_default"></td>
1386
+ <td class="nd_comments" rowspan="2">
1387
+ </td>
1388
+ </tr>
1389
+ <tr class="node_desc_oddrow">
1390
+ <td class="nd_field"><tt>expr2</tt></td>
1391
+ <td class="nd_child">Y</td>
1392
+ <td class="nd_values"><tt>Expression</tt></td>
1393
+ <td class="nd_default"></td>
1394
+ </tr>
1395
+
1396
+ <tr class="node_desc_evenrow">
1397
+ <td class="nd_class" rowspan="2"><tt>Mod</tt></td>
1398
+ <td class="nd_field"><tt>expr1</tt></td>
1399
+ <td class="nd_child">Y</td>
1400
+ <td class="nd_values"><tt>Expression</tt></td>
1401
+ <td class="nd_default"></td>
1402
+ <td class="nd_comments" rowspan="2">
1403
+ </td>
1404
+ </tr>
1405
+ <tr class="node_desc_evenrow">
1406
+ <td class="nd_field"><tt>expr2</tt></td>
1407
+ <td class="nd_child">Y</td>
1408
+ <td class="nd_values"><tt>Expression</tt></td>
1409
+ <td class="nd_default"></td>
1410
+ </tr>
1411
+
1412
+ <tr class="node_desc_oddrow">
1413
+ <td class="nd_class" rowspan="2"><tt>Equal</tt></td>
1414
+ <td class="nd_field"><tt>expr1</tt></td>
1415
+ <td class="nd_child">Y</td>
1416
+ <td class="nd_values"><tt>Expression</tt></td>
1417
+ <td class="nd_default"></td>
1418
+ <td class="nd_comments" rowspan="2">
1419
+ </td>
1420
+ </tr>
1421
+ <tr class="node_desc_oddrow">
1422
+ <td class="nd_field"><tt>expr2</tt></td>
1423
+ <td class="nd_child">Y</td>
1424
+ <td class="nd_values"><tt>Expression</tt></td>
1425
+ <td class="nd_default"></td>
1426
+ </tr>
1427
+
1428
+ <tr class="node_desc_evenrow">
1429
+ <td class="nd_class" rowspan="2"><tt>NotEqual</tt></td>
1430
+ <td class="nd_field"><tt>expr1</tt></td>
1431
+ <td class="nd_child">Y</td>
1432
+ <td class="nd_values"><tt>Expression</tt></td>
1433
+ <td class="nd_default"></td>
1434
+ <td class="nd_comments" rowspan="2">
1435
+ </td>
1436
+ </tr>
1437
+ <tr class="node_desc_evenrow">
1438
+ <td class="nd_field"><tt>expr2</tt></td>
1439
+ <td class="nd_child">Y</td>
1440
+ <td class="nd_values"><tt>Expression</tt></td>
1441
+ <td class="nd_default"></td>
1442
+ </tr>
1443
+
1444
+ <tr class="node_desc_oddrow">
1445
+ <td class="nd_class" rowspan="2"><tt>Less</tt></td>
1446
+ <td class="nd_field"><tt>expr1</tt></td>
1447
+ <td class="nd_child">Y</td>
1448
+ <td class="nd_values"><tt>Expression</tt></td>
1449
+ <td class="nd_default"></td>
1450
+ <td class="nd_comments" rowspan="2">
1451
+ </td>
1452
+ </tr>
1453
+ <tr class="node_desc_oddrow">
1454
+ <td class="nd_field"><tt>expr2</tt></td>
1455
+ <td class="nd_child">Y</td>
1456
+ <td class="nd_values"><tt>Expression</tt></td>
1457
+ <td class="nd_default"></td>
1458
+ </tr>
1459
+
1460
+ <tr class="node_desc_evenrow">
1461
+ <td class="nd_class" rowspan="2"><tt>More</tt></td>
1462
+ <td class="nd_field"><tt>expr1</tt></td>
1463
+ <td class="nd_child">Y</td>
1464
+ <td class="nd_values"><tt>Expression</tt></td>
1465
+ <td class="nd_default"></td>
1466
+ <td class="nd_comments" rowspan="2">
1467
+ </td>
1468
+ </tr>
1469
+ <tr class="node_desc_evenrow">
1470
+ <td class="nd_field"><tt>expr2</tt></td>
1471
+ <td class="nd_child">Y</td>
1472
+ <td class="nd_values"><tt>Expression</tt></td>
1473
+ <td class="nd_default"></td>
1474
+ </tr>
1475
+
1476
+ <tr class="node_desc_oddrow">
1477
+ <td class="nd_class" rowspan="2"><tt>LessOrEqual</tt></td>
1478
+ <td class="nd_field"><tt>expr1</tt></td>
1479
+ <td class="nd_child">Y</td>
1480
+ <td class="nd_values"><tt>Expression</tt></td>
1481
+ <td class="nd_default"></td>
1482
+ <td class="nd_comments" rowspan="2">
1483
+ </td>
1484
+ </tr>
1485
+ <tr class="node_desc_oddrow">
1486
+ <td class="nd_field"><tt>expr2</tt></td>
1487
+ <td class="nd_child">Y</td>
1488
+ <td class="nd_values"><tt>Expression</tt></td>
1489
+ <td class="nd_default"></td>
1490
+ </tr>
1491
+
1492
+ <tr class="node_desc_evenrow">
1493
+ <td class="nd_class" rowspan="2"><tt>MoreOrEqual</tt></td>
1494
+ <td class="nd_field"><tt>expr1</tt></td>
1495
+ <td class="nd_child">Y</td>
1496
+ <td class="nd_values"><tt>Expression</tt></td>
1497
+ <td class="nd_default"></td>
1498
+ <td class="nd_comments" rowspan="2">
1499
+ </td>
1500
+ </tr>
1501
+ <tr class="node_desc_evenrow">
1502
+ <td class="nd_field"><tt>expr2</tt></td>
1503
+ <td class="nd_child">Y</td>
1504
+ <td class="nd_values"><tt>Expression</tt></td>
1505
+ <td class="nd_default"></td>
1506
+ </tr>
1507
+
1508
+ <tr class="node_desc_oddrow">
1509
+ <td class="nd_class" rowspan="2"><tt>BitAnd</tt></td>
1510
+ <td class="nd_field"><tt>expr1</tt></td>
1511
+ <td class="nd_child">Y</td>
1512
+ <td class="nd_values"><tt>Expression</tt></td>
1513
+ <td class="nd_default"></td>
1514
+ <td class="nd_comments" rowspan="2">
1515
+ </td>
1516
+ </tr>
1517
+ <tr class="node_desc_oddrow">
1518
+ <td class="nd_field"><tt>expr2</tt></td>
1519
+ <td class="nd_child">Y</td>
1520
+ <td class="nd_values"><tt>Expression</tt></td>
1521
+ <td class="nd_default"></td>
1522
+ </tr>
1523
+
1524
+ <tr class="node_desc_evenrow">
1525
+ <td class="nd_class" rowspan="2"><tt>BitOr</tt></td>
1526
+ <td class="nd_field"><tt>expr1</tt></td>
1527
+ <td class="nd_child">Y</td>
1528
+ <td class="nd_values"><tt>Expression</tt></td>
1529
+ <td class="nd_default"></td>
1530
+ <td class="nd_comments" rowspan="2">
1531
+ </td>
1532
+ </tr>
1533
+ <tr class="node_desc_evenrow">
1534
+ <td class="nd_field"><tt>expr2</tt></td>
1535
+ <td class="nd_child">Y</td>
1536
+ <td class="nd_values"><tt>Expression</tt></td>
1537
+ <td class="nd_default"></td>
1538
+ </tr>
1539
+
1540
+ <tr class="node_desc_oddrow">
1541
+ <td class="nd_class" rowspan="2"><tt>BitXor</tt></td>
1542
+ <td class="nd_field"><tt>expr1</tt></td>
1543
+ <td class="nd_child">Y</td>
1544
+ <td class="nd_values"><tt>Expression</tt></td>
1545
+ <td class="nd_default"></td>
1546
+ <td class="nd_comments" rowspan="2">
1547
+ </td>
1548
+ </tr>
1549
+ <tr class="node_desc_oddrow">
1550
+ <td class="nd_field"><tt>expr2</tt></td>
1551
+ <td class="nd_child">Y</td>
1552
+ <td class="nd_values"><tt>Expression</tt></td>
1553
+ <td class="nd_default"></td>
1554
+ </tr>
1555
+
1556
+ <tr class="node_desc_evenrow">
1557
+ <td class="nd_class" rowspan="2"><tt>ShiftLeft</tt></td>
1558
+ <td class="nd_field"><tt>expr1</tt></td>
1559
+ <td class="nd_child">Y</td>
1560
+ <td class="nd_values"><tt>Expression</tt></td>
1561
+ <td class="nd_default"></td>
1562
+ <td class="nd_comments" rowspan="2">
1563
+ </td>
1564
+ </tr>
1565
+ <tr class="node_desc_evenrow">
1566
+ <td class="nd_field"><tt>expr2</tt></td>
1567
+ <td class="nd_child">Y</td>
1568
+ <td class="nd_values"><tt>Expression</tt></td>
1569
+ <td class="nd_default"></td>
1570
+ </tr>
1571
+
1572
+ <tr class="node_desc_oddrow">
1573
+ <td class="nd_class" rowspan="2"><tt>ShiftRight</tt></td>
1574
+ <td class="nd_field"><tt>expr1</tt></td>
1575
+ <td class="nd_child">Y</td>
1576
+ <td class="nd_values"><tt>Expression</tt></td>
1577
+ <td class="nd_default"></td>
1578
+ <td class="nd_comments" rowspan="2">
1579
+ </td>
1580
+ </tr>
1581
+ <tr class="node_desc_oddrow">
1582
+ <td class="nd_field"><tt>expr2</tt></td>
1583
+ <td class="nd_child">Y</td>
1584
+ <td class="nd_values"><tt>Expression</tt></td>
1585
+ <td class="nd_default"></td>
1586
+ </tr>
1587
+
1588
+ <tr class="node_desc_evenrow">
1589
+ <td class="nd_class" rowspan="2"><tt>And</tt></td>
1590
+ <td class="nd_field"><tt>expr1</tt></td>
1591
+ <td class="nd_child">Y</td>
1592
+ <td class="nd_values"><tt>Expression</tt></td>
1593
+ <td class="nd_default"></td>
1594
+ <td class="nd_comments" rowspan="2">
1595
+ </td>
1596
+ </tr>
1597
+ <tr class="node_desc_evenrow">
1598
+ <td class="nd_field"><tt>expr2</tt></td>
1599
+ <td class="nd_child">Y</td>
1600
+ <td class="nd_values"><tt>Expression</tt></td>
1601
+ <td class="nd_default"></td>
1602
+ </tr>
1603
+
1604
+ <tr class="node_desc_oddrow">
1605
+ <td class="nd_class" rowspan="2"><tt>Or</tt></td>
1606
+ <td class="nd_field"><tt>expr1</tt></td>
1607
+ <td class="nd_child">Y</td>
1608
+ <td class="nd_values"><tt>Expression</tt></td>
1609
+ <td class="nd_default"></td>
1610
+ <td class="nd_comments" rowspan="2">
1611
+ </td>
1612
+ </tr>
1613
+ <tr class="node_desc_oddrow">
1614
+ <td class="nd_field"><tt>expr2</tt></td>
1615
+ <td class="nd_child">Y</td>
1616
+ <td class="nd_values"><tt>Expression</tt></td>
1617
+ <td class="nd_default"></td>
1618
+ </tr>
1619
+
1620
+ <tr class="node_desc_evenrow">
1621
+ <td class="nd_class" rowspan="2"><tt>Assign</tt></td>
1622
+ <td class="nd_field"><tt>lval</tt></td>
1623
+ <td class="nd_child">Y</td>
1624
+ <td class="nd_values"><tt>Expression</tt></td>
1625
+ <td class="nd_default"></td>
1626
+ <td class="nd_comments" rowspan="2">
1627
+ </td>
1628
+ </tr>
1629
+ <tr class="node_desc_evenrow">
1630
+ <td class="nd_field"><tt>rval</tt></td>
1631
+ <td class="nd_child">Y</td>
1632
+ <td class="nd_values"><tt>Expression</tt></td>
1633
+ <td class="nd_default"></td>
1634
+ </tr>
1635
+
1636
+ <tr class="node_desc_oddrow">
1637
+ <td class="nd_class" rowspan="2"><tt>MultiplyAssign</tt></td>
1638
+ <td class="nd_field"><tt>lval</tt></td>
1639
+ <td class="nd_child">Y</td>
1640
+ <td class="nd_values"><tt>Expression</tt></td>
1641
+ <td class="nd_default"></td>
1642
+ <td class="nd_comments" rowspan="2">
1643
+ </td>
1644
+ </tr>
1645
+ <tr class="node_desc_oddrow">
1646
+ <td class="nd_field"><tt>rval</tt></td>
1647
+ <td class="nd_child">Y</td>
1648
+ <td class="nd_values"><tt>Expression</tt></td>
1649
+ <td class="nd_default"></td>
1650
+ </tr>
1651
+
1652
+ <tr class="node_desc_evenrow">
1653
+ <td class="nd_class" rowspan="2"><tt>DivideAssign</tt></td>
1654
+ <td class="nd_field"><tt>lval</tt></td>
1655
+ <td class="nd_child">Y</td>
1656
+ <td class="nd_values"><tt>Expression</tt></td>
1657
+ <td class="nd_default"></td>
1658
+ <td class="nd_comments" rowspan="2">
1659
+ </td>
1660
+ </tr>
1661
+ <tr class="node_desc_evenrow">
1662
+ <td class="nd_field"><tt>rval</tt></td>
1663
+ <td class="nd_child">Y</td>
1664
+ <td class="nd_values"><tt>Expression</tt></td>
1665
+ <td class="nd_default"></td>
1666
+ </tr>
1667
+
1668
+ <tr class="node_desc_oddrow">
1669
+ <td class="nd_class" rowspan="2"><tt>ModAssign</tt></td>
1670
+ <td class="nd_field"><tt>lval</tt></td>
1671
+ <td class="nd_child">Y</td>
1672
+ <td class="nd_values"><tt>Expression</tt></td>
1673
+ <td class="nd_default"></td>
1674
+ <td class="nd_comments" rowspan="2">
1675
+ </td>
1676
+ </tr>
1677
+ <tr class="node_desc_oddrow">
1678
+ <td class="nd_field"><tt>rval</tt></td>
1679
+ <td class="nd_child">Y</td>
1680
+ <td class="nd_values"><tt>Expression</tt></td>
1681
+ <td class="nd_default"></td>
1682
+ </tr>
1683
+
1684
+ <tr class="node_desc_evenrow">
1685
+ <td class="nd_class" rowspan="2"><tt>AddAssign</tt></td>
1686
+ <td class="nd_field"><tt>lval</tt></td>
1687
+ <td class="nd_child">Y</td>
1688
+ <td class="nd_values"><tt>Expression</tt></td>
1689
+ <td class="nd_default"></td>
1690
+ <td class="nd_comments" rowspan="2">
1691
+ </td>
1692
+ </tr>
1693
+ <tr class="node_desc_evenrow">
1694
+ <td class="nd_field"><tt>rval</tt></td>
1695
+ <td class="nd_child">Y</td>
1696
+ <td class="nd_values"><tt>Expression</tt></td>
1697
+ <td class="nd_default"></td>
1698
+ </tr>
1699
+
1700
+ <tr class="node_desc_oddrow">
1701
+ <td class="nd_class" rowspan="2"><tt>SubtractAssign</tt></td>
1702
+ <td class="nd_field"><tt>lval</tt></td>
1703
+ <td class="nd_child">Y</td>
1704
+ <td class="nd_values"><tt>Expression</tt></td>
1705
+ <td class="nd_default"></td>
1706
+ <td class="nd_comments" rowspan="2">
1707
+ </td>
1708
+ </tr>
1709
+ <tr class="node_desc_oddrow">
1710
+ <td class="nd_field"><tt>rval</tt></td>
1711
+ <td class="nd_child">Y</td>
1712
+ <td class="nd_values"><tt>Expression</tt></td>
1713
+ <td class="nd_default"></td>
1714
+ </tr>
1715
+
1716
+ <tr class="node_desc_evenrow">
1717
+ <td class="nd_class" rowspan="2"><tt>ShiftLeftAssign</tt></td>
1718
+ <td class="nd_field"><tt>lval</tt></td>
1719
+ <td class="nd_child">Y</td>
1720
+ <td class="nd_values"><tt>Expression</tt></td>
1721
+ <td class="nd_default"></td>
1722
+ <td class="nd_comments" rowspan="2">
1723
+ </td>
1724
+ </tr>
1725
+ <tr class="node_desc_evenrow">
1726
+ <td class="nd_field"><tt>rval</tt></td>
1727
+ <td class="nd_child">Y</td>
1728
+ <td class="nd_values"><tt>Expression</tt></td>
1729
+ <td class="nd_default"></td>
1730
+ </tr>
1731
+
1732
+ <tr class="node_desc_oddrow">
1733
+ <td class="nd_class" rowspan="2"><tt>ShiftRightAssign</tt></td>
1734
+ <td class="nd_field"><tt>lval</tt></td>
1735
+ <td class="nd_child">Y</td>
1736
+ <td class="nd_values"><tt>Expression</tt></td>
1737
+ <td class="nd_default"></td>
1738
+ <td class="nd_comments" rowspan="2">
1739
+ </td>
1740
+ </tr>
1741
+ <tr class="node_desc_oddrow">
1742
+ <td class="nd_field"><tt>rval</tt></td>
1743
+ <td class="nd_child">Y</td>
1744
+ <td class="nd_values"><tt>Expression</tt></td>
1745
+ <td class="nd_default"></td>
1746
+ </tr>
1747
+
1748
+ <tr class="node_desc_evenrow">
1749
+ <td class="nd_class" rowspan="2"><tt>BitAndAssign</tt></td>
1750
+ <td class="nd_field"><tt>lval</tt></td>
1751
+ <td class="nd_child">Y</td>
1752
+ <td class="nd_values"><tt>Expression</tt></td>
1753
+ <td class="nd_default"></td>
1754
+ <td class="nd_comments" rowspan="2">
1755
+ </td>
1756
+ </tr>
1757
+ <tr class="node_desc_evenrow">
1758
+ <td class="nd_field"><tt>rval</tt></td>
1759
+ <td class="nd_child">Y</td>
1760
+ <td class="nd_values"><tt>Expression</tt></td>
1761
+ <td class="nd_default"></td>
1762
+ </tr>
1763
+
1764
+ <tr class="node_desc_oddrow">
1765
+ <td class="nd_class" rowspan="2"><tt>BitXorAssign</tt></td>
1766
+ <td class="nd_field"><tt>lval</tt></td>
1767
+ <td class="nd_child">Y</td>
1768
+ <td class="nd_values"><tt>Expression</tt></td>
1769
+ <td class="nd_default"></td>
1770
+ <td class="nd_comments" rowspan="2">
1771
+ </td>
1772
+ </tr>
1773
+ <tr class="node_desc_oddrow">
1774
+ <td class="nd_field"><tt>rval</tt></td>
1775
+ <td class="nd_child">Y</td>
1776
+ <td class="nd_values"><tt>Expression</tt></td>
1777
+ <td class="nd_default"></td>
1778
+ </tr>
1779
+
1780
+ <tr class="node_desc_evenrow">
1781
+ <td class="nd_class" rowspan="2"><tt>BitOrAssign</tt></td>
1782
+ <td class="nd_field"><tt>lval</tt></td>
1783
+ <td class="nd_child">Y</td>
1784
+ <td class="nd_values"><tt>Expression</tt></td>
1785
+ <td class="nd_default"></td>
1786
+ <td class="nd_comments" rowspan="2">
1787
+ </td>
1788
+ </tr>
1789
+ <tr class="node_desc_evenrow">
1790
+ <td class="nd_field"><tt>rval</tt></td>
1791
+ <td class="nd_child">Y</td>
1792
+ <td class="nd_values"><tt>Expression</tt></td>
1793
+ <td class="nd_default"></td>
1794
+ </tr>
1795
+
1796
+ <tr class="node_desc_oddrow">
1797
+ <td class="nd_class" rowspan="1"><tt>StringLiteral</tt></td>
1798
+ <td class="nd_field"><tt>val</tt></td>
1799
+ <td class="nd_child"></td>
1800
+ <td class="nd_values"><tt>String</tt></td>
1801
+ <td class="nd_default"></td>
1802
+ <td class="nd_comments" rowspan="1">
1803
+ The <tt>String</tt> in <tt>val</tt> is the literal string entered. <tt>"\n"</tt>
1804
+ isn't converted to a newline, for instance.
1805
+ </td>
1806
+ </tr>
1807
+
1808
+ <tr class="node_desc_evenrow">
1809
+ <td class="nd_class" rowspan="1"><tt>CharLiteral</tt></td>
1810
+ <td class="nd_field"><tt>val</tt></td>
1811
+ <td class="nd_child"></td>
1812
+ <td class="nd_values"><tt>String</tt></td>
1813
+ <td class="nd_default"></td>
1814
+ <td class="nd_comments" rowspan="1">
1815
+ The <tt>String</tt> in <tt>val</tt> is the literal string entered. <tt>'\n'</tt>
1816
+ isn't converted to a newline, for instance.
1817
+ </td>
1818
+ </tr>
1819
+
1820
+ <tr class="node_desc_oddrow">
1821
+ <td class="nd_class" rowspan="2"><tt>CompoundLiteral</tt></td>
1822
+ <td class="nd_field"><tt>type</tt></td>
1823
+ <td class="nd_child">Y</td>
1824
+ <td class="nd_values"><tt>Type</tt></td>
1825
+ <td class="nd_default"></td>
1826
+ <td class="nd_comments" rowspan="2">
1827
+ <p>
1828
+ Here's an example. <tt>(struct S){1, .x = 2, .y [3] .z =
1829
+ 4}</tt> parses as:</p>
1830
+ <pre>
1831
+ CompoundLiteral
1832
+ type: Struct
1833
+ name: "S"
1834
+ member_inits:
1835
+ - MemberInit
1836
+ init: IntLiteral
1837
+ val: 1
1838
+ - MemberInit
1839
+ member:
1840
+ - Member
1841
+ name: "x"
1842
+ init: IntLiteral
1843
+ val: 2
1844
+ - MemberInit
1845
+ member:
1846
+ - Member
1847
+ name: "y"
1848
+ - IntLiteral
1849
+ val: 3
1850
+ - Member
1851
+ name: "z"
1852
+ init: IntLiteral
1853
+ val: 4
1854
+ </pre>
1855
+ "That's legal syntax!?" Yep. Look it up.
1856
+ </td>
1857
+ </tr>
1858
+ <tr class="node_desc_oddrow">
1859
+ <td class="nd_field"><tt>member_inits</tt></td>
1860
+ <td class="nd_child">Y</td>
1861
+ <td class="nd_values"><tt>NodeList</tt> of <tt>MemberInit</tt></td>
1862
+ <td class="nd_default"><tt>NodeArray[]</tt></td>
1863
+ </tr>
1864
+
1865
+ <tr class="node_desc_evenrow">
1866
+ <td class="nd_class" rowspan="2"><tt>IntLiteral</tt></td>
1867
+ <td class="nd_field"><tt>val</tt></td>
1868
+ <td class="nd_child"></td>
1869
+ <td class="nd_values"><tt>Integer</tt></td>
1870
+ <td class="nd_default"></td>
1871
+ <td class="nd_comments" rowspan="2">
1872
+ <p>Also:</p>
1873
+ <ul>
1874
+ <li><tt>#dec?</tt> -- return true iff <tt>format == :dec</tt></li>
1875
+ <li><tt>#hex?</tt> -- return true iff <tt>format == :hex</tt></li>
1876
+ <li><tt>#oct?</tt> -- return true iff <tt>format == :oct</tt></li>
1877
+ </ul>
1878
+ </td>
1879
+ </tr>
1880
+ <tr class="node_desc_evenrow">
1881
+ <td class="nd_field"><tt>format</tt></td>
1882
+ <td class="nd_child"></td>
1883
+ <td class="nd_values"><tt>:dec</tt>, <tt>:hex</tt>, <tt>:oct</tt></td>
1884
+ <td class="nd_default"><tt>:dec</tt></td>
1885
+ </tr>
1886
+
1887
+ <tr class="node_desc_oddrow">
1888
+ <td class="nd_class" rowspan="1"><tt>FloatLiteral</tt></td>
1889
+ <td class="nd_field"><tt>val</tt></td>
1890
+ <td class="nd_child"></td>
1891
+ <td class="nd_values"><tt>Float</tt></td>
1892
+ <td class="nd_default"></td>
1893
+ <td class="nd_comments" rowspan="1">
1894
+ </td>
1895
+ </tr>
1896
+
1897
+ <tr class="node_desc_evenrow">
1898
+ <td class="nd_class" rowspan="4"><tt>Pointer</tt></td>
1899
+ <td class="nd_field"><tt>const?</tt></td>
1900
+ <td class="nd_child"></td>
1901
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
1902
+ <td class="nd_default"></td>
1903
+ <td class="nd_comments" rowspan="4">
1904
+ </td>
1905
+ </tr>
1906
+ <tr class="node_desc_evenrow">
1907
+ <td class="nd_field"><tt>restrict?</tt></td>
1908
+ <td class="nd_child"></td>
1909
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
1910
+ <td class="nd_default"></td>
1911
+ </tr>
1912
+ <tr class="node_desc_evenrow">
1913
+ <td class="nd_field"><tt>volatile?</tt></td>
1914
+ <td class="nd_child"></td>
1915
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
1916
+ <td class="nd_default"></td>
1917
+ </tr>
1918
+ <tr class="node_desc_evenrow">
1919
+ <td class="nd_field"><tt>type</tt></td>
1920
+ <td class="nd_child">Y</td>
1921
+ <td class="nd_values"><tt>Type</tt></td>
1922
+ <td class="nd_default"></td>
1923
+ </tr>
1924
+
1925
+ <tr class="node_desc_oddrow">
1926
+ <td class="nd_class" rowspan="5"><tt>Array</tt></td>
1927
+ <td class="nd_field"><tt>const?</tt></td>
1928
+ <td class="nd_child"></td>
1929
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
1930
+ <td class="nd_default"></td>
1931
+ <td class="nd_comments" rowspan="5">
1932
+ </td>
1933
+ </tr>
1934
+ <tr class="node_desc_oddrow">
1935
+ <td class="nd_field"><tt>restrict?</tt></td>
1936
+ <td class="nd_child"></td>
1937
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
1938
+ <td class="nd_default"></td>
1939
+ </tr>
1940
+ <tr class="node_desc_oddrow">
1941
+ <td class="nd_field"><tt>volatile?</tt></td>
1942
+ <td class="nd_child"></td>
1943
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
1944
+ <td class="nd_default"></td>
1945
+ </tr>
1946
+ <tr class="node_desc_oddrow">
1947
+ <td class="nd_field"><tt>type</tt></td>
1948
+ <td class="nd_child">Y</td>
1949
+ <td class="nd_values"><tt>Type</tt></td>
1950
+ <td class="nd_default"></td>
1951
+ </tr>
1952
+ <tr class="node_desc_oddrow">
1953
+ <td class="nd_field"><tt>length</tt></td>
1954
+ <td class="nd_child">Y</td>
1955
+ <td class="nd_values"><tt>Expression</tt></td>
1956
+ <td class="nd_default"></td>
1957
+ </tr>
1958
+
1959
+ <tr class="node_desc_evenrow">
1960
+ <td class="nd_class" rowspan="6"><tt>Function</tt></td>
1961
+ <td class="nd_field"><tt>const?</tt></td>
1962
+ <td class="nd_child"></td>
1963
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
1964
+ <td class="nd_default"></td>
1965
+ <td class="nd_comments" rowspan="6">
1966
+ </td>
1967
+ </tr>
1968
+ <tr class="node_desc_evenrow">
1969
+ <td class="nd_field"><tt>restrict?</tt></td>
1970
+ <td class="nd_child"></td>
1971
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
1972
+ <td class="nd_default"></td>
1973
+ </tr>
1974
+ <tr class="node_desc_evenrow">
1975
+ <td class="nd_field"><tt>volatile?</tt></td>
1976
+ <td class="nd_child"></td>
1977
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
1978
+ <td class="nd_default"></td>
1979
+ </tr>
1980
+ <tr class="node_desc_evenrow">
1981
+ <td class="nd_field"><tt>type</tt></td>
1982
+ <td class="nd_child">Y</td>
1983
+ <td class="nd_values"><tt>Type</tt></td>
1984
+ <td class="nd_default"></td>
1985
+ </tr>
1986
+ <tr class="node_desc_evenrow">
1987
+ <td class="nd_field"><tt>params</tt></td>
1988
+ <td class="nd_child">Y</td>
1989
+ <td class="nd_values"><tt>NodeList</tt> of <tt>Parameter</tt></td>
1990
+ <td class="nd_default"><tt>NodeArray[]</tt></td>
1991
+ </tr>
1992
+ <tr class="node_desc_evenrow">
1993
+ <td class="nd_field"><tt>var_args?</tt></td>
1994
+ <td class="nd_child"></td>
1995
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
1996
+ <td class="nd_default"></td>
1997
+ </tr>
1998
+
1999
+ <tr class="node_desc_oddrow">
2000
+ <td class="nd_class" rowspan="5"><tt>Struct</tt></td>
2001
+ <td class="nd_field"><tt>const?</tt></td>
2002
+ <td class="nd_child"></td>
2003
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2004
+ <td class="nd_default"></td>
2005
+ <td class="nd_comments" rowspan="5">
2006
+ </td>
2007
+ </tr>
2008
+ <tr class="node_desc_oddrow">
2009
+ <td class="nd_field"><tt>restrict?</tt></td>
2010
+ <td class="nd_child"></td>
2011
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2012
+ <td class="nd_default"></td>
2013
+ </tr>
2014
+ <tr class="node_desc_oddrow">
2015
+ <td class="nd_field"><tt>volatile?</tt></td>
2016
+ <td class="nd_child"></td>
2017
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2018
+ <td class="nd_default"></td>
2019
+ </tr>
2020
+ <tr class="node_desc_oddrow">
2021
+ <td class="nd_field"><tt>name</tt></td>
2022
+ <td class="nd_child"></td>
2023
+ <td class="nd_values"><tt>String</tt></td>
2024
+ <td class="nd_default"></td>
2025
+ </tr>
2026
+ <tr class="node_desc_oddrow">
2027
+ <td class="nd_field"><tt>members</tt></td>
2028
+ <td class="nd_child">Y</td>
2029
+ <td class="nd_values"><tt>NodeList</tt> of <tt>Member</tt></td>
2030
+ <td class="nd_default"><tt>NodeArray[]</tt></td>
2031
+ </tr>
2032
+
2033
+ <tr class="node_desc_evenrow">
2034
+ <td class="nd_class" rowspan="5"><tt>Union</tt></td>
2035
+ <td class="nd_field"><tt>const?</tt></td>
2036
+ <td class="nd_child"></td>
2037
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2038
+ <td class="nd_default"></td>
2039
+ <td class="nd_comments" rowspan="5">
2040
+ </td>
2041
+ </tr>
2042
+ <tr class="node_desc_evenrow">
2043
+ <td class="nd_field"><tt>restrict?</tt></td>
2044
+ <td class="nd_child"></td>
2045
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2046
+ <td class="nd_default"></td>
2047
+ </tr>
2048
+ <tr class="node_desc_evenrow">
2049
+ <td class="nd_field"><tt>volatile?</tt></td>
2050
+ <td class="nd_child"></td>
2051
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2052
+ <td class="nd_default"></td>
2053
+ </tr>
2054
+ <tr class="node_desc_evenrow">
2055
+ <td class="nd_field"><tt>name</tt></td>
2056
+ <td class="nd_child"></td>
2057
+ <td class="nd_values"><tt>String</tt></td>
2058
+ <td class="nd_default"></td>
2059
+ </tr>
2060
+ <tr class="node_desc_evenrow">
2061
+ <td class="nd_field"><tt>members</tt></td>
2062
+ <td class="nd_child">Y</td>
2063
+ <td class="nd_values"><tt>NodeList</tt> of <tt>Member</tt></td>
2064
+ <td class="nd_default"><tt>NodeArray[]</tt></td>
2065
+ </tr>
2066
+
2067
+ <tr class="node_desc_oddrow">
2068
+ <td class="nd_class" rowspan="5"><tt>Enum</tt></td>
2069
+ <td class="nd_field"><tt>const?</tt></td>
2070
+ <td class="nd_child"></td>
2071
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2072
+ <td class="nd_default"></td>
2073
+ <td class="nd_comments" rowspan="5">
2074
+ </td>
2075
+ </tr>
2076
+ <tr class="node_desc_oddrow">
2077
+ <td class="nd_field"><tt>restrict?</tt></td>
2078
+ <td class="nd_child"></td>
2079
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2080
+ <td class="nd_default"></td>
2081
+ </tr>
2082
+ <tr class="node_desc_oddrow">
2083
+ <td class="nd_field"><tt>volatile?</tt></td>
2084
+ <td class="nd_child"></td>
2085
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2086
+ <td class="nd_default"></td>
2087
+ </tr>
2088
+ <tr class="node_desc_oddrow">
2089
+ <td class="nd_field"><tt>name</tt></td>
2090
+ <td class="nd_child"></td>
2091
+ <td class="nd_values"><tt>String</tt></td>
2092
+ <td class="nd_default"></td>
2093
+ </tr>
2094
+ <tr class="node_desc_oddrow">
2095
+ <td class="nd_field"><tt>members</tt></td>
2096
+ <td class="nd_child">Y</td>
2097
+ <td class="nd_values"><tt>NodeList</tt> of <tt>Enumerator</tt></td>
2098
+ <td class="nd_default"></td>
2099
+ </tr>
2100
+
2101
+ <tr class="node_desc_evenrow">
2102
+ <td class="nd_class" rowspan="4"><tt>CustomType</tt></td>
2103
+ <td class="nd_field"><tt>const?</tt></td>
2104
+ <td class="nd_child"></td>
2105
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2106
+ <td class="nd_default"></td>
2107
+ <td class="nd_comments" rowspan="4">
2108
+ This is for <tt>typedef</tt>'d names.
2109
+ </td>
2110
+ </tr>
2111
+ <tr class="node_desc_evenrow">
2112
+ <td class="nd_field"><tt>restrict?</tt></td>
2113
+ <td class="nd_child"></td>
2114
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2115
+ <td class="nd_default"></td>
2116
+ </tr>
2117
+ <tr class="node_desc_evenrow">
2118
+ <td class="nd_field"><tt>volatile?</tt></td>
2119
+ <td class="nd_child"></td>
2120
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2121
+ <td class="nd_default"></td>
2122
+ </tr>
2123
+ <tr class="node_desc_evenrow">
2124
+ <td class="nd_field"><tt>name</tt></td>
2125
+ <td class="nd_child"></td>
2126
+ <td class="nd_values"><tt>String</tt></td>
2127
+ <td class="nd_default"></td>
2128
+ </tr>
2129
+
2130
+ <tr class="node_desc_oddrow">
2131
+ <td class="nd_class" rowspan="3"><tt>Void</tt></td>
2132
+ <td class="nd_field"><tt>const?</tt></td>
2133
+ <td class="nd_child"></td>
2134
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2135
+ <td class="nd_default"></td>
2136
+ <td class="nd_comments" rowspan="3">
2137
+ <tt>const void</tt>!? Yes, think about: <tt>const void *</tt>.
2138
+ </td>
2139
+ </tr>
2140
+ <tr class="node_desc_oddrow">
2141
+ <td class="nd_field"><tt>restrict?</tt></td>
2142
+ <td class="nd_child"></td>
2143
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2144
+ <td class="nd_default"></td>
2145
+ </tr>
2146
+ <tr class="node_desc_oddrow">
2147
+ <td class="nd_field"><tt>volatile?</tt></td>
2148
+ <td class="nd_child"></td>
2149
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2150
+ <td class="nd_default"></td>
2151
+ </tr>
2152
+
2153
+ <tr class="node_desc_evenrow">
2154
+ <td class="nd_class" rowspan="5"><tt>Int</tt></td>
2155
+ <td class="nd_field"><tt>const?</tt></td>
2156
+ <td class="nd_child"></td>
2157
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2158
+ <td class="nd_default"></td>
2159
+ <td class="nd_comments" rowspan="5">
2160
+ <tt>longness</tt> sounds silly, so here are some less silly
2161
+ methods:
2162
+ <ul>
2163
+ <li><tt>#short?</tt> -- return true iff <tt>longness == -1</tt></li>
2164
+ <li><tt>#plain?</tt> -- return true iff <tt>longness == 0</tt></li>
2165
+ <li><tt>#long?</tt> -- return true iff <tt>longness == 1</tt></li>
2166
+ <li><tt>#long_long?</tt> -- return true iff <tt>longness == 2</tt></li>
2167
+ </ul>
2168
+ Oh, and look, a pseudo-field:
2169
+ <ul>
2170
+ <li><tt>#signed?</tt> -- same as <tt>!unsigned?</tt></li>
2171
+ <li><tt>#signed=(val)</tt> -- same as <tt>unsigned = !val</tt></li>
2172
+ </ul>
2173
+ </td>
2174
+ </tr>
2175
+ <tr class="node_desc_evenrow">
2176
+ <td class="nd_field"><tt>restrict?</tt></td>
2177
+ <td class="nd_child"></td>
2178
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2179
+ <td class="nd_default"></td>
2180
+ </tr>
2181
+ <tr class="node_desc_evenrow">
2182
+ <td class="nd_field"><tt>volatile?</tt></td>
2183
+ <td class="nd_child"></td>
2184
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2185
+ <td class="nd_default"></td>
2186
+ </tr>
2187
+ <tr class="node_desc_evenrow">
2188
+ <td class="nd_field"><tt>longness</tt></td>
2189
+ <td class="nd_child"></td>
2190
+ <td class="nd_values"><tt>-1</tt>, <tt>0</tt>, <tt>1</tt>, <tt>2</tt></td>
2191
+ <td class="nd_default"><tt>0</tt></td>
2192
+ </tr>
2193
+ <tr class="node_desc_evenrow">
2194
+ <td class="nd_field"><tt>unsigned?</tt></td>
2195
+ <td class="nd_child"></td>
2196
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2197
+ <td class="nd_default"></td>
2198
+ </tr>
2199
+
2200
+ <tr class="node_desc_oddrow">
2201
+ <td class="nd_class" rowspan="4"><tt>Float</tt></td>
2202
+ <td class="nd_field"><tt>const?</tt></td>
2203
+ <td class="nd_child"></td>
2204
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2205
+ <td class="nd_default"></td>
2206
+ <td class="nd_comments" rowspan="4">
2207
+ Less silly-sounding <tt>longness</tt> substitutes:
2208
+ <ul>
2209
+ <li><tt>#plain?</tt> -- return true iff <tt>longness == 0</tt></li>
2210
+ <li><tt>#double?</tt> -- return true iff <tt>longness == 1</tt></li>
2211
+ <li><tt>#long_double?</tt> -- return true iff <tt>longness == 2</tt></li>
2212
+ </ul>
2213
+ </td>
2214
+ </tr>
2215
+ <tr class="node_desc_oddrow">
2216
+ <td class="nd_field"><tt>restrict?</tt></td>
2217
+ <td class="nd_child"></td>
2218
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2219
+ <td class="nd_default"></td>
2220
+ </tr>
2221
+ <tr class="node_desc_oddrow">
2222
+ <td class="nd_field"><tt>volatile?</tt></td>
2223
+ <td class="nd_child"></td>
2224
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2225
+ <td class="nd_default"></td>
2226
+ </tr>
2227
+ <tr class="node_desc_oddrow">
2228
+ <td class="nd_field"><tt>longness</tt></td>
2229
+ <td class="nd_child"></td>
2230
+ <td class="nd_values"><tt>0</tt>, <tt>1</tt>, <tt>2</tt></td>
2231
+ <td class="nd_default"><tt>0</tt></td>
2232
+ </tr>
2233
+
2234
+ <tr class="node_desc_evenrow">
2235
+ <td class="nd_class" rowspan="4"><tt>Char</tt></td>
2236
+ <td class="nd_field"><tt>const?</tt></td>
2237
+ <td class="nd_child"></td>
2238
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2239
+ <td class="nd_default"></td>
2240
+ <td class="nd_comments" rowspan="4">
2241
+ Also:
2242
+ <ul>
2243
+ <li><tt>#signed?</tt> -- return true iff <tt>signed == true</tt></li>
2244
+ <li><tt>#unsigned?</tt> -- return true iff <tt>signed == false</tt></li>
2245
+ <li><tt>#plain?</tt> -- return true iff <tt>signed == nil</tt></li>
2246
+ </ul>
2247
+ Yes, C99 says that <tt>char</tt>, <tt>signed char</tt>, and
2248
+ <tt>unsigned char</tt> are 3 distinct types (unlike with
2249
+ <tt>int</tt> -- go figure). Like Martian chalk and Venusian
2250
+ cheese: completely different, but you can fit 'em each in one
2251
+ byte. Mmm, Martian chalk...
2252
+ </td>
2253
+ </tr>
2254
+ <tr class="node_desc_evenrow">
2255
+ <td class="nd_field"><tt>restrict?</tt></td>
2256
+ <td class="nd_child"></td>
2257
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2258
+ <td class="nd_default"></td>
2259
+ </tr>
2260
+ <tr class="node_desc_evenrow">
2261
+ <td class="nd_field"><tt>volatile?</tt></td>
2262
+ <td class="nd_child"></td>
2263
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2264
+ <td class="nd_default"></td>
2265
+ </tr>
2266
+ <tr class="node_desc_evenrow">
2267
+ <td class="nd_field"><tt>signed</tt></td>
2268
+ <td class="nd_child"></td>
2269
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt>, <tt>nil</tt></td>
2270
+ <td class="nd_default"></td>
2271
+ </tr>
2272
+
2273
+ <tr class="node_desc_oddrow">
2274
+ <td class="nd_class" rowspan="3"><tt>Bool</tt></td>
2275
+ <td class="nd_field"><tt>const?</tt></td>
2276
+ <td class="nd_child"></td>
2277
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2278
+ <td class="nd_default"></td>
2279
+ <td class="nd_comments" rowspan="3">
2280
+ This is the rarely seen <tt>_Bool</tt> type.
2281
+ </td>
2282
+ </tr>
2283
+ <tr class="node_desc_oddrow">
2284
+ <td class="nd_field"><tt>restrict?</tt></td>
2285
+ <td class="nd_child"></td>
2286
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2287
+ <td class="nd_default"></td>
2288
+ </tr>
2289
+ <tr class="node_desc_oddrow">
2290
+ <td class="nd_field"><tt>volatile?</tt></td>
2291
+ <td class="nd_child"></td>
2292
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2293
+ <td class="nd_default"></td>
2294
+ </tr>
2295
+
2296
+ <tr class="node_desc_evenrow">
2297
+ <td class="nd_class" rowspan="4"><tt>Complex</tt></td>
2298
+ <td class="nd_field"><tt>const?</tt></td>
2299
+ <td class="nd_child"></td>
2300
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2301
+ <td class="nd_default"></td>
2302
+ <td class="nd_comments" rowspan="4">
2303
+ <p>This is the rarely seen <tt>_Complex</tt> type.</p>
2304
+ <ul>
2305
+ <li><tt>#plain?</tt> -- return true iff <tt>longness == 0</tt></li>
2306
+ <li><tt>#double?</tt> -- return true iff <tt>longness == 1</tt></li>
2307
+ <li><tt>#long_double?</tt> -- return true iff <tt>longness == 2</tt></li>
2308
+ </ul>
2309
+ </td>
2310
+ </tr>
2311
+ <tr class="node_desc_evenrow">
2312
+ <td class="nd_field"><tt>restrict?</tt></td>
2313
+ <td class="nd_child"></td>
2314
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2315
+ <td class="nd_default"></td>
2316
+ </tr>
2317
+ <tr class="node_desc_evenrow">
2318
+ <td class="nd_field"><tt>volatile?</tt></td>
2319
+ <td class="nd_child"></td>
2320
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2321
+ <td class="nd_default"></td>
2322
+ </tr>
2323
+ <tr class="node_desc_evenrow">
2324
+ <td class="nd_field"><tt>longness</tt></td>
2325
+ <td class="nd_child"></td>
2326
+ <td class="nd_values"><tt>0</tt>, <tt>1</tt>, <tt>2</tt></td>
2327
+ <td class="nd_default"><tt>0</tt></td>
2328
+ </tr>
2329
+
2330
+ <tr class="node_desc_oddrow">
2331
+ <td class="nd_class" rowspan="4"><tt>Imaginary</tt></td>
2332
+ <td class="nd_field"><tt>const?</tt></td>
2333
+ <td class="nd_child"></td>
2334
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2335
+ <td class="nd_default"></td>
2336
+ <td class="nd_comments" rowspan="4">
2337
+ <p>This is the rarely seen <tt>_Imaginary</tt> type.</p>
2338
+ <ul>
2339
+ <li><tt>#plain?</tt> -- return true iff <tt>longness == 0</tt></li>
2340
+ <li><tt>#double?</tt> -- return true iff <tt>longness == 1</tt></li>
2341
+ <li><tt>#long_double?</tt> -- return true iff <tt>longness == 2</tt></li>
2342
+ </ul>
2343
+ </td>
2344
+ </tr>
2345
+ <tr class="node_desc_oddrow">
2346
+ <td class="nd_field"><tt>restrict?</tt></td>
2347
+ <td class="nd_child"></td>
2348
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2349
+ <td class="nd_default"></td>
2350
+ </tr>
2351
+ <tr class="node_desc_oddrow">
2352
+ <td class="nd_field"><tt>volatile?</tt></td>
2353
+ <td class="nd_child"></td>
2354
+ <td class="nd_values"><tt>true</tt>, <tt>false</tt></td>
2355
+ <td class="nd_default"></td>
2356
+ </tr>
2357
+ <tr class="node_desc_oddrow">
2358
+ <td class="nd_field"><tt>longness</tt></td>
2359
+ <td class="nd_child"></td>
2360
+ <td class="nd_values"><tt>0</tt>, <tt>1</tt>, <tt>2</tt></td>
2361
+ <td class="nd_default"><tt>0</tt></td>
2362
+ </tr>
2363
+ </tbody></table>
2364
+
2365
+ <h3>Node Construction</h3>
2366
+
2367
+ <p>
2368
+ Wanna make a <tt>Node</tt>? Take your pick:
2369
+ </p>
2370
+ <ul>
2371
+ <li>
2372
+ <tt>#new(field1, field2, ...)</tt> -- fields are in the order
2373
+ listed above.
2374
+ </li>
2375
+ <li>
2376
+ <tt>#new(:field1 => val, :field2 => val, ...)</tt> -- field order
2377
+ doesn't matter this way.
2378
+ </li>
2379
+ <li>
2380
+ <tt>#new_at(pos, *args)</tt> -- set the <tt>pos</tt> to that
2381
+ given, and pass <tt>args</tt> to <tt>#new</tt>.
2382
+ </li>
2383
+ </ul>
2384
+
2385
+ <p>
2386
+ They're for losers, though. What you really want to do is make
2387
+ <tt>Node</tt>s by parsing C code. Each class -- even the abstract
2388
+ classes like <tt>Statement</tt> -- has a <tt>.parse</tt> method:
2389
+ <pre class="code_snippet">
2390
+ funcdef = C::FunctionDef.parse &lt;&lt;EOS
2391
+ void frobnicate(int karma) {
2392
+ use_waffle_iron();
2393
+ }
2394
+
2395
+ stmt = C::Statement.parse('while (not_looking) paint_car();')
2396
+ </pre>
2397
+ </p>
2398
+ <p>
2399
+ Need to tell it to treat <tt>WaffleIron</tt> as a type name? All
2400
+ those <tt>parse</tt> methods use <tt>C.default_parser</tt>:
2401
+ <pre class="code_snippet">
2402
+ C.default_parser.type_names << 'WaffleIron'
2403
+ type = C::Type.parse('WaffleIron')
2404
+ </pre>
2405
+
2406
+ <p>Alternatively, you could've given <tt>parse</tt> your own
2407
+ parser:</p>
2408
+
2409
+ <pre class="code_snippet">
2410
+ parser = C::Parser.new
2411
+ parser.type_names << 'WaffleIron'
2412
+ type = C::Type.parse('WaffleIron', parser)
2413
+ </pre>
2414
+ </p>
2415
+ <p>
2416
+ In fact, there's also <tt>C.parse(str, parser=nil)</tt>, which is an
2417
+ alias for <tt>C::TranslationUnit.parse(str, parser)</tt>.
2418
+ </p>
2419
+ <pre class="code_snippet">
2420
+ ast = C.parse(STDIN)
2421
+ </pre>
2422
+ <p>
2423
+ Yes, all that talk in the intro about doing <tt>parser =
2424
+ C::Parser.new; parser.parse(...)</tt> was actually all a charade to
2425
+ make you type more. I so own you.
2426
+ </p>
2427
+
2428
+ <a name="open_issues"></a><h2>Open Issues</h2>
2429
+ <ul>
2430
+ <li>
2431
+ Is it okay to bastardize the <tt>=~</tt> operator like that?
2432
+ </li>
2433
+ <li>
2434
+ Should binary operators have a list of expressions rather than
2435
+ just 2? That'd allow to_s to format the strings better in some
2436
+ cases and make it consistent with Comma.
2437
+ </li>
2438
+ <li>
2439
+ At the moment CAST chokes on preprocessor #-lines. Ruby makes it
2440
+ trivial to filter these out before passing the string to
2441
+ <tt>Parser#parse</tt>, and this makes it obvious when you forget
2442
+ to run a file through the preprocessor (which you need to do to
2443
+ get type names at least once). Is this stupid? Ideally we should
2444
+ probably have a builtin preprocessor and use that.
2445
+ </li>
2446
+ <li>
2447
+ Should a <tt>Member</tt> be allowed in <tt>MemberInit#member</tt>?
2448
+ It'd be the common case, but special cases make uniform treatment
2449
+ more arduous. Is "uniform treatment" an issue?
2450
+ </li>
2451
+ <li>
2452
+ Should <tt>to_debug</tt> have a better name? What?
2453
+ </li>
2454
+ </ul>
2455
+
2456
+ <p>
2457
+ <a href="mailto:g_ogata@optushome.com.au">Vote now</a>.
2458
+ </p>
2459
+
2460
+ <a name="to_do"></a><h2>To Do</h2>
2461
+ <ul>
2462
+ <li>
2463
+ Stop embarrasing yourself and write the parser in C.
2464
+ </li>
2465
+ <li>
2466
+ Make it <tt>-wd</tt> friendly.
2467
+ </li>
2468
+ <li>
2469
+ Fix the "TODO" bits in <tt>c.y</tt>. These are for rarely used C
2470
+ constructs, like the declaration <tt>int arr[*];</tt>.
2471
+ </li>
2472
+ <li>
2473
+ Add a comment node. Might make it useful for doc extraction.
2474
+ Anyone want this? Not all comments will be caught, though.
2475
+ Comments can appear between any two tokens, and I don't really
2476
+ want to add comment fields to every node. They'd probably just
2477
+ appear between toplevel entities (in
2478
+ <tt>TranslationUnit#entities</tt>) and between statements (in
2479
+ <tt>Block#stmts</tt>).
2480
+ </li>
2481
+ <li>
2482
+ Make it rdoc-able.
2483
+ </li>
2484
+ <li>
2485
+ Make a starmonkey.
2486
+ </li>
2487
+ </ul>
2488
+
2489
+ <p>
2490
+ If any of these affect you greatly, <a
2491
+ href="mailto:g_ogata@optushome.com.au">kick me</a> to make it happen
2492
+ faster.
2493
+ </p>
2494
+
2495
+ <a name="to_do"></a><h2>Contact</h2>
2496
+
2497
+ I'm not really sure what people are going to try to use this for. If
2498
+ there's some functionality you think would make a good addition, or
2499
+ think I've made a mess of this poor puppy, give me a yell.
2500
+
2501
+ <p>I read <a href="mailto:ruby-talk@ruby-lang.org">ruby-talk</a> (a.k.a. <a href="news:comp.lang.ruby">comp.lang.ruby</a>).</p>
2502
+
2503
+ <p>
2504
+ You can also spam me at <a
2505
+ href="mailto:g_ogata@optushome.com.au">g_ogata@optushome.com.au</a>.
2506
+ It'd help if you prefixed the subject with "[cast] " so I can easily
2507
+ distinguish CAST spam from fake Rolex spam.
2508
+ </p>
2509
+
2510
+ </td></tr></table> <!-- frame table -->
2511
+
2512
+ </body>
2513
+ </html>