Beispiel #1
0
        private static Token ParseSupperComment(TokenBuffer buffer)
        {
            var tks = buffer.PopUntil(t => t.TokenType == TokenType.NewLine);

            if (buffer.Peek().TokenType == TokenType.NewLine)
            {
                buffer.Pop();
            }
            return(Token1.SuperComment(tks));
        }
Beispiel #2
0
        private static Token ParsePreprocessor(TokenBuffer buffer)
        {
            var tks = buffer.PopUntil(t => t.TokenType == TokenType.NewLine);

            if (buffer.Peek().TokenType == TokenType.NewLine)
            {
                buffer.Pop();
            }

            return(Token1.Preprocessor(tks));
        }
Beispiel #3
0
        private static Token ParseMultiComment(TokenBuffer buffer)
        {
            if (!buffer.PopUntilPop(t => t.Value == "*/", out var tks))
            {
                return(Token1.Error(tks));
            }
            var p = buffer.Peek();

            if (p.TokenType == TokenType.NewLine)
            {
                buffer.Pop();
            }
            return(Token1.MultiComment(tks));
        }
Beispiel #4
0
        private static Token ParseSubMacro(TokenBuffer buffer)
        {
            var nivel = 1;
            var res   = new List <Token>();

            res.Add(buffer.Pop());
            if (buffer.Peek().TokenType == TokenType.NewLine)
            {
                buffer.Pop();
            }
            while (!buffer.EOF && nivel > 0)
            {
                var p = buffer.PeekStr();
                if (p == "'")
                {
                    var p3 = buffer.Peek3Str();
                    if (p3 == "'{'" || p3 == "'}'")
                    {
                        res.Add(buffer.Pop());
                        res.Add(buffer.Pop());
                        res.Add(buffer.Pop());
                    }
                }

                if (p == "\"")
                {
                    var v = ParseQuote(buffer);
                    res.Add(v);
                    continue;
                }

                if (p == "}")
                {
                    nivel--;
                }
                if (p == "{")
                {
                    nivel++;
                }
                res.Add(buffer.Pop());
            }

            // ReSharper disable once IteratorMethodResultIsIgnored
            buffer.PopWhile(t => t.TokenType == TokenType.Blank);
            if (buffer.Peek().TokenType == TokenType.NewLine)
            {
                buffer.Pop();
            }
            return(Token1.SubMacro(res));
        }
Beispiel #5
0
        private static Token ParseExpression(TokenBuffer buffer)
        {
            var nivel = 1;
            var tks   = new List <Token>();

            tks.Add(buffer.Pop());
            while (!buffer.EOF && nivel > 0)
            {
                var p = buffer.PeekStr();
                if (p == "'")
                {
                    var p3 = buffer.Peek3Str();
                    if (p3 == "'('" || p3 == "')'")
                    {
                        tks.Add(Token0.Literal(buffer.Pop3Str()));
                    }
                    continue;
                }

                if (p == "\"")
                {
                    var v = ParseQuote(buffer);
                    tks.Add(v);
                    continue;
                }

                if (p == "(")
                {
                    nivel++;
                }
                if (p == ")")
                {
                    nivel--;
                }
                tks.Add(buffer.Pop());
            }

            return(Token1.Expression(tks));
        }
Beispiel #6
0
        private static IList <Token> Parse1(IEnumerable <Token> data)
        {
            var res    = new List <Token>();
            var buffer = new TokenBuffer(data);
            var queue  = new Queue <Token>();

            void Frush()
            {
                if (queue.Count > 0)
                {
                    res.Add(Token1.Pure(queue));
                }
                queue.Clear();
            }

            void FrushLine()
            {
                res.Add(Token1.PureLine(queue));
                queue.Clear();
            }

            while (!buffer.EOF)
            {
                var p = buffer.Peek();
                switch (p.TokenType)
                {
                case TokenType.Symbol:
                    var token = ParseSymbol(buffer);

                    if (token == null)
                    {
                        queue.Enqueue(buffer.Pop());
                    }
                    else
                    {
                        Frush();
                        res.Add(token);
                    }

                    break;

                case TokenType.NewLine:
                    buffer.Pop();
                    FrushLine();
                    continue;

                case TokenType.Variable:
                    Frush();
                    res.Add(buffer.Pop());
                    break;

                default:
                    queue.Enqueue(buffer.Pop());
                    break;
                }
            }

            if (queue.Count > 0)
            {
                FrushLine();
            }
            return(res);
        }