cast 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,22 +1,22 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ ROOT = File.expand_path('..', File.dirname(__FILE__))
4
+ $:.unshift "#{ROOT}/lib"
5
+
3
6
  require 'test/unit'
4
7
  require 'stringio'
8
+ require 'fileutils'
9
+ require 'cast'
5
10
 
6
- # require cast
7
- CAST_ROOT = File.expand_path('..', File.dirname(__FILE__))
8
- ENV['CAST_EXTDIR'] = "#{CAST_ROOT}/ext"
9
- ENV['CAST_LIBDIR'] = "#{CAST_ROOT}/lib/cast"
10
- require "#{CAST_ROOT}/lib/cast.rb"
11
+ # a dir to cd into for creating files and such
12
+ TEST_DIR = "#{File.dirname(__FILE__)}/var"
11
13
 
12
- ###
13
- ### ------------------------------------------------------------------
14
- ### Helpers for testing
15
- ### ------------------------------------------------------------------
16
- ###
14
+ # --------------------------------------------------------------------
15
+ # Helpers for testing
16
+ # --------------------------------------------------------------------
17
17
 
18
18
  class Array
19
- def same_list? other
19
+ def same_list?(other)
20
20
  self.length == other.length or
21
21
  return false
22
22
  self.zip(other).all? do |mine, yours|
@@ -27,60 +27,60 @@ class Array
27
27
  end
28
28
 
29
29
  class Integer
30
- ###
31
- ### Return a `self'-element array containing the result of the given
32
- ### block.
33
- ###
34
- def of &blk
30
+ #
31
+ # Return a `self'-element array containing the result of the given
32
+ # block.
33
+ #
34
+ def of(&blk)
35
35
  Array.new(self, &blk)
36
36
  end
37
37
  end
38
38
 
39
39
  module Test::Unit::Assertions
40
40
  INDENT = ' '
41
- ###
42
- ### Assert that the given string is parsed as expected. The given
43
- ### string is of the format:
44
- ###
45
- ### <program>
46
- ### ----
47
- ### <expected inspect string>
48
- ###
49
- ### The <program> part is yielded to obtain the AST.
50
- ###
51
- def check_ast test_data
41
+ #
42
+ # Assert that the given string is parsed as expected. The given
43
+ # string is of the format:
44
+ #
45
+ # <program>
46
+ # ----
47
+ # <expected inspect string>
48
+ #
49
+ # The <program> part is yielded to obtain the AST.
50
+ #
51
+ def check_ast(test_data)
52
52
  inp, exp = test_data.split(/^----+\n/)
53
53
  ast = yield(inp)
54
54
  assert_tree(ast)
55
55
  assert(ast.is_a?(C::Node))
56
56
  assert_equal_inspect_strs(exp, ast.inspect)
57
57
  end
58
- ###
59
- ### Assert that the given Node#inspect strings are equal.
60
- ###
61
- def assert_equal_inspect_strs exp, out
62
- ## remove EOL space
58
+ #
59
+ # Assert that the given Node#inspect strings are equal.
60
+ #
61
+ def assert_equal_inspect_strs(exp, out)
62
+ # remove EOL space
63
63
  out = out.gsub(/ *$/, '')
64
64
  exp = exp.gsub(/ *$/, '')
65
65
 
66
- ## normalize BOL space
66
+ # normalize BOL space
67
67
  exp.gsub!(%r'^#{INDENT}*') do |s|
68
68
  levels = s.length / INDENT.length
69
69
  C::Node::INSPECT_TAB*levels
70
70
  end
71
71
 
72
- ## compare
72
+ # compare
73
73
  msg = "Debug strings unequal:\n#{juxtapose('Expected', exp, 'Output', out)}"
74
74
  assert_block(msg){out == exp}
75
75
  end
