public IEnumerable <Parser <IAssetParserFragment> > GetParsers()
        {
            var propType = Between(Terms.Char('<'),
                                   Terms.Identifier().Then <IAssetParserFragment>(id => new PropertyValueFragment
            {
                PropertyType = id.ToString()
            }),
                                   Terms.Char('>'));
            var propValue = Between(Terms.Char('<'), Terms.Identifier().AndSkip(Terms.Char('=')).And(TemplateParser.ValueInputParser.Or(Terms.Char('*').Then(c => c.ToString())))
                                    .Then <IAssetParserFragment>(x =>
                                                                 new PropertyValueFragment
            {
                PropertyType = x.Item1.ToString(), PropertyValue = x.Item2.ToString()
            }), Terms.Char('>'));

            var numberPropValue = Between(Terms.Char('<'),
                                          Terms.Identifier().AndSkip(Terms.Char('=')).And(
                                              Separated(Terms.Char('|'), Terms.Integer().Then(Convert.ToDouble).Or(Terms.Decimal().Then(Convert.ToDouble)))), Terms.Char('>'))
                                  .Then <IAssetParserFragment>(result => new NumberCollectionValueFragment(result.Item1.ToString())
            {
                AllowedValues = result.Item2
            });

            return(new List <Parser <IAssetParserFragment> > {
                propType, propValue, numberPropValue
            });
        }
 public IEnumerable <Parser <IAssetParserFragment> > GetParsers()
 {
     return(new[] { Between(Terms.Char('<'),
                            Terms.Identifier().AndSkip(Terms.Char(':').And(Terms.Char(':'))).And(ZeroOrOne(Terms.Identifier()))
                            .Then <IAssetParserFragment>(m => new EnumValueFragment {
             EnumType = m.Item1.ToString(), EnumValue = m.Item2.ToString()
         }),
                            Terms.Char('>')) });
     // this needs to parse a syntax like <EnumType::EnumMember> or <EnumType::> and then formulate that into an EnumValueFragment. Maybe <|whatever|> ?
 }
Exemple #3
0
        static JsonParser()
        {
            var LBrace   = Terms.Char('{');
            var RBrace   = Terms.Char('}');
            var LBracket = Terms.Char('[');
            var RBracket = Terms.Char(']');
            var Colon    = Terms.Char(':');
            var Comma    = Terms.Char(',');

            var String = Terms.String(StringLiteralQuotes.Double);

            var jsonString =
                String
                .Then <IJson>(static s => new JsonString(s.Text));
Exemple #4
0
        private void CreateLavaDocumentParsers()
        {
            // Define the top-level parsers.
            var anyTags   = CreateKnownTagsParser(throwOnUnknownTag: false);
            var knownTags = CreateKnownTagsParser(throwOnUnknownTag: true);

            var outputElement = OutputStart.SkipAnd(FilterExpression.And(OutputEnd.ElseError(ErrorMessages.ExpectedOutputEnd))
                                                    .Then <Statement>(x => new OutputStatement(x.Item1)));

            var textElement = AnyCharBefore(OutputStart.Or(LavaTagParsers.LavaTagStart().AsFluidTagResultParser()).Or(LavaTagParsers.LavaShortcodeStart().AsFluidTagResultParser()))
                              .Then <Statement>((ctx, x) =>
            {
                // Keep track of each text span such that whitespace trimming can be applied
                var p = ( FluidParseContext )ctx;

                var result = new TextSpanStatement(x);

                p.PreviousTextSpanStatement = result;

                if (p.StripNextTextSpanStatement)
                {
                    result.StripLeft             = true;
                    p.StripNextTextSpanStatement = false;
                }

                result.PreviousIsTag    = p.PreviousIsTag;
                result.PreviousIsOutput = p.PreviousIsOutput;

                return(result);
            });

            // Define parsers for Lava block/inline comments.
            var blockCommentElement = Terms.Text("/-").SkipAnd(AnyCharBefore(Terms.Text("-/")));
            var lineCommentElement  = Terms.Text("/-").SkipAnd(AnyCharBefore(Terms.Char('\r').SkipAnd(Terms.Char('\n'))));

            var commentElement = blockCommentElement.Or(lineCommentElement);

            // Set the parser to be used for a block element.
            // This parser returns an empty result when an unknown tag is found.
            _anyTagsListParser = ZeroOrMany(outputElement.Or(anyTags).Or(textElement));

            // Set the parser to be used for the entire template.
            // This parser raises an exception when an unknown tag is found.
            _knownTagsListParser = ZeroOrMany(outputElement.Or(knownTags).Or(textElement));
        }
        static LocalizationParser()
        {
            /*
             * Grammar:
             *
             * statement ::= insertStatement | goStatement
             *
             * insertStatement ::= INSERT tableName (columnList) VALUES (valueList)
             *
             * ifStatement ::=
             *
             * value ::= literal | N<literal>
             */
            var insert       = Terms.Text("INSERT");
            var ifExpression = Terms.Text("IF");
            var values       = Terms.Text("VALUES");
            var openParen    = Terms.Char('(');
            var closeParen   = Terms.Char(')');
            var openBracket  = Terms.Char('[');
            var closeBracket = Terms.Char(']');
            var comma        = Terms.Char(',');
            var semiColon    = Terms.Char(';');
            var dot          = Terms.Char('.');
            var apostrophe   = Terms.Char('\'');
            var nType        = Terms.Char('N');
            var comment      = Terms.Text("--");
            var newline      = Terms.Pattern(c => c != '\n');

            var go = Terms.Text("GO");

            var name = Between(openBracket, Terms.Identifier(), closeBracket).Or(dot.Then(c => new TextSpan(c.ToString())));

            var identifierName = OneOrMany(name).Then(c => string.Concat(c));

            var literal = Terms.String(StringLiteralQuotes.Single).Then(l => l.ToString());

            var value = literal.Or(nType.And(literal).Then(static c => c.Item2.ToString())).Or(literal);
Exemple #6
0
 public IEnumerable <Parser <IAssetParserFragment> > GetParsers()
 {
     return(new List <Parser <IAssetParserFragment> > {
         Between(Terms.Char('['),
                 ZeroOrOne(Terms.Char('!')).And(Terms.String()),
                 Terms.Char(']'))
         .Then <IAssetParserFragment>(x => new StructFragment {
             MatchValue = x.Item2.ToString(), InvertMatch = x.Item1 == '!'
         }),
         Between(
             OpenBrace,
             ZeroOrOne(Terms.Identifier().AndSkip(Terms.Char(':'))).And(Parsers.Between(OpenBrace, Terms.String().AndSkip(Terms.Char('=')).And(Terms.String()), CloseBrace)),
             CloseBrace
             ).Then <IAssetParserFragment>(res => new StructMatchFragment {
             Type = res.Item1.ToString(),
             PropertyName = res.Item2.Item1.ToString(),
             PropertyValue = res.Item2.Item2.ToString()
         }),
         Between(OpenBrace, Terms.String(), CloseBrace)
         .Then <IAssetParserFragment>(x => new StructPropertyFragment {
             MatchValue = x.ToString()
         })
     });
 }