xdrgen 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/Guardfile +12 -0
- data/LICENSE.txt +202 -0
- data/README.md +79 -0
- data/Rakefile +6 -0
- data/bin/xdrgen +5 -0
- data/lib/xdrgen.rb +24 -0
- data/lib/xdrgen/ast.rb +81 -0
- data/lib/xdrgen/ast/concerns/contained.rb +32 -0
- data/lib/xdrgen/ast/concerns/has_children.rb +9 -0
- data/lib/xdrgen/ast/concerns/has_definitions.rb +90 -0
- data/lib/xdrgen/ast/concerns/named.rb +16 -0
- data/lib/xdrgen/ast/concerns/namespace.rb +7 -0
- data/lib/xdrgen/ast/concerns/nested_definition.rb +16 -0
- data/lib/xdrgen/ast/constant.rb +7 -0
- data/lib/xdrgen/ast/decimal_constant.rb +7 -0
- data/lib/xdrgen/ast/declarations/array.rb +15 -0
- data/lib/xdrgen/ast/declarations/base.rb +28 -0
- data/lib/xdrgen/ast/declarations/opaque.rb +11 -0
- data/lib/xdrgen/ast/declarations/optional.rb +5 -0
- data/lib/xdrgen/ast/declarations/simple.rb +7 -0
- data/lib/xdrgen/ast/declarations/string.rb +7 -0
- data/lib/xdrgen/ast/declarations/void.rb +7 -0
- data/lib/xdrgen/ast/definitions/base.rb +9 -0
- data/lib/xdrgen/ast/definitions/const.rb +12 -0
- data/lib/xdrgen/ast/definitions/enum.rb +17 -0
- data/lib/xdrgen/ast/definitions/enum_member.rb +44 -0
- data/lib/xdrgen/ast/definitions/namespace.rb +9 -0
- data/lib/xdrgen/ast/definitions/nested_enum.rb +7 -0
- data/lib/xdrgen/ast/definitions/nested_struct.rb +7 -0
- data/lib/xdrgen/ast/definitions/nested_union.rb +7 -0
- data/lib/xdrgen/ast/definitions/struct.rb +18 -0
- data/lib/xdrgen/ast/definitions/struct_body.rb +11 -0
- data/lib/xdrgen/ast/definitions/struct_member.rb +12 -0
- data/lib/xdrgen/ast/definitions/typedef.rb +19 -0
- data/lib/xdrgen/ast/definitions/union.rb +55 -0
- data/lib/xdrgen/ast/definitions/union_arm.rb +33 -0
- data/lib/xdrgen/ast/definitions/union_arm_case.rb +11 -0
- data/lib/xdrgen/ast/definitions/union_body.rb +22 -0
- data/lib/xdrgen/ast/definitions/union_default_arm.rb +19 -0
- data/lib/xdrgen/ast/fixed_size.rb +23 -0
- data/lib/xdrgen/ast/hexadecimal_constant.rb +7 -0
- data/lib/xdrgen/ast/identifier.rb +5 -0
- data/lib/xdrgen/ast/octal_constant.rb +7 -0
- data/lib/xdrgen/ast/top.rb +5 -0
- data/lib/xdrgen/ast/typespecs/base.rb +27 -0
- data/lib/xdrgen/ast/typespecs/bool.rb +5 -0
- data/lib/xdrgen/ast/typespecs/double.rb +5 -0
- data/lib/xdrgen/ast/typespecs/float.rb +5 -0
- data/lib/xdrgen/ast/typespecs/hyper.rb +6 -0
- data/lib/xdrgen/ast/typespecs/int.rb +6 -0
- data/lib/xdrgen/ast/typespecs/opaque.rb +10 -0
- data/lib/xdrgen/ast/typespecs/quadruple.rb +5 -0
- data/lib/xdrgen/ast/typespecs/simple.rb +14 -0
- data/lib/xdrgen/ast/typespecs/string.rb +9 -0
- data/lib/xdrgen/ast/typespecs/unsigned_hyper.rb +5 -0
- data/lib/xdrgen/ast/typespecs/unsigned_int.rb +5 -0
- data/lib/xdrgen/ast/var_size.rb +26 -0
- data/lib/xdrgen/ast/whitespace.rb +5 -0
- data/lib/xdrgen/cli.rb +31 -0
- data/lib/xdrgen/compilation.rb +31 -0
- data/lib/xdrgen/generators.rb +16 -0
- data/lib/xdrgen/generators/base.rb +11 -0
- data/lib/xdrgen/generators/elixir.rb +260 -0
- data/lib/xdrgen/generators/go.rb +578 -0
- data/lib/xdrgen/generators/java.rb +810 -0
- data/lib/xdrgen/generators/java/XdrDataInputStream.erb +122 -0
- data/lib/xdrgen/generators/java/XdrDataOutputStream.erb +96 -0
- data/lib/xdrgen/generators/java/XdrElement.erb +10 -0
- data/lib/xdrgen/generators/java/XdrString.erb +58 -0
- data/lib/xdrgen/generators/javascript.rb +248 -0
- data/lib/xdrgen/generators/ruby.rb +283 -0
- data/lib/xdrgen/grammar/base.treetop +71 -0
- data/lib/xdrgen/grammar/comments.treetop +15 -0
- data/lib/xdrgen/grammar/const.treetop +8 -0
- data/lib/xdrgen/grammar/declaration.treetop +99 -0
- data/lib/xdrgen/grammar/enum.treetop +46 -0
- data/lib/xdrgen/grammar/main.treetop +30 -0
- data/lib/xdrgen/grammar/namespace.treetop +12 -0
- data/lib/xdrgen/grammar/struct.treetop +32 -0
- data/lib/xdrgen/grammar/typedef.treetop +12 -0
- data/lib/xdrgen/grammar/union.treetop +63 -0
- data/lib/xdrgen/output.rb +37 -0
- data/lib/xdrgen/output_file.rb +87 -0
- data/lib/xdrgen/parser.rb +40 -0
- data/lib/xdrgen/version.rb +3 -0
- data/spec/fixtures/generator/block_comments.x +14 -0
- data/spec/fixtures/generator/const.x +4 -0
- data/spec/fixtures/generator/enum.x +36 -0
- data/spec/fixtures/generator/nesting.x +24 -0
- data/spec/fixtures/generator/optional.x +8 -0
- data/spec/fixtures/generator/struct.x +10 -0
- data/spec/fixtures/generator/test.x +77 -0
- data/spec/fixtures/generator/union.x +28 -0
- data/spec/fixtures/parser/block_comments.x +14 -0
- data/spec/fixtures/parser/const.x +1 -0
- data/spec/fixtures/parser/enum.x +35 -0
- data/spec/fixtures/parser/nesting.x +26 -0
- data/spec/fixtures/parser/optional.x +8 -0
- data/spec/fixtures/parser/struct.x +8 -0
- data/spec/fixtures/parser/test.x +77 -0
- data/spec/fixtures/parser/union.x +10 -0
- data/spec/lib/xdrgen/generator_spec.rb +30 -0
- data/spec/lib/xdrgen/output_file_spec.rb +33 -0
- data/spec/lib/xdrgen/parser_spec.rb +27 -0
- data/spec/spec_helper.rb +13 -0
- data/spec/support/fixtures.rb +27 -0
- data/xdrgen.gemspec +32 -0
- metadata +301 -0
@@ -0,0 +1,283 @@
|
|
1
|
+
module Xdrgen
|
2
|
+
module Generators
|
3
|
+
|
4
|
+
class Ruby < Xdrgen::Generators::Base
|
5
|
+
|
6
|
+
def generate
|
7
|
+
render_index
|
8
|
+
render_definitions(@top)
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
def render_index
|
13
|
+
root_file = "#{@namespace}.rb"
|
14
|
+
out = @output.open(root_file)
|
15
|
+
render_top_matter out
|
16
|
+
|
17
|
+
render_definitions_index(out, @top)
|
18
|
+
end
|
19
|
+
|
20
|
+
def render_definitions_index(out, node)
|
21
|
+
|
22
|
+
node.definitions.each do |member|
|
23
|
+
case member
|
24
|
+
when AST::Definitions::Namespace ;
|
25
|
+
render_namespace_index(out, member)
|
26
|
+
when AST::Definitions::Typedef ;
|
27
|
+
render_typedef(out, member)
|
28
|
+
when AST::Definitions::Const ;
|
29
|
+
render_const(out, member)
|
30
|
+
when AST::Definitions::Struct,
|
31
|
+
AST::Definitions::Union,
|
32
|
+
AST::Definitions::Enum ;
|
33
|
+
render_autoload(out, member)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def render_namespace_index(out, ns)
|
39
|
+
out.puts "module #{name_string ns.name}"
|
40
|
+
out.indent do
|
41
|
+
out.puts "include XDR::Namespace"
|
42
|
+
out.break
|
43
|
+
render_definitions_index(out, ns)
|
44
|
+
out.unbreak
|
45
|
+
end
|
46
|
+
out.puts "end"
|
47
|
+
end
|
48
|
+
|
49
|
+
def render_autoload(out, named)
|
50
|
+
out.puts "autoload :#{name_string named.name}"
|
51
|
+
end
|
52
|
+
|
53
|
+
def render_typedef(out, typedef)
|
54
|
+
out.puts "#{name_string typedef.name} = #{decl_string(typedef.declaration)}"
|
55
|
+
end
|
56
|
+
|
57
|
+
def render_const(out, const)
|
58
|
+
out.puts "#{const.name.underscore.upcase} = #{const.value}"
|
59
|
+
end
|
60
|
+
|
61
|
+
def render_definitions(node)
|
62
|
+
node.definitions.each(&method(:render_definition))
|
63
|
+
node.namespaces.each(&method(:render_definitions))
|
64
|
+
end
|
65
|
+
|
66
|
+
def render_definition(defn)
|
67
|
+
case defn
|
68
|
+
when AST::Definitions::Struct ;
|
69
|
+
render_struct defn
|
70
|
+
when AST::Definitions::Enum ;
|
71
|
+
render_enum defn
|
72
|
+
when AST::Definitions::Union ;
|
73
|
+
render_union defn
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def render_struct(struct)
|
78
|
+
render_element "class", struct, "< XDR::Struct" do |out|
|
79
|
+
|
80
|
+
render_nested_definitions out, struct
|
81
|
+
|
82
|
+
out.balance_after /,[\s]*/ do
|
83
|
+
struct.members.each do |m|
|
84
|
+
out.puts "attribute :#{m.name.underscore}, #{decl_string(m.declaration)}"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def render_enum(enum)
|
91
|
+
render_element "class", enum, "< XDR::Enum" do |out|
|
92
|
+
out.balance_after /,[\s]*/ do
|
93
|
+
enum.members.each do |em|
|
94
|
+
out.puts "member :#{em.name.underscore}, #{em.value}"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
out.break
|
98
|
+
out.puts "seal"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def render_union(union)
|
103
|
+
|
104
|
+
render_element "class", union, "< XDR::Union" do |out|
|
105
|
+
render_nested_definitions out, union
|
106
|
+
|
107
|
+
out.puts "switch_on #{type_string union.discriminant.type}, :#{union.discriminant_name}"
|
108
|
+
out.break
|
109
|
+
|
110
|
+
out.balance_after /,[\s]*/ do
|
111
|
+
union.normal_arms.each do |arm|
|
112
|
+
arm.cases.each do |c|
|
113
|
+
value = c.value.text_value
|
114
|
+
value = ":#{value.underscore}" if c.value.is_a?(AST::Identifier)
|
115
|
+
render_union_switch(out, value, arm)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
if union.default_arm.present?
|
120
|
+
render_union_switch(out, ":default", union.default_arm)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
out.break
|
124
|
+
|
125
|
+
out.balance_after /,[\s]*/ do
|
126
|
+
union.arms.each do |a|
|
127
|
+
next if a.void?
|
128
|
+
out.puts "attribute :#{a.name.underscore}, #{decl_string(a.declaration)}"
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def render_union_switch(out, switch, arm)
|
135
|
+
if arm.void?
|
136
|
+
out.puts "switch #{switch}"
|
137
|
+
else
|
138
|
+
out.puts "switch #{switch}, :#{arm.name.underscore}"
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def render_nested_definitions(out, parent)
|
143
|
+
ndefn = parent.nested_definitions
|
144
|
+
return if ndefn.empty?
|
145
|
+
ndefn.each(&method(:render_definition))
|
146
|
+
|
147
|
+
out.puts "include XDR::Namespace"
|
148
|
+
out.break
|
149
|
+
ndefn.each{|ndefn| render_autoload out, ndefn}
|
150
|
+
out.break
|
151
|
+
end
|
152
|
+
|
153
|
+
# TODO: find a better name
|
154
|
+
# This renders the skeletal structure of enums, structs, and unions
|
155
|
+
def render_element(type, element, post_name="")
|
156
|
+
path = element.fully_qualified_name.map(&:underscore).join("/") + ".rb"
|
157
|
+
name = name_string element.name
|
158
|
+
out = @output.open(path)
|
159
|
+
render_top_matter out
|
160
|
+
render_source_comment out, element
|
161
|
+
|
162
|
+
render_containers out, element.namespaces do
|
163
|
+
out.puts "#{type} #{name} #{post_name}"
|
164
|
+
out.indent do
|
165
|
+
yield out
|
166
|
+
out.unbreak
|
167
|
+
end
|
168
|
+
out.puts "end"
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
def render_source_comment(out, defn)
|
173
|
+
return if defn.is_a?(AST::Definitions::Namespace)
|
174
|
+
|
175
|
+
out.puts <<-EOS.strip_heredoc
|
176
|
+
# === xdr source ============================================================
|
177
|
+
#
|
178
|
+
EOS
|
179
|
+
|
180
|
+
out.puts "# " + defn.text_value.split("\n").join("\n# ")
|
181
|
+
|
182
|
+
out.puts <<-EOS.strip_heredoc
|
183
|
+
#
|
184
|
+
# ===========================================================================
|
185
|
+
EOS
|
186
|
+
end
|
187
|
+
|
188
|
+
def render_top_matter(out)
|
189
|
+
out.puts <<-EOS.strip_heredoc
|
190
|
+
# This code was automatically generated using xdrgen
|
191
|
+
# DO NOT EDIT or your changes may be overwritten
|
192
|
+
|
193
|
+
require 'xdr'
|
194
|
+
EOS
|
195
|
+
out.break
|
196
|
+
end
|
197
|
+
|
198
|
+
|
199
|
+
def render_containers(out, containers, &block)
|
200
|
+
cur = containers.first
|
201
|
+
|
202
|
+
if cur.blank?
|
203
|
+
block.call
|
204
|
+
return
|
205
|
+
end
|
206
|
+
|
207
|
+
type = case cur
|
208
|
+
when AST::Definitions::Union, AST::Definitions::Struct ;
|
209
|
+
"class"
|
210
|
+
else
|
211
|
+
"module"
|
212
|
+
end
|
213
|
+
|
214
|
+
out.puts "#{type} #{name_string cur.name}"
|
215
|
+
out.indent do
|
216
|
+
render_containers(out, containers.drop(1), &block)
|
217
|
+
end
|
218
|
+
out.puts "end"
|
219
|
+
end
|
220
|
+
|
221
|
+
private
|
222
|
+
|
223
|
+
def decl_string(decl)
|
224
|
+
case decl
|
225
|
+
when AST::Declarations::Opaque ;
|
226
|
+
type = decl.fixed? ? "XDR::Opaque" : "XDR::VarOpaque"
|
227
|
+
"#{type}[#{decl.size}]"
|
228
|
+
when AST::Declarations::String ;
|
229
|
+
"XDR::String[#{decl.size}]"
|
230
|
+
when AST::Declarations::Array ;
|
231
|
+
type = decl.fixed? ? "XDR::Array" : "XDR::VarArray"
|
232
|
+
args = [decl.child_type.to_s, decl.size].
|
233
|
+
compact.
|
234
|
+
map(&:to_s).
|
235
|
+
join(", ")
|
236
|
+
"#{type}[#{args}]"
|
237
|
+
when AST::Declarations::Optional ;
|
238
|
+
"XDR::Option[#{name_string decl.type.text_value}]"
|
239
|
+
when AST::Declarations::Simple ;
|
240
|
+
type_string(decl.type)
|
241
|
+
when AST::Declarations::Void ;
|
242
|
+
"XDR::Void"
|
243
|
+
when AST::Concerns::NestedDefinition ;
|
244
|
+
name_string type.name
|
245
|
+
else
|
246
|
+
raise "Unknown declaration type: #{decl.class.name}"
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
def type_string(type)
|
251
|
+
case type
|
252
|
+
when AST::Typespecs::Int ;
|
253
|
+
"XDR::Int"
|
254
|
+
when AST::Typespecs::UnsignedInt ;
|
255
|
+
"XDR::UnsignedInt"
|
256
|
+
when AST::Typespecs::Hyper ;
|
257
|
+
"XDR::Hyper"
|
258
|
+
when AST::Typespecs::UnsignedHyper ;
|
259
|
+
"XDR::UnsignedHyper"
|
260
|
+
when AST::Typespecs::Float ;
|
261
|
+
"XDR::Float"
|
262
|
+
when AST::Typespecs::Double ;
|
263
|
+
"XDR::Double"
|
264
|
+
when AST::Typespecs::Quadruple ;
|
265
|
+
"XDR::Quadruple"
|
266
|
+
when AST::Typespecs::Bool ;
|
267
|
+
"XDR::Bool"
|
268
|
+
when AST::Typespecs::Simple ;
|
269
|
+
name_string type.text_value
|
270
|
+
when AST::Concerns::NestedDefinition ;
|
271
|
+
name_string type.name
|
272
|
+
else
|
273
|
+
raise "Unknown type: #{type.class.name}"
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
def name_string(name)
|
278
|
+
name.camelize
|
279
|
+
end
|
280
|
+
|
281
|
+
end
|
282
|
+
end
|
283
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
grammar XdrBaseGrammar
|
2
|
+
|
3
|
+
rule identifier
|
4
|
+
!keyword
|
5
|
+
([a-zA-Z] [0-9a-zA-Z_]*)
|
6
|
+
("::" [a-zA-Z] [0-9a-zA-Z_]*)*
|
7
|
+
<Xdrgen::AST::Identifier>
|
8
|
+
end
|
9
|
+
|
10
|
+
rule keyword
|
11
|
+
("bool" /
|
12
|
+
"case" /
|
13
|
+
"const" /
|
14
|
+
"default" /
|
15
|
+
"double" /
|
16
|
+
"quadruple" /
|
17
|
+
"enum" /
|
18
|
+
"float" /
|
19
|
+
"hyper" /
|
20
|
+
"opaque" /
|
21
|
+
"string" /
|
22
|
+
"struct" /
|
23
|
+
"switch" /
|
24
|
+
"typedef" /
|
25
|
+
"union" /
|
26
|
+
"unsigned" /
|
27
|
+
"int" /
|
28
|
+
"void")
|
29
|
+
&space
|
30
|
+
end
|
31
|
+
|
32
|
+
rule value
|
33
|
+
identifier / constant
|
34
|
+
end
|
35
|
+
|
36
|
+
rule constant
|
37
|
+
( hexadecimal_constant / octal_constant / decimal_constant )
|
38
|
+
end
|
39
|
+
|
40
|
+
rule decimal_constant
|
41
|
+
"0" <Xdrgen::AST::DecimalConstant>
|
42
|
+
/
|
43
|
+
"-"? [1-9] [0-9]* <Xdrgen::AST::DecimalConstant>
|
44
|
+
end
|
45
|
+
|
46
|
+
rule hexadecimal_constant
|
47
|
+
"0x" [a-fA-F0-9]+
|
48
|
+
<Xdrgen::AST::HexadecimalConstant>
|
49
|
+
end
|
50
|
+
|
51
|
+
rule octal_constant
|
52
|
+
"0" [0-7]+
|
53
|
+
<Xdrgen::AST::OctalConstant>
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
# Misc.
|
58
|
+
|
59
|
+
rule size
|
60
|
+
identifier / decimal_constant
|
61
|
+
end
|
62
|
+
|
63
|
+
rule space
|
64
|
+
([\s] / line_comment / block_comment)+
|
65
|
+
<Xdrgen::AST::Whitespace>
|
66
|
+
end
|
67
|
+
|
68
|
+
rule asterisk
|
69
|
+
"*"
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
grammar XdrDeclarationGrammar
|
2
|
+
rule declaration
|
3
|
+
void_decl /
|
4
|
+
opaque_decl /
|
5
|
+
string_decl /
|
6
|
+
array_decl /
|
7
|
+
optional_decl /
|
8
|
+
simple_decl
|
9
|
+
end
|
10
|
+
|
11
|
+
rule void_decl
|
12
|
+
"void"
|
13
|
+
<Xdrgen::AST::Declarations::Void>
|
14
|
+
end
|
15
|
+
|
16
|
+
rule opaque_decl
|
17
|
+
type_s:("opaque" <Xdrgen::AST::Typespecs::Opaque>)
|
18
|
+
space
|
19
|
+
identifier
|
20
|
+
size_spec:(fixed_size_spec / var_size_spec)
|
21
|
+
<Xdrgen::AST::Declarations::Opaque>
|
22
|
+
end
|
23
|
+
|
24
|
+
rule string_decl
|
25
|
+
type_s:("string" <Xdrgen::AST::Typespecs::String>)
|
26
|
+
space
|
27
|
+
identifier
|
28
|
+
size_spec:var_size_spec
|
29
|
+
<Xdrgen::AST::Declarations::String>
|
30
|
+
end
|
31
|
+
|
32
|
+
rule array_decl
|
33
|
+
type_s:type_specifier
|
34
|
+
space
|
35
|
+
identifier
|
36
|
+
size_spec:(fixed_size_spec / var_size_spec)
|
37
|
+
<Xdrgen::AST::Declarations::Array>
|
38
|
+
end
|
39
|
+
|
40
|
+
rule optional_decl
|
41
|
+
type_s:type_specifier
|
42
|
+
("*" space? / space? "*")
|
43
|
+
identifier
|
44
|
+
<Xdrgen::AST::Declarations::Optional>
|
45
|
+
end
|
46
|
+
|
47
|
+
rule simple_decl
|
48
|
+
type_s:type_specifier
|
49
|
+
space
|
50
|
+
identifier
|
51
|
+
<Xdrgen::AST::Declarations::Simple>
|
52
|
+
end
|
53
|
+
|
54
|
+
rule type_specifier
|
55
|
+
(integral_type_spec /
|
56
|
+
float_type_spec /
|
57
|
+
boolean_type_spec /
|
58
|
+
enum_type_spec /
|
59
|
+
struct_type_spec /
|
60
|
+
union_type_spec /
|
61
|
+
(identifier <Xdrgen::AST::Typespecs::Simple>))
|
62
|
+
end
|
63
|
+
|
64
|
+
rule integral_type_spec
|
65
|
+
(("int" <Xdrgen::AST::Typespecs::Int>) /
|
66
|
+
("hyper" <Xdrgen::AST::Typespecs::Hyper>) /
|
67
|
+
("unsigned int" <Xdrgen::AST::Typespecs::UnsignedInt>)/
|
68
|
+
("unsigned hyper" <Xdrgen::AST::Typespecs::UnsignedHyper>))
|
69
|
+
type_suffix
|
70
|
+
end
|
71
|
+
|
72
|
+
rule float_type_spec
|
73
|
+
(("float" <Xdrgen::AST::Typespecs::Float>) /
|
74
|
+
("double" <Xdrgen::AST::Typespecs::Double>) /
|
75
|
+
("quadruple" <Xdrgen::AST::Typespecs::Quadruple>) )
|
76
|
+
type_suffix
|
77
|
+
end
|
78
|
+
|
79
|
+
rule boolean_type_spec
|
80
|
+
"bool"
|
81
|
+
type_suffix
|
82
|
+
<Xdrgen::AST::Typespecs::Bool>
|
83
|
+
end
|
84
|
+
|
85
|
+
rule type_suffix
|
86
|
+
&(space / "*")
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
rule fixed_size_spec
|
91
|
+
"[" size_t:size "]"
|
92
|
+
<Xdrgen::AST::FixedSize>
|
93
|
+
end
|
94
|
+
|
95
|
+
rule var_size_spec
|
96
|
+
"<" size_t:size? ">"
|
97
|
+
<Xdrgen::AST::VarSize>
|
98
|
+
end
|
99
|
+
end
|