76
- ###
77
- ### Return a string of `s1' and `s2' side by side with a dividing
78
- ### line in between indicating differences. `h1' and `h2' are the
79
- ### column headings.
80
- ###
81
- def juxtapose h1, s1, h2, s2
82
- s1 = s1.map{|line| line.chomp}
83
- s2 = s2.map{|line| line.chomp}
76
+ #
77
+ # Return a string of `s1' and `s2' side by side with a dividing line
78
+ # in between indicating differences. `h1' and `h2' are the column
79
+ # headings.
80
+ #
81
+ def juxtapose(h1, s1, h2, s2)
82
+ s1 = s1.split("\n")
83
+ s2 = s2.split("\n")
84
84
  rows = [s1.length, s2.length].max
85
85
  wl = s1.map{|line| line.length}.max
86
86
  wr = s2.map{|line| line.length}.max
@@ -102,11 +102,11 @@ module Test::Unit::Assertions
102
102
  ret << "#{('-'*wl)}----#{'-'*wr}\n"
103
103
  return ret
104
104
  end
105
- ###
106
- ### Assert that an exception of the given class is raised, and that
107
- ### the message matches the given regex.
108
- ###
109
- def assert_error klass, re
105
+ #
106
+ # Assert that an exception of the given class is raised, and that
107
+ # the message matches the given regex.
108
+ #
109
+ def assert_error(klass, re)
110
110
  ex = nil
111
111
  assert_raise(klass) do
112
112
  begin
@@ -117,11 +117,11 @@ module Test::Unit::Assertions
117
117
  end
118
118
  assert_match(re, ex.message)
119
119
  end
120
- ###
121
- ### Assert that the given ast's nodes' parents are correct, and
122
- ### there aren't non-Nodes where there shouldn't be.
123
- ###
124
- def assert_tree ast
120
+ #
121
+ # Assert that the given ast's nodes' parents are correct, and there
122
+ # aren't non-Nodes where there shouldn't be.
123
+ #
124
+ def assert_tree(ast)
125
125
  meth = 'unknown method'
126
126
  caller.each do |line|
127
127
  if line =~ /in `(test_.*?)'/ #`
@@ -139,8 +139,8 @@ module Test::Unit::Assertions
139
139
  flunk("#{e.message}. Output dumped to `#{filename}'.")
140
140
  end
141
141
  end
142
- ###
143
- def assert_tree1 x, parent
142
+ #
143
+ def assert_tree1(x, parent)
144
144
  if x.is_a? C::Node
145
145
  parent.equal? x.parent or
146
146
  raise BadTreeError, "#{x.class}:0x#{(x.id << 1).to_s(16)} has #{x.parent ? 'wrong' : 'no'} parent"
@@ -155,53 +155,41 @@ module Test::Unit::Assertions
155
155
  end
156
156
  end
157
157
  class BadTreeError < StandardError; end
158
- ###
159
- ### Assert that `arg' is a C::NodeList.
160
- ###
161
- def assert_list arg
158
+ #
159
+ # Assert that `arg' is a C::NodeList.
160
+ #
161
+ def assert_list(arg)
162
162
  assert_kind_of(C::NodeList, arg)
163
163
  end
164
- ###
165
- ### Assert that `arg' is an empty C::NodeList.
166
- ###
167
- def assert_empty_list arg
164
+ #
165
+ # Assert that `arg' is an empty C::NodeList.
166
+ #
167
+ def assert_empty_list(arg)
168
168
  assert_list arg
169
169
  assert(arg.empty?)
170
170
  end
171
- ###
172
- ### Assert that the elements of exp are the same as those of out,
173
- ### and are in the same order.
174
- ###
175
- def assert_same_list exp, out
171
+ #
172
+ # Assert that the elements of exp are the same as those of out, and
173
+ # are in the same order.
174
+ #
175
+ def assert_same_list(exp, out)
176
176
  assert_equal(exp.length, out.length, "Checking length")
177
177
  (0...exp.length).each do |i|
178
178
  assert_same(exp[i], out[i], "At index #{i} (of 0...#{exp.length})")
