macks-ruby_protobuf 0.3.2.2 → 0.3.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/protobuf/compiler/proto.y +52 -34
- data/lib/protobuf/compiler/proto_parser.rb +606 -601
- data/lib/protobuf/message/field.rb +12 -10
- data/lib/protobuf/message/message.rb +18 -11
- data/lib/ruby_protobuf.rb +1 -1
- metadata +1 -1
@@ -1,5 +1,4 @@
|
|
1
1
|
class Protobuf::ProtoParser
|
2
|
-
#options no_result_var
|
3
2
|
rule
|
4
3
|
proto : proto_item
|
5
4
|
{ result = Protobuf::Node::ProtoNode.new val }
|
@@ -162,42 +161,61 @@ end
|
|
162
161
|
|
163
162
|
---- inner
|
164
163
|
|
164
|
+
require 'strscan'
|
165
|
+
|
165
166
|
def parse(f)
|
166
|
-
@
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
167
|
+
@scanner = StringScanner.new(f.read)
|
168
|
+
yyparse(self, :scan)
|
169
|
+
end
|
170
|
+
|
171
|
+
def scan_debug
|
172
|
+
scan do |token, value|
|
173
|
+
p [token, value]
|
174
|
+
yield [token, value]
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
def scan
|
179
|
+
until @scanner.eos?
|
180
|
+
case
|
181
|
+
when match(/\s+/, /\/\/.*/)
|
182
|
+
# skip
|
183
|
+
when match(/\/\*/)
|
184
|
+
# C-like comment
|
185
|
+
raise 'EOF inside block comment' until @scanner.scan_until(/\*\//)
|
186
|
+
when match(/(?:required|optional|repeated|import|package|option|message|extend|enum|service|rpc|returns|group|default|extensions|to|max|double|float|int32|int64|uint32|uint64|sint32|sint64|fixed32|fixed64|sfixed32|sfixed64|bool|string|bytes)\b/)
|
187
|
+
yield [@token, @token.to_sym]
|
188
|
+
when match(/[1-9]\d*(?!\.)/, /0(?![.xX0-9])/)
|
189
|
+
yield [:DEC_INTEGER, @token.to_i]
|
190
|
+
when match(/0[xX]([A-Fa-f0-9])+/)
|
191
|
+
yield [:HEX_INTEGER, @token.to_i(0)]
|
192
|
+
when match(/0[0-7]+/)
|
193
|
+
yield [:OCT_INTEGER, @token.to_i(0)]
|
194
|
+
when match(/\d+(\.\d+)?([Ee][\+-]?\d+)?/)
|
195
|
+
yield [:FLOAT_LITERAL, @token.to_f]
|
196
|
+
when match(/(true|false)\b/)
|
197
|
+
yield [:BOOLEAN_LITERAL, @token == 'true']
|
198
|
+
when match(/"(?:[^"\\]+|\\.)*"/, /'(?:[^'\\]+|\\.)*'/)
|
199
|
+
yield [:STRING_LITERAL, eval(@token)]
|
200
|
+
when match(/[a-zA-Z_][\w_]*/)
|
201
|
+
yield [:IDENT, @token.to_sym]
|
202
|
+
when match(/[A-Z][\w_]*/)
|
203
|
+
yield [:CAMEL_IDENT, @token.to_sym]
|
204
|
+
when match(/./)
|
205
|
+
yield [@token, @token]
|
206
|
+
else
|
207
|
+
raise "parse error around #{@scanner.string[@scanner.pos, 32].inspect}"
|
196
208
|
end
|
197
209
|
end
|
198
|
-
|
210
|
+
yield [false, nil]
|
199
211
|
end
|
200
212
|
|
201
|
-
def
|
202
|
-
|
213
|
+
def match(*regular_expressions)
|
214
|
+
regular_expressions.each do |re|
|
215
|
+
if @scanner.scan(re)
|
216
|
+
@token = @scanner[0]
|
217
|
+
return true
|
218
|
+
end
|
219
|
+
end
|
220
|
+
false
|
203
221
|
end
|