ridl 2.5.6 → 2.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/LICENSE +21 -49
- data/README.rdoc +30 -25
- data/lib/ridl/backend.rb +6 -10
- data/lib/ridl/delegate.rb +1 -2
- data/lib/ridl/expression.rb +0 -1
- data/lib/ridl/genfile.rb +0 -1
- data/lib/ridl/node.rb +29 -9
- data/lib/ridl/options.rb +176 -0
- data/lib/ridl/optparse_ext.rb +0 -1
- data/lib/ridl/parser.rb +4 -4
- data/lib/ridl/parser.ry +40 -41
- data/lib/ridl/require.rb +0 -1
- data/lib/ridl/ridl.rb +0 -1
- data/lib/ridl/runner.rb +184 -52
- data/lib/ridl/scanner.rb +87 -87
- data/lib/ridl/type.rb +22 -2
- data/lib/ridl/version.rb +2 -3
- metadata +13 -19
- data/lib/idl/BiDirPolicy.pidl +0 -28
- data/lib/idl/CosNaming.idl +0 -260
- data/lib/idl/IOP.pidl +0 -98
- data/lib/idl/Messaging.pidl +0 -152
- data/lib/idl/PortableServer.pidl +0 -371
- data/lib/idl/TimeBase.pidl +0 -40
- data/lib/idl/orb.idl +0 -200
data/lib/ridl/scanner.rb
CHANGED
@@ -8,7 +8,6 @@
|
|
8
8
|
# included with this program.
|
9
9
|
#
|
10
10
|
# Copyright (c) Remedy IT Expertise BV
|
11
|
-
# Chamber of commerce Rotterdam nr.276339, The Netherlands
|
12
11
|
#--------------------------------------------------------------------
|
13
12
|
require 'racc/parser'
|
14
13
|
require 'delegate'
|
@@ -44,7 +43,9 @@ module IDL
|
|
44
43
|
|
45
44
|
class In
|
46
45
|
def initialize(src, name = '', line = 0, column = 1)
|
47
|
-
@src
|
46
|
+
@src = src
|
47
|
+
@fwd = src.getc # look ahead character
|
48
|
+
@bwd = nil # look back character
|
48
49
|
@pos = Position.new(name, line, column)
|
49
50
|
@mark = nil
|
50
51
|
end
|
@@ -97,46 +98,24 @@ module IDL
|
|
97
98
|
end
|
98
99
|
alias skipc getc
|
99
100
|
|
100
|
-
def _include?(ch, *chars)
|
101
|
-
chars.each { |v|
|
102
|
-
return true if case v
|
103
|
-
when Array
|
104
|
-
_include?(ch, *v)
|
105
|
-
when Enumerable
|
106
|
-
v.include? ch
|
107
|
-
when Fixnum
|
108
|
-
v == ch
|
109
|
-
when String
|
110
|
-
v == ch
|
111
|
-
else
|
112
|
-
false
|
113
|
-
end
|
114
|
-
}
|
115
|
-
false
|
116
|
-
end
|
117
|
-
|
118
101
|
def skipwhile(*chars, &block)
|
119
|
-
if block
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
break unless block.call(ch)
|
125
|
-
skipc
|
102
|
+
if block
|
103
|
+
until (ch = lookc).nil?
|
104
|
+
return ch unless block.call(ch)
|
105
|
+
skipc
|
106
|
+
end
|
126
107
|
end
|
127
|
-
|
108
|
+
nil
|
128
109
|
end
|
129
110
|
|
130
111
|
def skipuntil(*chars, &block)
|
131
|
-
if block
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
break if block.call(ch)
|
137
|
-
skipc
|
112
|
+
if block
|
113
|
+
until (ch = lookc).nil?
|
114
|
+
return ch if block.call(ch)
|
115
|
+
skipc
|
116
|
+
end
|
138
117
|
end
|
139
|
-
|
118
|
+
nil
|
140
119
|
end
|
141
120
|
|
142
121
|
def mark(*ini)
|
@@ -159,6 +138,10 @@ module IDL
|
|
159
138
|
@mark = nil
|
160
139
|
ret
|
161
140
|
end
|
141
|
+
|
142
|
+
def close
|
143
|
+
@src.close # close input source
|
144
|
+
end
|
162
145
|
end ## of class In
|
163
146
|
|
164
147
|
class StrIStream
|
@@ -249,7 +232,7 @@ module IDL
|
|
249
232
|
when File
|
250
233
|
i = src
|
251
234
|
nm = src.path
|
252
|
-
when IO
|
235
|
+
when IO, StringIO
|
253
236
|
i = src
|
254
237
|
nm = '<io>'
|
255
238
|
else
|
@@ -261,7 +244,7 @@ module IDL
|
|
261
244
|
end
|
262
245
|
def find_include(fname, all = true)
|
263
246
|
if File.file?(fname) && File.readable?(fname)
|
264
|
-
fname
|
247
|
+
File.expand_path(fname)
|
265
248
|
else
|
266
249
|
# search transient include paths if allowed (quoted includes)
|
267
250
|
fp = if all then
|
@@ -322,6 +305,9 @@ module IDL
|
|
322
305
|
more_source? and @stack.last[0] == :define
|
323
306
|
end
|
324
307
|
def leave_source
|
308
|
+
# make sure to close the input source
|
309
|
+
@in.close
|
310
|
+
# check if we have any previous source still stacked up
|
325
311
|
if @stack.size>0
|
326
312
|
if @stack.last[0] == :include
|
327
313
|
@xincludepaths.pop # remove directory of finished include
|
@@ -347,7 +333,8 @@ module IDL
|
|
347
333
|
end
|
348
334
|
|
349
335
|
LFCR = [ (?\n), (?\r) ]
|
350
|
-
|
336
|
+
SPACES = [ (?\ ), (?\t) ]
|
337
|
+
WHITESPACE = SPACES+LFCR
|
351
338
|
|
352
339
|
ANNOTATION = ?@
|
353
340
|
ANNOTATION_STR = '@'
|
@@ -361,9 +348,16 @@ module IDL
|
|
361
348
|
|
362
349
|
SHIFTCHARS = [ ?<, ?> ]
|
363
350
|
|
364
|
-
|
351
|
+
DIGITS = (?0..?9).to_a
|
352
|
+
ALPHA_LC = (?a..?z).to_a
|
353
|
+
ALPHA_UC = (?A..?Z).to_a
|
354
|
+
OCTALS = (?0..?7).to_a
|
355
|
+
HEXCHARS = DIGITS + (?a..?f).to_a + (?A..?F).to_a
|
356
|
+
SIGNS = [?-, ?+]
|
357
|
+
DOT = ?.
|
365
358
|
|
366
|
-
IDCHARS = [?_
|
359
|
+
IDCHARS = [?_ ] + ALPHA_LC + ALPHA_UC
|
360
|
+
FULL_IDCHARS = IDCHARS + DIGITS
|
367
361
|
|
368
362
|
ESCTBL = CharRegistry.new({
|
369
363
|
:n => ?\n, :t => ?\t, :v => ?\v, :b => ?\b,
|
@@ -432,8 +426,9 @@ module IDL
|
|
432
426
|
annotation_body = nil
|
433
427
|
# next token should be '(' in case of normal/single value annotation
|
434
428
|
# or anything else in case of marker annotation
|
435
|
-
|
436
|
-
if
|
429
|
+
skip_spaces # skip till next non-space or eol
|
430
|
+
if peek_next == '('
|
431
|
+
token = next_token # parse '('
|
437
432
|
begin
|
438
433
|
# identifier or value (in case of single value annotation) expected
|
439
434
|
token = next_token
|
@@ -454,9 +449,9 @@ module IDL
|
|
454
449
|
end
|
455
450
|
end
|
456
451
|
end until token.first == ')'
|
457
|
-
|
458
|
-
token = nil
|
452
|
+
token = next_token_before_eol
|
459
453
|
else
|
454
|
+
token = next_token_before_eol
|
460
455
|
# marker annotation or symbolic value; leave body nil
|
461
456
|
end
|
462
457
|
[token, annotation_body]
|
@@ -495,13 +490,18 @@ module IDL
|
|
495
490
|
token
|
496
491
|
end
|
497
492
|
|
493
|
+
def peek_next
|
494
|
+
@in.lookc
|
495
|
+
end
|
496
|
+
|
497
|
+
def skip_spaces
|
498
|
+
@in.skipwhile {|c| SPACES.include?(c) }
|
499
|
+
end
|
500
|
+
|
498
501
|
def next_identifier(first = nil)
|
499
502
|
@in.mark(first)
|
500
|
-
while
|
501
|
-
|
502
|
-
when nil
|
503
|
-
break
|
504
|
-
when ?0..?9, ?a..?z, ?A..?Z, ?_
|
503
|
+
while true
|
504
|
+
if FULL_IDCHARS.include?(@in.lookc)
|
505
505
|
@in.skipc
|
506
506
|
else
|
507
507
|
break
|
@@ -512,17 +512,13 @@ module IDL
|
|
512
512
|
s2 = s0.dup # (to be) unescaped id
|
513
513
|
|
514
514
|
# simple check
|
515
|
-
escape = false
|
516
515
|
if s2.length == 0
|
517
516
|
parse_error 'identifier expected!'
|
518
517
|
else
|
519
|
-
|
520
|
-
|
521
|
-
when ?_ ## if starts with CORBA IDL escape => remove
|
522
|
-
escape = true
|
523
|
-
s2.slice!(0)
|
518
|
+
if s2[0] == ?_
|
519
|
+
s2.slice!(0) ## if starts with CORBA IDL escape => remove
|
524
520
|
else
|
525
|
-
parse_error "identifier must begin with alphabet character: #{s2}"
|
521
|
+
parse_error "identifier must begin with alphabet character: #{s2}" unless ALPHA_LC.include?(s2[0]) || ALPHA_UC.include?(s2[0])
|
526
522
|
end
|
527
523
|
end
|
528
524
|
|
@@ -540,9 +536,8 @@ module IDL
|
|
540
536
|
[ :identifier, Identifier.new(s2, s2, s0) ]
|
541
537
|
end
|
542
538
|
elsif (a = KEYWORDS.assoc(s1)).nil?
|
543
|
-
# check for language mapping keyword
|
544
|
-
|
545
|
-
[ :identifier, Identifier.new(s2, escape ? s2 : chk_identifier(s2), s0) ]
|
539
|
+
# check for language mapping keyword
|
540
|
+
[ :identifier, Identifier.new(s2, chk_identifier(s2), s0) ]
|
546
541
|
elsif s0 == a[1]
|
547
542
|
[ a[1], nil ]
|
548
543
|
else
|
@@ -657,26 +652,26 @@ module IDL
|
|
657
652
|
end
|
658
653
|
|
659
654
|
def skipfloat_or_fixed
|
660
|
-
if @in.lookc ==
|
655
|
+
if @in.lookc == DOT
|
661
656
|
@in.skipc
|
662
|
-
@in.skipwhile(
|
657
|
+
@in.skipwhile {|c| DIGITS.include?(c) }
|
663
658
|
end
|
664
659
|
if [?e, ?E].include? @in.lookc
|
665
660
|
@in.skipc
|
666
|
-
@in.skipc if
|
667
|
-
@in.skipwhile(
|
661
|
+
@in.skipc if SIGNS.include? @in.lookc
|
662
|
+
@in.skipwhile {|c| DIGITS.include?(c) }
|
668
663
|
return :floating_pt_literal
|
669
664
|
elsif [?d, ?D].include? @in.lookc
|
670
665
|
@in.skipc
|
671
|
-
@in.skipc if
|
672
|
-
@in.skipwhile(
|
666
|
+
@in.skipc if SIGNS.include? @in.lookc
|
667
|
+
@in.skipwhile {|c| DIGITS.include?(c) }
|
673
668
|
return :fixed_pt_literal
|
674
669
|
end
|
675
670
|
:floating_pt_literal
|
676
671
|
end
|
677
672
|
|
678
673
|
def skipline
|
679
|
-
while
|
674
|
+
while true
|
680
675
|
s = @in.gets
|
681
676
|
until s.chomp!.nil?; end
|
682
677
|
break unless s[s.length - 1] == ?\\
|
@@ -685,13 +680,13 @@ module IDL
|
|
685
680
|
|
686
681
|
def getline
|
687
682
|
s = ''
|
688
|
-
while
|
683
|
+
while true
|
689
684
|
ch = @in.lookc
|
690
685
|
break if ch.nil?
|
691
686
|
case
|
692
687
|
when (ch == ?\") #"
|
693
688
|
s << @in.getc # opening quote
|
694
|
-
while
|
689
|
+
while true
|
695
690
|
if @in.lookc == ?\\
|
696
691
|
# escape sequence
|
697
692
|
s << @in.getc
|
@@ -779,7 +774,7 @@ module IDL
|
|
779
774
|
end
|
780
775
|
|
781
776
|
def eval_directive(s)
|
782
|
-
IDL.log(
|
777
|
+
IDL.log(3,"** RIDL - eval_directive(#{s})")
|
783
778
|
rc = eval(s)
|
784
779
|
case rc
|
785
780
|
when FalseClass, TrueClass
|
@@ -792,7 +787,7 @@ module IDL
|
|
792
787
|
end
|
793
788
|
|
794
789
|
def parse_directive
|
795
|
-
@in.skipwhile
|
790
|
+
@in.skipwhile {|c| SPACES.include?(c) }
|
796
791
|
s = getline
|
797
792
|
/^(\w*)\s*/ === s
|
798
793
|
s1,s2 = $1, $' #'
|
@@ -860,7 +855,7 @@ module IDL
|
|
860
855
|
if do_parse?
|
861
856
|
# match 'defined(Foo)' or 'defined Foo'
|
862
857
|
while s2 =~ /(^|[\W])defined(\s*\(\s*(\w+)\s*\)|\s+(\w+))/
|
863
|
-
IDL.log(
|
858
|
+
IDL.log(3,"** RIDL - parse_directive : resolving 'defined(#{$3 || $4})'")
|
864
859
|
def_id = $3 || $4
|
865
860
|
# resolve 'defined' expression to 'true' or 'false' according to actual macro definition
|
866
861
|
s2.gsub!(/(^|[\W])(defined\s*[\s\(]\s*#{def_id}(\s*\))?)/, '\1'+"#{@defined.has_key?(def_id).to_s}")
|
@@ -936,10 +931,15 @@ module IDL
|
|
936
931
|
end
|
937
932
|
end
|
938
933
|
|
934
|
+
def next_token_before_eol
|
935
|
+
@in.skipwhile {|c| SPACES.include?(c)}
|
936
|
+
LFCR.include?(@in.lookc) ? nil : next_token
|
937
|
+
end
|
938
|
+
|
939
939
|
def next_token
|
940
940
|
sign = nil
|
941
941
|
str = '' #initialize empty string
|
942
|
-
while
|
942
|
+
while true
|
943
943
|
ch = @in.getc
|
944
944
|
if ch.nil?
|
945
945
|
if @ifdef.size>0 and !in_expansion?
|
@@ -949,12 +949,12 @@ module IDL
|
|
949
949
|
leave_source
|
950
950
|
next
|
951
951
|
else
|
952
|
-
return [
|
952
|
+
return [false, nil]
|
953
953
|
end
|
954
954
|
end
|
955
955
|
|
956
956
|
if WHITESPACE.include? ch
|
957
|
-
@in.skipwhile
|
957
|
+
@in.skipwhile {|c| WHITESPACE.include?(c) }
|
958
958
|
next
|
959
959
|
end
|
960
960
|
|
@@ -1017,7 +1017,7 @@ module IDL
|
|
1017
1017
|
ret = []
|
1018
1018
|
chs = ''
|
1019
1019
|
@in.skipc # skip 'L'
|
1020
|
-
while
|
1020
|
+
while true
|
1021
1021
|
_nxtc = @in.lookc
|
1022
1022
|
if _nxtc == ?\\
|
1023
1023
|
@in.skipc
|
@@ -1067,7 +1067,7 @@ module IDL
|
|
1067
1067
|
# return token returned by parse_annotation or parse next token recursively
|
1068
1068
|
return parse_annotation(true) || next_token
|
1069
1069
|
else
|
1070
|
-
@in.skipuntil(
|
1070
|
+
@in.skipuntil {|c| LFCR.include?(c) }
|
1071
1071
|
end
|
1072
1072
|
end
|
1073
1073
|
str = '' # reset
|
@@ -1077,9 +1077,9 @@ module IDL
|
|
1077
1077
|
return %w(/ /)
|
1078
1078
|
end
|
1079
1079
|
|
1080
|
-
when ch
|
1080
|
+
when SIGNS.include?(ch)
|
1081
1081
|
_nxtc = @in.lookc
|
1082
|
-
if
|
1082
|
+
if DIGITS.include? _nxtc
|
1083
1083
|
sign = ch
|
1084
1084
|
str = '' # reset
|
1085
1085
|
next
|
@@ -1089,7 +1089,7 @@ module IDL
|
|
1089
1089
|
|
1090
1090
|
when (?1..?9).include?(ch)
|
1091
1091
|
@in.mark(sign, ch)
|
1092
|
-
@in.skipwhile(
|
1092
|
+
@in.skipwhile {|c| DIGITS.include?(c) }
|
1093
1093
|
num_type = ([?., ?e, ?E, ?d, ?D].include?(@in.lookc)) ? skipfloat_or_fixed : :integer_literal
|
1094
1094
|
|
1095
1095
|
r = @in.getregion
|
@@ -1102,10 +1102,10 @@ module IDL
|
|
1102
1102
|
return [:integer_literal, r.to_i]
|
1103
1103
|
end
|
1104
1104
|
|
1105
|
-
when ch ==
|
1105
|
+
when ch == DOT #
|
1106
1106
|
@in.mark(ch)
|
1107
|
-
@in.skipwhile(
|
1108
|
-
num_type = (
|
1107
|
+
@in.skipwhile {|c| DIGITS.include?(c) }
|
1108
|
+
num_type = (DOT != @in.lookc) ? skipfloat_or_fixed : nil
|
1109
1109
|
s = @in.getregion
|
1110
1110
|
if s == '.'
|
1111
1111
|
parse_error 'token consisting of single dot (.) is invalid.'
|
@@ -1128,11 +1128,11 @@ module IDL
|
|
1128
1128
|
s = @in.getregion
|
1129
1129
|
return [:integer_literal, s.hex]
|
1130
1130
|
else
|
1131
|
-
dec =
|
1132
|
-
@in.skipwhile(
|
1131
|
+
dec = false
|
1132
|
+
@in.skipwhile {|c| OCTALS.include?(c) }
|
1133
1133
|
if (?8..?9).include? @in.lookc
|
1134
1134
|
dec = TRUE
|
1135
|
-
@in.skipwhile(
|
1135
|
+
@in.skipwhile {|c| DIGITS.include?(c) }
|
1136
1136
|
end
|
1137
1137
|
|
1138
1138
|
num_type = ([?., ?e, ?E, ?d, ?D].include?(@in.lookc)) ? skipfloat_or_fixed : :integer_literal
|
@@ -1170,7 +1170,7 @@ module IDL
|
|
1170
1170
|
|
1171
1171
|
when ch == ?\" #" #double quote, for a string literal.
|
1172
1172
|
ret = ''
|
1173
|
-
while
|
1173
|
+
while true
|
1174
1174
|
_nxtc = @in.lookc
|
1175
1175
|
if _nxtc == ?\\
|
1176
1176
|
@in.skipc
|
data/lib/ridl/type.rb
CHANGED
@@ -8,7 +8,6 @@
|
|
8
8
|
# included with this program.
|
9
9
|
#
|
10
10
|
# Copyright (c) Remedy IT Expertise BV
|
11
|
-
# Chamber of commerce Rotterdam nr.276339, The Netherlands
|
12
11
|
#--------------------------------------------------------------------
|
13
12
|
module IDL
|
14
13
|
class Type
|
@@ -42,6 +41,9 @@ module IDL
|
|
42
41
|
def is_template?
|
43
42
|
false
|
44
43
|
end
|
44
|
+
def matches?(idltype)
|
45
|
+
self.class == idltype.class
|
46
|
+
end
|
45
47
|
|
46
48
|
def instantiate(_context)
|
47
49
|
self
|
@@ -74,6 +76,9 @@ module IDL
|
|
74
76
|
def resolved_node
|
75
77
|
@node
|
76
78
|
end
|
79
|
+
def matches?(idltype)
|
80
|
+
super && self.resolved_node == idltype.resolved_node
|
81
|
+
end
|
77
82
|
end
|
78
83
|
|
79
84
|
class ScopedName < NodeType
|
@@ -259,6 +264,9 @@ module IDL
|
|
259
264
|
def is_template?
|
260
265
|
(@size && @size.is_a?(IDL::Expression) && @size.is_template?)
|
261
266
|
end
|
267
|
+
def matches?(idltype)
|
268
|
+
super && self.size == idltype.size
|
269
|
+
end
|
262
270
|
def instantiate(_context)
|
263
271
|
self.is_template? ? (Type::String.new(@size.instantiate(_context).value)) : self
|
264
272
|
end
|
@@ -301,8 +309,11 @@ module IDL
|
|
301
309
|
def is_template?
|
302
310
|
(@size && @size.is_a?(IDL::Expression::ScopedName) && @size.node.is_a?(IDL::AST::TemplateParam)) || @basetype.is_template?
|
303
311
|
end
|
312
|
+
def matches?(idltype)
|
313
|
+
super && self.size == idltype.size && self.basetype.resolved_type.matches?(idltype.basetype.resolved_type)
|
314
|
+
end
|
304
315
|
def instantiate(_context)
|
305
|
-
self.is_template? ? Type::Sequence.new(@basetype.instantiate(_context), @size.instantiate(_context).value) : self
|
316
|
+
self.is_template? ? Type::Sequence.new(@basetype.instantiate(_context), @size ? @size.instantiate(_context).value : nil) : self
|
306
317
|
end
|
307
318
|
end
|
308
319
|
|
@@ -338,6 +349,9 @@ module IDL
|
|
338
349
|
def is_template?
|
339
350
|
@sizes.any? { |sz| (sz.is_a?(IDL::Expression::ScopedName) && sz.node.is_a?(IDL::AST::TemplateParam)) } || @basetype.is_template?
|
340
351
|
end
|
352
|
+
def matches?(idltype)
|
353
|
+
super && self.sizes == idltype.sizes && self.basetype.resolved_type.matches?(idltype.basetype.resolved_type)
|
354
|
+
end
|
341
355
|
def instantiate(_context)
|
342
356
|
self.is_template? ? Type::Array.new(@basetype.instantiate(_context), @sizes.collect { |sz| sz.instantiate(_context).value }) : self
|
343
357
|
end
|
@@ -366,6 +380,9 @@ module IDL
|
|
366
380
|
def is_template?
|
367
381
|
(@size && @size.is_a?(IDL::Expression::ScopedName) && @size.node.is_a?(IDL::AST::TemplateParam))
|
368
382
|
end
|
383
|
+
def matches?(idltype)
|
384
|
+
super && self.size == idltype.size
|
385
|
+
end
|
369
386
|
def instantiate(_context)
|
370
387
|
self.is_template? ? Type::WString.new(@size.instantiate(_context).value) : self
|
371
388
|
end
|
@@ -501,6 +518,9 @@ module IDL
|
|
501
518
|
def resolved_node
|
502
519
|
@type.resolved_node
|
503
520
|
end
|
521
|
+
def matches?(idltype)
|
522
|
+
super && self.type.resolved_type.matches?(idltype.type.resolved_type)
|
523
|
+
end
|
504
524
|
end
|
505
525
|
|
506
526
|
end
|