Sync with 5.4.2
[deliverable/titan.core.git] / compiler2 / ttcn3 / coding_attrib_p.y
... / ...
CommitLineData
1/******************************************************************************
2 * Copyright (c) 2000-2015 Ericsson Telecom AB
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 ******************************************************************************/
8/* Parser for "extension" attributes of functions, external functions and
9 * port types related to message encoding. */
10
11%{
12
13#include "../../common/dbgnew.hh"
14#include "../string.hh"
15#include "../Identifier.hh"
16#include "../Setting.hh"
17#include "../Type.hh"
18#include "AST_ttcn3.hh"
19#include "Attributes.hh"
20#include "Ttcnstuff.hh"
21#include "../stack.hh"
22
23using namespace Ttcn;
24using namespace Common;
25
26/* Various C macros */
27
28#define YYERROR_VERBOSE
29#define yytext coding_attrib_text
30
31/* C/C++ declarations */
32
33extern char *yytext;
34extern int yylex();
35extern const char *coding_attrib_infile;
36
37/* Init the lexer. Located in coding_attrib_la.l */
38extern void init_coding_attrib_lex(const AttributeSpec& attrib);
39extern void cleanup_coding_attrib_lex();
40
41ExtensionAttributes *extatrs = 0;
42
43static void yyerror(const char *str);
44
45%}
46
47/*********************************************************************
48 * Bison declarations
49 *********************************************************************/
50
51%name-prefix="coding_attrib_"
52%output="coding_attrib_p.cc"
53%expect 0
54
55/*********************************************************************
56 * The union-type
57 *********************************************************************/
58
59%union {
60 ErrorBehaviorList *errorbehaviorlist;
61 ErrorBehaviorSetting *errorbehaviorsetting;
62 PrintingType *printing;
63 Identifier *id;
64 Ttcn::Reference *reference;
65 string *str;
66 Type *type;
67 Types *types;
68 TypeMapping *typemapping;
69 TypeMappings *typemappings;
70 TypeMappingTarget *typemappingtarget;
71 TypeMappingTargets *typemappingtargets;
72
73 struct {
74 Type::MessageEncodingType_t encoding_type;
75 string *encoding_options;
76 } encdec_attribute;
77
78 struct {
79 Type::MessageEncodingType_t encoding_type;
80 string *encoding_options;
81 ErrorBehaviorList *eb_list;
82 } encdec_mapping;
83
84 struct {
85 TypeMappings *in_mappings, *out_mappings;
86 } in_out_mappings;
87
88 struct {
89 Ttcn::Reference *port_type_ref;
90 TypeMappings *in_mappings, *out_mappings;
91 } user_attribute;
92
93 Def_Function_Base::prototype_t prototype;
94 Type::typetype_t typetype;
95 Type::MessageEncodingType_t encoding_type;
96 ExtensionAttributes *extattrs;
97 ExtensionAttribute *extattr;
98 int number;
99}
100
101/*********************************************************************
102 * Tokens with semantic value
103 *********************************************************************/
104
105%token <prototype> PrototypeSetting
106%token <encoding_type> EncodingType
107%token <str> EncodingOption
108%token <str> ErrorBehaviorString
109%token <id> IDentifier "Identifier"
110%token <number> Number
111%token <str> CustomEncoding
112
113/*********************************************************************
114 * Tokens without semantic value
115 *********************************************************************/
116
117/* TTCN-3 keywords */
118
119%token AddressKeyword "address"
120%token AnyTypeKeyword "anytype"
121%token BitStringKeyword "bitstring"
122%token BooleanKeyword "boolean"
123%token CharStringKeyword "charstring"
124%token DefaultKeyword "default"
125%token EncodeKeyword "encode"
126%token FloatKeyword "float"
127%token FunctionKeyword "function"
128%token HexStringKeyword "hexstring"
129%token InKeyword "in"
130%token IntegerKeyword "integer"
131%token ObjectIdentifierKeyword "objid"
132%token OctetStringKeyword "octetstring"
133%token OutKeyword "out"
134%token UniversalKeyword "universal"
135%token VerdictTypeKeyword "verdicttype"
136%token VersionKeyword "version"
137%token RequiresKeyword "requires"
138%token ReqTitanKeyword "requiresTitan"
139
140/* Non-standard keywords used by the attributes with context-sensitive
141 * recognition */
142
143%token DecodeKeyword "decode"
144%token DiscardKeyword "discard"
145%token ErrorBehaviorKeyword "errorbehavior"
146%token InternalKeyword "internal"
147%token PrototypeKeyword "prototype"
148%token ProviderKeyword "provider"
149%token SimpleKeyword "simple"
150%token UserKeyword "user"
151%token TransparentKeyword "transparent"
152%token PrintingKeyword "printing"
153
154%token CompactKeyword "compact"
155%token PrettyKeyword "pretty"
156
157%token RedirectSymbol "->"
158
159%token '.'
160%token '<'
161%token '>'
162%token '/'
163
164/*********************************************************************
165 * Semantic types of nonterminals
166 *********************************************************************/
167
168%type <errorbehaviorsetting> ErrorBehaviorSetting
169%type <errorbehaviorlist> ErrorBehaviorSettingList ErrorBehaviorAttribute
170%type <printing> PrintingAttribute PrintingType
171%type <reference> FunctionMapping FunctionReference PortTypeReference
172 ReferencedType
173%type <str> EncodingOptions
174%type <type> Type
175%type <types> TypeList
176%type <typemapping> TypeMapping
177%type <typemappings> TypeMappingList
178%type <typemappingtarget> TypeMappingTarget
179%type <typemappingtargets> TypeMappingTargetList
180
181%type <encdec_attribute> DecodeAttribute EncDecAttributeBody EncodeAttribute
182%type <encdec_mapping> DecodeMapping EncodeMapping
183%type <in_out_mappings> InOutTypeMapping InOutTypeMappingList
184%type <user_attribute> UserAttribute
185
186%type <prototype> PrototypeAttribute
187%type <typetype> PredefinedType
188
189%type <extattr> ExtensionAttribute ExternalFunctionAttribute
190 PortTypeAttribute AnyTypeAttribute EncDecValueAttribute
191 VersionAttribute RequiresAttribute TransparentAttribute
192
193%type <extattrs> ExtensionAttributes
194
195/*********************************************************************
196 * Destructors
197 *********************************************************************/
198
199%destructor { delete $$; }
200EncodingOption
201EncodingOptions
202ErrorBehaviorAttribute
203ErrorBehaviorSetting
204ErrorBehaviorSettingList
205ErrorBehaviorString
206FunctionMapping
207FunctionReference
208IDentifier
209PortTypeReference
210ReferencedType
211Type
212TypeList
213TypeMapping
214TypeMappingList
215TypeMappingTarget
216TypeMappingTargetList
217ExtensionAttribute
218ExtensionAttributes
219ExternalFunctionAttribute
220PortTypeAttribute
221AnyTypeAttribute
222EncDecValueAttribute
223VersionAttribute
224RequiresAttribute
225PrintingAttribute
226PrintingType
227CustomEncoding
228
229%destructor { delete $$.encoding_options; }
230DecodeAttribute
231EncDecAttributeBody
232EncodeAttribute
233
234%destructor {
235 delete $$.encoding_options;
236 delete $$.eb_list;
237}
238DecodeMapping
239EncodeMapping
240
241%destructor {
242 delete $$.in_mappings;
243 delete $$.out_mappings;
244}
245InOutTypeMapping
246InOutTypeMappingList
247
248%destructor {
249 delete $$.port_type_ref;
250 delete $$.in_mappings;
251 delete $$.out_mappings;
252}
253UserAttribute
254
255%expect 4
256
257%%
258
259/*********************************************************************
260 * Grammar
261 *********************************************************************/
262
263GrammarRoot:
264 ExtensionAttributes
265 {
266 if (extatrs == 0) extatrs = $1;
267 else {
268 extatrs->import($1);
269 delete $1;
270 }
271 }
272;
273
274ExtensionAttributes:
275 /* empty */
276 {
277 $$ = new ExtensionAttributes;
278 }
279| ExtensionAttributes ExtensionAttribute
280 {
281 $$=$1;
282 if ($2 != NULL) $$->add($2);
283 }
284;
285
286ExtensionAttribute:
287 ExternalFunctionAttribute
288| PortTypeAttribute
289| AnyTypeAttribute
290| EncDecValueAttribute
291| VersionAttribute
292| RequiresAttribute
293| TransparentAttribute
294;
295
296VersionAttribute:
297VersionKeyword IDentifier
298{ // version R2D2
299 $$ = new ExtensionAttribute(NULL, 0, 0, 0, $2); // VERSION
300 $$->set_location(coding_attrib_infile, @$);
301 if ($$->get_type() == ExtensionAttribute::NONE) {
302 $$->error("Incorrect version data '%s'", $2->get_name().c_str());
303 delete $2;
304 delete $$;
305 $$ = NULL;
306 }
307}
308| VersionKeyword '<' IDentifier '>'
309{ // version <RnXnn>
310 $$ = new ExtensionAttribute(NULL, 0, 0, 0, $3, ExtensionAttribute::VERSION_TEMPLATE);
311 $$->set_location(coding_attrib_infile, @$);
312 if ($$->get_type() == ExtensionAttribute::NONE) {
313 $$->error("Incorrect version template '<%s>'", $3->get_name().c_str());
314 delete $3;
315 delete $$;
316 $$ = NULL;
317 }
318}
319| VersionKeyword IDentifier Number Number IDentifier
320{ // version CNL 113 200 R2D2
321 $$ = new ExtensionAttribute($2->get_dispname().c_str(), $3, $4, 0, $5); // VERSION
322 $$->set_location(coding_attrib_infile, @$);
323 if ($$->get_type() == ExtensionAttribute::NONE) {
324 $$->error("Incorrect version data '%s %d %d %s'",
325 $2->get_dispname().c_str(), $3, $4, $5->get_dispname().c_str());
326 delete $5;
327 delete $$;
328 $$ = NULL;
329 }
330 delete $2;
331}
332| VersionKeyword IDentifier Number Number '<' IDentifier '>'
333{ // version CNL 113 200 <RnXnn>
334 $$ = new ExtensionAttribute($2->get_dispname().c_str(), $3, $4, 0, $6, ExtensionAttribute::VERSION_TEMPLATE); // VERSION
335 $$->set_location(coding_attrib_infile, @$);
336 if ($$->get_type() == ExtensionAttribute::NONE) {
337 $$->error("Incorrect version data '%s %d %d <%s>'",
338 $2->get_dispname().c_str(), $3, $4, $6->get_dispname().c_str());
339 delete $6;
340 delete $$;
341 $$ = NULL;
342 }
343 delete $2;
344}
345| VersionKeyword IDentifier Number Number '/' Number IDentifier
346{ // version CNL 113 200 / 1 R2D2
347 $$ = new ExtensionAttribute($2->get_dispname().c_str(), $3, $4, $6, $7); // VERSION
348 $$->set_location(coding_attrib_infile, @$);
349 if ($$->get_type() == ExtensionAttribute::NONE) {
350 $$->error("Incorrect version data '%s %d %d / %d %s'",
351 $2->get_dispname().c_str(), $3, $4, $6, $7->get_dispname().c_str());
352 delete $7;
353 delete $$;
354 $$ = NULL;
355 }
356 delete $2;
357}
358| VersionKeyword IDentifier Number Number '/' Number '<' IDentifier '>'
359{ // version CNL 113 200 / 1 <RnXnn>
360 $$ = new ExtensionAttribute($2->get_dispname().c_str(), $3, $4, $6, $8, ExtensionAttribute::VERSION_TEMPLATE); // VERSION
361 $$->set_location(coding_attrib_infile, @$);
362 if ($$->get_type() == ExtensionAttribute::NONE) {
363 $$->error("Incorrect version data '%s %d %d / %d <%s>'",
364 $2->get_dispname().c_str(), $3, $4, $6, $8->get_dispname().c_str());
365 delete $8;
366 delete $$;
367 $$ = NULL;
368 }
369 delete $2;
370}
371;
372
373RequiresAttribute:
374RequiresKeyword IDentifier IDentifier
375{ // module R1B
376 $$ = new ExtensionAttribute($2, NULL, 0, 0, 0, $3); // REQUIRES
377 $$->set_location(coding_attrib_infile, @$);
378 if ($$->get_type() == ExtensionAttribute::NONE) {
379 /* parsing the version has failed */
380 $$->error("Incorrect version data '%s'", $3->get_name().c_str());
381 delete $2;
382 delete $3;
383 delete $$;
384 $$ = NULL;
385 }
386}
387| RequiresKeyword IDentifier IDentifier Number Number IDentifier
388{ // module CNL xxx xxx R1A
389 $$ = new ExtensionAttribute($2, $3->get_dispname().c_str(), $4, $5, 0, $6); // REQUIRES
390 $$->set_location(coding_attrib_infile, @$);
391 if ($$->get_type() == ExtensionAttribute::NONE) {
392 $$->error("Incorrect version data '%s %d %d %s'",
393 $3->get_dispname().c_str(), $4, $5, $6->get_dispname().c_str());
394 delete $2;
395 delete $6;
396 delete $$;
397 $$ = NULL;
398 }
399 delete $3;
400}
401| RequiresKeyword IDentifier IDentifier Number Number '/' Number IDentifier
402{ // module CNL xxx xxx / 1 R9A
403 $$ = new ExtensionAttribute($2, $3->get_dispname().c_str(), $4, $5, $7, $8); // REQUIRES
404 $$->set_location(coding_attrib_infile, @$);
405 if ($$->get_type() == ExtensionAttribute::NONE) {
406 $$->error("Incorrect version data '%s %d %d / %d %s'",
407 $3->get_dispname().c_str(), $4, $5, $7, $8->get_dispname().c_str());
408 delete $2;
409 delete $8;
410 delete $$;
411 $$ = NULL;
412 }
413 delete $3;
414}
415| ReqTitanKeyword IDentifier
416{ // R1A
417 $$ = new ExtensionAttribute(NULL, 0, 0, 0, $2, ExtensionAttribute::REQ_TITAN);
418 $$->set_location(coding_attrib_infile, @$);
419 if ($$->get_type() == ExtensionAttribute::NONE) {
420 /* parsing the version has failed */
421 $$->error("Incorrect version data '%s'", $2->get_name().c_str());
422 delete $2;
423 delete $$;
424 $$ = NULL;
425 }
426}
427| ReqTitanKeyword IDentifier Number Number IDentifier
428{ // CRL 113 200 R1A
429 $$ = new ExtensionAttribute($2->get_dispname().c_str(), $3, $4, 0, $5, ExtensionAttribute::REQ_TITAN);
430 $$->set_location(coding_attrib_infile, @$);
431 if ($$->get_type() == ExtensionAttribute::NONE) {
432 $$->error("Incorrect version data '%s %d %d %s'",
433 $2->get_dispname().c_str(), $3, $4, $5->get_dispname().c_str());
434 delete $5;
435 delete $$;
436 $$ = NULL;
437 }
438 delete $2;
439}
440| ReqTitanKeyword IDentifier Number Number '/' Number IDentifier
441{ // CRL 113 200 / 2 R1A
442 $$ = new ExtensionAttribute($2->get_dispname().c_str(), $3, $4, $6, $7, ExtensionAttribute::REQ_TITAN);
443 $$->set_location(coding_attrib_infile, @$);
444 if ($$->get_type() == ExtensionAttribute::NONE) {
445 $$->error("Incorrect version data '%s %d %d / %d %s'",
446 $2->get_dispname().c_str(), $3, $4, $6, $7->get_dispname().c_str());
447 delete $7;
448 delete $$;
449 $$ = NULL;
450 }
451 delete $2;
452}
453;
454
455TransparentAttribute: TransparentKeyword
456{
457 $$ = new ExtensionAttribute(ExtensionAttribute::TRANSPARENT);
458 $$->set_location(coding_attrib_infile, @$);
459}
460;
461
462EncDecValueAttribute:
463 InOutTypeMappingList
464 {
465 $$ = new ExtensionAttribute($1.in_mappings, $1.out_mappings); // ENCDECVALUE
466 $$->set_location(coding_attrib_infile, @$);
467 }
468;
469
470/* FunctionAttribute is covered by the PrototypeAttribute branch */
471ExternalFunctionAttribute:
472 PrototypeAttribute
473 {
474 $$ = new ExtensionAttribute($1); // PROTOTYPE
475 $$->set_location(coding_attrib_infile, @$);
476 }
477| EncodeAttribute
478 {
479 $$ = new ExtensionAttribute(ExtensionAttribute::ENCODE,
480 $1.encoding_type, $1.encoding_options);
481 $$->set_location(coding_attrib_infile, @$);
482 }
483| DecodeAttribute
484 {
485 $$ = new ExtensionAttribute(ExtensionAttribute::DECODE,
486 $1.encoding_type, $1.encoding_options);
487 $$->set_location(coding_attrib_infile, @$);
488 }
489| ErrorBehaviorAttribute
490 {
491 $$ = new ExtensionAttribute($1); // ERRORBEHAVIOR
492 $$->set_location(coding_attrib_infile, @$);
493 }
494| PrintingAttribute
495 {
496 $$ = new ExtensionAttribute($1); // PRINTING
497 $$->set_location(coding_attrib_infile, @$);
498 }
499;
500
501PortTypeAttribute:
502 InternalKeyword
503 {
504 $$ = new ExtensionAttribute(PortTypeBody::TP_INTERNAL); // PORT_API
505 $$->set_location(coding_attrib_infile, @$);
506 }
507| AddressKeyword
508 {
509 $$ = new ExtensionAttribute(PortTypeBody::TP_ADDRESS); // PORT_API
510 $$->set_location(coding_attrib_infile, @$);
511 }
512| ProviderKeyword
513 {
514 $$ = new ExtensionAttribute(ExtensionAttribute::PORT_TYPE_PROVIDER);
515 $$->set_location(coding_attrib_infile, @$);
516 }
517| UserAttribute
518 {
519 $$ = new ExtensionAttribute($1.port_type_ref,
520 $1.in_mappings, $1.out_mappings); // PORT_TYPE_USER
521 $$->set_location(coding_attrib_infile, @$);
522 }
523;
524
525PrototypeAttribute:
526 PrototypeKeyword '(' PrototypeSetting ')' { $$ = $3; }
527;
528
529EncodeAttribute:
530 EncodeKeyword EncDecAttributeBody { $$ = $2; }
531;
532
533DecodeAttribute:
534 DecodeKeyword EncDecAttributeBody { $$ = $2; }
535;
536
537EncDecAttributeBody:
538 '(' EncodingType ')'
539 {
540 $$.encoding_type = $2;
541 $$.encoding_options = 0;
542 }
543| '(' EncodingType ':' EncodingOptions ')'
544 {
545 $$.encoding_type = $2;
546 $$.encoding_options = $4;
547 }
548| '(' CustomEncoding ')'
549 {
550 $$.encoding_type = Type::CT_CUSTOM;
551 $$.encoding_options = $2;
552 }
553;
554
555EncodingOptions:
556 EncodingOption { $$ = $1; }
557| EncodingOptions EncodingOption
558 {
559 $$ = $1;
560 *$$ += ' ';
561 *$$ += *$2;
562 delete $2;
563 }
564;
565
566ErrorBehaviorAttribute:
567 ErrorBehaviorKeyword '(' ErrorBehaviorSettingList ')'
568 {
569 $$ = $3;
570 $$->set_location(coding_attrib_infile, @$);
571 }
572;
573
574ErrorBehaviorSettingList:
575 ErrorBehaviorSetting
576 {
577 $$ = new ErrorBehaviorList();
578 $$->add_ebs($1);
579 }
580| ErrorBehaviorSettingList ',' ErrorBehaviorSetting
581 {
582 $$ = $1;
583 $$->add_ebs($3);
584 }
585;
586
587ErrorBehaviorSetting:
588 ErrorBehaviorString ':' ErrorBehaviorString
589 {
590 $$ = new ErrorBehaviorSetting(*$1, *$3);
591 $$->set_location(coding_attrib_infile, @$);
592 delete $1;
593 delete $3;
594 }
595;
596
597PrintingAttribute:
598 PrintingKeyword '(' PrintingType ')'
599 {
600 $$ = $3;
601 $$->set_location(coding_attrib_infile, @$);
602 }
603;
604
605PrintingType:
606 CompactKeyword
607 {
608 $$ = new PrintingType();
609 $$->set_printing(PrintingType::PT_COMPACT);
610 }
611| PrettyKeyword
612 {
613 $$ = new PrintingType();
614 $$->set_printing(PrintingType::PT_PRETTY);
615 }
616;
617
618UserAttribute:
619 UserKeyword PortTypeReference InOutTypeMappingList
620 {
621 $$.port_type_ref = $2;
622 $$.in_mappings = $3.in_mappings;
623 $$.out_mappings = $3.out_mappings;
624 }
625;
626
627PortTypeReference:
628 IDentifier
629 {
630 $$ = new Ttcn::Reference($1);
631 $$->set_location(coding_attrib_infile, @$);
632 }
633| IDentifier '.' IDentifier
634 {
635 $$ = new Ttcn::Reference($1, $3);
636 $$->set_location(coding_attrib_infile, @$);
637 }
638;
639
640InOutTypeMappingList:
641 InOutTypeMapping { $$ = $1; }
642| InOutTypeMappingList InOutTypeMapping
643 {
644 if ($1.in_mappings) {
645 $$.in_mappings = $1.in_mappings;
646 if ($2.in_mappings) {
647 $$.in_mappings->steal_mappings($2.in_mappings);
648 delete $2.in_mappings;
649 }
650 } else $$.in_mappings = $2.in_mappings;
651 if ($1.out_mappings) {
652 $$.out_mappings = $1.out_mappings;
653 if ($2.out_mappings) {
654 $$.out_mappings->steal_mappings($2.out_mappings);
655 delete $2.out_mappings;
656 }
657 } else $$.out_mappings = $2.out_mappings;
658 }
659;
660
661InOutTypeMapping:
662 InKeyword '(' TypeMappingList ')'
663 {
664 $$.in_mappings = $3;
665 $$.in_mappings->set_location(coding_attrib_infile, @$);
666 $$.out_mappings = 0;
667 }
668| OutKeyword '(' TypeMappingList ')'
669 {
670 $$.in_mappings = 0;
671 $$.out_mappings = $3;
672 $$.out_mappings->set_location(coding_attrib_infile, @$);
673 }
674;
675
676TypeMappingList:
677 TypeMapping
678 {
679 $$ = new TypeMappings();
680 $$->add_mapping($1);
681 }
682| TypeMappingList ';' TypeMapping
683 {
684 $$ = $1;
685 $$->add_mapping($3);
686 }
687;
688
689TypeMapping:
690 Type RedirectSymbol TypeMappingTargetList
691 {
692 $$ = new TypeMapping($1, $3);
693 $$->set_location(coding_attrib_infile, @$);
694 }
695;
696
697TypeMappingTargetList:
698 TypeMappingTarget
699 {
700 $$ = new TypeMappingTargets();
701 $$->add_target($1);
702 }
703| TypeMappingTargetList ',' TypeMappingTarget
704 {
705 $$ = $1;
706 $$->add_target($3);
707 }
708;
709
710TypeMappingTarget:
711 Type ':' SimpleKeyword
712 {
713 $$ = new TypeMappingTarget($1, TypeMappingTarget::TM_SIMPLE);
714 $$->set_location(coding_attrib_infile, @$);
715 }
716| '-' ':' DiscardKeyword
717 {
718 $$ = new TypeMappingTarget(0, TypeMappingTarget::TM_DISCARD);
719 $$->set_location(coding_attrib_infile, @$);
720 }
721| Type ':' FunctionMapping
722 {
723 $$ = new TypeMappingTarget($1, TypeMappingTarget::TM_FUNCTION, $3);
724 $$->set_location(coding_attrib_infile, @$);
725 }
726| Type ':' EncodeMapping
727 {
728 $$ = new TypeMappingTarget($1, TypeMappingTarget::TM_ENCODE,
729 $3.encoding_type, $3.encoding_options, $3.eb_list);
730 $$->set_location(coding_attrib_infile, @$);
731 }
732| Type ':' DecodeMapping
733 {
734 $$ = new TypeMappingTarget($1, TypeMappingTarget::TM_DECODE,
735 $3.encoding_type, $3.encoding_options, $3.eb_list);
736 $$->set_location(coding_attrib_infile, @$);
737 }
738;
739
740FunctionMapping:
741 FunctionKeyword '(' FunctionReference ')' { $$ = $3; }
742;
743
744FunctionReference:
745 IDentifier
746 {
747 $$ = new Ttcn::Reference($1);
748 $$->set_location(coding_attrib_infile, @$);
749 }
750| IDentifier '.' IDentifier
751 {
752 $$ = new Ttcn::Reference($1, $3);
753 $$->set_location(coding_attrib_infile, @$);
754 }
755;
756
757EncodeMapping:
758 EncodeAttribute
759 {
760 $$.encoding_type = $1.encoding_type;
761 $$.encoding_options = $1.encoding_options;
762 $$.eb_list = 0;
763 }
764| EncodeAttribute ErrorBehaviorAttribute
765 {
766 $$.encoding_type = $1.encoding_type;
767 $$.encoding_options = $1.encoding_options;
768 $$.eb_list = $2;
769 }
770;
771
772DecodeMapping:
773 DecodeAttribute
774 {
775 $$.encoding_type = $1.encoding_type;
776 $$.encoding_options = $1.encoding_options;
777 $$.eb_list = 0;
778 }
779| DecodeAttribute ErrorBehaviorAttribute
780 {
781 $$.encoding_type = $1.encoding_type;
782 $$.encoding_options = $1.encoding_options;
783 $$.eb_list = $2;
784 }
785;
786
787Type:
788 PredefinedType
789 {
790 $$ = new Type($1);
791 $$->set_location(coding_attrib_infile, @$);
792 }
793| ReferencedType
794 {
795 $$ = new Type(Type::T_REFD, $1);
796 $$->set_location(coding_attrib_infile, @$);
797 }
798;
799
800PredefinedType: /* typetype_t */
801 BitStringKeyword { $$ = Type::T_BSTR; }
802| BooleanKeyword { $$ = Type::T_BOOL; }
803| CharStringKeyword { $$ = Type::T_CSTR; }
804| UniversalKeyword CharStringKeyword { $$ = Type::T_USTR; }
805| IntegerKeyword { $$ = Type::T_INT; }
806| OctetStringKeyword { $$ = Type::T_OSTR; }
807| HexStringKeyword { $$ = Type::T_HSTR; }
808| VerdictTypeKeyword { $$ = Type::T_VERDICT; }
809| FloatKeyword { $$ = Type::T_REAL; }
810| AddressKeyword { $$ = Type::T_ADDRESS; }
811| DefaultKeyword { $$ = Type::T_DEFAULT; }
812| AnyTypeKeyword
813 {
814 Location loc(coding_attrib_infile, @$);
815 loc.error("Type `anytype' as a field of `anytype' is not supported");
816 $$ = Type::T_ERROR;
817 }
818| ObjectIdentifierKeyword { $$ = Type::T_OID; }
819;
820
821ReferencedType: /* a Reference* */
822 IDentifier
823 {
824 $$ = new Ttcn::Reference($1);
825 $$->set_location(coding_attrib_infile, @$);
826 }
827| IDentifier '.' IDentifier
828 {
829 $$ = new Ttcn::Reference($1, $3);
830 $$->set_location(coding_attrib_infile, @$);
831 }
832;
833
834
835AnyTypeAttribute:
836 AnyTypeKeyword TypeList
837 {
838 $$ = new ExtensionAttribute($2); // ANYTYPELIST
839 $$->set_location(coding_attrib_infile, @$);
840 }
841
842
843TypeList:
844 Type
845 {
846 $$ = new Types;
847 $$->add_type($1);
848 $$->set_location(coding_attrib_infile, @$);
849 }
850| TypeList ',' Type
851 {
852 $$ = $1;
853 $$->add_type($3);
854 $$->set_location(coding_attrib_infile, @$);
855 }
856;
857
858%%
859
860static void yyerror(const char *str)
861{
862 Location loc(coding_attrib_infile, yylloc);
863 if (*yytext) {
864 // the most recently parsed token is known
865 loc.error("at or before token `%s': %s", yytext, str);
866 } else {
867 // the most recently parsed token is unknown
868 loc.error("%s", str);
869 }
870}
871
872/** Parse all extension attributes in a "with" statement */
873ExtensionAttributes * parse_extattributes(WithAttribPath *w_attrib_path)
874{
875 extatrs = 0;
876 if (!w_attrib_path) FATAL_ERROR("parse_extattributes(): NULL pointer");
877 // Collect attributes from outer scopes
878 vector<SingleWithAttrib> const& real_attribs =
879 w_attrib_path->get_real_attrib();
880 const size_t nof_attribs = real_attribs.size();
881
882 for (size_t i = 0; i < nof_attribs; i++) {
883 SingleWithAttrib *attrib = real_attribs[i];
884 if (attrib->get_attribKeyword() == SingleWithAttrib::AT_EXTENSION) {
885 Qualifiers *qualifiers = attrib->get_attribQualifiers();
886 if (!qualifiers || qualifiers->get_nof_qualifiers() == 0) {
887 // Only care about extension attributes without qualifiers
888 Error_Context cntxt(attrib, "In `extension' attribute");
889 init_coding_attrib_lex(attrib->get_attribSpec());
890 int result = yyparse(); /* 0=ok, 1=error, 2=out of memory */
891 (void)result;
892 cleanup_coding_attrib_lex();
893 } // if no qualifiers
894 } // if AT_EXTENSION
895 } // for
896
897 return extatrs;
898}
This page took 0.030389 seconds and 5 git commands to generate.