/// <summary>
 /// Packet definition departure.
 /// </summary>
 /// <param name="context"></param>
 public override void ExitPacket_definition(KryptonParser.Packet_definitionContext context)
 {
     _memberContainers.Pop();
     _statementContainers.Pop();
     _customizables.Pop();
     _documentables.Pop();
 }
        /// <summary>
        /// Packet definition entry.
        ///
        /// PACKET IDENTIFIER (':' packet_parent)? '{' operation_statement+ '}'
        /// </summary>
        /// <param name="context"></param>
        public override void EnterPacket_definition(KryptonParser.Packet_definitionContext context)
        {
            var parent = _memberContainers.Peek();
            var name   = context.IDENTIFIER().GetText();

            // Verify our name is unique (with the exception of pairs)
            if (parent.TryFindMember(name, out var existing) && !(existing is ProtocolPair))
            {
                throw new KryptonParserException($"Multiple definitions for {name}.");
            }

            var packet = new Packet(name, parent);

            parent.AddMember(packet);

            _memberContainers.Push(packet);
            _statementContainers.Push(packet);
            _customizables.Push(packet);
            _documentables.Push(packet);
        }