Esempio n. 1
0
        Ast.TextElement _GetTextElement(FtlParserStream ps)
        {
            var buffer = new StringBuilder();

            int ch;

            while ((ch = ps.Current) != Eof)
            {
                if (ch == '{')
                {
                    return(new Ast.TextElement(buffer.ToString()));
                }

                if (ch == '\r' || ch == '\n')
                {
                    if (!ps.IsPeekNextLineValue())
                    {
                        return(new Ast.TextElement(buffer.ToString()));
                    }

                    ps.SkipNewLine();
                    ps.SkipInlineWs();

                    // Add the new line to the buffer
                    buffer.Append((char)ch);
                    continue;
                }

                if (ch == '\\')
                {
                    ps.Next();
                    GetEscapeSequence(ps,
                                      new int[] { '{', '\\' }, buffer);
                    continue;
                }

                buffer.Append((char)ps.Current);
                ps.Next();
            }

            return(new Ast.TextElement(buffer.ToString()));
        }
Esempio n. 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));
        }