private static bool IsInsideToken(SCG.Dictionary<ParseRecord, bool> memoization, CompositeGrammar compositeGrammar, ParseRecord record) { bool res; if (memoization.TryGetValue(record, out res)) return res; if (record.Sequence.ParsingSequence.SequenceInfo is SequenceInfo.Ast) { var parser = record.Sequence.ParsingSequence.SequenceInfo.Parser; res = compositeGrammar.Tokens.ContainsKey(parser) || compositeGrammar.VoidTokens.ContainsKey(parser); memoization[record] = res; if(res) return res; } foreach (var caller in record.Sequence.Callers) { res = IsInsideToken(memoization, compositeGrammar, caller); if (res) { memoization[record] = true; return true; } } memoization[record] = false; return false; }