namespace Ghost.Shader.ParserBlock; internal class KeywordsBlock : IBlockParser> { public static bool ShouldEnter(Token token) { return token.Match(TokenType.Keyword, TokenLexicon.KnownKeywords.KEYWORDS); } public static List Parse(TokenStreamSlice stream) { stream.Expect(TokenType.Keyword); stream.Expect(TokenType.LBrace); var keywords = new List(); var bodyStream = stream.Slice(stream.Remaining - 1); while (bodyStream.HasMore) { var keywordToken = bodyStream.Expect(TokenType.Identifier); var args = ParseUtility.ParseFunctionArguments(ref bodyStream, TokenType.Identifier); keywords.Add(new FunctionCall { name = keywordToken, arguments = args }); bodyStream.Expect(TokenType.Semicolon); } stream.Expect(TokenType.RBrace); return keywords; } }