示例#1
0
        /// <summary>
        /// Парсер даты и строк.
        /// </summary>
        /// <param name="iterator"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        public bool Parse(SourceIterator iterator, out IToken token)
        {
            token = null;
            string content = string.Empty;

            CodeInformation information = iterator.CodeInformation.Clone();

            if (ParseDate(iterator, out content))
            {
                token = new TokenClass()
                {
                    Content         = content,
                    CodeInformation = information,
                    Type            = TokenTypeEnum.LITERAL,
                    SubType         = TokenSubTypeEnum.L_DATE
                };
                return(true);
            }

            if (ParseString(iterator, out content))
            {
                token = new TokenClass()
                {
                    Content         = content,
                    CodeInformation = information,
                    Type            = TokenTypeEnum.LITERAL,
                    SubType         = TokenSubTypeEnum.L_STRING
                };
                return(true);
            }

            return(false);
        }
示例#2
0
        public bool Parse(SourceIterator iterator, out IToken token)
        {
            token = null;
            string           content = string.Empty;
            TokenSubTypeEnum subtype;

            if (Char.IsLetter(iterator.Current) || iterator.Current == '_')
            {
                CodeInformation information = iterator.CodeInformation.Clone();
                content = iterator.GetLettersAndDigits();

                if (!_table.TryGetValue(content, out subtype))
                {
                    subtype = TokenSubTypeEnum.NA;
                }

                token = new TokenClass()
                {
                    Content         = content,
                    CodeInformation = information,
                    Type            = TokenTypeEnum.IDENTIFIER,
                    SubType         = subtype
                };

                return(true);
            }
            return(false);
        }
示例#3
0
        /// <summary>
        /// Парсинг даты.
        /// </summary>
        /// <param name="iterator"></param>
        /// <param name="date"></param>
        /// <returns></returns>
        private bool ParseDate(SourceIterator iterator, out string date)
        {
            CodeInformation information;

            date = string.Empty;

            if (iterator.Current == '\'')
            {
                information = iterator.CodeInformation.Clone();
                do
                {
                    if (Char.IsNumber(iterator.Current))
                    {
                        date += iterator.Current;
                    }
                    if (iterator.Current == '\'' && iterator.CodeInformation.ColumnNumber != information.ColumnNumber)
                    {
                        iterator.MoveNext();
                        break;
                    }
                }while (iterator.MoveNext());

                if (date.Length > 14)
                {
                    throw new CompilerException(information, "Дата не может быть длинной более 14 символов.");
                }

                return(true);
            }
            return(false);
        }
示例#4
0
        /// <summary>
        /// Парсинг текстовой строки в кавычках ""
        /// </summary>
        /// <param name="iterator"></param>
        /// <param name="str"></param>
        /// <returns></returns>
        private bool ParseString(SourceIterator iterator, out string str)
        {
            str = string.Empty;

            if (iterator.Current == '"')
            {
                str = iterator.GetString();
                return(true);
            }
            return(false);
        }
示例#5
0
        public ParserClass(string module_name, string module_src)
        {
            _iterator = new SourceIterator(module_name, module_src);
            _factory  = new TokenParserFactory();
            _iterator.MoveNext();


            _factory.Add(TokenTypeEnum.IDENTIFIER, new IdentifierTokenParser());
            _factory.Add(TokenTypeEnum.LITERAL, new LiteralTokenParser());
            _factory.Add(TokenTypeEnum.PUNCTUATION, new PunctuationTokenParser());
            _factory.Add(TokenTypeEnum.NUMBER, new NumberTokenParser());
        }
示例#6
0
        public bool Parse(SourceIterator iterator, out IToken token)
        {
            token = null;
            string content = string.Empty;

            if (Char.IsNumber(iterator.Current))
            {
                CodeInformation information = iterator.CodeInformation.Clone();
                content = iterator.GetDigits();
                token   = new TokenClass()
                {
                    Content         = content,
                    CodeInformation = information,
                    Type            = TokenTypeEnum.NUMBER
                };
                return(true);
            }
            return(false);
        }
示例#7
0
        public bool Parse(SourceIterator iterator, out IToken token)
        {
            token = null;
            string           content = string.Empty;
            TokenSubTypeEnum subtype;

            if (_punctuation_table.TryGetValue(iterator.Current.ToString(), out subtype))
            {
                char forward_symbol;

                CodeInformation information = iterator.CodeInformation.Clone();
                forward_symbol = iterator.GetForwardSymbol();
                content       += iterator.Current;

                if ((forward_symbol == '>' || forward_symbol == '=') && (iterator.Current == '<' || iterator.Current == '>'))
                {
                    content = iterator.Current + forward_symbol.ToString();
                    _punctuation_table.TryGetValue(content, out subtype);

                    iterator.MoveNext();
                }

                iterator.MoveNext();

                token = new TokenClass()
                {
                    Content         = content,
                    CodeInformation = information,
                    Type            = TokenTypeEnum.PUNCTUATION,
                    SubType         = subtype
                };
                return(true);
            }
            else
            {
                return(false);
            }
        }