public override bool CreateNonTerminal(Lexer lex, ProductionStorage ps)
        {
            string by;

            // get the leading ( BY | A BU )
            if (ps.MatchProduction(Selmaho.BY, out by))
            {
                if (by.Length == 2)
                    by = by[0].ToString();
                _String += by;
            }
            else if (lex.Peek.Type == Selmaho.BU)
            {
                string l = lex.Advance();
                if (l.Length > 1)
                    l = "(" + l + ")";
                _String += l;
                lex.Advance();//eat the bu
            }
            else
            {
                return false;
            }

            while(true)
            {
                if (ps.MatchProduction(Selmaho.BY, out by))
                {
                    if (by.Length == 2)
                        by = by[0].ToString();
                    _String += by;
                }
                else if (lex.Peek.Type == Selmaho.BU)
                {
                    string l = lex.Advance();
                    if (l.Length > 1)
                        l = "(" + l + ")";
                    _String += l;
                    lex.Advance();//eat the bu
                }
                else
                    break;
            }

            //eat the BOI that might be there
            ps.MatchProduction(Selmaho.BOI);

            return true;
        }
Exemple #2
0
        public void AdvanceCarriageReturnIncrementsLine()
        {
            using var lexer = new Lexer(new StringReader("\r"));
            lexer.Advance();

            Assert.Equal(2, lexer.Line);
        }
Exemple #3
0
        public void AdvanceAssignsNextValueToCurrent()
        {
            using var lexer = new Lexer(new StringReader("123"));
            lexer.Advance();

            Assert.Equal('2', lexer.Current);
        }
Exemple #4
0
        public void AdvanceNewlineIncrementsLine()
        {
            using var lexer = new Lexer(new StringReader("\n"));
            lexer.Advance();

            Assert.Equal(2, lexer.Line);
        }
Exemple #5
0
        public void AdvanceReturnsPreviousValue()
        {
            using var lexer = new Lexer(new StringReader("123"));
            var result = lexer.Advance();

            Assert.Equal('1', result);
        }
Exemple #6
0
        public void HexNumbers()
        {
            var lex = new Lexer("hex.c", "0x201");

            lex.Advance();
            Assert.AreEqual(TokenKind.CONSTANT, lex.CurrentToken.Kind);
            Assert.AreEqual(513, lex.CurrentToken.Value);
        }
Exemple #7
0
        void AssertId(string expectedId, string code = null)
        {
            var lex = new Lexer("assertid.c", code ?? expectedId);

            lex.Advance();
            Assert.AreEqual(TokenKind.IDENTIFIER, lex.CurrentToken.Kind);
            Assert.AreEqual(expectedId, lex.CurrentToken.Value);
        }
Exemple #8
0
        public void HexLetters()
        {
            var lex = new Lexer("hex.c", "0xC0");

            lex.Advance();
            Assert.AreEqual(TokenKind.CONSTANT, lex.CurrentToken.Kind);
            Assert.AreEqual(192, lex.CurrentToken.Value);
        }
Exemple #9
0
        public override bool CreateNonTerminal(Lexer lex, ProductionStorage ts)
        {
            if (lex.Current.Type == Selmaho.Operator)
            {
                _Operator = lex.Advance();
                return true;
            }

            return false;
        }
Exemple #10
0
        public Token Parse(ref Lexer lexer)
        {
            bool esc = false;

            bool ok = lexer.Advance(Start);

            if (!ok)
            {
                return(lexer.Capture(false));
            }

            do
            {
                if (!esc && lexer.Current == End)
                {
                    break;
                }
                esc = (lexer.Current == Escape);
                ok  = lexer.AdvanceWhile();
            }while (ok);
            ok = lexer.Advance(End);
            return(lexer.Capture(ok));
        }
Exemple #11
0
        public Token Parse(ref Lexer lexer)
        {
            var ok = lexer.Advance(literal, ignoreCase);

            return(lexer.Capture(ok));
        }