public DragonToken Scan()
        {
            try
            {
                for (; ; ReadChar())
                {
                    if (Peek == ' ' || Peek == '\t')
                    {
                        continue;
                    }
                    else if (Peek == '\n')
                    {
                        Line = Line + 1;
                    }
                    else
                    {
                        break;
                    }
                }
                switch (Peek)
                {
                case '&':
                    if (ReadChar('&'))
                    {
                        return(DragonWord.and);
                    }
                    else
                    {
                        return(new DragonToken('&'));
                    }

                case '|':
                    if (ReadChar('|'))
                    {
                        return(DragonWord.or);
                    }
                    else
                    {
                        return(new DragonToken('|'));
                    }

                case '=':
                    if (ReadChar('='))
                    {
                        return(DragonWord.eq);
                    }
                    else
                    {
                        return(new DragonToken('='));
                    }

                case '!':
                    if (ReadChar('='))
                    {
                        return(DragonWord.ne);
                    }
                    else
                    {
                        return(new DragonToken('!'));
                    }

                case '<':
                    if (ReadChar('='))
                    {
                        return(DragonWord.le);
                    }
                    else
                    {
                        return(new DragonToken('<'));
                    }

                case '>':
                    if (ReadChar('='))
                    {
                        return(DragonWord.ge);
                    }
                    else
                    {
                        return(new DragonToken('>'));
                    }
                }
                if (Char.IsDigit(Peek))
                {
                    int v = 0;
                    do
                    {
                        v *= 10;
                        v += Convert.ToInt16(Peek);
                        ReadChar();
                    }while (Char.IsDigit(Peek));
                    if (Peek != '.')
                    {
                        return(new DragonNumber(v));
                    }
                    float x = v;
                    float d = 10;
                    for (; ;)
                    {
                        ReadChar();
                        if (!Char.IsDigit(Peek))
                        {
                            break;
                        }
                        x += Convert.ToInt16(Peek);
                        x /= d;
                        d *= 10;
                    }
                    return(new DragonReal(x));
                }
                if (Char.IsLetter(Peek))
                {
                    StringBuilder Sb = new StringBuilder();
                    do
                    {
                        Sb.Append(Peek);
                        ReadChar();
                    }while (Char.IsLetterOrDigit(Peek));
                    string     s = Sb.ToString();
                    DragonWord w = (DragonWord)Words[s];
                    if (w != null)
                    {
                        return(w);
                    }
                    w = new DragonWord(s, DragonTag.ID);
                    Words.Add(s, w);
                    return(w);
                }
                DragonToken tok = new DragonToken(Peek);
                Peek = ' ';
                return(tok);
            }
            catch
            {
                throw new IOException();
            }
        }
 void Reserve(DragonWord w)
 {
     Words.Add(w.LexElement, w);
 }