1%%
2%% %CopyrightBegin%
3%%
4%% Copyright Ericsson AB 2000-2016. All Rights Reserved.
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%% %CopyrightEnd%
19%%
20
21%%
22%%----------------------------------------------------------------------
23%% Purpose: YECC grammar for text encoding of Megaco/H.248
24%%----------------------------------------------------------------------
25
26%%----------------------------------------------------------------------
27%% Annex B TEXT ENCODING OF THE PROTOCOL (NORMATIVE)
28%%
29%% B.1 Coding of wildcards
30%%
31%% In a text encoding of the protocol, while TerminationIDs are
32%% arbitrary, by judicious choice of names, the wildcard character, "*"
33%% may be made more useful.  When the wildcard character is encountered,
34%% it will "match" all TerminationIDs having the same previous and
35%% following characters (if appropriate).  For example, if there were
36%% TerminationIDs of R13/3/1, R13/3/2 and R13/3/3, the TerminationID
37%% R13/3/* would match all of them.  There are some circumstances where
38%% ALL Terminations must be referred to.  The TerminationID "*" suffices,
39%% and is referred to as ALL. The CHOOSE TerminationID "$" may be used to
40%% signal to the MG that it has to create an ephemeral Termination or
41%% select an idle physical Termination.
42%%
43%% B.2 ABNF specification
44%%
45%% The protocol syntax is presented in ABNF according to RFC2234.  The
46%% protocol is not case sensitive.  Identifiers are not case sensitive.
47%%----------------------------------------------------------------------
48
49%%----------------------------------------------------------------------
50%% Number of expected shift/reduce warnings
51%% This is ugly but...
52%%----------------------------------------------------------------------
53
54Expect 609.
55
56
57%%----------------------------------------------------------------------
58%% Non-terminals
59%%----------------------------------------------------------------------
60
61Nonterminals
62
63    actionReply
64    actionReplyBody
65    actionReplyList
66    actionRequest
67    actionRequestItem
68    actionRequestItems
69    actionRequestList
70    alternativeValue
71    ammParameter
72    ammParameters
73    ammRequest
74    ammRequestBody
75    ammToken
76    ammsReply
77    ammsReplyBody
78    ammsToken
79    auditDescriptor
80    auditDescriptorBody
81    auditItem
82    auditItemList
83    auditOther
84    auditReply
85    auditRequest
86    auditReturnItem
87    auditReturnParameter
88    auditReturnParameterList
89    authenticationHeader
90    commandReply
91    commandReplyList
92    commandRequest
93    contextAudit
94    contextAuditProperties
95    contextAuditProperty
96    contextID
97    contextProperty
98    contextTerminationAudit
99    daddr
100    deviceName
101    digitMapDescriptor
102    domainAddress
103    domainName
104    embedFirst
105    embedNoSig
106    embedSig
107    embedWithSig
108    errorCode
109    errorDescriptor
110    errorText
111    eventBufferControl
112    eventBufferControlState
113    eventBufferDescriptor
114    eventDM
115    eventParameter
116    eventParameterName
117    eventParameters
118    eventSpec
119    eventSpecList
120    eventStreamOrOther
121    eventsDescriptor
122    extension
123    extensionParameter
124    localControlDescriptor
125    localParm
126    localParmList
127    mId
128    mediaDescriptor
129    mediaParm
130    mediaParmList
131    megacoMessage
132    message
133    messageBody
134    modemDescriptor
135    modemType
136    modemTypeList
137    mtpAddress
138    muxDescriptor
139    muxType
140    notificationReason
141    notificationReasons
142    notifyReply
143    notifyReplyBody
144    notifyRequest
145    notifyRequestBody
146    observedEvent
147    observedEventBody
148    observedEventParameter
149    observedEventParameters
150    observedEventTimeStamp
151    observedEvents
152    observedEventsDescriptor
153    onOrOff
154    optAuditDescriptor
155    optImmAckRequired
156    optPropertyParms
157    optSep
158    packagesDescriptor
159    packagesItem
160    packagesItems
161    %% parmName
162    parmValue
163    pathName
164    pkgdName
165    portNumber
166    priority
167    propertyParm
168    propertyParms
169    requestID
170    requestedEvent
171    requestedEventBody
172    requestedEvents
173    safeToken
174    safeToken2
175    secondEventParameter
176    secondEventParameters
177    secondRequestedEvent
178    secondRequestedEventBody
179    secondRequestedEvents
180    servChgReplyParm
181    servChgReplyParms
182    serviceChangeAddress
183    serviceChangeDelay
184    serviceChangeDescriptor
185    serviceChangeMethod
186    serviceChangeMgcId
187    serviceChangeParm
188    serviceChangeParms
189    serviceChangeProfile
190    serviceChangeReason
191    serviceChangeReply
192    serviceChangeReplyBody
193    serviceChangeReplyDescriptor
194    serviceChangeRequest
195    serviceChangeVersion
196    serviceState
197    serviceStates
198    sigParameter
199    sigParameters
200    signalList
201    signalListId
202    signalListParm
203    signalListParms
204    signalName
205    signalParm
206    signalParms
207    signalRequest
208    signalsDescriptor
209    signalType
210    statisticsDescriptor
211    statisticsParameter
212    statisticsParameters
213    streamDescriptor
214    streamID
215    streamModes
216    streamParm
217    streamParmList
218    subtractRequest
219    terminationA
220    terminationAudit
221    terminationB
222    terminationID
223    terminationIDList
224    terminationIDListRepeat
225    terminationStateDescriptor
226    terminationStateParm
227    terminationStateParms
228    timeStamp
229    topologyDescriptor
230    topologyDirection
231    topologyTriple
232    topologyTripleList
233    transactionAck
234    transactionAckList
235    transactionID
236    transactionItem
237    transactionList
238    transactionPending
239    transactionReply
240    transactionReplyBody
241    transactionRequest
242    transactionResponseAck
243    value
244    valueList
245
246.
247
248%%----------------------------------------------------------------------
249%% Terminals
250%%----------------------------------------------------------------------
251
252Terminals
253
254    'AddToken'
255    'AuditCapToken'
256    'AuditToken'
257    'AuditValueToken'
258    'AuthToken'
259    'BothwayToken'
260    'BriefToken'
261    'BufferToken'
262    'COLON'
263    'COMMA'
264    'ContextAuditToken'
265    'CtxToken'
266    'DelayToken'
267    'DigitMapToken'
268    'DigitMapDescriptorToken'
269    'DiscardToken'
270    'DisconnectedToken'
271    'DurationToken'
272    'EQUAL'
273    'EmbedToken'
274    'EmergencyToken'
275    'ErrorToken'
276    'EventBufferToken'
277    'EventsToken'
278    'FailoverToken'
279    'ForcedToken'
280    'GREATER'
281    'GracefulToken'
282    'H221Token'
283    'H223Token'
284    'H226Token'
285    'HandOffToken'
286    'ImmAckRequiredToken'
287    'InSvcToken'
288    'InactiveToken'
289    'IsolateToken'
290    'InterruptByEventToken'
291    'InterruptByNewSignalsDescrToken'
292    'KeepActiveToken'
293    'LBRKT'
294    'LESSER'
295    'LSBRKT'
296    'LocalControlToken'
297    'LocalDescriptorToken'
298    'LockStepToken'
299    'LoopbackToken'
300    'MediaToken'
301    %% 'MegacopToken'
302    'MethodToken'
303    'MgcIdToken'
304    'ModeToken'
305    'ModemToken'
306    'ModifyToken'
307    'MoveToken'
308    'MtpAddressToken'
309    'MuxToken'
310    'NEQUAL'
311    'NotifyCompletionToken'
312    'NotifyToken'
313    'ObservedEventsToken'
314    'OffToken'
315    'OnToken'
316    'OnOffToken'
317    'OnewayToken'
318    'OtherReasonToken'
319    'OutOfSvcToken'
320    'PackagesToken'
321    'PendingToken'
322    'PriorityToken'
323    'ProfileToken'
324    'QuotedChars'
325    'RBRKT'
326    'RSBRKT'
327    'ReasonToken'
328    'RecvonlyToken'
329    'RemoteDescriptorToken'
330    'ReplyToken'
331    'ReservedGroupToken'
332    'ReservedValueToken'
333    'ResponseAckToken'
334    'RestartToken'
335    'SEP'
336    'SafeChars'
337    'SendonlyToken'
338    'SendrecvToken'
339    'ServiceChangeAddressToken'
340    'ServiceChangeToken'
341    'ServiceStatesToken'
342    'ServicesToken'
343    'SignalListToken'
344    'SignalTypeToken'
345    'SignalsToken'
346    'StatsToken'
347    'StreamToken'
348    'SubtractToken'
349    'SynchISDNToken'
350    'TerminationStateToken'
351    'TestToken'
352    'TimeOutToken'
353    'TimeStampToken'
354    'TopologyToken'
355    'TransToken'
356    'V18Token'
357    'V22Token'
358    'V22bisToken'
359    'V32Token'
360    'V32bisToken'
361    'V34Token'
362    'V76Token'
363    'V90Token'
364    'V91Token'
365    'VersionToken'
366    'AndAUDITSelectToken'            %% OTP-7534: v3-fix
367    'BothToken'                      %% OTP-7534: v3-fix
368    'ContextAttrToken'               %% OTP-7534: v3-fix
369    'ContextListToken'               %% OTP-7534: v3-fix
370    'DirectionToken'                 %% OTP-7534: v3-fix
371    'EmergencyOffToken'              %% OTP-7534: v3-fix
372    'EmergencyValueToken'            %% OTP-7534: v3-fix
373    'ExternalToken'                  %% OTP-7534: v3-fix
374    'IEPSToken'                      %% OTP-7534: v3-fix
375    'IntsigDelayToken'               %% OTP-7534: v3-fix
376    'InternalToken'                  %% OTP-7534: v3-fix
377    'IterationToken'                 %% OTP-7534: v3-fix
378    'MessageSegmentToken'            %% OTP-7534: v3-fix
379    'NeverNotifyToken'               %% OTP-7534: v3-fix
380    'NotifyImmediateToken'           %% OTP-7534: v3-fix
381    'NotifyRegulatedToken'           %% OTP-7534: v3-fix
382    'Nx64kToken'                     %% OTP-7534: v2-fix
383    'OnewayBothToken'                %% OTP-7534: v3-fix
384    'OnewayExternalToken'            %% OTP-7534: v3-fix
385    'OrAUDITselectToken'             %% OTP-7534: v3-fix
386    'RequestIDToken'                 %% OTP-7534: v3-fix
387    'ResetEventsDescriptorToken'     %% OTP-7534: v3-fix
388    'SegmentationCompleteToken'      %% OTP-7534: v3-fix
389    'ServiceChangeIncompleteToken'   %% OTP-7534: v3-fix
390    endOfMessage
391
392.
393
394%%----------------------------------------------------------------------
395%% Root symbol
396%%----------------------------------------------------------------------
397
398Rootsymbol megacoMessage.
399
400%%----------------------------------------------------------------------
401%% The grammar
402%%----------------------------------------------------------------------
403
404%% megacoMessage        = LWSP [authenticationHeader SEP ] message
405%% authenticationHeader = AuthToken EQUAL SecurityParmIndex COLON
406%%                        SequenceNum COLON AuthData
407%%
408%% SecurityParmIndex    = "0x" 8(HEXDIG)
409%% SequenceNum          = "0x" 8(HEXDIG)
410%% AuthData             = "0x" 24*64(HEXDIG)
411%% message              = MegacopToken SLASH version SEP mId SEP messageBody
412%% version              = 1*2(DIGIT) .
413
414megacoMessage        -> optSep authenticationHeader message endOfMessage :
415                        #'MegacoMessage'{authHeader = '$2', mess = '$3'} .
416
417optSep               -> 'SEP'    : sep .
418optSep               -> '$empty' : no_sep .
419
420authenticationHeader -> 'AuthToken' 'EQUAL'
421                        safeToken 'COLON' safeToken 'COLON' safeToken optSep :
422                        ensure_auth_header('$3', '$5', '$7') .
423authenticationHeader -> '$empty' : asn1_NOVALUE .
424
425message              -> safeToken mId messageBody :
426                        ensure_message('$1', '$2', '$3') .
427
428messageBody          -> errorDescriptor : {messageError, '$1'} .
429messageBody          -> transactionList : {transactions, '$1'} .
430
431transactionList      -> transactionItem : ['$1'] .
432transactionList      -> transactionItem transactionList : ['$1' | '$2'] .
433
434transactionItem      -> transactionRequest      : {transactionRequest,     '$1'} .
435transactionItem      -> transactionReply        : {transactionReply,       '$1'}.
436transactionItem      -> transactionPending      : {transactionPending,     '$1'} .
437transactionItem      -> transactionResponseAck  : {transactionResponseAck, '$1'} .
438
439transactionResponseAck -> 'ResponseAckToken'
440                          'LBRKT' transactionAck transactionAckList 'RBRKT' :
441                          ['$3' | '$4'] .
442
443transactionAckList   -> 'COMMA' transactionAck transactionAckList : ['$2' | '$3'] .
444transactionAckList   -> '$empty' : [] .
445
446transactionAck       -> safeToken : ensure_transactionAck('$1') .
447
448transactionPending   -> 'PendingToken' 'EQUAL' transactionID 'LBRKT' 'RBRKT' :
449                        #'TransactionPending'{transactionId = ensure_transactionID('$3')} .
450
451transactionRequest   -> 'TransToken'
452                        'LBRKT'  actionRequest actionRequestList 'RBRKT' :
453                        #'TransactionRequest'{transactionId = asn1_NOVALUE,
454                                              actions = ['$3' | '$4']} .
455transactionRequest   -> 'TransToken' 'EQUAL'
456                        'LBRKT'  actionRequest actionRequestList 'RBRKT' :
457                        #'TransactionRequest'{transactionId = asn1_NOVALUE,
458                                              actions = ['$4' | '$5']} .
459transactionRequest   -> 'TransToken' 'EQUAL' transactionID
460                        'LBRKT'  actionRequest actionRequestList 'RBRKT' :
461                        #'TransactionRequest'{transactionId = ensure_transactionID('$3'),
462                                              actions = ['$5' | '$6']} .
463
464actionRequestList    -> 'COMMA' actionRequest actionRequestList :
465                        ['$2' | '$3'] .
466actionRequestList    -> '$empty' : [] .
467
468actionRequest        -> 'CtxToken' 'EQUAL' contextID
469                        'LBRKT' actionRequestItem actionRequestItems 'RBRKT' :
470                        merge_action_requests('$3', ['$5' | '$6']) .
471
472actionRequestItems   -> 'COMMA' actionRequestItem actionRequestItems : ['$2' | '$3'] .
473actionRequestItems   -> '$empty' : [] .
474
475actionRequestItem    -> contextProperty : '$1'.
476actionRequestItem    -> contextAudit    : '$1' .
477actionRequestItem    -> commandRequest  : '$1'.
478
479%% at-most-once
480contextProperty      -> topologyDescriptor  : {topology, '$1'}.
481contextProperty      -> priority            : {priority, '$1'}.
482contextProperty      -> 'EmergencyToken'    : {emergency, true}.
483
484contextAudit         -> 'ContextAuditToken'
485                        'LBRKT' contextAuditProperty
486                                contextAuditProperties 'RBRKT' :
487                        ['$3' | '$4'] .
488
489contextAuditProperties -> 'COMMA' contextAuditProperty
490                                  contextAuditProperties  :
491                          ['$2' | '$3'] .
492contextAuditProperties -> '$empty' : [] .
493
494%% at-most-once .
495contextAuditProperty -> 'TopologyToken'  : topologyAudit .
496contextAuditProperty -> 'EmergencyToken' : emergencyAudit .
497contextAuditProperty -> 'PriorityToken'  : priorityAudit .
498
499commandRequest       -> ammRequest             : '$1'.
500commandRequest       -> subtractRequest        : '$1'.
501commandRequest       -> auditRequest           : '$1'.
502commandRequest       -> notifyRequest          : '$1'.
503commandRequest       -> serviceChangeRequest   : '$1'.
504
505transactionReply     -> 'ReplyToken' 'EQUAL' transactionID
506			'LBRKT' optImmAckRequired
507                                transactionReplyBody 'RBRKT' :
508                        #'TransactionReply'{transactionId     = '$3',
509				            immAckRequired    = '$5',
510					    transactionResult = '$6'} .
511
512optImmAckRequired    -> 'ImmAckRequiredToken' 'COMMA' : 'NULL' .
513optImmAckRequired    -> '$empty' : asn1_NOVALUE .
514
515transactionReplyBody -> errorDescriptor :
516                        {transactionError, '$1'} .
517transactionReplyBody -> actionReply actionReplyList  :
518                        {actionReplies, ['$1' | '$2']} .
519
520actionReplyList      -> 'COMMA' actionReply actionReplyList  : ['$2' | '$3'] .
521actionReplyList      -> '$empty' : [] .
522
523actionReply          -> 'CtxToken' 'EQUAL' contextID
524                        'LBRKT' actionReplyBody 'RBRKT' :
525                        setelement(#'ActionReply'.contextId, '$5', '$3') .
526
527actionReplyBody -> errorDescriptor :
528                   #'ActionReply'{errorDescriptor = '$1'} .
529actionReplyBody -> commandReply commandReplyList :
530                   merge_action_reply(['$1' | '$2']) .
531
532commandReply         -> serviceChangeReply  : {command, '$1'} .
533commandReply         -> auditReply          : {command, '$1'} .
534commandReply         -> ammsReply           : {command, '$1'} .
535commandReply         -> notifyReply         : {command, '$1'} .
536commandReply         -> contextProperty     : {context, '$1'} .
537
538%% OTP-5085
539%% This ugly thing is to fool the parser. The errorDescriptor does not
540%% realy belong here. The merge_action_reply will remove it and put it
541%% in it's right place later.
542commandReplyList     -> 'COMMA' errorDescriptor :
543                        ['$2'] .
544commandReplyList     -> 'COMMA' commandReply commandReplyList  :
545                        ['$2' | '$3'] .
546commandReplyList     -> '$empty' : [] .
547
548%Add Move and Modify have the same request parameter
549ammRequest           -> ammToken 'EQUAL' terminationID ammRequestBody :
550                        make_commandRequest('$1',
551				            #'AmmRequest'{terminationID = ['$3'],
552							  descriptors   = '$4'}) .
553
554ammToken             -> 'AddToken'     : {addReq,  '$1'} .
555ammToken             -> 'MoveToken'    : {moveReq, '$1'} .
556ammToken             -> 'ModifyToken'  : {modReq,  '$1'} .
557
558ammRequestBody       -> 'LBRKT' ammParameter ammParameters 'RBRKT'  : ['$2' | '$3'] .
559ammRequestBody       -> '$empty' : [] .
560
561ammParameters        -> 'COMMA' ammParameter ammParameters  :  ['$2' | '$3'] .
562ammParameters        -> '$empty' : [] .
563
564%at-most-once
565ammParameter         -> mediaDescriptor        : {mediaDescriptor,       '$1'}.
566ammParameter         -> modemDescriptor        : {modemDescriptor,       '$1'}.
567ammParameter         -> muxDescriptor          : {muxDescriptor,         '$1'}.
568ammParameter         -> eventsDescriptor       : {eventsDescriptor,      '$1'}.
569ammParameter         -> eventBufferDescriptor  : {eventBufferDescriptor, '$1'}.
570ammParameter         -> signalsDescriptor      : {signalsDescriptor,     '$1'}.
571ammParameter         -> digitMapDescriptor     : {digitMapDescriptor,    '$1'}.
572ammParameter         -> auditDescriptor        : {auditDescriptor,       '$1'}.
573
574ammsReply            -> ammsToken 'EQUAL' terminationID ammsReplyBody :
575                        {'$1', #'AmmsReply'{terminationID    = ['$3'],
576				            terminationAudit = '$4'}} .
577
578ammsToken            -> 'AddToken'       : addReply .
579ammsToken            -> 'MoveToken'      : moveReply .
580ammsToken            -> 'ModifyToken'    : modReply .
581ammsToken            -> 'SubtractToken'  : subtractReply .
582
583ammsReplyBody        -> 'LBRKT' terminationAudit 'RBRKT' : '$2' .
584ammsReplyBody        -> '$empty' : asn1_NOVALUE .
585
586subtractRequest      -> 'SubtractToken' 'EQUAL'
587                        terminationID optAuditDescriptor :
588                        make_commandRequest({subtractReq, '$1'},
589                                            #'SubtractRequest'{terminationID = ['$3'],
590                                                               auditDescriptor = '$4'}) .
591
592
593optAuditDescriptor   -> 'LBRKT' auditDescriptor 'RBRKT'  : '$2'.
594optAuditDescriptor   -> '$empty'                         : asn1_NOVALUE .
595
596auditRequest -> 'AuditValueToken' 'EQUAL'
597                terminationID optAuditDescriptor :
598                make_commandRequest({auditValueRequest, '$1'},
599                                    #'AuditRequest'{terminationID   = '$3',
600                                                    auditDescriptor = '$4'}) .
601auditRequest -> 'AuditCapToken' 'EQUAL'
602                terminationID optAuditDescriptor :
603                make_commandRequest({auditCapRequest, '$1'},
604                                    #'AuditRequest'{terminationID   = '$3',
605                                                    auditDescriptor = '$4'}) .
606
607auditReply -> 'AuditValueToken' 'EQUAL' 'CtxToken' contextTerminationAudit
608		  : {auditValueReply, '$4'} .
609auditReply -> 'AuditCapToken'   'EQUAL' 'CtxToken' contextTerminationAudit
610		  : {auditCapReply,   '$4'} .
611auditReply -> 'AuditValueToken' 'EQUAL' auditOther
612		  : {auditValueReply, '$3'} .
613auditReply -> 'AuditCapToken'   'EQUAL' auditOther
614		  : {auditCapReply,   '$3'} .
615
616contextTerminationAudit -> terminationIDList               : {contextAuditResult, '$1'} .
617contextTerminationAudit -> 'LBRKT' errorDescriptor 'RBRKT' : {contextAuditResult, '$2'} .
618
619auditOther              -> terminationID :
620                           {auditResult,
621                            #'AuditResult'{terminationID          = '$1',
622					   terminationAuditResult = []}} .
623auditOther              -> terminationID 'LBRKT' terminationAudit 'RBRKT' :
624                           {auditResult,
625                            #'AuditResult'{terminationID          = '$1',
626					   terminationAuditResult = '$3'}} .
627
628terminationAudit     -> auditReturnParameter auditReturnParameterList :
629                        merge_terminationAudit(['$1' |'$2' ]) .
630
631auditReturnParameterList -> 'COMMA' auditReturnParameter auditReturnParameterList : ['$2' | '$3'] .
632auditReturnParameterList -> '$empty' : [] .
633
634auditReturnParameter -> mediaDescriptor           : {mediaDescriptor, '$1'} .
635auditReturnParameter -> modemDescriptor           : {modemDescriptor, '$1'} .
636auditReturnParameter -> muxDescriptor             : {muxDescriptor, '$1'} .
637auditReturnParameter -> eventsDescriptor          : {eventsDescriptor, '$1'} .
638auditReturnParameter -> signalsDescriptor         : {signalsDescriptor, '$1'} .
639auditReturnParameter -> digitMapDescriptor        : {digitMapDescriptor, '$1'} .
640auditReturnParameter -> observedEventsDescriptor  : {observedEventsDescriptor, '$1'} .
641auditReturnParameter -> eventBufferDescriptor     : {eventBufferDescriptor, '$1'} .
642auditReturnParameter -> statisticsDescriptor      : {statisticsDescriptor, '$1'} .
643auditReturnParameter -> packagesDescriptor        : {packagesDescriptor, '$1'} .
644auditReturnParameter -> errorDescriptor           : {errorDescriptor, '$1'} .
645auditReturnParameter -> auditReturnItem           : {auditReturnItem, '$1'} .  %% IGv11
646
647auditDescriptor      -> 'AuditToken' 'LBRKT' auditDescriptorBody 'RBRKT'
648			    : #'AuditDescriptor'{auditToken = '$3'} .
649
650auditDescriptorBody  -> auditItem auditItemList : ['$1' | '$2'].
651auditDescriptorBody  -> '$empty'                : asn1_NOVALUE .
652
653auditItemList        -> 'COMMA' auditItem auditItemList : ['$2' | '$3'] .
654auditItemList        -> '$empty'                        : [] .
655
656%% IGv11 - begin
657%%
658auditReturnItem      -> 'MuxToken'            : muxToken .
659auditReturnItem      -> 'ModemToken'          : modemToken .
660auditReturnItem      -> 'MediaToken'          : mediaToken .
661auditReturnItem      -> 'DigitMapToken'       : digitMapToken .
662auditReturnItem      -> 'StatsToken'          : statsToken .
663auditReturnItem      -> 'ObservedEventsToken' : observedEventsToken .
664auditReturnItem      -> 'PackagesToken'       : packagesToken .
665
666%% at-most-once, and DigitMapToken and PackagesToken are not allowed
667%% in AuditCapabilities command
668%%
669auditItem            -> auditReturnItem       : '$1' .
670auditItem            -> 'SignalsToken'        : signalsToken .
671auditItem            -> 'EventBufferToken'    : eventBufferToken .
672auditItem            -> 'EventsToken'         : eventsToken .
673%%
674%% IGv11 - end
675
676notifyRequest        -> 'NotifyToken' 'EQUAL' terminationID
677                        'LBRKT' notifyRequestBody 'RBRKT'
678                      : make_commandRequest({notifyReq, '$1'},
679					    setelement(#'NotifyRequest'.terminationID, '$5', ['$3'])) .
680
681notifyRequestBody    -> observedEventsDescriptor
682                            : #'NotifyRequest'{observedEventsDescriptor = '$1'}.
683notifyRequestBody    -> errorDescriptor
684                            : #'NotifyRequest'{errorDescriptor = '$1'}.
685
686notifyReply          -> 'NotifyToken' 'EQUAL' terminationID notifyReplyBody
687			    : {notifyReply,
688			       #'NotifyReply'{terminationID = ['$3'],
689					      errorDescriptor = '$4'}} .
690
691notifyReplyBody      -> 'LBRKT' errorDescriptor 'RBRKT' : '$2'.
692notifyReplyBody      -> '$empty' : asn1_NOVALUE .
693
694serviceChangeRequest -> 'ServiceChangeToken' 'EQUAL' terminationID
695                        'LBRKT' serviceChangeDescriptor 'RBRKT'
696                      : make_commandRequest({serviceChangeReq, '$1'},
697					    #'ServiceChangeRequest'{terminationID = ['$3'],
698								    serviceChangeParms = '$5'}) .
699
700serviceChangeReply   -> 'ServiceChangeToken' 'EQUAL' terminationID serviceChangeReplyBody
701			    : {serviceChangeReply,
702			       #'ServiceChangeReply'{terminationID = ['$3'],
703						     serviceChangeResult = '$4'}} .
704
705serviceChangeReplyBody -> 'LBRKT' errorDescriptor 'RBRKT'
706			      : {errorDescriptor, '$2'} .
707serviceChangeReplyBody -> 'LBRKT' serviceChangeReplyDescriptor 'RBRKT'
708			      : {serviceChangeResParms, '$2'} .
709serviceChangeReplyBody -> '$empty' : {serviceChangeResParms, #'ServiceChangeResParm'{}}.
710
711errorDescriptor      -> 'ErrorToken' 'EQUAL' errorCode 'LBRKT' errorText 'RBRKT'
712                            : #'ErrorDescriptor'{errorCode = '$3',
713                                                 errorText = '$5'} .
714
715errorCode            -> safeToken : ensure_uint('$1', 0, 999) .
716
717errorText            -> 'QuotedChars' : value_of('$1') .
718errorText            -> '$empty'      : asn1_NOVALUE .
719
720transactionID        -> safeToken : ensure_uint32('$1') .
721
722mId                  -> domainName               : '$1' .
723mId                  -> domainAddress            : '$1' .
724mId                  -> optSep mtpAddress optSep : '$2' .
725mId                  -> optSep deviceName optSep : '$2' .
726
727domainName           -> 'LESSER' safeToken 'GREATER' 'COLON' portNumber optSep
728                            : ensure_domainName('$2', '$5') .
729domainName           -> 'LESSER' safeToken 'GREATER'
730                            : ensure_domainName('$2', asn1_NOVALUE) .
731
732deviceName           -> pathName  : {deviceName, '$1'} .
733
734contextID            -> safeToken : ensure_contextID('$1') .
735
736domainAddress        -> 'LSBRKT' daddr 'RSBRKT' 'COLON' portNumber optSep
737                        : ensure_domainAddress('$2', '$5') .
738domainAddress        -> 'LSBRKT' daddr 'RSBRKT'
739                        : ensure_domainAddress('$2', asn1_NOVALUE) .
740
741daddr -> '$empty'        : [] .
742daddr -> 'COLON' daddr   : [colon| '$2'] .
743daddr -> safeToken daddr : ['$1'| '$2'] .
744
745
746portNumber           -> safeToken : ensure_uint16('$1') .
747
748mtpAddress           -> 'MtpAddressToken' : ensure_mtpAddress('$1') .
749
750%% terminationIDList    -> LBRKT terminationID *(COMMA terminationID) RBRKT .
751
752terminationIDList    -> 'LBRKT' terminationID terminationIDListRepeat 'RBRKT'
753                                 : ['$2' | '$3'] .
754
755terminationIDListRepeat -> 'COMMA' terminationID terminationIDListRepeat
756                                 : ['$2'| '$3'] .
757terminationIDListRepeat -> '$empty' : [] .
758
759
760pathName             -> safeToken : ensure_pathName('$1') .
761
762terminationID        -> safeToken : ensure_terminationID('$1') .
763
764mediaDescriptor      -> 'MediaToken' 'LBRKT' mediaParm mediaParmList 'RBRKT'
765			    : merge_mediaDescriptor(['$3' | '$4']) .
766
767mediaParmList        -> 'COMMA' mediaParm mediaParmList : ['$2' | '$3'] .
768mediaParmList        -> '$empty' : [] .
769
770
771%% at-most-once per item
772%% using either streamParms or streamDescriptors but not both
773mediaParm            -> streamParm
774			    : {streamParm, '$1'} .
775mediaParm            -> streamDescriptor
776			    : {streamDescriptor, '$1'} .
777mediaParm            -> terminationStateDescriptor
778			    : {termState, '$1'} .
779
780%% at-most-onc .
781%% Specially treated by the scanner.
782streamParm           -> 'LocalDescriptorToken' :
783                        PGs = ensure_prop_groups('$1'),
784                        {local, #'LocalRemoteDescriptor'{propGrps = PGs} } .
785streamParm           -> 'RemoteDescriptorToken' :
786                        PGs = ensure_prop_groups('$1'),
787		        {remote, #'LocalRemoteDescriptor'{propGrps = PGs}} .
788streamParm           -> localControlDescriptor  : {control, '$1'} .
789
790streamDescriptor     -> 'StreamToken' 'EQUAL' streamID
791                        'LBRKT' streamParm streamParmList 'RBRKT'
792		      : #'StreamDescriptor'{streamID    = '$3',
793					    streamParms = merge_streamParms(['$5' | '$6'])} .
794
795streamParmList       -> 'COMMA' streamParm streamParmList : ['$2' | '$3'] .
796streamParmList       -> '$empty' : [] .
797
798localControlDescriptor -> 'LocalControlToken' 'LBRKT' localParm localParmList 'RBRKT'
799                        : ['$3' | '$4'] .
800
801localParmList        -> 'COMMA' localParm localParmList : ['$2' | '$3'] .
802localParmList        -> '$empty': [] .
803
804terminationStateDescriptor -> 'TerminationStateToken'
805				  'LBRKT' terminationStateParm terminationStateParms 'RBRKT'
806		            : merge_terminationStateDescriptor(['$3' | '$4']) .
807
808terminationStateParms -> 'COMMA' terminationStateParm terminationStateParms : ['$2' | '$3'] .
809terminationStateParms -> '$empty' : [] .
810
811%% at-most-once per item except for propertyParm
812localParm            -> 'ReservedGroupToken' 'EQUAL' onOrOff : {group, '$3'} .
813localParm            -> 'ReservedValueToken' 'EQUAL' onOrOff : {value, '$3'} .
814localParm            -> 'ModeToken' 'EQUAL' streamModes      : {mode,  '$3'} .
815localParm            -> propertyParm                         : {prop,  '$1'} .
816
817onOrOff              -> 'OnToken'  : true .
818onOrOff              -> 'OffToken' : false .
819
820%% at-most-once
821streamModes          -> 'SendonlyToken' : sendOnly .
822streamModes          -> 'RecvonlyToken' : recvOnly .
823streamModes          -> 'SendrecvToken' : sendRecv .
824streamModes          -> 'InactiveToken' : inactive .
825streamModes          -> 'LoopbackToken' : loopBack .
826
827propertyParm         -> pkgdName parmValue : setelement(#'PropertyParm'.name, '$2', '$1') .
828
829parmValue            -> 'EQUAL' alternativeValue : '$2' .
830
831parmValue            -> 'NEQUAL'  value
832                            : #'PropertyParm'{value = ['$2'], extraInfo = {relation, unequalTo}} .
833parmValue            -> 'LESSER'  value
834                            : #'PropertyParm'{value = ['$2'], extraInfo = {relation, smallerThan}} .
835parmValue            -> 'GREATER' value
836                            : #'PropertyParm'{value = ['$2'], extraInfo = {relation, greaterThan}} .
837
838%% OTP-4013
839%% alternativeValue  = ( VALUE /
840%%                       LSBRKT VALUE *(COMMA VALUE) RSBRKT  /
841%%                       LSBRKT VALUE COLON VALUE RSBRKT ) /
842%%                       LBRKT VALUE *(COMMA VALUE) RBRKT
843alternativeValue     -> 'LBRKT' value valueList 'RBRKT'
844                            : #'PropertyParm'{value     = ['$2' | '$3'],
845					      extraInfo = {sublist, false}}. % OR
846
847alternativeValue     -> 'LSBRKT' value 'COLON' value 'RSBRKT'
848                            : #'PropertyParm'{value     = ['$2', '$4'],
849                                              extraInfo = {range, true}}.
850
851alternativeValue     -> 'LSBRKT' value valueList 'RSBRKT'
852                            : #'PropertyParm'{value     = ['$2' | '$3'],
853					      extraInfo = {sublist, true}}. % AND
854
855alternativeValue     -> value : #'PropertyParm'{value = ['$1']} .
856
857valueList            -> 'COMMA' value valueList : ['$2' | '$3'] .
858valueList            -> '$empty' : [] .
859
860
861eventBufferDescriptor -> 'EventBufferToken' : [] .
862eventBufferDescriptor -> 'EventBufferToken' 'LBRKT' eventSpec eventSpecList 'RBRKT'
863			 : ['$3' | '$4'] .
864
865eventSpecList        -> 'COMMA' eventSpec eventSpecList : ['$2' | '$3'] .
866eventSpecList        -> '$empty' : [] .
867
868eventSpec            -> observedEvent : merge_eventSpec('$1') .
869
870%% at-most-once per item except for propertyParm
871terminationStateParm -> serviceStates      : {serviceState, '$1'} .
872terminationStateParm -> eventBufferControl : {eventBufferControl, '$1'} .
873terminationStateParm -> propertyParm       : {propertyParm, '$1'} .
874
875serviceStates        -> 'ServiceStatesToken' 'EQUAL' serviceState : '$3' .
876
877serviceState         -> 'TestToken'     : test .
878serviceState         -> 'OutOfSvcToken' : outOfSvc .
879serviceState         -> 'InSvcToken'    : inSvc .
880
881eventBufferControl   -> 'BufferToken' 'EQUAL' eventBufferControlState : '$3' .
882
883eventBufferControlState -> 'OffToken'      : off .
884eventBufferControlState -> 'LockStepToken' : lockStep .
885
886muxDescriptor        -> 'MuxToken' 'EQUAL' muxType  terminationIDList
887			    : #'MuxDescriptor'{muxType  = '$3',
888					       termList = '$4'} .
889
890muxType              -> safeToken : ensure_muxType('$1') .
891
892streamID             -> safeToken : ensure_streamID('$1') .
893
894pkgdName             -> safeToken : ensure_pkgdName('$1') .
895
896eventsDescriptor     -> 'EventsToken' :
897                        #'EventsDescriptor'{requestID = asn1_NOVALUE,
898                                            eventList = []} .
899eventsDescriptor     -> 'EventsToken' 'EQUAL' requestID
900                        'LBRKT' requestedEvent requestedEvents 'RBRKT' :
901                        #'EventsDescriptor'{requestID = '$3',
902					    eventList = ['$5' | '$6']} .
903
904requestedEvents      -> 'COMMA' requestedEvent requestedEvents : ['$2' | '$3']  .
905requestedEvents      -> '$empty' : [] .
906
907requestedEvent       -> pkgdName requestedEventBody :
908                        setelement(#'RequestedEvent'.pkgdName, '$2', '$1') .
909
910requestedEventBody   -> 'LBRKT' eventParameter eventParameters 'RBRKT' :
911                        merge_eventParameters(['$2' | '$3']) .
912requestedEventBody   -> '$empty' :
913                        #'RequestedEvent'{evParList = []} .
914
915eventParameters      -> 'COMMA' eventParameter eventParameters :
916                        ['$2' | '$3'] .
917eventParameters      -> '$empty' :
918                        [] .
919
920%% at-most-once each of embedOrKeepActive , eventDM or eventStream
921eventParameter       -> 'KeepActiveToken'   : keepActive .
922eventParameter       -> embedWithSig        : '$1'.
923eventParameter       -> embedNoSig          : '$1'.
924eventParameter       -> eventDM             : '$1'.
925eventParameter       -> eventStreamOrOther  : '$1'.
926
927embedWithSig         -> 'EmbedToken' 'LBRKT' signalsDescriptor
928			    'COMMA' embedFirst 'RBRKT' :
929                         {embed, '$3', '$5'} .
930embedWithSig         -> 'EmbedToken' 'LBRKT' signalsDescriptor 'RBRKT' :
931			 {embed, '$3', asn1_NOVALUE} .
932
933embedNoSig           -> 'EmbedToken' 'LBRKT' embedFirst 'RBRKT' :
934                        {embed, asn1_NOVALUE, '$3'} .
935
936embedFirst           -> 'EventsToken' :
937                        #'SecondEventsDescriptor'{requestID = asn1_NOVALUE,
938						  eventList = []} .
939embedFirst           -> 'EventsToken' 'EQUAL' requestID
940                        'LBRKT' secondRequestedEvent
941                                secondRequestedEvents 'RBRKT' :
942		        #'SecondEventsDescriptor'{requestID = '$3',
943						  eventList = ['$5' | '$6']} .
944
945secondRequestedEvents -> 'COMMA' secondRequestedEvent secondRequestedEvents :
946                         ['$2' | '$3'] .
947secondRequestedEvents -> '$empty' : [] .
948
949%% at-most-once of each
950secondRequestedEvent  -> pkgdName secondRequestedEventBody :
951                         setelement(#'SecondRequestedEvent'.pkgdName,
952                                    '$2', '$1') .
953
954secondRequestedEventBody -> 'LBRKT' secondEventParameter
955                                    secondEventParameters 'RBRKT' :
956                            merge_secondEventParameters(['$2' | '$3']) .
957secondRequestedEventBody -> '$empty' :
958                            #'SecondRequestedEvent'{evParList = []} .
959
960secondEventParameters -> 'COMMA' secondEventParameter secondEventParameters :
961                         ['$2' | '$3'] .
962secondEventParameters -> '$empty' : [] .
963
964%% at-most-once each of embedOrKeepActive , eventDM or eventStream
965secondEventParameter -> 'KeepActiveToken'    : keepActive .
966secondEventParameter -> embedSig             : '$1' .
967secondEventParameter -> eventDM              : '$1' .
968secondEventParameter -> eventStreamOrOther   : '$1' .
969
970embedSig             -> 'EmbedToken' 'LBRKT' signalsDescriptor 'RBRKT' :
971			{second_embed, '$3'} .
972
973eventStreamOrOther   -> eventParameterName parmValue :
974                        select_stream_or_other('$1', '$2') .
975
976eventParameterName   -> safeToken :
977                        ensure_NAME('$1') .
978
979%% The DigitMapDescriptorToken is specially treated by the scanner
980eventDM              -> 'DigitMapDescriptorToken' : ensure_eventDM('$1') .
981
982%% H248S-IG (IGv11)
983signalsDescriptor    -> 'SignalsToken' 'LBRKT' signalParm signalParms 'RBRKT' :
984                        ['$3' | '$4'] .
985signalsDescriptor    -> 'SignalsToken' :
986                        [] .
987
988signalParms          -> 'COMMA' signalParm signalParms : [ '$2' | '$3'] .
989signalParms          -> '$empty' : [] .
990
991signalParm           -> signalList    : {seqSigList, '$1'} .
992signalParm           -> signalRequest : {signal, '$1'} .
993
994signalRequest        -> signalName 'LBRKT' sigParameter sigParameters 'RBRKT'
995			    : merge_signalRequest('$1', ['$3' | '$4']).
996signalRequest        -> signalName : merge_signalRequest('$1', []).
997
998sigParameters        -> 'COMMA' sigParameter sigParameters : ['$2' | '$3'] .
999sigParameters        -> '$empty' : [] .
1000
1001%%    sigParameter    = sigStream / sigSignalType / sigDuration / sigOther
1002%% 		      / notifyCompletion / KeepActiveToken
1003%%    sigStream            = StreamToken EQUAL StreamID
1004%%    sigOther             = sigParameterName parmValue
1005%%    sigParameterName     = NAME
1006%%    sigSignalType        = SignalTypeToken EQUAL signalType
1007%%    signalType           = (OnOffToken / TimeOutToken / BriefToken)
1008%%    sigDuration          = DurationToken EQUAL UINT16
1009%%    notifyCompletion     = NotifyCompletionToken EQUAL (LBRKT
1010%% 		      notificationReason *(COMMA notificationReason) RBRKT
1011%%
1012%%    notificationReason   = ( TimeOutToken / InterruptByEventToken
1013%% 				   / InterruptByNewSignalsDescrToken
1014%% 				   / OtherReasonToken )
1015
1016sigParameter         -> 'StreamToken' 'EQUAL' streamID : {stream, '$3'}.
1017sigParameter         -> 'SignalTypeToken' 'EQUAL' signalType : {signal_type, '$3'} .
1018sigParameter         -> 'DurationToken' 'EQUAL' safeToken : {duration, ensure_uint16('$3')} .
1019sigParameter         -> safeToken parmValue : {other, ensure_NAME('$1'), '$2'}.
1020sigParameter         -> 'NotifyCompletionToken' 'EQUAL'
1021			    'LBRKT' notificationReason notificationReasons 'RBRKT'
1022			    : {notify_completion, ['$4' | '$5']} .
1023sigParameter         -> 'KeepActiveToken' : keepActive .
1024
1025signalType           -> 'OnOffToken'   : onOff.
1026signalType           -> 'TimeOutToken' : timeOut.
1027signalType           -> 'BriefToken'   : brief.
1028
1029notificationReasons  -> 'COMMA' notificationReason notificationReasons : ['$2' | '$3'] .
1030notificationReasons  -> '$empty' : [] .
1031
1032notificationReason   -> 'TimeOutToken' : onTimeOut .
1033notificationReason   -> 'InterruptByEventToken' : onInterruptByEvent .
1034notificationReason   -> 'InterruptByNewSignalsDescrToken' : onInterruptByNewSignalDescr .
1035notificationReason   -> 'OtherReasonToken' : otherReason .
1036
1037signalList           -> 'SignalListToken' 'EQUAL' signalListId
1038                        'LBRKT' signalListParm signalListParms 'RBRKT'
1039			    : #'SeqSigList'{id = ensure_uint16('$3'),
1040					    signalList = ['$5' | '$6']} .
1041
1042signalListParms      -> 'COMMA' signalListParm signalListParms : ['$2' | '$3'] .
1043signalListParms      -> '$empty' : [] .
1044
1045signalListId         -> safeToken : ensure_uint16('$1') .
1046
1047%% exactly once signalType,
1048%% at most once duration and every signal parameter
1049signalListParm       -> signalRequest  : '$1'.
1050
1051signalName           -> pkgdName  : '$1'.
1052
1053observedEventsDescriptor -> 'ObservedEventsToken' 'EQUAL' requestID
1054                            'LBRKT' observedEvent observedEvents 'RBRKT'
1055                      : #'ObservedEventsDescriptor'{requestId        = '$3',
1056						    observedEventLst = ['$5' | '$6']} .
1057
1058observedEvents       -> 'COMMA' observedEvent observedEvents : ['$2' | '$3'] .
1059observedEvents       -> '$empty' : [] .
1060
1061%%time per event, because it might be buffered
1062observedEvent        -> observedEventTimeStamp optSep pkgdName observedEventBody :
1063                        merge_observed_event('$4', '$3', '$1') .
1064observedEvent        -> pkgdName observedEventBody :
1065                        merge_observed_event('$2', '$1', asn1_NOVALUE) .
1066
1067observedEventTimeStamp -> timeStamp optSep 'COLON' : '$1' .
1068observedEventTimeStamp -> '$empty' : asn1_NOVALUE .
1069
1070observedEventBody    -> 'LBRKT' observedEventParameter observedEventParameters 'RBRKT'
1071			    : ['$2' | '$3'] .
1072observedEventBody    -> '$empty' : [] .
1073
1074observedEventParameters -> 'COMMA' observedEventParameter observedEventParameters : ['$2' | '$3'] .
1075observedEventParameters -> '$empty' : [] .
1076
1077%%at-most-once eventStream, every eventParameterName at most once
1078observedEventParameter -> eventStreamOrOther : '$1' .
1079
1080requestID            -> safeToken : ensure_requestID('$1') .
1081
1082modemDescriptor      -> 'ModemToken' 'EQUAL' modemType optPropertyParms :
1083			#'ModemDescriptor'{mtl = ['$3'],
1084                                           mpl = '$4'} .
1085
1086%% at-most-once of each modem type exept for extensionParameter
1087modemDescriptor      -> 'ModemToken' 'LSBRKT' modemType modemTypeList 'RSBRKT'
1088                        optPropertyParms :
1089			#'ModemDescriptor'{mtl = ['$3'  | '$4'],
1090                                           mpl = '$6'} .
1091
1092modemTypeList 	     -> 'COMMA' modemType modemTypeList : ['$2' | '$3'] .
1093modemTypeList 	     -> '$empty' : [] .
1094
1095optPropertyParms     -> 'LBRKT' propertyParm propertyParms 'RBRKT' : ['$2' | '$3'] .
1096optPropertyParms     -> '$empty' : [] .
1097
1098propertyParms  	     -> 'COMMA' propertyParm propertyParms :  ['$2' | '$3'] .
1099propertyParms 	     -> '$empty' : [] .
1100
1101% parmName             -> safeToken : ensure_NAME('$1') .
1102
1103modemType            -> safeToken : ensure_modemType('$1').
1104
1105%% The DigitMapDescriptorToken is specially treated by the scanner
1106digitMapDescriptor   -> 'DigitMapDescriptorToken' : ensure_DMD('$1') .
1107
1108%% ; at most of either serviceChangeAddress or serviceChangeMgcId but not both
1109serviceChangeDescriptor -> 'ServicesToken'
1110                           'LBRKT' serviceChangeParm
1111                                   serviceChangeParms 'RBRKT' :
1112                            merge_ServiceChangeParm(['$3' | '$4']) .
1113
1114serviceChangeParms   -> 'COMMA' serviceChangeParm serviceChangeParms :
1115                        ['$2' | '$3'] .
1116serviceChangeParms   -> '$empty' : [] .
1117
1118serviceChangeParm    -> serviceChangeMethod  : {method,    '$1'} .
1119serviceChangeParm    -> serviceChangeReason  : {reason,    '$1'} .
1120serviceChangeParm    -> serviceChangeDelay   : {delay,     '$1'} .
1121serviceChangeParm    -> serviceChangeAddress : {address,   '$1'} .
1122serviceChangeParm    -> serviceChangeProfile : {profile,   '$1'} .
1123serviceChangeParm    -> extension            : {extension, '$1'} .
1124serviceChangeParm    -> timeStamp            : {time_stamp,'$1'} .
1125serviceChangeParm    -> serviceChangeMgcId   : {mgc_id,    '$1'} .
1126serviceChangeParm    -> serviceChangeVersion : {version,   '$1'} .
1127
1128serviceChangeMethod  -> 'MethodToken' 'EQUAL' safeToken : ensure_serviceChangeMethod('$3') .
1129
1130serviceChangeReason  -> 'ReasonToken' 'EQUAL' value : ['$3'] .
1131
1132serviceChangeDelay   -> 'DelayToken'  'EQUAL' safeToken : ensure_uint32('$3').
1133
1134serviceChangeAddress -> 'ServiceChangeAddressToken' 'EQUAL' mId : '$3' .
1135serviceChangeAddress -> 'ServiceChangeAddressToken' 'EQUAL' portNumber : {portNumber, '$3'} .
1136
1137serviceChangeMgcId   -> 'MgcIdToken'   'EQUAL' mId       : '$3' .
1138
1139serviceChangeProfile -> 'ProfileToken' 'EQUAL' safeToken : ensure_profile('$3').
1140
1141serviceChangeVersion -> 'VersionToken' 'EQUAL' safeToken : ensure_version('$3') .
1142
1143extension            ->  extensionParameter parmValue
1144			     : setelement(#'PropertyParm'.name, '$2', '$1') .
1145
1146%% at most once. Version is REQUIRED on first ServiceChange response
1147%% at most of either serviceChangeAddress or serviceChangeMgcId but not both
1148serviceChangeReplyDescriptor -> 'ServicesToken'
1149                                'LBRKT' servChgReplyParm
1150                                        servChgReplyParms 'RBRKT' :
1151                                merge_ServiceChangeResParm(['$3' | '$4']) .
1152
1153servChgReplyParms    -> 'COMMA' servChgReplyParm servChgReplyParms :
1154                        ['$2' | '$3'] .
1155servChgReplyParms    -> '$empty' :  [] .
1156
1157servChgReplyParm     -> serviceChangeAddress : {address,   '$1'} .
1158servChgReplyParm     -> serviceChangeMgcId   : {mgc_id,    '$1'}.
1159servChgReplyParm     -> serviceChangeProfile : {profile,   '$1'} .
1160servChgReplyParm     -> serviceChangeVersion : {version,   '$1'}.
1161servChgReplyParm     -> timeStamp            : {time_stamp,'$1'}.
1162
1163packagesDescriptor   -> 'PackagesToken' 'LBRKT' packagesItem packagesItems 'RBRKT'
1164                            : ['$3' | '$4'] .
1165
1166packagesItems        -> 'COMMA' packagesItem packagesItems  : ['$2' | '$3'] .
1167packagesItems        -> '$empty' : [] .
1168
1169packagesItem         -> safeToken : ensure_packagesItem('$1') .
1170
1171timeStamp            -> TimeStampToken : ensure_timeStamp('$1') .
1172
1173statisticsDescriptor -> 'StatsToken'
1174                        'LBRKT' statisticsParameter statisticsParameters 'RBRKT'
1175                            :  ['$3' | '$4'] .
1176
1177statisticsParameters -> 'COMMA' statisticsParameter statisticsParameters  : ['$2' | '$3'] .
1178statisticsParameters -> '$empty' : [] .
1179
1180%%at-most-once per item
1181statisticsParameter  -> pkgdName
1182                            : #'StatisticsParameter'{statName  = '$1',
1183                                                     statValue = asn1_NOVALUE} .
1184statisticsParameter  -> pkgdName 'EQUAL' value
1185                            : #'StatisticsParameter'{statName  = '$1',
1186                                                     statValue = ['$3']} .
1187
1188topologyDescriptor   -> 'TopologyToken' 'LBRKT' topologyTriple
1189                        topologyTripleList 'RBRKT' : ['$3' | '$4'] .
1190
1191terminationA         -> terminationID  : '$1' .
1192
1193terminationB         -> terminationID  : '$1' .
1194
1195topologyTriple       -> terminationA 'COMMA' terminationB 'COMMA'
1196                        topologyDirection :
1197                          #'TopologyRequest'{terminationFrom   = '$1',
1198                                             terminationTo     = '$3',
1199                                             topologyDirection = '$5'} .
1200
1201topologyTripleList   -> '$empty' : [] .
1202topologyTripleList   -> 'COMMA' topologyTriple topologyTripleList :
1203                          ['$2' | '$3'] .
1204
1205topologyDirection    -> 'BothwayToken' : bothway .
1206topologyDirection    -> 'IsolateToken' : isolate .
1207topologyDirection    -> 'OnewayToken'  : oneway .
1208
1209priority             -> 'PriorityToken' 'EQUAL' safeToken : ensure_uint16('$3') .
1210
1211extensionParameter   -> safeToken : ensure_extensionParameter('$1') .
1212
1213value                -> 'QuotedChars' : ensure_value('$1') .
1214value                -> safeToken     : ensure_value('$1').
1215
1216safeToken            -> safeToken2              : make_safe_token('$1') .
1217
1218safeToken2           -> 'SafeChars'             : '$1' .
1219safeToken2           -> 'AddToken'              : '$1' .
1220safeToken2           -> 'AuditToken'            : '$1' .
1221safeToken2           -> 'AuditCapToken'         : '$1' .
1222safeToken2           -> 'AuditValueToken'       : '$1' .
1223safeToken2           -> 'AuthToken'             : '$1' .
1224safeToken2           -> 'BothwayToken'          : '$1' .
1225safeToken2           -> 'BriefToken'            : '$1' .
1226safeToken2           -> 'BufferToken'           : '$1' .
1227safeToken2           -> 'CtxToken'              : '$1' .
1228safeToken2           -> 'ContextAuditToken'     : '$1' .
1229safeToken2           -> 'DigitMapToken'         : '$1' .
1230%% safeToken2        -> 'DigitMapDescriptorToken' : '$1' .
1231safeToken2           -> 'DiscardToken'          : '$1' .
1232safeToken2           -> 'DisconnectedToken'     : '$1' .
1233safeToken2           -> 'DelayToken'            : '$1' .
1234safeToken2           -> 'DurationToken'         : '$1' .
1235safeToken2           -> 'EmbedToken'            : '$1' .
1236safeToken2           -> 'EmergencyToken'        : '$1' .
1237safeToken2           -> 'ErrorToken'            : '$1' .
1238safeToken2           -> 'EventBufferToken'      : '$1' .
1239safeToken2           -> 'EventsToken'           : '$1' .
1240safeToken2           -> 'FailoverToken'         : '$1' .
1241safeToken2           -> 'ForcedToken'           : '$1' .
1242safeToken2           -> 'GracefulToken'         : '$1' .
1243safeToken2           -> 'H221Token'             : '$1' .
1244safeToken2           -> 'H223Token'             : '$1' .
1245safeToken2           -> 'H226Token'             : '$1' .
1246safeToken2           -> 'HandOffToken'          : '$1' .
1247safeToken2           -> 'ImmAckRequiredToken'   : '$1' .
1248safeToken2           -> 'InactiveToken'         : '$1' .
1249safeToken2           -> 'InterruptByEventToken' : '$1' .
1250safeToken2           -> 'InterruptByNewSignalsDescrToken' : '$1' .
1251safeToken2           -> 'IsolateToken'          : '$1' .
1252safeToken2           -> 'InSvcToken'            : '$1' .
1253safeToken2           -> 'KeepActiveToken'       : '$1' .
1254%% safeToken2        -> 'LocalToken'            : '$1' .
1255%% safeToken2        -> 'LocalDescriptorToken'  : '$1' .
1256safeToken2           -> 'LocalControlToken'     : '$1' .
1257safeToken2           -> 'LoopbackToken'         : '$1' .
1258safeToken2           -> 'LockStepToken'         : '$1' .
1259safeToken2           -> 'MediaToken'            : '$1' .
1260%% safeToken2        -> 'MegacopToken'          : '$1' .
1261safeToken2           -> 'MethodToken'           : '$1' .
1262safeToken2           -> 'MgcIdToken'            : '$1' .
1263safeToken2           -> 'ModeToken'             : '$1' .
1264safeToken2           -> 'ModifyToken'           : '$1' .
1265safeToken2           -> 'ModemToken'            : '$1' .
1266safeToken2           -> 'MoveToken'             : '$1' .
1267%% safeToken2        -> 'MtpToken'              : '$1' .
1268%% safeToken2        -> 'MtpAddressToken'       : '$1' .
1269safeToken2           -> 'MuxToken'              : '$1' .
1270safeToken2           -> 'NotifyToken'           : '$1' .
1271safeToken2           -> 'NotifyCompletionToken' : '$1' .
1272safeToken2           -> 'ObservedEventsToken'   : '$1' .
1273safeToken2           -> 'OnewayToken'           : '$1' .
1274safeToken2           -> 'OffToken'              : '$1' .
1275safeToken2           -> 'OnToken'               : '$1' .
1276safeToken2           -> 'OnOffToken'            : '$1' .
1277safeToken2           -> 'OutOfSvcToken'         : '$1' .
1278safeToken2           -> 'OtherReasonToken'      : '$1' .
1279safeToken2           -> 'PackagesToken'         : '$1' .
1280safeToken2           -> 'PendingToken'          : '$1' .
1281safeToken2           -> 'PriorityToken'         : '$1' .
1282safeToken2           -> 'ProfileToken'          : '$1' .
1283safeToken2           -> 'ReasonToken'           : '$1' .
1284safeToken2           -> 'RecvonlyToken'         : '$1' .
1285safeToken2           -> 'ReplyToken'            : '$1' .
1286safeToken2           -> 'ResponseAckToken'      : '$1' .
1287safeToken2           -> 'RestartToken'          : '$1' .
1288%% safeToken2        -> 'RemoteToken'           : '$1' .
1289%% safeToken2        -> 'RemoteDescriptorToken' : '$1' .
1290safeToken2           -> 'ReservedGroupToken'    : '$1' .
1291safeToken2           -> 'ReservedValueToken'    : '$1' .
1292safeToken2           -> 'SendonlyToken'         : '$1' .
1293safeToken2           -> 'SendrecvToken'         : '$1' .
1294safeToken2           -> 'ServicesToken'         : '$1' .
1295safeToken2           -> 'ServiceStatesToken'    : '$1' .
1296safeToken2           -> 'ServiceChangeToken'    : '$1' .
1297safeToken2           -> 'ServiceChangeAddressToken' : '$1' .
1298safeToken2           -> 'SignalListToken'       : '$1' .
1299safeToken2           -> 'SignalsToken'          : '$1' .
1300safeToken2           -> 'SignalTypeToken'       : '$1' .
1301safeToken2           -> 'StatsToken'            : '$1' .
1302safeToken2           -> 'StreamToken'           : '$1' .
1303safeToken2           -> 'SubtractToken'         : '$1' .
1304safeToken2           -> 'SynchISDNToken'        : '$1' .
1305safeToken2           -> 'TerminationStateToken' : '$1' .
1306safeToken2           -> 'TestToken'             : '$1' .
1307safeToken2           -> 'TimeOutToken'          : '$1' .
1308safeToken2           -> 'TopologyToken'         : '$1' .
1309safeToken2           -> 'TransToken'            : '$1' .
1310safeToken2           -> 'V18Token'              : '$1' .
1311safeToken2           -> 'V22Token'              : '$1' .
1312safeToken2           -> 'V22bisToken'           : '$1' .
1313safeToken2           -> 'V32Token'              : '$1' .
1314safeToken2           -> 'V32bisToken'           : '$1' .
1315safeToken2           -> 'V34Token'              : '$1' .
1316safeToken2           -> 'V76Token'              : '$1' .
1317safeToken2           -> 'V90Token'              : '$1' .
1318safeToken2           -> 'V91Token'              : '$1' .
1319safeToken2           -> 'VersionToken'          : '$1' .
1320%% <OTP-7534>
1321safeToken2           -> 'AndAUDITSelectToken'   : '$1' . % v3
1322safeToken2           -> 'BothToken'             : '$1' . % v3
1323safeToken2           -> 'ContextAttrToken'      : '$1' . % v3
1324safeToken2           -> 'ContextListToken'      : '$1' . % v3
1325safeToken2           -> 'DirectionToken'        : '$1' . % v3
1326safeToken2           -> 'EmergencyOffToken'     : '$1' . % v3
1327safeToken2           -> 'EmergencyValueToken'   : '$1' . % v3
1328safeToken2           -> 'ExternalToken'         : '$1' . % v3
1329safeToken2           -> 'IEPSToken'             : '$1' . % v3
1330safeToken2           -> 'InternalToken'         : '$1' . % v3
1331safeToken2           -> 'IntsigDelayToken'      : '$1' . % v3
1332safeToken2           -> 'IterationToken'        : '$1' . % v3
1333safeToken2           -> 'MessageSegmentToken'   : '$1' . % v3
1334safeToken2           -> 'NeverNotifyToken'      : '$1' . % v3
1335safeToken2           -> 'NotifyImmediateToken'  : '$1' . % v3
1336safeToken2           -> 'NotifyRegulatedToken'  : '$1' . % v3
1337safeToken2           -> 'Nx64kToken'            : '$1' . % v2
1338safeToken2           -> 'OnewayBothToken'       : '$1' . % v3
1339safeToken2           -> 'OnewayExternalToken'   : '$1' . % v3
1340safeToken2           -> 'OrAUDITselectToken'    : '$1' . % v3
1341safeToken2           -> 'RequestIDToken'        : '$1' . % v3
1342safeToken2           -> 'ResetEventsDescriptorToken'    : '$1' . % v3
1343safeToken2           -> 'SegmentationCompleteToken'     : '$1' . % v3
1344safeToken2           -> 'ServiceChangeIncompleteToken'  : '$1' . % v3
1345%% </OTP-7534>
1346
1347Erlang code.
1348
1349-include("megaco_text_parser_v1.hrl").
1350
1351%%i(F) ->
1352%%    i(F, []).
1353
1354%%i(F, A) ->
1355%%    i(get(dbg), F, A).
1356
1357%%i(true, F, A) ->
1358%%    io:format("DBG:~p:" ++ F ++ "~n", [?MODULE|A]);
1359%%i(_, _, _) ->
1360%%    ok.
1361
1362