179
179
  end
180
180
  end
181
- ###
182
- ### Assert that out is ==, but not the same as exp (i.e., it is a
183
- ### copy).
184
- ###
185
- def assert_copy exp, out
181
+ #
182
+ # Assert that out is ==, but not the same as exp (i.e., it is a
183
+ # copy).
184
+ #
185
+ def assert_copy(exp, out)
186
186
  assert_not_same exp, out
187
187
  assert_equal exp, out
188
188
  end
189
- ###
190
- ### Assert the invariants of `node'.
191
- ###
192
- def assert_invariants node
189
+ #
190
+ # Assert the invariants of `node'.
191
+ #
192
+ def assert_invariants(node)
193
193
  node.assert_invariants(self)
194
194
  end
195
195
  end
196
-
197
- ###
198
- ### ------------------------------------------------------------------
199
- ### Main
200
- ### ------------------------------------------------------------------
201
- ###
202
-
203
- if $0 == __FILE__
204
- Dir.new(Dir.pwd).grep(/^test_/) do |filename|
205
- require "#{Dir.pwd}/#{filename}"
206
- end
207
- end
metadata CHANGED
@@ -1,68 +1,114 @@
1
- --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.8.11
3
- specification_version: 1
1
+ --- !ruby/object:Gem::Specification
4
2
  name: cast
5
- version: !ruby/object:Gem::Version
6
- version: 0.1.0
7
- date: 2006-04-26 00:00:00 +10:00
8
- summary: C parser and AST constructor.
9
- require_paths:
10
- - lib
11
- email: george.ogata@gmail.com
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
- - !ruby/object:Gem::Version
23
- version: 0.0.0
24
- version:
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ prerelease:
25
6
  platform: ruby
26
- signing_key:
27
- cert_chain:
28
- authors:
7
+ authors:
29
8
  - George Ogata
30
- files:
31
- - README
32
- - lib/cast
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-05-14 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: ritual
16
+ requirement: &70254348936800 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.4.0
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70254348936800
25
+ - !ruby/object:Gem::Dependency
26
+ name: racc
27
+ requirement: &70254349108160 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 1.4.8
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70254349108160
36
+ description:
37
+ email:
38
+ - george.ogata@gmail.com
39
+ executables: []
40
+ extensions:
41
+ - ext/extconf.rb
42
+ extra_rdoc_files: []
43
+ files:
44
+ - .gitignore
45
+ - CHANGELOG
46
+ - Gemfile
47
+ - LICENSE
48
+ - README.markdown
49
+ - Rakefile
50
+ - cast.gemspec
51
+ - ext/cast.c
52
+ - ext/cast.h
53
+ - ext/extconf.rb
54
+ - ext/parser.c
55
+ - ext/yylex.re
33
56
  - lib/cast.rb
34
- - lib/cast/node.rb
35
57
  - lib/cast/c.y
36
58
  - lib/cast/c_nodes.rb
37
59
  - lib/cast/inspect.rb
60
+ - lib/cast/node.rb
38
61
  - lib/cast/node_list.rb
39
62
  - lib/cast/parse.rb
63
+ - lib/cast/preprocessor.rb
64
+ - lib/cast/tempfile.rb
40
65
  - lib/cast/to_s.rb
41
- - ext/cast_ext.c
42
- - ext/cast.h
43
- - ext/extconf.rb
44
- - ext/parser.c
45
- - ext/yylex.re
46
- - doc/index.html
47
- - test/test_node.rb
48
- - test/run.rb
49
- - test/test_c_nodes.rb
50
- - test/test_node_list.rb
51
- - test/test_parse.rb
52
- - test/test_parser.rb
66
+ - lib/cast/version.rb
67
+ - test/all.rb
68
+ - test/c_nodes_test.rb
69
+ - test/lexer_test.rb
70
+ - test/node_list_test.rb
71
+ - test/node_test.rb
72
+ - test/parse_test.rb
73
+ - test/parser_test.rb
74
+ - test/preprocessor_test.rb
75
+ - test/render_test.rb
76
+ - test/test_helper.rb
53
77
  - ext/yylex.c
