示例#1
0
        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);
        }
示例#3
0
        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));
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
        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);
        }
示例#7
0
        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));
        }
示例#8
0
        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");
        }
示例#9
0
        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));
        }
示例#10
0
        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());
        }
示例#11
0
        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);
        }
示例#12
0
        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);
        }
示例#13
0
        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);
        }
示例#14
0
        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);
        }
示例#15
0
        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);
        }