Пример #1
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));
        }
Пример #2
0
        private static Token ParseQuote(TokenBuffer buffer)
        {
            var res = new StringBuilder();
            var p   = buffer.PopStr();

            if (p != "\"")
            {
                throw new Exception("\" Expected");
            }
            res.Append(p);
            var tks = buffer.PopWhile(t => t.Value != "\"").Select(t => t.Value);

            res.Append(string.Concat(tks));
            if (buffer.PeekStr() == "\"")
            {
                res.Append(buffer.PopStr());
            }
            return(Token0.Quote(res.ToString()));
        }
Пример #3
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));
        }