54
78
  - lib/cast/c.tab.rb
55
- test_files:
56
- - test/run.rb
79
+ homepage: http://github.com/oggy/cast
80
+ licenses: []
81
+ post_install_message:
57
82
  rdoc_options: []
58
-
59
- extra_rdoc_files: []
60
-
61
- executables: []
62
-
63
- extensions:
64
- - ext/extconf.rb
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ! '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ required_rubygems_version: !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
65
97
  requirements: []
66
-
67
- dependencies: []
68
-
98
+ rubyforge_project:
99
+ rubygems_version: 1.8.10
100
+ signing_key:
101
+ specification_version: 3
102
+ summary: C parser and AST constructor.
103
+ test_files:
104
+ - test/all.rb
105
+ - test/c_nodes_test.rb
106
+ - test/lexer_test.rb
107
+ - test/node_list_test.rb
108
+ - test/node_test.rb
109
+ - test/parse_test.rb
110
+ - test/parser_test.rb
111
+ - test/preprocessor_test.rb
112
+ - test/render_test.rb
113
+ - test/test_helper.rb
114
+ has_rdoc:
data/README DELETED
@@ -1,6 +0,0 @@
1
- Gem install: gem install cast
2
- Gem uninstall: gem uninstall cast
3
- Site install: rake install
4
- Site uninstall: rake uninstall
5
- Documentation: See doc/index.html. Latest at http://cast.rubyforge.org .
6
- Licence: Ruby's.
@@ -1,2505 +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
- p tree
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>#inspect</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>-or-<tt>Type</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
- </ul>
2452
-
2453
- <p>
2454
- <a href="mailto:george.ogata@gmail.com">Vote now</a>.
2455
- </p>
2456
-
2457
- <a name="to_do"></a><h2>To Do</h2>
2458
- <ul>
2459
- <li>
2460
- Stop embarrasing yourself and write the parser in C.
2461
- </li>
2462
- <li>
2463
- Make it <tt>-wd</tt> friendly.
2464
- </li>
2465
- <li>
2466
- Fix the "TODO" bits in <tt>c.y</tt>. These are for rarely used C
2467
- constructs, like the declaration <tt>int arr[*];</tt>.
2468
- </li>
2469
- <li>
2470
- Add a comment node. Might make it useful for doc extraction.
2471
- Anyone want this? Not all comments will be caught, though.
2472
- Comments can appear between any two tokens, and I don't really
2473
- want to add comment fields to every node. They'd probably just
2474
- appear between toplevel entities (in
2475
- <tt>TranslationUnit#entities</tt>) and between statements (in
2476
- <tt>Block#stmts</tt>).
2477
- </li>
2478
- <li>
2479
- Make it rdoc-able.
2480
- </li>
2481
- </ul>
2482
-
2483
- <p>
2484
- If any of these affect you greatly, <a
2485
- href="mailto:george.ogata@gmail.com">kick me</a> to make it happen
2486
- faster.
2487
- </p>
2488
-
2489
- <a name="to_do"></a><h2>Contact</h2>
2490
-
2491
- I'm not really sure what people are going to try to use this for. If
2492
- there's some functionality you think would make a good addition, or
2493
- think I've made a mess of this poor puppy, give me a yell.
2494
-
2495
- <p>
2496
- You can spam me at <a
2497
- href="mailto:george.ogata@gmail.com">george.ogata@gmail.com</a>.
2498
- It'd help if you prefixed the subject with "[cast] " so I can easily
2499
- distinguish CAST spam from fake Rolex spam.
2500
- </p>
2501
-
2502
- </td></tr></table> <!-- frame table -->
2503
-
2504
- </body>
2505
- </html>