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 ParseSupperComment(TokenBuffer buffer) { var tks = buffer.PopUntil(t => t.TokenType == TokenType.NewLine); if (buffer.Peek().TokenType == TokenType.NewLine) { buffer.Pop(); } return(Token1.SuperComment(tks)); }
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)); }
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)); }
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); }