cast 0.0.1 → 0.3.1

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