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)); }
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)); }