📄 megaco_text_parser_v2.yrl
字号:
'SEP' 'SafeChars' 'SendonlyToken' 'SendrecvToken' 'ServiceChangeAddressToken' 'ServiceChangeToken' 'ServiceStatesToken' 'ServicesToken' 'SignalListToken' 'SignalTypeToken' 'SignalsToken' 'StatsToken' 'StreamToken' 'SubtractToken' 'SynchISDNToken' 'TerminationStateToken' 'TestToken' 'TimeOutToken' 'TimeStampToken' 'TopologyToken' 'TransToken' 'V18Token' 'V22Token' 'V22bisToken' 'V32Token' 'V32bisToken' 'V34Token' 'V76Token' 'V90Token' 'V91Token' 'VersionToken' endOfMessage.%%----------------------------------------------------------------------%% Root symbol%%----------------------------------------------------------------------Rootsymbol megacoMessage.%%----------------------------------------------------------------------%% The grammar%%----------------------------------------------------------------------%% megacoMessage = LWSP [authenticationHeader SEP ] message%% authenticationHeader = AuthToken EQUAL SecurityParmIndex COLON%% SequenceNum COLON AuthData%% %% SecurityParmIndex = "0x" 8(HEXDIG)%% SequenceNum = "0x" 8(HEXDIG)%% AuthData = "0x" 24*64(HEXDIG)%% message = MegacopToken SLASH version SEP mId SEP messageBody%% version = 1*2(DIGIT) .megacoMessage -> optSep authenticationHeader message endOfMessage : #'MegacoMessage'{authHeader = '$2', mess = '$3'} .optSep -> 'SEP' : sep .optSep -> '$empty' : no_sep .authenticationHeader -> 'AuthToken' 'EQUAL' safeToken 'COLON' safeToken 'COLON' safeToken optSep : ensure_auth_header('$3', '$5', '$7') .authenticationHeader -> '$empty' : asn1_NOVALUE .message -> safeToken mId messageBody : ensure_message('$1', '$2', '$3') .messageBody -> errorDescriptor : {messageError, '$1'} .messageBody -> transactionList : {transactions, '$1'} .transactionList -> transactionItem : ['$1'] .transactionList -> transactionItem transactionList : ['$1' | '$2'] .transactionItem -> transactionRequest : {transactionRequest, '$1'} .transactionItem -> transactionReply : {transactionReply, '$1'}.transactionItem -> transactionPending : {transactionPending, '$1'} .transactionItem -> transactionResponseAck : {transactionResponseAck, '$1'} .transactionResponseAck -> 'ResponseAckToken' 'LBRKT' transactionAck transactionAckList 'RBRKT' : ['$3' | '$4'] .transactionAckList -> 'COMMA' transactionAck transactionAckList : ['$2' | '$3'] .transactionAckList -> '$empty' : [] .transactionAck -> safeToken : ensure_transactionAck('$1') .transactionPending -> 'PendingToken' 'EQUAL' transactionID 'LBRKT' 'RBRKT' : #'TransactionPending'{transactionId = ensure_transactionID('$3') } .%% OTP-4359: We have the first two rule's in order to be able%% to handle chapter 8.1.1 in RFC3525transactionRequest -> 'TransToken' 'LBRKT' actionRequest actionRequestList 'RBRKT' : #'TransactionRequest'{transactionId = asn1_NOVALUE, actions = ['$3' | '$4']} .transactionRequest -> 'TransToken' 'EQUAL' 'LBRKT' actionRequest actionRequestList 'RBRKT' : #'TransactionRequest'{transactionId = asn1_NOVALUE, actions = ['$4' | '$5']} .transactionRequest -> 'TransToken' 'EQUAL' transactionID 'LBRKT' actionRequest actionRequestList 'RBRKT' : #'TransactionRequest'{transactionId = ensure_transactionID('$3'), actions = ['$5' | '$6']} .actionRequestList -> 'COMMA' actionRequest actionRequestList : ['$2' | '$3'] .actionRequestList -> '$empty' : [] .actionRequest -> 'CtxToken' 'EQUAL' contextID 'LBRKT' actionRequestItem actionRequestItems 'RBRKT' : merge_action_requests('$3', ['$5' | '$6']) .actionRequestItems -> 'COMMA' actionRequestItem actionRequestItems : ['$2' | '$3'] .actionRequestItems -> '$empty' : [] .actionRequestItem -> contextProperty : '$1' .actionRequestItem -> contextAudit : '$1' .actionRequestItem -> commandRequest : '$1' .%% at-most-oncecontextProperty -> topologyDescriptor : {topology, '$1'}.contextProperty -> priority : {priority, '$1'}. contextProperty -> 'EmergencyToken' : {emergency, true}.contextProperty -> 'EmergencyOffToken' : {emergency, false}.contextAudit -> 'ContextAuditToken' 'LBRKT' contextAuditProperty contextAuditProperties 'RBRKT' : {contextAudit, ['$3' | '$4']} .contextAuditProperties -> 'COMMA' contextAuditProperty contextAuditProperties : ['$2' | '$3'] .contextAuditProperties -> '$empty' : [] .%% at-most-once .contextAuditProperty -> 'TopologyToken' : topologyAudit .contextAuditProperty -> 'EmergencyToken' : emergencyAudit .contextAuditProperty -> 'PriorityToken' : priorityAudit . commandRequest -> ammRequest : '$1'.commandRequest -> subtractRequest : '$1'.commandRequest -> auditRequest : '$1'.commandRequest -> notifyRequest : '$1'.commandRequest -> serviceChangeRequest : '$1'.transactionReply -> 'ReplyToken' 'EQUAL' transactionID 'LBRKT' optImmAckRequired transactionReplyBody 'RBRKT' : #'TransactionReply'{transactionId = '$3', immAckRequired = '$5', transactionResult = '$6'} .optImmAckRequired -> 'ImmAckRequiredToken' 'COMMA' : 'NULL' .optImmAckRequired -> '$empty' : asn1_NOVALUE . transactionReplyBody -> errorDescriptor : {transactionError, '$1'} .transactionReplyBody -> actionReply actionReplyList : {actionReplies, ['$1' | '$2']} .actionReplyList -> 'COMMA' actionReply actionReplyList : ['$2' | '$3'] .actionReplyList -> '$empty' : [] .actionReply -> 'CtxToken' 'EQUAL' contextID 'LBRKT' actionReplyBody 'RBRKT' : setelement(#'ActionReply'.contextId, '$5', '$3') .actionReplyBody -> errorDescriptor : #'ActionReply'{errorDescriptor = '$1'} .actionReplyBody -> commandReply commandReplyList : merge_action_reply(['$1' | '$2']) .commandReply -> serviceChangeReply : {command, '$1'} .commandReply -> auditReply : {command, '$1'} .commandReply -> ammsReply : {command, '$1'} .commandReply -> notifyReply : {command, '$1'} .commandReply -> contextProperty : {context, '$1'} . %% OTP-5085%% This ugly thing is to fool the parser. The errorDescriptor does not%% realy belong here. The merge_action_reply will remove it and put it%% in it's right place later.commandReplyList -> 'COMMA' errorDescriptor : ['$2'] .commandReplyList -> 'COMMA' commandReply commandReplyList : ['$2' | '$3'] .commandReplyList -> '$empty' : [] .%Add Move and Modify have the same request parameterammRequest -> ammToken 'EQUAL' terminationID ammRequestBody : Descs = merge_AmmRequest_descriptors('$4', []), make_commandRequest('$1', #'AmmRequest'{terminationID = ['$3'], descriptors = Descs}) .ammToken -> 'AddToken' : {addReq, '$1'} .ammToken -> 'MoveToken' : {moveReq, '$1'} .ammToken -> 'ModifyToken' : {modReq, '$1'} .ammRequestBody -> 'LBRKT' ammParameter ammParameters 'RBRKT' : ['$2' | '$3'] .ammRequestBody -> '$empty' : [] .ammParameters -> 'COMMA' ammParameter ammParameters : ['$2' | '$3'] .ammParameters -> '$empty' : [] .%at-most-onceammParameter -> mediaDescriptor : {mediaDescriptor, '$1'}.ammParameter -> modemDescriptor : {modemDescriptor, deprecated}.ammParameter -> muxDescriptor : {muxDescriptor, '$1'}.ammParameter -> eventsDescriptor : {eventsDescriptor, '$1'}.ammParameter -> eventBufferDescriptor : {eventBufferDescriptor, '$1'}.ammParameter -> signalsDescriptor : {signalsDescriptor, '$1'}.ammParameter -> digitMapDescriptor : {digitMapDescriptor, '$1'}.ammParameter -> auditDescriptor : {auditDescriptor, '$1'}.ammsReply -> ammsToken 'EQUAL' terminationID ammsReplyBody : {'$1', #'AmmsReply'{terminationID = ['$3'], terminationAudit = '$4'}} .ammsToken -> 'AddToken' : addReply .ammsToken -> 'MoveToken' : moveReply .ammsToken -> 'ModifyToken' : modReply .ammsToken -> 'SubtractToken' : subtractReply .ammsReplyBody -> 'LBRKT' terminationAudit 'RBRKT' : '$2' .ammsReplyBody -> '$empty' : asn1_NOVALUE .subtractRequest -> 'SubtractToken' 'EQUAL' terminationID optAuditDescriptor : make_commandRequest({subtractReq, '$1'}, #'SubtractRequest'{terminationID = ['$3'], auditDescriptor = '$4'}) . optAuditDescriptor -> 'LBRKT' auditDescriptor 'RBRKT' : '$2'.optAuditDescriptor -> '$empty' : asn1_NOVALUE .auditRequest -> 'AuditValueToken' 'EQUAL' terminationID optAuditDescriptor : make_commandRequest({auditValueRequest, '$1'}, #'AuditRequest'{terminationID = '$3', auditDescriptor = '$4'}) .auditRequest -> 'AuditCapToken' 'EQUAL' terminationID optAuditDescriptor : make_commandRequest({auditCapRequest, '$1'}, #'AuditRequest'{terminationID = '$3', auditDescriptor = '$4'}) .auditReply -> 'AuditValueToken' 'EQUAL' 'CtxToken' contextTerminationAudit : {auditValueReply, '$4'} .auditReply -> 'AuditCapToken' 'EQUAL' 'CtxToken' contextTerminationAudit : {auditCapReply, '$4'} .auditReply -> 'AuditValueToken' 'EQUAL' auditOther : {auditValueReply, '$3'} .auditReply -> 'AuditCapToken' 'EQUAL' auditOther : {auditCapReply, '$3'} .contextTerminationAudit -> terminationIDList : {contextAuditResult, '$1'} .contextTerminationAudit -> 'LBRKT' errorDescriptor 'RBRKT' : {contextAuditResult, '$2'} .auditOther -> terminationID : {auditResult, #'AuditResult'{terminationID = '$1', terminationAuditResult = []}} .auditOther -> terminationID 'LBRKT' terminationAudit 'RBRKT' : {auditResult, #'AuditResult'{terminationID = '$1', terminationAuditResult = '$3'}} . terminationAudit -> auditReturnParameter auditReturnParameterList : merge_terminationAudit(['$1' |'$2' ]) .auditReturnParameterList -> 'COMMA' auditReturnParameter auditReturnParameterList : ['$2' | '$3'] .auditReturnParameterList -> '$empty' : [] .auditReturnParameter -> mediaDescriptor : {mediaDescriptor, '$1'} .auditReturnParameter -> modemDescriptor.auditReturnParameter -> muxDescriptor : {muxDescriptor, '$1'} .auditReturnParameter -> eventsDescriptor : {eventsDescriptor, '$1'} .auditReturnParameter -> signalsDescriptor : {signalsDescriptor, '$1'} .auditReturnParameter -> digitMapDescriptor : {digitMapDescriptor, '$1'} .auditReturnParameter -> observedEventsDescriptor : {observedEventsDescriptor, '$1'} .auditReturnParameter -> eventBufferDescriptor : {eventBufferDescriptor, '$1'} .auditReturnParameter -> statisticsDescriptor : {statisticsDescriptor, '$1'} .auditReturnParameter -> packagesDescriptor : {packagesDescriptor, '$1'} .auditReturnParameter -> errorDescriptor : {errorDescriptor, '$1'} .auditReturnParameter -> auditReturnItem : {auditReturnItem, '$1'} .auditDescriptor -> 'AuditToken' 'LBRKT' auditDescriptorBody 'RBRKT' : merge_auditDescriptor('$3') .auditDescriptorBody -> auditItem auditItemList : ['$1' | '$2'].auditDescriptorBody -> '$empty' : asn1_NOVALUE .auditItemList -> 'COMMA' auditItem auditItemList : ['$2' | '$3'] .auditItemList -> '$empty' : [] . %% IGv11 - begin%% auditReturnItem -> 'MuxToken' : muxToken .auditReturnItem -> 'ModemToken' : modemToken .auditReturnItem -> 'MediaToken' : mediaToken .auditReturnItem -> 'DigitMapToken' : digitMapToken .auditReturnItem -> 'StatsToken' : statsToken .auditReturnItem -> 'ObservedEventsToken' : observedEventsToken .auditReturnItem -> 'PackagesToken' : packagesToken .%% at-most-once, and DigitMapToken and PackagesToken are not allowed %% in AuditCapabilities command auditItem -> auditReturnItem : '$1' .auditItem -> 'SignalsToken' : signalsToken.auditItem -> 'EventBufferToken' : eventBufferToken.auditItem -> 'EventsToken' : eventsToken .auditItem -> indAudterminationAudit : {terminationAudit, '$1'} . % v2%% %% IGv11 - end%% v2 - start%% indAudterminationAudit -> indAudauditReturnParameter indAudterminationAuditList : ['$1' | '$2'] .% testing fix...% indAudterminationAudit -> 'IndAudTerminationAuditToken' % indAudauditReturnParameter % indAudterminationAuditList % : ['$2' | '$3'] . indAudterminationAuditList -> 'COMMA' indAudauditReturnParameter indAudterminationAuditList : ['$2' | '$3'] .indAudterminationAuditList -> '$empty' : [] . indAudauditReturnParameter -> indAudmediaDescriptor : {indAudMediaDescriptor, '$1'} .indAudauditReturnParameter -> indAudeventsDescriptor : {indAudEventsDescriptor, '$1'} .indAudauditReturnParameter -> indAudsignalsDescriptor : {indAudSignalsDescriptor, '$1'} .indAudauditReturnParameter -> indAuddigitMapDescriptor : {indAudDigitMapDescriptor, '$1'} .indAudauditReturnParameter -> indAudeventBufferDescriptor : {indAudEventBufferDescriptor, '$1'} .indAudauditReturnParameter -> indAudstatisticsDescriptor : {indAudStatisticsDescriptor, '$1'} .indAudauditReturnParameter -> indAudpackagesDescriptor : {indAudPackagesDescriptor, '$1'} . indAudmediaDescriptor -> 'MediaToken' 'LBRKT' indAudmediaParm 'RBRKT' : merge_indAudMediaDescriptor('$3') . %% at-most-once per item%% and either streamParm or streamDescriptor but not both%% <rambling>%% This is solved in another way in text than in binary :(%% Instead of having a list of indAudmediaParm we put this%% stuff in the indAudterminationAuditList with several %% indAudmediaDescriptor's. %% </rambling>%% indAudmediaParm -> indAudstreamParm : {streamParm, '$1'} .indAudmediaParm -> indAudstreamDescriptor : {streamDescr, '$1'} .indAudmediaParm -> indAudterminationStateDescriptor : {termStateDescr, '$1'} . %% at-most-once
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -