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