void ParseDescrHeading(Descr descr, TokenRange toks) { toks.First(NonWhitespace).Assert("non-struct DESCR!", t => t.Value == "struct"); toks = toks.SkipWhile(Whitespace).Skip(1).SkipWhile(Whitespace); var colon = toks.FirstOrDefault(t => t.Value == ":"); if (colon != null) { descr.superClassList = str(range(colon.Position + 1, toks.End)).Trim(); toks = range(toks.Begin, colon.Position); } descr.name = str(toks).Trim(); }
Descr ParseDescr(int pos, out int end) { var descr = new Descr(); var toks = range(pos + 1, tokens.Length); var heading = toks.TakeWhile(t => t.Value != "{"); var body = range(heading.End + 1, tokens.Length) .TakeWhile(t => t.BraceDepth > toks.First().BraceDepth || t.Value == ";"); //assumes no whitespace between the last "}" and the ";" ParseDescrHeading(descr, heading); descr.body = ParseDescrCodeBlock(body); end = body.End + 1; return(descr); }