public override Section VisitSection(SectionContext context)
            {
                var titleVisitor   = new TextAreasVisitor().Inherit(this);
                var title          = titleVisitor.VisitTitle(context.title());
                var separator      = context.SectionSeparator()[0].GetText();
                var level          = SectionTracker.Track(separator[0]);
                var list           = new List <IElement>();
                var elementVisitor = new ElementVisitor().Inherit(this);
                var element        = context.sectionElement();

                if (element != null)
                {
                    foreach (var item in element)
                    {
                        list.Add(elementVisitor.VisitSectionElement(item));
                    }
                }

                return(new Section(level, title, list, context.overline != null));
            }
            public override IElement VisitElement([NotNull] ElementContext context)
            {
                var sectionContext = context.section();

                if (sectionContext != null)
                {
                    var sectionVisitor = new SectionVisitor().Inherit(this);
                    var section        = sectionVisitor.VisitSection(sectionContext);
                    return(section);
                }

                var sectionElementContext = context.sectionElement();

                if (sectionElementContext != null)
                {
                    var elementVisitor = new ElementVisitor().Inherit(this);
                    var element        = elementVisitor.VisitSectionElement(context.sectionElement());
                    return(element);
                }

                //TODO: throw a better exception.
                throw new InvalidOperationException();
            }