csquare-cast 0.2.2

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