/// <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); }
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); }
/// <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); }
/// <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); }
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()); }
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); }
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); } }