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