%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
%% compliance with the License. You should have received a copy of the
%% Erlang Public License along with this software. If not, it can be
%% retrieved online at http://www.erlang.org/.
%%
%% Software distributed under the License is distributed on an "AS IS"
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
%% the License for the specific language governing rights and limitations
%% under the License.
%%
%% %CopyrightEnd%
%%
%%
%%----------------------------------------------------------------------
%% Purpose: YECC grammar for mini text decoding of Megaco/H.248
%%----------------------------------------------------------------------
%%----------------------------------------------------------------------
%% Annex B TEXT ENCODING OF THE PROTOCOL (NORMATIVE)
%%
%% B.1 Coding of wildcards
%%
%% In a text encoding of the protocol, while TerminationIDs are
%% arbitrary, by judicious choice of names, the wildcard character, "*"
%% may be made more useful. When the wildcard character is encountered,
%% it will "match" all TerminationIDs having the same previous and
%% following characters (if appropriate). For example, if there were
%% TerminationIDs of R13/3/1, R13/3/2 and R13/3/3, the TerminationID
%% R13/3/* would match all of them. There are some circumstances where
%% ALL Terminations must be referred to. The TerminationID "*" suffices,
%% and is referred to as ALL. The CHOOSE TerminationID "$" may be used to
%% signal to the MG that it has to create an ephemeral Termination or
%% select an idle physical Termination.
%%
%% B.2 ABNF specification
%%
%% The protocol syntax is presented in ABNF according to RFC2234. The
%% protocol is not case sensitive. Identifiers are not case sensitive.
%%----------------------------------------------------------------------
Expect 1.
%%----------------------------------------------------------------------
%% Non-terminals
%%----------------------------------------------------------------------
Nonterminals
authenticationHeader
daddr
deviceName
domainAddress
domainName
mId
megacoMessage
message
mtpAddress
optSep
pathName
portNumber
safeToken
safeToken2
.
%%----------------------------------------------------------------------
%% Terminals
%%----------------------------------------------------------------------
Terminals
%% 'AddToken'
%% 'AndAUDITselectToken'
'AuditCapToken'
'AuditToken'
'AuditValueToken'
'AuthToken'
%% 'BothToken'
%% 'BothwayToken'
'BriefToken'
%% 'BufferToken'
'COLON'
%% 'ContextAttrToken'
'ContextAuditToken'
%% 'ContextListToken'
'CtxToken'
'DelayToken'
%% 'DigitMapToken'
%% 'DigitMapDescriptorToken'
'DirectionToken'
'DiscardToken'
'DisconnectedToken'
'DurationToken'
'EQUAL'
'EmbedToken'
%% 'EmergencyToken'
%% 'EmergencyOffToken'
%% 'EmergencyValueToken'
'ErrorToken'
%% 'EventBufferToken'
%% 'EventsToken'
%% 'ExternalToken'
'FailoverToken'
'ForcedToken'
'GREATER'
'GracefulToken'
'H221Token'
'H223Token'
'H226Token'
'HandOffToken'
%% 'IEPSToken'
'ImmAckRequiredToken'
'InSvcToken'
'InactiveToken'
%% 'InternalToken'
'InterruptByEventToken'
'InterruptByNewSignalsDescrToken'
%% 'IntsigDelayToken'
%% 'IsolateToken'
%% 'IterationToken'
'KeepActiveToken'
'LESSER'
'LSBRKT'
'LocalControlToken'
%% 'LocalDescriptorToken'
'LockStepToken'
'LoopbackToken'
%% 'MediaToken'
%% 'MessageSegmentToken'
'MethodToken'
'MgcIdToken'
%% 'ModeToken'
%% 'ModemToken'
%% 'ModifyToken'
%% 'MoveToken'
'MtpAddressToken'
%% 'MuxToken'
%% 'NeverNotifyToken'
'NotifyCompletionToken'
%% 'NotifyImmediateToken'
%% 'NotifyRegulatedToken'
'NotifyToken'
'Nx64Token'
%% 'ObservedEventsToken'
'OffToken'
'OnToken'
'OnOffToken'
%% 'OnewayToken'
%% 'OnewayExternalToken'
%% 'OnewayBothToken'
%% 'OrAUDITselectToken'
'OtherReasonToken'
'OutOfSvcToken'
%% 'PackagesToken'
'PendingToken'
%% 'PriorityToken'
'ProfileToken'
%% 'QuotedChars'
'RSBRKT'
'ReasonToken'
'RecvonlyToken'
%% 'RemoteDescriptorToken'
'ReplyToken'
'RequestIDToken'
%% 'ReservedGroupToken'
%% 'ReservedValueToken'
%% 'ResetEventsDescriptorToken'
'ResponseAckToken'
'RestartToken'
'SEP'
'SafeChars'
'SendonlyToken'
'SendrecvToken'
'ServiceChangeAddressToken'
'ServiceChangeToken'
%% 'ServiceChangeIncompleteToken'
%% '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 : ensure_message('$1', '$2') .
mId -> domainName : '$1' .
mId -> domainAddress : '$1' .
mId -> optSep mtpAddress optSep : '$2' .
mId -> optSep deviceName optSep : '$2' .
domainName -> 'LESSER' safeToken 'GREATER' 'COLON' portNumber optSep
: ensure_domainName('$2', '$5') .
domainName -> 'LESSER' safeToken 'GREATER'
: ensure_domainName('$2', asn1_NOVALUE) .
deviceName -> pathName : {deviceName, '$1'} .
domainAddress -> 'LSBRKT' daddr 'RSBRKT' 'COLON' portNumber optSep
: ensure_domainAddress('$2', '$5') .
domainAddress -> 'LSBRKT' daddr 'RSBRKT'
: ensure_domainAddress('$2', asn1_NOVALUE) .
daddr -> '$empty' : [] .
daddr -> 'COLON' daddr : [colon| '$2'] .
daddr -> safeToken daddr : ['$1'| '$2'] .
portNumber -> safeToken : ensure_uint16('$1') .
mtpAddress -> 'MtpAddressToken' : ensure_mtpAddress('$1') .
pathName -> safeToken : ensure_pathName('$1') .
safeToken -> safeToken2 : make_safe_token('$1') .
%% safeToken2 -> 'AddToken' : '$1' .
safeToken2 -> 'AuditToken' : '$1' .
safeToken2 -> 'AuditCapToken' : '$1' .
safeToken2 -> 'AuditValueToken' : '$1' .
safeToken2 -> 'AuthToken' : '$1' .
%% safeToken2 -> 'BothToken' : '$1' . % v3
%% safeToken2 -> 'BothwayToken' : '$1' .
safeToken2 -> 'BriefToken' : '$1' .
%% safeToken2 -> 'BufferToken' : '$1' .
safeToken2 -> 'CtxToken' : '$1' .
%% safeToken2 -> 'ContextAttrToken' : '$1' . % v3
safeToken2 -> 'ContextAuditToken' : '$1' .
%% safeToken2 -> 'ContextListToken' : '$1' . % v3
%% safeToken2 -> 'DigitMapToken' : '$1' .
%% safeToken2 -> 'DigitMapDescriptorToken' : '$1' .
safeToken2 -> 'DirectionToken' : '$1' . % v3
safeToken2 -> 'DiscardToken' : '$1' .
safeToken2 -> 'DisconnectedToken' : '$1' .
safeToken2 -> 'DelayToken' : '$1' .
safeToken2 -> 'DurationToken' : '$1' .
safeToken2 -> 'EmbedToken' : '$1' .
%% safeToken2 -> 'EmergencyToken' : '$1' .
%% safeToken2 -> 'EmergencyOffToken' : '$1' .
safeToken2 -> 'ErrorToken' : '$1' .
%% safeToken2 -> 'EventBufferToken' : '$1' .
%% safeToken2 -> 'EventsToken' : '$1' .
%% safeToken2 -> 'ExternalToken' : '$1' . % v3
safeToken2 -> 'FailoverToken' : '$1' .
safeToken2 -> 'ForcedToken' : '$1' .
safeToken2 -> 'GracefulToken' : '$1' .
safeToken2 -> 'H221Token' : '$1' .
safeToken2 -> 'H223Token' : '$1' .
safeToken2 -> 'H226Token' : '$1' .
safeToken2 -> 'HandOffToken' : '$1' .
%% safeToken2 -> 'IEPSToken' : '$1' . % v3
safeToken2 -> 'ImmAckRequiredToken' : '$1' .
safeToken2 -> 'InactiveToken' : '$1' .
%% safeToken2 -> 'InternalToken' : '$1' . % v3
safeToken2 -> 'InterruptByEventToken' : '$1' .
safeToken2 -> 'InterruptByNewSignalsDescrToken' : '$1' .
%% safeToken2 -> 'IsolateToken' : '$1' .
safeToken2 -> 'InSvcToken' : '$1' .
safeToken2 -> 'KeepActiveToken' : '$1' .
%% safeToken2 -> 'LocalToken' : '$1' .
%% safeToken2 -> 'LocalDescriptorToken' : '$1' .
safeToken2 -> 'LocalControlToken' : '$1' .
safeToken2 -> 'LoopbackToken' : '$1' .
safeToken2 -> 'LockStepToken' : '$1' .
%% safeToken2 -> 'MediaToken' : '$1' .
%% safeToken2 -> 'MegacopToken' : '$1' .
safeToken2 -> 'MethodToken' : '$1' .
safeToken2 -> 'MgcIdToken' : '$1' .
%% safeToken2 -> 'ModeToken' : '$1' .
%% safeToken2 -> 'ModifyToken' : '$1' .
%% safeToken2 -> 'ModemToken' : '$1' .
%% safeToken2 -> 'MoveToken' : '$1' .
%% safeToken2 -> 'MtpToken' : '$1' .
%% safeToken2 -> 'MtpAddressToken' : '$1' .
%% safeToken2 -> 'MuxToken' : '$1' .
safeToken2 -> 'NotifyToken' : '$1' .
safeToken2 -> 'NotifyCompletionToken' : '$1' .
safeToken2 -> 'Nx64Token' : '$1' .
%% safeToken2 -> 'ObservedEventsToken' : '$1' .
%% safeToken2 -> 'OnewayToken' : '$1' .
%% safeToken2 -> 'OnewayExternalToken' : '$1' .
%% safeToken2 -> 'OnewayBothToken' : '$1' .
safeToken2 -> 'OffToken' : '$1' .
safeToken2 -> 'OnToken' : '$1' .
safeToken2 -> 'OnOffToken' : '$1' .
safeToken2 -> 'OutOfSvcToken' : '$1' .
safeToken2 -> 'OtherReasonToken' : '$1' .
%% safeToken2 -> 'PackagesToken' : '$1' .
safeToken2 -> 'PendingToken' : '$1' .
%% safeToken2 -> 'PriorityToken' : '$1' .
safeToken2 -> 'ProfileToken' : '$1' .
safeToken2 -> 'ReasonToken' : '$1' .
safeToken2 -> 'RecvonlyToken' : '$1' .
safeToken2 -> 'ReplyToken' : '$1' .
safeToken2 -> 'RequestIDToken' : '$1' .
safeToken2 -> 'ResponseAckToken' : '$1' .
safeToken2 -> 'SafeChars' : '$1' .
safeToken2 -> 'RestartToken' : '$1' .
%% safeToken2 -> 'RemoteToken' : '$1' .
%% safeToken2 -> 'RemoteDescriptorToken' : '$1' .
%% safeToken2 -> 'ReservedGroupToken' : '$1' .
%% safeToken2 -> 'ReservedValueToken' : '$1' .
safeToken2 -> 'SendonlyToken' : '$1' .
safeToken2 -> 'SendrecvToken' : '$1' .
safeToken2 -> 'ServicesToken' : '$1' .
%% safeToken2 -> 'ServiceStatesToken' : '$1' .
safeToken2 -> 'ServiceChangeToken' : '$1' .
%% safeToken2 -> 'ServiceChangeIncompleteToken' : '$1' .
safeToken2 -> 'ServiceChangeAddressToken' : '$1' .
safeToken2 -> 'SignalListToken' : '$1' .
%% safeToken2 -> 'SignalsToken' : '$1' .
safeToken2 -> 'SignalTypeToken' : '$1' .
%% safeToken2 -> 'StatsToken' : '$1' .
safeToken2 -> 'StreamToken' : '$1' .
%% safeToken2 -> 'SubtractToken' : '$1' .
safeToken2 -> 'SynchISDNToken' : '$1' .
safeToken2 -> 'TerminationStateToken' : '$1' .
safeToken2 -> 'TestToken' : '$1' .
safeToken2 -> 'TimeOutToken' : '$1' .
%% safeToken2 -> 'TopologyToken' : '$1' .
safeToken2 -> 'TransToken' : '$1' .
safeToken2 -> 'V18Token' : '$1' .
safeToken2 -> 'V22Token' : '$1' .
safeToken2 -> 'V22bisToken' : '$1' .
safeToken2 -> 'V32Token' : '$1' .
safeToken2 -> 'V32bisToken' : '$1' .
safeToken2 -> 'V34Token' : '$1' .
safeToken2 -> 'V76Token' : '$1' .
safeToken2 -> 'V90Token' : '$1' .
safeToken2 -> 'V91Token' : '$1' .
safeToken2 -> 'VersionToken' : '$1' .
Erlang code.
%% The following directive is needed for (significantly) faster compilation
%% of the generated .erl file by the HiPE compiler. Please do not remove.
-compile([{hipe,[{regalloc,linear_scan}]}]).
-include("megaco_text_mini_parser.hrl").