private static Token ParseSymbol(TokenBuffer buffer) { var(p, p2) = buffer.Peek2(); if (p.Value == "#" && buffer.Col == 0 && p2.TokenType == TokenType.Literal) { return(ParsePreprocessor(buffer)); } if (p.Value == "//" && p2.Value == "!") { return(ParseSupperComment(buffer)); } if (p.Value == "/*") { return(ParseMultiComment(buffer)); } if (p.Value == "@{" && buffer.Col == 0) { return(ParseSubMacro(buffer)); } if (p.Value == "@(") { return(ParseExpression(buffer)); } return(null); }
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 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 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())); }
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)); }
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); }