csquare-cast 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
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