public override Lexem ReadNextLexem(ParseIterator iterator) { bool hasDecimalPoint = false; while (true) { if (Char.IsDigit(iterator.CurrentSymbol)) { if (!iterator.MoveNext()) { var lex = new Lexem() { Type = LexemType.NumberLiteral, Content = iterator.GetContents().content }; return(lex); } } else if (SpecialChars.IsDelimiter(iterator.CurrentSymbol)) { if (iterator.CurrentSymbol == '.') { if (!hasDecimalPoint) { hasDecimalPoint = true; iterator.MoveNext(); continue; } else { throw CreateExceptionOnCurrentLine("Некорректно указана десятичная точка в числе", iterator); } } var lex = new Lexem() { Type = LexemType.NumberLiteral, Content = iterator.GetContents().content }; return(lex); } else { throw CreateExceptionOnCurrentLine("Некорректный символ", iterator); } } }
public Lexem NextLexem() { _state = _emptyState; while (true) { if (_iterator.MoveToContent()) { char cs = _iterator.CurrentSymbol; if (Char.IsLetter(cs) || cs == '_') { _state = _wordState; } else if (Char.IsDigit(cs)) { _state = _numberState; } else if (cs == SpecialChars.DateQuote) { _state = _dateState; } else if (cs == SpecialChars.StringQuote) { _state = _stringState; } else if (SpecialChars.IsOperatorChar(cs)) { _state = _operatorState; } else if (cs == SpecialChars.EndOperator) { _iterator.MoveNext(); return(new Lexem() { Type = LexemType.EndOperator, Token = Token.Semicolon }); } else if (cs == '?') { _iterator.MoveNext(); return(new Lexem() { Type = LexemType.Identifier, Token = Token.Question }); } else if (cs == SpecialChars.Directive) { _state = _directiveState; } else { var cp = _iterator.GetPositionInfo(_iterator.CurrentLine); throw new ParserException(cp, string.Format("Неизвестный символ {0}", cs)); } var lex = _state.ReadNextLexem(_iterator); if (lex.Type == LexemType.NotALexem) { _state = _emptyState; continue; } return(lex); } else { return(Lexem.EndOfText()); } } }
public override Lexem ReadNextLexem(ParseIterator iterator) { bool isEndOfText = false; Char cs = '\0'; while (true) { if (!isEndOfText) { cs = iterator.CurrentSymbol; } if (SpecialChars.IsDelimiter(cs) || isEndOfText) { var content = iterator.GetContents().content; Lexem lex; if (_booleanOperators.Contains(content)) { lex = new Lexem() { Type = LexemType.Operator, Token = LanguageDef.GetToken(content), Content = content }; } else if (_booleanLiterals.Contains(content)) { lex = new Lexem() { Type = LexemType.BooleanLiteral, Content = content }; } else if (_undefined.Contains(content)) { lex = new Lexem() { Type = LexemType.UndefinedLiteral, Content = content }; } else if (String.Compare(content, "null", true) == 0) { lex = new Lexem() { Type = LexemType.NullLiteral, Content = content }; } else { lex = new Lexem() { Type = LexemType.Identifier, Content = content, Token = LanguageDef.GetToken(content) }; if (LanguageDef.IsBuiltInFunction(lex.Token)) { iterator.SkipSpaces(); if (iterator.CurrentSymbol != '(') { lex.Token = Token.NotAToken; } } } return(lex); } if (!iterator.MoveNext()) { if (isEndOfText) { break; } else { isEndOfText = true; } } } return(Lexem.Empty()); }