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|> ? }
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));
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);
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() }) }); }