retro_idl 0.0.1

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.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/ext/retro_idl/asn/ext_parser/ext_common.h +27 -0
  3. data/ext/retro_idl/asn/ext_parser/ext_parser.l +201 -0
  4. data/ext/retro_idl/asn/ext_parser/ext_parser.y +1207 -0
  5. data/ext/retro_idl/asn/ext_parser/extconf.rb +3 -0
  6. data/ext/retro_idl/asn/ext_parser/lexer.c +2873 -0
  7. data/ext/retro_idl/asn/ext_parser/lexer.h +366 -0
  8. data/ext/retro_idl/asn/ext_parser/parser.c +2963 -0
  9. data/ext/retro_idl/asn/ext_parser/parser.h +175 -0
  10. data/lib/retro_idl/asn/alternative_type.rb +43 -0
  11. data/lib/retro_idl/asn/asn.rb +309 -0
  12. data/lib/retro_idl/asn/asn_error.rb +2 -0
  13. data/lib/retro_idl/asn/base_type.rb +87 -0
  14. data/lib/retro_idl/asn/base_value.rb +75 -0
  15. data/lib/retro_idl/asn/bit_string.rb +44 -0
  16. data/lib/retro_idl/asn/boolean.rb +50 -0
  17. data/lib/retro_idl/asn/builtin_value.rb +51 -0
  18. data/lib/retro_idl/asn/choice.rb +95 -0
  19. data/lib/retro_idl/asn/component_type.rb +56 -0
  20. data/lib/retro_idl/asn/constraint.rb +162 -0
  21. data/lib/retro_idl/asn/defined_type.rb +61 -0
  22. data/lib/retro_idl/asn/defined_value.rb +82 -0
  23. data/lib/retro_idl/asn/enumerated.rb +127 -0
  24. data/lib/retro_idl/asn/enumeration_item.rb +103 -0
  25. data/lib/retro_idl/asn/integer.rb +84 -0
  26. data/lib/retro_idl/asn/location.rb +10 -0
  27. data/lib/retro_idl/asn/named_number.rb +83 -0
  28. data/lib/retro_idl/asn/null.rb +41 -0
  29. data/lib/retro_idl/asn/octetstring.rb +48 -0
  30. data/lib/retro_idl/asn/real.rb +36 -0
  31. data/lib/retro_idl/asn/sequence.rb +132 -0
  32. data/lib/retro_idl/asn/sequenceof.rb +62 -0
  33. data/lib/retro_idl/asn/single_value.rb +26 -0
  34. data/lib/retro_idl/asn/tag.rb +163 -0
  35. data/lib/retro_idl/asn/type_list.rb +121 -0
  36. data/lib/retro_idl/asn/value_assignment.rb +21 -0
  37. data/lib/retro_idl/asn/value_list.rb +48 -0
  38. data/lib/retro_idl.rb +20 -0
  39. data/rakefile +33 -0
  40. data/test/asn/ext_parser/capture_stderr.rb +20 -0
  41. data/test/asn/ext_parser/tc_ext_parser.rb +94 -0
  42. data/test/asn/parser/capture_stderr.rb +20 -0
  43. data/test/asn/parser/tc_parser.rb +90 -0
  44. metadata +133 -0
