public void Word_Lexer_State_BuiltIn_Tokens_As_Usual_Words() { string code = "Лев СтрДлина Прав"; var iterator = new SourceCodeIterator(code); var state = new WordLexerState(); iterator.MoveToContent(); var lexem = state.ReadNextLexem(iterator); Assert.True(lexem.Type == LexemType.Identifier); Assert.True(lexem.Content == "Лев"); Assert.True(lexem.Token == Token.NotAToken); iterator.MoveToContent(); lexem = state.ReadNextLexem(iterator); Assert.True(lexem.Type == LexemType.Identifier); Assert.True(lexem.Content == "СтрДлина"); Assert.True(lexem.Token == Token.NotAToken); iterator.MoveToContent(); lexem = state.ReadNextLexem(iterator); Assert.True(lexem.Type == LexemType.Identifier); Assert.True(lexem.Content == "Прав"); Assert.True(lexem.Token == Token.NotAToken); }
public void IteratorReturnsCorrectLine() { var code = "\r\nF = 1;\r\nD = 2;\r\nX = 3;\r\n"; var iterator = new SourceCodeIterator(code); Assert.Equal(1, iterator.CurrentLine); Assert.Equal(-1, iterator.CurrentColumn); iterator.MoveToContent(); Assert.Equal(2, iterator.CurrentLine); Assert.Equal(1, iterator.CurrentColumn); Assert.Equal("F = 1;\r", iterator.GetCodeLine(2)); iterator.MoveNext(); Assert.Equal(2, iterator.CurrentColumn); iterator.MoveNext(); Assert.Equal(3, iterator.CurrentColumn); Assert.Equal('=', iterator.CurrentSymbol); while (iterator.CurrentSymbol != 'D' && iterator.MoveNext()) { ; } Assert.Equal(1, iterator.CurrentColumn); Assert.Equal(3, iterator.CurrentLine); }
public void Unclosed_String_Literal() { string code; SourceCodeIterator iterator; StringLexerState state = new StringLexerState(); code = " \"-just string "; iterator = new SourceCodeIterator(code); iterator.MoveToContent(); Assert.Throws <SyntaxErrorException>(() => state.ReadNextLexem(iterator)); }
public void Preprocessor_Lexem_ProcessedCorrectly() { string code = "#Если #КонецЕсли"; var iterator = new SourceCodeIterator(code); var wordParser = new PreprocessorDirectiveLexerState(); Lexem lex; iterator.MoveToContent(); lex = wordParser.ReadNextLexem(iterator); Assert.Equal(LexemType.PreprocessorDirective, lex.Type); Assert.Equal("Если", lex.Content); Assert.Equal(Token.If, lex.Token); iterator.MoveToContent(); lex = wordParser.ReadNextLexem(iterator); Assert.Equal(LexemType.PreprocessorDirective, lex.Type); Assert.Equal("КонецЕсли", lex.Content); Assert.Equal(Token.EndIf, lex.Token); }
public void Date_LexerState_Works_With_14_Numbers() { string code = " '12341212020202' "; var iterator = new SourceCodeIterator(code); iterator.MoveToContent(); var state = new DateLexerState(); var lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.DateLiteral); Assert.Equal("12341212020202", lex.Content); }
public void NumberLiteral_State_Works_Fine() { string code = " 123.45 "; var iterator = new SourceCodeIterator(code); iterator.MoveToContent(); var state = new NumberLexerState(); var lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.NumberLiteral); Assert.Equal("123.45", lex.Content); }
public void Incorrect_NewLine_InString() { string code; SourceCodeIterator iterator; StringLexerState state = new StringLexerState(); code = @" ""-just d|string """; iterator = new SourceCodeIterator(code); iterator.MoveToContent(); Assert.Throws <SyntaxErrorException>(() => state.ReadNextLexem(iterator)); }
public void Identifier_LexerState_Works_Fine() { string code = " \ndddddd-"; var iterator = new SourceCodeIterator(code); var state = new WordLexerState(); iterator.MoveToContent(); var lexem = state.ReadNextLexem(iterator); Assert.True(lexem.Type == LexemType.Identifier); Assert.True(lexem.Content == "dddddd"); }
public void Wrong_Number_Literal() { string code = " 123.45.45 "; var iterator = new SourceCodeIterator(code); iterator.MoveToContent(); var state = new NumberLexerState(); Assert.Throws <SyntaxErrorException>(() => state.ReadNextLexem(iterator)); code = " 12jk"; iterator = new SourceCodeIterator(code); iterator.MoveToContent(); Assert.Throws <SyntaxErrorException>(() => state.ReadNextLexem(iterator)); }
public void Whitespace_Skipping() { string code = "Б \t\t=\n 1; "; string check = "Б=1;"; var iterator = new SourceCodeIterator(code); for (int i = 0; i < check.Length; i++) { iterator.MoveToContent(); Assert.True(check[i] == iterator.CurrentSymbol); iterator.MoveNext(); } Assert.True(iterator.CurrentLine == 2); Assert.False(iterator.MoveNext()); }
public override Lexem ReadNextLexem(SourceCodeIterator iterator) { iterator.MoveNext(); if (!iterator.MoveToContent()) { throw CreateExceptionOnCurrentLine(MESSAGE_ANNOTATION_EXPECTED, iterator); } if (!char.IsLetter(iterator.CurrentSymbol)) { throw CreateExceptionOnCurrentLine(MESSAGE_ANNOTATION_EXPECTED, iterator); } var lexem = _wordExtractor.ReadNextLexem(iterator); lexem.Type = LexemType.Annotation; return(lexem); }
public void Word_Literals_Processed_Correctly() { string code; SourceCodeIterator iterator; Lexem lex; WordLexerState state = new WordLexerState(); code = " Истина Ложь Неопределено Null True False Undefined"; iterator = new SourceCodeIterator(code); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.Equal(LexemType.BooleanLiteral, lex.Type); Assert.Equal("Истина", lex.Content); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.BooleanLiteral); Assert.Equal("Ложь", lex.Content); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.UndefinedLiteral); Assert.Equal("Неопределено", lex.Content); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.NullLiteral); Assert.Equal("Null", lex.Content); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.BooleanLiteral); Assert.Equal("True", lex.Content); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.BooleanLiteral); Assert.Equal("False", lex.Content); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.UndefinedLiteral); Assert.Equal("Undefined", lex.Content); }
public void StringLiteral_LexerState_WorksFine() { string code; SourceCodeIterator iterator; Lexem lex; StringLexerState state = new StringLexerState(); code = " \"-just string \""; iterator = new SourceCodeIterator(code); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.StringLiteral); Assert.Equal("-just string ", lex.Content); code = @" ""-just |string """; iterator = new SourceCodeIterator(code); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.StringLiteral); Assert.Equal("-just\nstring ", lex.Content); code = @" ""-just "" ""string"" ""123"""; iterator = new SourceCodeIterator(code); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.StringLiteral); Assert.Equal("-just \nstring\n123", lex.Content); code = @"""first line |second line // comment |third line"""; iterator = new SourceCodeIterator(code); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.StringLiteral); Assert.Equal("first line\nsecond line\nthird line", lex.Content); }
public void CurrentColumn_Calculation() { string code = @"А = 1; Б = 2; В = 7-11; Г = 8"; var iterator = new SourceCodeIterator(code); while (iterator.CurrentLine < 3) { if (!iterator.MoveNext()) { throw new Xunit.Sdk.XunitException("Code is less than 3 lines"); } } Assert.True(iterator.CurrentLine == 3); iterator.MoveToContent(); Assert.True(iterator.CurrentSymbol == 'В'); Assert.True(iterator.CurrentColumn == 13); }
public void Operators_Lexer_State() { string code = " + - * / < > <= >= <> % ,.()[]"; var iterator = new SourceCodeIterator(code); var state = new OperatorLexerState(); Lexem lex; iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.Operator); Assert.Equal("+", lex.Content); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.Operator); Assert.Equal("-", lex.Content); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.Operator); Assert.Equal("*", lex.Content); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.Operator); Assert.Equal("/", lex.Content); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.Operator); Assert.Equal("<", lex.Content); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.Operator); Assert.Equal(">", lex.Content); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.Operator); Assert.Equal("<=", lex.Content); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.Operator); Assert.Equal(">=", lex.Content); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.Operator); Assert.Equal("<>", lex.Content); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.Operator); Assert.Equal("%", lex.Content); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.Operator); Assert.Equal(",", lex.Content); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.Operator); Assert.Equal(".", lex.Content); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.Operator); Assert.Equal("(", lex.Content); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.Operator); Assert.Equal(")", lex.Content); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.Operator); Assert.Equal("[", lex.Content); iterator.MoveToContent(); lex = state.ReadNextLexem(iterator); Assert.True(lex.Type == LexemType.Operator); Assert.Equal("]", lex.Content); }