public static void ParseArray(string source, ParseArrayArguments args) { // how many dimensions? var rank = 0; Notification FoundArray = null; FoundArray = a => { rank++; var index = -1; a( new ParseArguments { FoundArray = FoundArray, FoundString = value => { index++; args.FoundString(rank, index, value); } } ); rank--; }; Parse(source, new ParseArguments { FoundArray = FoundArray, FoundString = value => { args.FoundString(rank, 0, value); } } ); }