public Ast.BaseComment _GetComment(FtlParserStream ps) { // 0 - comment // 1 - group comment // 2 - resource comment int level = -1; var content = new StringBuilder(); while (true) { int i = -1; while (ps.CurrentIs('#') && (i < (level == -1 ? 2 : level))) { ps.Next(); i++; } if (level == -1) { level = i; } if (!ps.IsPeekNewLine()) { ps.ExpectChar(' '); int ch; while ((ch = ps.TakeChar(x => x != '\r' && x != '\n')) != Eof) { content.Append((char)ch); } } if (ps.IsPeekNextLineComment(level)) { content.Append('\n'); ps.SkipNewLine(); } else { break; } } var text = content.ToString(); switch (level) { case 0: return(new Ast.Comment(text)); case 1: return(new Ast.GroupComment(text)); case 2: return(new Ast.ResourceComment(text)); } throw new InvalidOperationException($"Unknown level value '{level}'"); }