cast 0.0.1 → 0.3.1

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