@@ -0,0 +1,1207 @@
1
+ /* Bison Configuration
2
+ *
3
+ * Cameron Harper 2016
4
+ *
5
+ * */
6
+ %{
7
+
8
+ /* includes ***********************************************************/
9
+
10
+ #include <stdio.h>
11
+ #include <stdlib.h>
12
+ #include <stdbool.h>
13
+ #include <ruby.h>
14
+ #include <assert.h>
15
+
16
+ #include "lexer.h"
17
+
18
+ /* local prototypes ***************************************************/
19
+
20
+ /**
21
+ * - Ruby method to take a hash of attributes and return a tree of parsed data
22
+ *
23
+ * <code>
24
+ * attr = {
25
+ * :buffer => [a ruby string containing the file],
26
+ * :filename => [a ruby string containing the filename]
27
+ * }
28
+ * </code>
29
+ *
30
+ * @param[in] self reciever
31
+ * @param[in] attr hash of attributes
32
+ *
33
+ * @return tree of parsed data
34
+ *
35
+ * */
36
+ static VALUE parseFileBuffer(VALUE self, VALUE attr);
37
+
38
+ /**
39
+ * - Create a Ruby location record from YYLTYPE structure
40
+ * - Returned structure is a Hash with keys for location values
41
+ *
42
+ * @param[in] filename filename corresponding to location record
43
+ * @param[in] location pointer to Bison location record
44
+ *
45
+ * @return Ruby location instance
46
+ *
47
+ * */
48
+ static VALUE newLocation(VALUE filename, YYLTYPE *location);
49
+
50
+ /**
51
+ * - Mandatory yyerror function called by Flex/Bison
52
+ * - variadic like printf
53
+ *
54
+ * @param[in] locp pointer to Bison location record
55
+ * @param[in] scanner pointer to scanner instance (this is a pure parser)
56
+ * @param[in] filename filename corresponding to location record
57
+ * @param[out] tree the return structure
58
+ * @param[in] msg printf format string
59
+ *
60
+ * */
61
+ void yyerror(YYLTYPE *locp, yyscan_t scanner, VALUE filename, VALUE *tree, char const *msg, ... );
62
+
63
+ /* static variables ***************************************************/
64
+
65
+ static VALUE ASN;
66
+
67
+ /* generated **********************************************************/
68
+
69
+ %}
70
+
71
+ %define api.value.type {VALUE}
72
+ %define api.pure full
73
+ %locations
74
+ %lex-param {yyscan_t scanner}
75
+ %parse-param {yyscan_t scanner}{VALUE filename}{VALUE *tree}
76
+ %define parse.error verbose
77
+
78
+ %nonassoc EXCEPT
79
+ %left CARET INTERSECTION
80
+ %left PIPE UNION
81
+
82
+ %define api.token.prefix {TOK_}
83
+
84
+ %token
85
+ ENDL
86
+ LVERSION "[["
87
+ ASSIGN "::="
88
+ RANGE ".."
89
+ ELLIPSES "..."
90
+ EXCEPT
91
+ UNION
92
+ INTERSECTION
93
+ EXCLAIM
94
+ OCTET
95
+ CHARACTER
96
+ BIT
97
+ STRING
98
+ SIZE
99
+ CHOICE
100
+ SEQUENCE
101
+ SET
102
+ OF
103
+ ALL
104
+ MIN
105
+ MAX
106
+ COMPONENTS
107
+ COMPONENT
108
+ ABSENT
109
+ CONTAINING
110
+ FROM
111
+ INCLUDES
112
+ SETTINGS
113
+ PRESENT
114
+ PATTERN
115
+ WITH
116
+ OPTIONAL
117
+ DEFAULT
118
+ IMPLICIT
119
+ EXPLICIT
120
+ APPLICATION
121
+ PRIVATE
122
+ UNIVERSAL
123
+ CHAR
124
+ BOOLEAN
125
+ INTEGER
126
+ REAL
127
+ ENUMERATED
128
+ BMPString
129
+ GeneralString
130
+ GraphicString
131
+ IA5String
132
+ ISO646String
133
+ NumericString
134
+ PrintableString
135
+ TeletexString
136
+ T61String
137
+ UniversalString
138
+ UTF8String
139
+ VideotexString
140
+ VisibleString
141
+ DATE
142
+ DATE_TIME
143
+ DURATION
144
+ EMBEDDED
145
+ PDV
146
+ EXTERNAL
147
+ RELATIVE_OID_IRI
148
+ OBJECT
149
+ IDENTIFIER
150
+ RELATIVE_IRI
151
+ RELATIVE_OID
152
+ TIME
153
+ TIME_OF_DAY
154
+ POSINT "positive integer"
155
+ NEGINT "negative integer"
156
+ HEXINT
157
+ ID "identifier"
158
+ RVERSION "]]"
159
+ PLUS_INFINITY
160
+ MINUS_INFINITY
161
+ NOT_A_NUMBER
162
+ TRUE
163
+ FALSE
164
+ NULL
165
+ CONTAINS
166
+ POSREAL "positive real number"
167
+ NEGREAL "negative real number"
168
+ HSTRING "hstring"
169
+ BSTRING "bstring"
170
+ CSTRING "cstring"
171
+ DEFINITIONS
172
+ BEGIN
173
+ END
174
+ TAGS
175
+ INSTRUCTIONS
176
+ EXPORTS
177
+ IMPORTS
178
+ EXTENSIBILITY
179
+ IMPLIED
180
+ AUTOMATIC
181
+ TYPEREF "typereference"
182
+
183
+
184
+
185
+ %%
186
+
187
+ Top:
188
+ {
189
+ *tree = rb_ary_new();
190
+ }
191
+ AssignmentList
192
+ {
193
+ *tree = $AssignmentList;
194
+ }
195
+ ;
196
+
197
+ empty:
198
+ %empty
199
+ {
200
+ $$ = Qnil;
201
+ }
202
+ ;
203
+
204
+ hstring: HSTRING;
205
+
206
+ bstring: BSTRING;
207
+
208
+ cstring: CSTRING;
209
+
210
+ identifier: ID;
211
+
212
+ typereference: TYPEREF;
213
+
214
+ modulereference: typereference;
215
+
216
+ valuereference: identifier;
217
+
218
+ number: POSINT | NEGINT;
219
+
220
+ encodingreference: identifier;
221
+
222
+ /**********************************************************************/
223
+
224
+ AssignmentList:
225
+ AssignmentList[list] Assignment[item]
226
+ {
227
+ $$ = $list;
228
+ rb_ary_push($$, $item);
229
+ }
230
+ |
231
+ Assignment[item]
232
+ {
233
+ $$ = rb_ary_new3(1, $item);
234
+ }
235
+ ;
236
+
237
+ Assignment:
238
+ TypeAssignment
239
+ |
240
+ ValueAssignment
241
+ ;
242
+
243
+ TypeAssignment:
244
+ typereference[ref] ASSIGN optTypePrefix[tag] Type Constraint
245
+ {
246
+ $$ = $Type;
247
+ rb_hash_aset($$, ID2SYM(rb_intern("id")), $ref);
248
+ rb_hash_aset($$, ID2SYM(rb_intern("tag")), $tag);
249
+ rb_hash_aset($$, ID2SYM(rb_intern("location")), newLocation(filename, &@$));
250
+ rb_hash_aset($$, ID2SYM(rb_intern("constraint")), $Constraint);
251
+ }
252
+ ;
253
+
254
+ ValueAssignment:
255
+ valuereference[ref] Type[gov] ASSIGN Value[value]
256
+ {
257
+ $$ = $value;
258
+ rb_hash_aset($$, ID2SYM(rb_intern("id")), $ref);
259
+ rb_hash_aset($$, ID2SYM(rb_intern("governor")), $gov);
260
+ rb_hash_aset($$, ID2SYM(rb_intern("location")), newLocation(filename, &@$));
261
+ }
262
+ ;
263
+
264
+ /**********************************************************************/
265
+
266
+ Value:
267
+ BuiltinValue[value]
268
+ {
269
+ $$ = rb_hash_new();
270
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("BuiltinValue")));
271
+ rb_hash_aset($$, ID2SYM(rb_intern("value")), $value);
272
+ }
273
+ |
274
+ DefinedValue[value]
275
+ {
276
+ $$ = rb_hash_new();
277
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("DefinedValue")));
278
+ rb_hash_aset($$, ID2SYM(rb_intern("ref")), $value);
279
+ }
280
+ ;
281
+
282
+ BuiltinValue:
283
+ TRUE
284
+ |
285
+ FALSE
286
+ |
287
+ NULL
288
+ |
289
+ POSINT
290
+ |
291
+ NEGINT
292
+ |
293
+ HEXINT
294
+ |
295
+ POSREAL
296
+ |
297
+ NEGREAL
298
+ |
299
+ PLUS_INFINITY
300
+ |
301
+ MINUS_INFINITY
302
+ |
303
+ NOT_A_NUMBER
304
+ ;
305
+
306
+ DefinedValue:
307
+ valuereference
308
+ ;
309
+
310
+ NamedValue:
311
+ identifier Value
312
+ {
313
+ $$ = rb_hash_new();
314
+ rb_hash_aset($$, ID2SYM(rb_intern("id")), $identifier);
315
+ rb_hash_aset($$, ID2SYM(rb_intern("value")), $Value);
316
+ rb_hash_aset($$, ID2SYM(rb_intern("location")), newLocation(filename, &@$));
317
+ }
318
+ ;
319
+
320
+ /**********************************************************************/
321
+
322
+ Type:
323
+ BitStringType
324
+ |
325
+ BooleanType
326
+ |
327
+ CharacterStringType
328
+ |
329
+ ChoiceType
330
+ |
331
+ EnumeratedType
332
+ |
333
+ IntegerType
334
+ |
335
+ NullType
336
+ |
337
+ OctetStringType
338
+ |
339
+ RealType
340
+ |
341
+ SequenceOfType
342
+ |
343
+ SequenceType
344
+ |
345
+ DefinedType
346
+ ;
347
+
348
+ /**********************************************************************/
349
+
350
+ CharacterStringType:
351
+ RestrictedCharacterStringType
352
+ |
353
+ UnrestrictedCharacterStringType
354
+ ;
355
+
356
+ UnrestrictedCharacterStringType:
357
+ CHARACTER STRING
358
+ {
359
+ $$ = rb_hash_new();
360
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("CharacterString")));
361
+ }
362
+ ;
363
+
364
+ RestrictedCharacterStringType:
365
+ BMPString
366
+ {
367
+ $$ = rb_hash_new();
368
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("BMPString")));
369
+ }
370
+ |
371
+ GeneralString
372
+ {
373
+ $$ = rb_hash_new();
374
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("GeneralString")));
375
+ }
376
+ |
377
+ GraphicString
378
+ {
379
+ $$ = rb_hash_new();
380
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("GraphicString")));
381
+ }
382
+ |
383
+ IA5String
384
+ {
385
+ $$ = rb_hash_new();
386
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("IA5String")));
387
+ }
388
+ |
389
+ ISO646String
390
+ {
391
+ $$ = rb_hash_new();
392
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("ISO646String")));
393
+ }
394
+ |
395
+ NumericString
396
+ {
397
+ $$ = rb_hash_new();
398
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("NumericString")));
399
+ }
400
+ |
401
+ PrintableString
402
+ {
403
+ $$ = rb_hash_new();
404
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("PrintableString")));
405
+ }
406
+ |
407
+ TeletexString
408
+ {
409
+ $$ = rb_hash_new();
410
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("TeletexString")));
411
+ }
412
+ |
413
+ T61String
414
+ {
415
+ $$ = rb_hash_new();
416
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("T61String")));
417
+ }
418
+ |
419
+ UniversalString
420
+ {
421
+ $$ = rb_hash_new();
422
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("UniversalString")));
423
+ }
424
+ |
425
+ UTF8String
426
+ {
427
+ $$ = rb_hash_new();
428
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("UTF8String")));
429
+ }
430
+ |
431
+ VideotexString
432
+ {
433
+ $$ = rb_hash_new();
434
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("VideotexString")));
435
+ }
436
+ |
437
+ VisibleString
438
+ {
439
+ $$ = rb_hash_new();
440
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("VisibleString")));
441
+ }
442
+ ;
443
+
444
+ /**********************************************************************/
445
+
446
+ DefinedType:
447
+ typereference[ref]
448
+ {
449
+ $$ = rb_hash_new();
450
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("DefinedType")));
451
+ rb_hash_aset($$, ID2SYM(rb_intern("ref")), $ref);
452
+ }
453
+ ;
454
+
455
+ /**********************************************************************/
456
+
457
+ BooleanType:
458
+ BOOLEAN
459
+ {
460
+ $$ = rb_hash_new();
461
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("BOOLEAN")));
462
+ }
463
+ ;
464
+
465
+ /**********************************************************************/
466
+
467
+ IntegerType:
468
+ INTEGER
469
+ {
470
+ $$ = rb_hash_new();
471
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("INTEGER")));
472
+ }
473
+ |
474
+ INTEGER '{' NamedNumberList '}'
475
+ {
476
+ $$ = rb_hash_new();
477
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("INTEGER")));
478
+ rb_hash_aset($$, ID2SYM(rb_intern("numberList")), $NamedNumberList);
479
+ }
480
+ ;
481
+
482
+ NamedNumberList:
483
+ NamedNumber
484
+ {
485
+ $$ = rb_ary_new();
486
+ rb_ary_push($$, $NamedNumber);
487
+ }
488
+ |
489
+ NamedNumberList ',' NamedNumber
490
+ {
491
+ rb_ary_push($$, $NamedNumber);
492
+ }
493
+ ;
494
+
495
+ NamedNumber:
496
+ identifier[id] '(' NamedNumberNumber[number] ')'
497
+ {
498
+ $$ = rb_hash_new();
499
+ rb_hash_aset($$, ID2SYM(rb_intern("id")), $id);
500
+ rb_hash_aset($$, ID2SYM(rb_intern("number")), $number);
501
+ rb_hash_aset($$, ID2SYM(rb_intern("location")), newLocation(filename, &@$));
502
+ }
503
+ ;
504
+
505
+ NamedNumberNumber:
506
+ DefinedValue
507
+ |
508
+ SignedNumber
509
+ ;
510
+
511
+ SignedNumber:
512
+ POSINT
513
+ |
514
+ NEGINT
515
+ ;
516
+
517
+ /**********************************************************************/
518
+
519
+ EnumeratedType:
520
+ ENUMERATED '{' EnumerationItem[item] NextEnumerationItem[list]
521
+ {
522
+ $$ = $list;
523
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("ENUMERATED")));
524
+ rb_ary_unshift(rb_hash_aref($$, ID2SYM(rb_intern("root"))), $item);
525
+ }
526
+ ;
527
+
528
+ NextEnumerationItem:
529
+ '}'
530
+ {
531
+ $$ = rb_hash_new();
532
+ rb_hash_aset($$, ID2SYM(rb_intern("root")), rb_ary_new());
533
+ }
534
+ |
535
+ ',' EnumerationItem[item] NextEnumerationItem[list]
536
+ {
537
+ $$ = $list;
538
+ rb_ary_unshift(rb_hash_aref($$, ID2SYM(rb_intern("root"))), $item);
539
+ }
540
+ |
541
+ ',' ELLIPSES ExceptionSpec NextAddEnumerationItem[list]
542
+ {
543
+ $$ = $list;
544
+ rb_hash_aset($$, ID2SYM(rb_intern("extensible")), Qtrue);
545
+ rb_hash_aset($$, ID2SYM(rb_intern("exceptionSpec")), $ExceptionSpec);
546
+ }
547
+ ;
548
+
549
+ NextAddEnumerationItem:
550
+ '}'
551
+ {
552
+ $$ = rb_hash_new();
553
+ rb_hash_aset($$, ID2SYM(rb_intern("additional")), rb_ary_new());
554
+ rb_hash_aset($$, ID2SYM(rb_intern("root")), rb_ary_new());
555
+ }
556
+ |
557
+ ',' EnumerationItem[item] NextAddEnumerationItem[list]
558
+ {
559
+ $$ = $list;
560
+ rb_ary_unshift(rb_hash_aref($$, ID2SYM(rb_intern("additional"))), $item);
561
+ }
562
+ ;
563
+
564
+ EnumerationItem:
565
+ identifier
566
+ {
567
+ $$ = rb_hash_new();
568
+ rb_hash_aset($$, ID2SYM(rb_intern("id")), $identifier);
569
+ rb_hash_aset($$, ID2SYM(rb_intern("location")), newLocation(filename, &@$));
570
+ }
571
+ |
572
+ NamedNumber
573
+ ;
574
+
575
+ /**********************************************************************/
576
+
577
+ RealType:
578
+ REAL
579
+ {
580
+ $$ = rb_hash_new();
581
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("REAL")));
582
+ }
583
+ ;
584
+
585
+ /**********************************************************************/
586
+
587
+ BitStringType:
588
+ BIT STRING
589
+ {
590
+ $$ = rb_hash_new();
591
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("BITSTRING")));
592
+ rb_hash_aset($$, ID2SYM(rb_intern("bitList")), rb_ary_new());
593
+ }
594
+ |
595
+ BIT STRING '{' NamedNumberList '}'
596
+ {
597
+ $$ = rb_hash_new();
598
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("BITSTRING")));
599
+ rb_hash_aset($$, ID2SYM(rb_intern("bitList")), $NamedNumberList);
600
+ }
601
+ ;
602
+
603
+ /**********************************************************************/
604
+
605
+ OctetStringType:
606
+ OCTET STRING
607
+ {
608
+ $$ = rb_hash_new();
609
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("OCTETSTRING")));
610
+ }
611
+ ;
612
+
613
+ /**********************************************************************/
614
+
615
+ NullType:
616
+ NULL
617
+ {
618
+ $$ = rb_hash_new();
619
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("NULL")));
620
+ }
621
+ ;
622
+
623
+ /**********************************************************************/
624
+
625
+ SequenceType:
626
+ SEQUENCE '{' HeadComponentTypeList[list]
627
+ {
628
+ $$ = $list;
629
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("SEQUENCE")));
630
+ }
631
+ ;
632
+
633
+ HeadComponentTypeList:
634
+ '}'
635
+ {
636
+ $$ = rb_hash_new();
637
+ }
638
+ |
639
+ ELLIPSES ExceptionSpec AdditionalComponentTypeList[list]
640
+ {
641
+ $$ = $list;
642
+ rb_hash_aset($$, ID2SYM(rb_intern("extensible")), Qtrue);
643
+ rb_hash_aset($$, ID2SYM(rb_intern("exceptionSpec")), $ExceptionSpec);
644
+ }
645
+ |
646
+ ComponentType[item] NextHeadComponentType[list]
647
+ {
648
+ $$ = $list;
649
+ rb_ary_unshift(rb_hash_aref($$, ID2SYM(rb_intern("head"))), $item);
650
+ }
651
+ ;
652
+
653
+ NextHeadComponentType:
654
+ '}'
655
+ {
656
+ $$ = rb_hash_new();
657
+ rb_hash_aset($$, ID2SYM(rb_intern("head")), rb_ary_new());
658
+ }
659
+ |
660
+ ',' ELLIPSES ExceptionSpec AdditionalComponentTypeList[list]
661
+ {
662
+ $$ = $list;
663
+ rb_hash_aset($$, ID2SYM(rb_intern("extensible")), Qtrue);
664
+ rb_hash_aset($$, ID2SYM(rb_intern("exceptionSpec")), $ExceptionSpec);
665
+ }
666
+ |
667
+ ',' ComponentType[item] NextHeadComponentType[list]
668
+ {
669
+ $$ = $list;
670
+ rb_ary_unshift(rb_hash_aref($$, ID2SYM(rb_intern("head"))), $item);
671
+ }
672
+ ;
673
+
674
+ AdditionalComponentTypeList:
675
+ '}'
676
+ {
677
+ $$ = rb_hash_new();
678
+ rb_hash_aset($$, ID2SYM(rb_intern("head")), rb_ary_new());
679
+ }
680
+ |
681
+ ',' AdditionalComponentType[item] NextAdditionalComponentType[list]
682
+ {
683
+ $$ = $list;
684
+ rb_ary_unshift(rb_hash_aref($$, ID2SYM(rb_intern("additional"))), $item);
685
+ }
686
+ ;
687
+
688
+ NextAdditionalComponentType:
689
+ '}'
690
+ {
691
+ $$ = rb_hash_new();
692
+ rb_hash_aset($$, ID2SYM(rb_intern("additional")), rb_ary_new());
693
+ rb_hash_aset($$, ID2SYM(rb_intern("head")), rb_ary_new());
694
+ }
695
+ |
696
+ ',' ELLIPSES TailComponentTypeList[list] '}'
697
+ {
698
+ $$ = rb_hash_new();
699
+ rb_hash_aset($$, ID2SYM(rb_intern("additional")), rb_ary_new());
700
+ rb_hash_aset($$, ID2SYM(rb_intern("tail")), $list);
701
+ rb_hash_aset($$, ID2SYM(rb_intern("extensible")), Qtrue);
702
+ }
703
+ |
704
+ ',' AdditionalComponentType[item] NextAdditionalComponentType[list]
705
+ {
706
+ $$ = $list;
707
+ rb_ary_unshift(rb_hash_aref($$, ID2SYM(rb_intern("additional"))), $item);
708
+ }
709
+ ;
710
+
711
+ AdditionalComponentType:
712
+ ComponentType
713
+ |
714
+ LVERSION VersionNumber[version] ComponentTypeList[additional] RVERSION
715
+ {
716
+ $$ = rb_hash_new();
717
+ rb_hash_aset($$, ID2SYM(rb_intern("version")), $version);
718
+ rb_hash_aset($$, ID2SYM(rb_intern("additional")), $additional);
719
+ rb_hash_aset($$, ID2SYM(rb_intern("location")), newLocation(filename, &@$));
720
+ }
721
+ ;
722
+
723
+ ComponentTypeList:
724
+ ComponentType
725
+ |
726
+ ComponentTypeList ',' ComponentType
727
+ ;
728
+
729
+ TailComponentTypeList:
730
+ empty
731
+ |
732
+ ',' ComponentTypeList[list]
733
+ {
734
+ $$ = $list;
735
+ }
736
+ ;
737
+
738
+ VersionNumber:
739
+ empty
740
+ |
741
+ POSINT ':'
742
+ ;
743
+
744
+ ComponentType:
745
+ NamedType
746
+ |
747
+ NamedType OPTIONAL
748
+ {
749
+ rb_hash_aset($$, ID2SYM(rb_intern("OPTIONAL")), Qtrue);
750
+ }
751
+ |
752
+ NamedType DEFAULT Value
753
+ {
754
+ rb_hash_aset($$, ID2SYM(rb_intern("DEFAULT")), $Value);
755
+ }
756
+ |
757
+ COMPONENTS OF Type
758
+ {
759
+ $$ = Qnil;
760
+ }
761
+ ;
762
+
763
+ NamedType:
764
+ identifier optTypePrefix[tag] Type Constraint
765
+ {
766
+ $$ = $Type;
767
+ rb_hash_aset($$, ID2SYM(rb_intern("id")), $identifier);
768
+ rb_hash_aset($$, ID2SYM(rb_intern("tag")), $tag);
769
+ rb_hash_aset($$, ID2SYM(rb_intern("location")), newLocation(filename, &@$));
770
+ rb_hash_aset($$, ID2SYM(rb_intern("constraint")), $Constraint);
771
+ }
772
+ ;
773
+
774
+
775
+ /**********************************************************************/
776
+
777
+ SequenceOfType:
778
+ SEQUENCE SequenceOfTypeVariant SequenceOfTypeTarget
779
+ {
780
+ $$ = $SequenceOfTypeVariant;
781
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("SEQUENCEOF")));
782
+ rb_hash_aset($$, ID2SYM(rb_intern("type")), $SequenceOfTypeTarget);
783
+ }
784
+
785
+ SequenceOfTypeVariant:
786
+ OF
787
+ {
788
+ $$ = rb_hash_new();
789
+ }
790
+ |
791
+ Constraint OF
792
+ {
793
+ $$ = rb_hash_new();
794
+ rb_hash_aset($$, ID2SYM(rb_intern("constraint")), $Constraint);
795
+ }
796
+ |
797
+ SizeConstraint OF
798
+ {
799
+ $$ = rb_hash_new();
800
+ rb_hash_aset($$, ID2SYM(rb_intern("constraint")), $SizeConstraint);
801
+ }
802
+ ;
803
+
804
+ SequenceOfTypeTarget:
805
+ Type
806
+ |
807
+ NamedType
808
+ ;
809
+
810
+ /**********************************************************************/
811
+
812
+
813
+ ChoiceType:
814
+ CHOICE '{' NamedType[item] NextAltType[list]
815
+ {
816
+ $$ = $list;
817
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("CHOICE")));
818
+ rb_ary_unshift(rb_hash_aref($$, ID2SYM(rb_intern("root"))), $item);
819
+ }
820
+ ;
821
+
822
+ NextAltType:
823
+ '}'
824
+ {
825
+ $$ = rb_hash_new();
826
+ rb_hash_aset($$, ID2SYM(rb_intern("root")), rb_ary_new());
827
+ }
828
+ |
829
+ ',' ELLIPSES ExceptionSpec NextAddAltType[list]
830
+ {
831
+ $$ = $list;
832
+ rb_hash_aset($$, ID2SYM(rb_intern("extensible")), Qtrue);
833
+ rb_hash_aset($$, ID2SYM(rb_intern("exceptionSpec")), $ExceptionSpec);
834
+ rb_hash_aset($$, ID2SYM(rb_intern("root")), rb_ary_new());
835
+ }
836
+ |
837
+ ',' NamedType[item] NextAltType[list]
838
+ {
839
+ $$ = $list;
840
+ rb_ary_unshift(rb_hash_aref($$, ID2SYM(rb_intern("root"))), $item);
841
+ }
842
+ ;
843
+
844
+ NextAddAltType:
845
+ '}'
846
+ {
847
+ $$ = rb_hash_new();
848
+ rb_hash_aset($$, ID2SYM(rb_intern("additional")), rb_ary_new());
849
+ }
850
+ |
851
+ ',' ELLIPSES '}'
852
+ {
853
+ $$ = rb_hash_new();
854
+ rb_hash_aset($$, ID2SYM(rb_intern("additional")), rb_ary_new());
855
+ }
856
+ |
857
+ ',' AddAltType[item] NextAddAltType[list]
858
+ {
859
+ $$ = $list;
860
+ rb_ary_unshift(rb_hash_aref($$, ID2SYM(rb_intern("additional"))), $item);
861
+ }
862
+ ;
863
+
864
+ AddAltType:
865
+ NamedType
866
+ |
867
+ LVERSION VersionNumber[version] VersionedAltType[list] RVERSION
868
+ {
869
+ $$ = rb_hash_new();
870
+ rb_hash_aset($$, ID2SYM(rb_intern("version")), $version);
871
+ rb_hash_aset($$, ID2SYM(rb_intern("additional")), $list);
872
+ }
873
+ ;
874
+
875
+ VersionedAltType:
876
+ VersionedAltType[list] ',' NamedType[item]
877
+ {
878
+ rb_ary_push($$, $item);
879
+ }
880
+ |
881
+ NamedType[item]
882
+ {
883
+ $$ = rb_ary_new3(1, $item);
884
+ }
885
+ ;
886
+
887
+ /**********************************************************************/
888
+
889
+ optTypePrefix:
890
+ empty
891
+ |
892
+ TypePrefix
893
+ ;
894
+
895
+ TypePrefix:
896
+ Tag
897
+ |
898
+ Tag IMPLICIT
899
+ {
900
+ $$ = $Tag;
901
+ rb_hash_aset($Tag, ID2SYM(rb_intern("type")), ID2SYM(rb_intern("Implicit")));
902
+ }
903
+ |
904
+ Tag EXPLICIT
905
+ {
906
+ $$ = $Tag;
907
+ rb_hash_aset($Tag, ID2SYM(rb_intern("type")), ID2SYM(rb_intern("Explicit")));
908
+ }
909
+ ;
910
+
911
+ Tag:
912
+ '[' encodingreference ':' Class ']'
913
+ {
914
+ $$ = $Class;
915
+ }
916
+ |
917
+ '[' Class ']'
918
+ {
919
+ $$ = $Class;
920
+ }
921
+ ;
922
+
923
+ Class:
924
+ UNIVERSAL ClassNumber
925
+ {
926
+ $$ = rb_hash_new();
927
+ rb_hash_aset($$, ID2SYM(rb_intern("classNumber")), $ClassNumber);
928
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("Universal")));
929
+ }
930
+ |
931
+ APPLICATION ClassNumber
932
+ {
933
+ $$ = rb_hash_new();
934
+ rb_hash_aset($$, ID2SYM(rb_intern("classNumber")), $ClassNumber);
935
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("Application")));
936
+ }
937
+ |
938
+ PRIVATE ClassNumber
939
+ {
940
+ $$ = rb_hash_new();
941
+ rb_hash_aset($$, ID2SYM(rb_intern("classNumber")), $ClassNumber);
942
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("Private")));
943
+ }
944
+ |
945
+ ClassNumber
946
+ {
947
+ $$ = rb_hash_new();
948
+ rb_hash_aset($$, ID2SYM(rb_intern("classNumber")), $ClassNumber);
949
+ }
950
+ ;
951
+
952
+ ClassNumber:
953
+ number
954
+ |
955
+ DefinedValue
956
+ ;
957
+
958
+
959
+ /**********************************************************************/
960
+
961
+
962
+
963
+ Constraint:
964
+ '(' ConstraintSpec ')'
965
+ {
966
+ $$ = $ConstraintSpec;
967
+ }
968
+ |
969
+ empty
970
+ ;
971
+
972
+ ConstraintSpec:
973
+ ElementSetSpec
974
+ {
975
+ $$ = rb_hash_new();
976
+ rb_hash_aset($$, ID2SYM(rb_intern("rootElementSetSpec")), $ElementSetSpec);
977
+ }
978
+ ;
979
+
980
+ ElementSetSpec:
981
+ ALL EXCEPT Elements
982
+ {
983
+ $$ = rb_ary_new();
984
+ rb_ary_push($$, ID2SYM(rb_intern("ALL")));
985
+ rb_ary_push($$, ID2SYM(rb_intern("EXCEPT")));
986
+ rb_ary_push($$, $Elements);
987
+ }
988
+ |
989
+ Elements NextElements
990
+ {
991
+ $$ = $NextElements;
992
+ rb_ary_unshift($$, $Elements);
993
+ }
994
+ ;
995
+
996
+ NextElements:
997
+ UnionMark Elements NextElements[next]
998
+ {
999
+ rb_ary_unshift($next, $Elements);
1000
+ VALUE mark = rb_hash_new();
1001
+ rb_hash_aset(mark, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("UNION")));
1002
+ rb_hash_aset(mark, ID2SYM(rb_intern("location")), newLocation(filename, &@$));
1003
+ rb_ary_unshift($$, mark);
1004
+ }
1005
+ |
1006
+ IntersectionMark Elements NextElements[next]
1007
+ {
1008
+ rb_ary_unshift($next, $Elements);
1009
+ VALUE mark = rb_hash_new();
1010
+ rb_hash_aset(mark, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("INTERSECTION")));
1011
+ rb_hash_aset(mark, ID2SYM(rb_intern("location")), newLocation(filename, &@$));
1012
+ rb_hash_aset($$, ID2SYM(rb_intern("location")), newLocation(filename, &@$));
1013
+ rb_ary_unshift($$, mark);
1014
+ }
1015
+ |
1016
+ empty
1017
+ {
1018
+ $$ = rb_ary_new();
1019
+ }
1020
+ ;
1021
+
1022
+ IntersectionMark:
1023
+ INTERSECTION
1024
+ |
1025
+ '^'
1026
+ ;
1027
+
1028
+ UnionMark:
1029
+ UNION
1030
+ |
1031
+ '|'
1032
+ ;
1033
+
1034
+ Elements:
1035
+ '(' ElementSetSpec ')'
1036
+ |
1037
+ SubTypeElements
1038
+ ;
1039
+
1040
+ SubTypeElements:
1041
+ SingleValue
1042
+ |
1043
+ ValueRange
1044
+ |
1045
+ SizeConstraint
1046
+ ;
1047
+
1048
+ SingleValue:
1049
+ Value
1050
+ {
1051
+ $$ = rb_hash_new();
1052
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("SingleValue")));
1053
+ rb_hash_aset($$, ID2SYM(rb_intern("location")), newLocation(filename, &@$));
1054
+ rb_hash_aset($$, ID2SYM(rb_intern("value")), $Value);
1055
+ }
1056
+ ;
1057
+
1058
+ ValueRange:
1059
+ LowerEndpoint RANGE UpperEndpoint
1060
+ {
1061
+ $$ = rb_hash_new();
1062
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("ValueRange")));
1063
+ rb_hash_aset($$, ID2SYM(rb_intern("location")), newLocation(filename, &@$));
1064
+ rb_hash_aset($$, ID2SYM(rb_intern("lower")), $LowerEndpoint);
1065
+ rb_hash_aset($$, ID2SYM(rb_intern("upper")), $UpperEndpoint);
1066
+ }
1067
+ ;
1068
+
1069
+ LowerEndpoint:
1070
+ LowerEndValue
1071
+ |
1072
+ LowerEndValue '<'
1073
+ ;
1074
+
1075
+ UpperEndpoint:
1076
+ UpperEndValue
1077
+ |
1078
+ '<' UpperEndValue
1079
+ {
1080
+ $$ = $UpperEndValue;
1081
+ }
1082
+ ;
1083
+
1084
+ LowerEndValue:
1085
+ Value
1086
+ |
1087
+ MIN
1088
+ {
1089
+ $$ = ID2SYM(rb_intern("MIN"));
1090
+ }
1091
+ ;
1092
+
1093
+ UpperEndValue:
1094
+ Value
1095
+ |
1096
+ MAX
1097
+ {
1098
+ $$ = ID2SYM(rb_intern("MAX"));
1099
+ }
1100
+ ;
1101
+
1102
+ SizeConstraint:
1103
+ SIZE Constraint
1104
+ {
1105
+ $$ = rb_hash_new();
1106
+ rb_hash_aset($$, ID2SYM(rb_intern("class")), ID2SYM(rb_intern("SizeConstraint")));
1107
+ rb_hash_aset($$, ID2SYM(rb_intern("location")), newLocation(filename, &@$));
1108
+ rb_hash_aset($$, ID2SYM(rb_intern("constraint")), $Constraint);
1109
+ }
1110
+ ;
1111
+
1112
+
1113
+ /**********************************************************************/
1114
+
1115
+ ExceptionSpec:
1116
+ '!' ExceptionIdentification
1117
+ |
1118
+ empty
1119
+ ;
1120
+
1121
+ ExceptionIdentification:
1122
+ Type ':' Value
1123
+ |
1124
+ DefinedValue
1125
+ |
1126
+ SignedNumber
1127
+ ;
1128
+
1129
+ %%
1130
+
1131
+
1132
+
1133
+ /* public functions ***************************************************/
1134
+
1135
+ void Init_ext_parser(void)
1136
+ {
1137
+ ASN = rb_define_module_under(rb_define_module("RetroIDL"), "ASN");
1138
+ rb_define_module_function(ASN, "parseFileBuffer", parseFileBuffer, 1);
1139
+ }
1140
+
1141
+ void yyerror(YYLTYPE *locp, yyscan_t scanner, VALUE filename, VALUE *tree, char const *msg, ... )
1142
+ {
1143
+ int retval;
1144
+ VALUE rbString;
1145
+ char error[500];
1146
+
1147
+ int hdrLen;
1148
+
1149
+ hdrLen = snprintf(error, sizeof(error), "%s:%i:%i: error: ", (const char *)RSTRING_PTR(filename), locp->first_line, locp->first_column);
1150
+
1151
+ if((hdrLen > 0) && (hdrLen <= sizeof(error))){
1152
+
1153
+ va_list argptr;
1154
+ va_start(argptr, msg);
1155
+ retval = vsnprintf(&error[hdrLen], sizeof(error) - hdrLen, msg, argptr);
1156
+ va_end(argptr);
1157
+
1158
+ if((retval > 0) && ((hdrLen + retval) <= sizeof(error))){
1159
+
1160
+ rbString = rb_str_new((const char *)error, (hdrLen + retval));
1161
+ rb_io_puts(1, &rbString, rb_stderr);
1162
+ }
1163
+ else{
1164
+
1165
+ rb_bug("yyerror buffer is too short to contain error message");
1166
+ }
1167
+ }
1168
+ else{
1169
+
1170
+ rb_bug("yyerror buffer is too short to contain error message");
1171
+ }
1172
+ }
1173
+
1174
+ /* static functions ***************************************************/
1175
+
1176
+ static VALUE parseFileBuffer(VALUE self, VALUE attr)
1177
+ {
1178
+ yyscan_t scanner;
1179
+
1180
+ VALUE tree = Qnil;
1181
+
1182
+ VALUE buffer = rb_hash_aref(attr, ID2SYM(rb_intern("buffer")));
1183
+ VALUE filename = rb_hash_aref(attr, ID2SYM(rb_intern("fileName")));
1184
+
1185
+ if(yylex_init(&scanner) == 0){
1186
+
1187
+ if(yy_scan_bytes((const char *)RSTRING_PTR(buffer), RSTRING_LEN(buffer), scanner)){
1188
+
1189
+ yyparse(scanner, filename, &tree);
1190
+ }
1191
+
1192
+ yylex_destroy(scanner);
1193
+ }
1194
+
1195
+ return tree;
1196
+ }
1197
+
1198
+ static VALUE newLocation(VALUE filename, YYLTYPE *location)
1199
+ {
1200
+ return rb_funcall(rb_const_get(ASN, rb_intern("Location")), rb_intern("new"), 5,
1201
+ filename,
1202
+ INT2NUM(location->first_line),
1203
+ INT2NUM(location->last_line),
1204
+ INT2NUM(location->first_column),
1205
+ INT2NUM(location->last_column)
1206
+ );
1207
+ }