msgpack-idl 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,260 @@
1
+ #
2
+ # MessagePack IDL Processor
3
+ #
4
+ # Copyright (C) 2011 FURUHASHI Sadayuki
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+ module MessagePack
19
+ module IDL
20
+
21
+
22
+ class ParsletTransform < Parslet::Transform
23
+ rule(:sequence_x => simple(:x)) {
24
+ x
25
+ }
26
+
27
+ rule(:sequence_xs => simple(:xs)) {
28
+ xs
29
+ }
30
+
31
+ rule(:sequence => simple(:x)) {
32
+ x ? AST::Sequence.new([x]) : AST::Sequence.new
33
+ }
34
+
35
+ rule(:sequence => sequence(:x)) {
36
+ AST::Sequence.new(x)
37
+ }
38
+
39
+
40
+ rule(:val_int => simple(:i)) {
41
+ i.to_i
42
+ }
43
+
44
+ rule(:val_optional => simple(:x)) {
45
+ AST::FIELD_OPTIONAL
46
+ }
47
+
48
+ rule(:val_required => simple(:x)) {
49
+ AST::FIELD_REQUIRED
50
+ }
51
+
52
+ rule(:val_override => simple(:x)) {
53
+ AST::FUNC_OVERRIDE
54
+ }
55
+
56
+ rule(:val_remove => simple(:x)) {
57
+ AST::FUNC_REMOVE
58
+ }
59
+
60
+ rule(:val_add => simple(:x)) {
61
+ AST::FUNC_ADD
62
+ }
63
+
64
+
65
+ rule(:name => simple(:n)) {
66
+ n.to_s
67
+ }
68
+
69
+
70
+ rule(:field_id => simple(:i),
71
+ :field_modifier => simple(:m),
72
+ :field_type => simple(:t),
73
+ :field_name => simple(:n),
74
+ :field_value => simple(:v)) {
75
+ m = m() ? m() : AST::FIELD_REQUIRED
76
+ if v == nil
77
+ AST::Field.new(i, t, m, n)
78
+ else
79
+ AST::ValueAssignedField.new(i, t, m, n, v)
80
+ end
81
+ }
82
+
83
+ rule(:generic_type => simple(:n),
84
+ :type_params => simple(:tp)) {
85
+ if tp
86
+ AST::GenericType.new(n, tp)
87
+ else
88
+ AST::Type.new(n)
89
+ end
90
+ }
91
+
92
+ rule(:field_type => simple(:t),
93
+ :field_type_maybe => simple(:n)) {
94
+ nullable = !!n
95
+ if t.is_a?(AST::GenericType)
96
+ AST::GenericType.new(t.name, t.type_params, nullable)
97
+ else
98
+ AST::Type.new(t.name, nullable)
99
+ end
100
+ }
101
+
102
+
103
+ rule(:message_name => simple(:n),
104
+ :message_body => sequence(:b),
105
+ :super_class => simple(:sc)) {
106
+ AST::Message.new(n, sc, b)
107
+ }
108
+
109
+ rule(:exception_name => simple(:n),
110
+ :exception_body => sequence(:b),
111
+ :super_class => simple(:sc)) {
112
+ AST::Exception.new(n, sc, b)
113
+ }
114
+
115
+
116
+ rule(:enum_field_id => simple(:i),
117
+ :enum_field_name => simple(:n)) {
118
+ AST::EnumField.new(i, n)
119
+ }
120
+
121
+ rule(:enum_name => simple(:n),
122
+ :enum_body => sequence(:b)) {
123
+ AST::Enum.new(n, b)
124
+ }
125
+
126
+
127
+ rule(:return_type => simple(:rt),
128
+ :func_name => simple(:n),
129
+ :func_args => simple(:a),
130
+ :func_throws => simple(:ex)) {
131
+ AST::Func.new(n, rt, a, ex)
132
+ }
133
+
134
+ rule(:service_description => sequence(:s)) {
135
+ current = AST::ServiceVersion.new(0, [])
136
+ versions = [current]
137
+ s.each {|l|
138
+ case l
139
+ when Integer
140
+ v = versions.find {|v| v.version == l }
141
+ if v
142
+ current = v
143
+ else
144
+ current = AST::ServiceVersion.new(l, [])
145
+ versions << current
146
+ end
147
+ else
148
+ current.funcs << l
149
+ end
150
+ }
151
+ versions
152
+ }
153
+
154
+ rule(:service_name => simple(:n),
155
+ :service_version => simple(:v),
156
+ :service_funcs => sequence(:fs)) {
157
+ AST::Service.new(n, v, fs)
158
+ }
159
+
160
+
161
+ rule(:scope_service => simple(:s),
162
+ :scope_service_version => simple(:v),
163
+ :scope_name => simple(:n),
164
+ :scope_default => simple(:d)) {
165
+ if d
166
+ AST::Scope.new(s, v, n, true)
167
+ else
168
+ AST::Scope.new(s, v, n, false)
169
+ end
170
+ }
171
+
172
+ rule(:application_name => simple(:n),
173
+ :application_body => sequence(:b)) {
174
+ AST::Application.new(n, b)
175
+ }
176
+
177
+
178
+ rule(:namespace_name => simple(:n)) {
179
+ AST::Namespace.new(n, nil)
180
+ }
181
+
182
+ rule(:namespace_name => simple(:n),
183
+ :namespace_lang => simple(:l)) {
184
+ AST::Namespace.new(n, l)
185
+ }
186
+
187
+
188
+ rule(:path => simple(:n)) {
189
+ n
190
+ }
191
+
192
+ rule(:include => simple(:n)) {
193
+ AST::Include.new(n.to_s)
194
+ }
195
+
196
+
197
+ rule(:document => sequence(:es)) {
198
+ AST::Document.new(es)
199
+ }
200
+
201
+
202
+ rule(:literal_const => simple(:n)) {
203
+ AST::ConstLiteral.new(n)
204
+ }
205
+
206
+ rule(:literal_enum_name => simple(:n),
207
+ :literal_enum_field => simple(:f)) {
208
+ AST::EnumLiteral.new(n, f)
209
+ }
210
+
211
+ rule(:literal_int => simple(:i)) {
212
+ AST::IntLiteral.new(i.to_i)
213
+ }
214
+
215
+ rule(:literal_float => simple(:f)) {
216
+ AST::FloatLiteral.new(f.to_f)
217
+ }
218
+
219
+ rule(:literal_str_dq => simple(:s)) {
220
+ s.to_s.gsub(/\\(.)/) {|e|
221
+ eval("\"\\#{$~[1]}\"") # TODO escape
222
+ }
223
+ }
224
+
225
+ rule(:literal_str_sq => simple(:s)) {
226
+ s.to_s
227
+ }
228
+
229
+ rule(:literal_str_seq => sequence(:ss)) {
230
+ AST::StringLiteral.new(ss.join)
231
+ }
232
+
233
+ rule(:literal_nil => simple(:_)) {
234
+ AST::NilLiteral.new
235
+ }
236
+
237
+ rule(:literal_true => simple(:_)) {
238
+ AST::TrueLiteral.new
239
+ }
240
+
241
+ rule(:literal_false => simple(:_)) {
242
+ AST::FalseLiteral.new
243
+ }
244
+
245
+ #rule(:literal_list => simple(:a)) {
246
+ # AST::ListLiteral.new(Array.new(a))
247
+ #}
248
+
249
+ #rule(:literal_map => simple(:ps)) {
250
+ # AST::MapLiteral.new(Array.new(ps))
251
+ #}
252
+
253
+ #rule(:literal_map_key => simple(:k), :literal_map_value => simple(:v)) {
254
+ # AST::MapLiteralPair.new(k, v)
255
+ #}
256
+ end
257
+
258
+
259
+ end
260
+ end
@@ -0,0 +1,84 @@
1
+ #
2
+ # MessagePack IDL Processor
3
+ #
4
+ # Copyright (C) 2011 FURUHASHI Sadayuki
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+ module MessagePack
19
+ module IDL
20
+
21
+
22
+ class Parser
23
+ include ProcessorModule
24
+
25
+ require 'stringio'
26
+
27
+ def initialize(search_paths = [])
28
+ @search_paths = search_paths
29
+ @parslet = ParsletParser.new
30
+ @transform = ParsletTransform.new
31
+ @ast = []
32
+ end
33
+
34
+ attr_reader :ast
35
+
36
+ def parse(src, fname, dir)
37
+ begin
38
+ tree = @parslet.parse(src)
39
+ ast = @transform.apply(tree)
40
+ rescue Parslet::ParseFailed => error
41
+ msg = @parslet.print_error(error, fname, StringIO.new).string
42
+ raise SyntaxError, msg
43
+ end
44
+ ast.each {|e|
45
+ if e.class == AST::Include
46
+ parse_include(e.path, dir, fname)
47
+ else
48
+ @ast << e
49
+ end
50
+ }
51
+ self
52
+ end
53
+
54
+ def parse_file(path)
55
+ parse(File.read(path), File.basename(path), File.dirname(path))
56
+ end
57
+
58
+ protected
59
+ def parse_include(inc, dir, fname)
60
+ if dir
61
+ search_paths = @search_paths + [File.expand_path(dir)]
62
+ else
63
+ search_paths = @search_paths
64
+ end
65
+ search_paths.each {|dir|
66
+ real_path = File.join(dir, inc)
67
+ if File.file?(real_path)
68
+ return parse_file(real_path)
69
+ end
70
+ }
71
+ raise IncludeError, format_include_error(inc, fname)
72
+ end
73
+
74
+ def format_include_error(inc, fname)
75
+ [
76
+ "#{fname}:",
77
+ " Can't include file #{inc}"
78
+ ].join("\n")
79
+ end
80
+ end
81
+
82
+
83
+ end
84
+ end
@@ -0,0 +1,7 @@
1
+ module MessagePack
2
+ module IDL
3
+
4
+ VERSION = '0.1.0'
5
+
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: msgpack-idl
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - FURUHASHI Sadayuki
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-04-23 00:00:00 +09:00
19
+ default_executable: msgpack-idl
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: parslet
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 23
30
+ segments:
31
+ - 0
32
+ - 2
33
+ - 0
34
+ version: 0.2.0
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: rspec
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 3
46
+ segments:
47
+ - 0
48
+ version: "0"
49
+ type: :development
50
+ version_requirements: *id002
51
+ description:
52
+ email: frsyuki@users.sourceforge.jp
53
+ executables:
54
+ - msgpack-idl
55
+ extensions: []
56
+
57
+ extra_rdoc_files: []
58
+
59
+ files:
60
+ - AUTHORS
61
+ - ChangeLog
62
+ - README
63
+ - lib/msgpack/idl/ast.rb
64
+ - lib/msgpack/idl/command/example.rb
65
+ - lib/msgpack/idl/command/idl.rb
66
+ - lib/msgpack/idl/error.rb
67
+ - lib/msgpack/idl/evaluator.rb
68
+ - lib/msgpack/idl/generator.rb
69
+ - lib/msgpack/idl/ir.rb
70
+ - lib/msgpack/idl/module.rb
71
+ - lib/msgpack/idl/parser.rb
72
+ - lib/msgpack/idl/parser/rule.rb
73
+ - lib/msgpack/idl/parser/transform.rb
74
+ - lib/msgpack/idl/version.rb
75
+ - bin/msgpack-idl
76
+ has_rdoc: true
77
+ homepage: http://msgpack.org/
78
+ licenses: []
79
+
80
+ post_install_message:
81
+ rdoc_options:
82
+ - --charset=UTF-8
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ hash: 3
91
+ segments:
92
+ - 0
93
+ version: "0"
94
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ hash: 3
100
+ segments:
101
+ - 0
102
+ version: "0"
103
+ requirements: []
104
+
105
+ rubyforge_project: msgpack
106
+ rubygems_version: 1.3.7
107
+ signing_key:
108
+ specification_version: 3
109
+ summary: MessagePack IDL Processor
110
+ test_files: []
111
+