public override SpanSyntaxNode Parse(ref Indexical<SpanToken> index)
        {
            var neighbor = GetNeighbor ();

            if (neighbor is WordExpression && index.Value is WordToken)
            {
                parentStack.Pop ();

                var wordexp = parentStack.Pop () as WordExpression;

                var part1 = wordexp.word;
                var part2 = (index.Value as WordToken).GetString();

                return new HyphenatedWord (part1, part2);
            }

            if (neighbor is HyphenatedWord && index.Value is WordToken)
            {
                parentStack.Pop ();

                var hyphenated = parentStack.Top as HyphenatedWord;

                hyphenated.AddPart (index.Value.GetString ());

                return hyphenated;
            }

            return base.Parse (ref index);
        }
        public override SpanToken Scan(ref Indexical<CharEx> index)
        {
            var c = index.Value;

            if (c.IsCaret)
                return new DoubleCaret (c);
            else
                return Start (ref index);
        }
        public SpanToken ScanHour(Indexical<CharEx> index)
        {
            if (index.Value != ':')
                hour.Add (index.Value);
            else
                state = 1;

            return this;
        }
        public SpanToken ScanPeriod(Indexical<CharEx> index)
        {
            if (index.Value != '\\')
                period.Add (index.Value);
            else
                done = true;

            return this;
        }
 public override SpanToken Scan(ref Indexical<CharEx> index)
 {
     if (index.Value == '\'')
     {
         parentStack.Pop ();
         return new DoublePrime ();
     }
     else
         return base.Scan (ref index);
 }
 public override SpanToken Scan(ref Indexical<CharEx> index)
 {
     if (++count > length)
         return Start (ref index);
     else
     {
         chars.Add (index.Value);
         return this;
     }
 }
        public override SpanToken Scan(ref Indexical<CharEx> index)
        {
            var c = index.Value;

            if (c == '.')
            {
                parentStack.Pop ();
                return new TripleDot ('.');
            }
            else
                return base.Scan (ref index);
        }
        public override SpanToken Scan(ref Indexical<CharEx> index)
        {
            var c = index.Value;

            if (c == '_')
            {
                parentStack.Pop ();
                return new DoubleUnderscore (c);
            }
            else
                return Start (ref index);
        }
        public override SpanToken Scan(ref Indexical<CharEx> index)
        {
            var c = index.Value;

            if (c == '*')
            {
                parentStack.Pop ();
                return new TripleAsterisk (c);
            }
            else
                return Start (ref index);
        }
        public override SpanToken Scan(ref Indexical<CharEx> index)
        {
            var c = index.Value;

            if (c.IsGraveAccent)
            {
                parentStack.Pop ();
                return new DoubleGraveAccent (c);
            }
            else
                return Start (ref index);
        }
        public override SpanSyntaxNode GetStartNode(ref Indexical<SpanToken> index)
        {
            int i = 0;

            while (i < chars.Count && chars[i] != '>')
                i++;

            var full_url = new string (chars.Take(i).ToArray());
            var display = full_url.Split (new[] { "://" }, System.StringSplitOptions.None)[1];

            return new HyperLinkExpression (full_url, display, full_url);
        }
        public override SpanSyntaxNode GetStartNode(ref Indexical<SpanToken> index)
        {
            var c = chars[0];

            if (char.IsSymbol (c))
                return new GenericSymbolExpression (c);

            if (char.IsPunctuation (c))
                return new GenericPunctuationExpression (c);

            return new WordExpression (c.ToString ());
        }
        public override SpanToken Scan(ref Indexical<CharEx> index)
        {
            var c = index.Value;

            if (c.IsDigit)
            {
                Add (c);
                return this;
            }
            else
            {
                return Start (ref index);
            }
        }
        public SpanToken ScanMinute(Indexical<CharEx> index)
        {
            if (index.Value.IsDigit)
            {
                minute.Add (index.Value);
                return this;
            }
            else
            {
                state = 2;

                return actions[state] (index);
            }
        }
        public override SpanSyntaxNode Parse(ref Indexical<SpanToken> index)
        {
            if (index.Value is Digits)
            {
                parentStack.Pop ();

                var num = index.Value.GetString();

                return new NumericSubscript (num);
            }

            else
                return base.Parse (ref index);
        }
        public override SpanToken Scan(ref Indexical<CharEx> index)
        {
            if (done)
                return Start (ref index);

            if (index.Value != '\\')
            {
                chars.Add (index.Value);
                return this;
            }
            else
            {
                done = true;
                return this;
            }
        }
        public override SpanSyntaxNode Parse(ref Indexical<SpanToken> index)
        {
            var token = index.Value;

            if (token is DoublePrime)
            {
                parentStack.Pop ();

                return new CompleteSingleQuoteExpression (tokens);
            }
            else
            {
                tokens.Add (token);
                return this;
            }
        }
        public override SpanToken Scan(ref Indexical<CharEx> index)
        {
            if (finished)
                return Start (ref index);

            var c = index.Value;

            if (c == ']')
            {
                finished = true;
                return this;
            }

            chars.Add (c);

            return this;
        }
        public override SpanSyntaxNode Parse(ref Indexical<SpanToken> index)
        {
            var upper = index + 2;

            if (upper)
            {
                var c0 = (index + 0).Value; //adding zero because I like the symmetry
                var c1 = (index + 1).Value;
                var c2 = (index + 2).Value;

                if (c0 is Hash && c1 is Digits && c2 is Semicolon)
                {
                    parentStack.Pop ();

                    index = index + 2;

                    var line = c1.GetString ();

                    if (line.Length <= 7) //Since there are only 17 unicode planes with 2^16 characters each, let's just assume we can handle any number less that 9 million
                    {
                        var code = int.Parse(line);

                        return new HtmlEntityExpression (code);
                    }
                }
            }

            upper = index + 1;

            if (upper) //TODO: fix so that this can handle entities that are a mix of numbers and letters. ex &there4;
            {
                var c0 = (index + 0).Value;
                var c2 = (index + 1).Value;

                if (c0 is WordToken && c2 is Semicolon)
                {
                    index = index + 1;

                    parentStack.Pop ();

                    return new HtmlEntityExpression (c0.GetString ());
                }
            }

            return base.Parse (ref index);
        }
        public override SpanToken Scan(ref Indexical<CharEx> index)
        {
            if (index + 3)
            {
                if (index.Value == 'm')
                    if ((index + 1).Value == 'u')
                        if ((index + 2).Value == 'l')
                            if ((index + 3).Value == 't')
                            {
                                index = index + 3;
                                parentStack.Pop ();

                                return new DimensionSign ();
                            }
            }

            parentStack.Pop ();
            return new LiteralToken (index.Value);
        }
        public override SpanSyntaxNode Parse(ref Indexical<SpanToken> index)
        {
            var token = index.Value;

            if (token is EndOfline)
            {
                Pop ();
                return new CardinalNumberExpression (number);
            }

            if (token is WordToken)
            {
                var s = token.GetString ();

                if (TestOrdinal (s))
                {
                    Pop ();
                    return new OrdinalNumberExpression (number, s);
                }

                if (s.ToUpper () == "X")
                {
                    var next = index + 1;

                    if (next.IsValid && next.Value is Digits)
                    {
                        return new DimesionExpression (number);
                    }
                }

                if (s == "DEG")
                    return new DegreeExpression (number);
            }

            Pop ();

            parentStack.Push (new CardinalNumberExpression (number));

            return token.GetStartNode (ref index);
        }
        public override SpanSyntaxNode GetStartNode(ref Indexical<SpanToken> index)
        {
            List<char> uri_xs = new List<char>(), title_xs = new List<char>();

            var k = new[] { uri_xs, title_xs };
            int ndx = 0;

            for (var i = 0; i < chars.Count; i++)
            {
                if (chars[i] == '>')
                {
                    ndx = 1;
                    continue;
                }

                k[ndx].Add (chars[i]);
            }

            var url = new string (uri_xs.ToArray ());

            var title = title_xs.Count > 0 ? new string (title_xs.ToArray ()) : url;

            return new HyperLinkExpression (url, url, title);
        }
 public override SpanSyntaxNode GetStartNode(ref Indexical<SpanToken> index)
 {
     return new GenericPunctuationExpression (chars[0]);
 }
 public override SpanSyntaxNode GetStartNode(ref Indexical<SpanToken> index)
 {
     return new DimesnionSignExpression ();
 }
 public override SpanSyntaxNode GetStartNode(ref Indexical<SpanToken> index)
 {
     return new EmailExpression (new string (chars.ToArray ()));
 }
            public override SpanSyntaxNode Parse(ref Indexical<SpanToken> index)
            {
                if (index.Value is EndOfline)
                    is_last = true;

                return base.Parse (ref index);
            }
 public ApostropheExpression(Indexical<SpanToken> index)
 {
     this.index = index;
 }
 public override SpanSyntaxNode GetStartNode(ref Indexical<SpanToken> index)
 {
     return new NumberExpression (GetString ());
 }
 public override SpanSyntaxNode GetStartNode(ref Indexical<SpanToken> index)
 {
     return new PartialInlineQuoteExpression (index);
 }
 public override SpanSyntaxNode GetStartNode(ref Indexical<SpanToken> index)
 {
     return new EmptyImageExpression ();
 }