示例#1
0
        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}'");
        }
示例#2
0
        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));
        }