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}'"); }
Ast.Pattern _GetPattern(FtlParserStream ps) { var elements = new List <Ast.SyntaxNode>(); ps.SkipInlineWs(); int ch; while ((ch = ps.Current) != Eof) { // The end condition for GetPattern's while loop is a newline // which is not followed by a valid pattern continuation. if (ps.IsPeekNewLine() && !ps.IsPeekNextLineValue()) { break; } if (ch == '{') { var element = GetPlaceable(ps); elements.Add(element); } else { var element = GetTextElement(ps); elements.Add(element); } } // Trim trailing whitespace. if (elements.Count > 0 && elements[elements.Count - 1] is Ast.TextElement te) { te.Value = TrimRight(te.Value); } return(new Ast.Pattern(elements)); }