Esempio n. 1
0
 private static Parser <Param> param()
 {
     return(from q in Parse.Char('$')
            from first in Parse.Chars("123456789")
            from rest in Parse.Optional(Parse.Number)
            select new Param(first + rest.GetOrElse("")));
 }
Esempio n. 2
0
 public void Parser_OfChars_UsingString_AcceptsAnyOfThoseChars()
 {
     var parser = Parse.Chars("abc").Once();
     AssertParser.SucceedsWithOne(parser, "a", 'a');
     AssertParser.SucceedsWithOne(parser, "b", 'b');
     AssertParser.SucceedsWithOne(parser, "c", 'c');
 }
Esempio n. 3
0
 private static Parser <IEnumerable <string> > IdentifierListParse() =>
 (from identifier in Parse.CharExcept(new[]
 {
     ',',
     '\n'
 }).AtLeastOnce().Text()
  from separator in Parse.Chars(',').Optional()
  select identifier.Trim()).Many();
Esempio n. 4
0
 static Parser <ESOperator> SimpleOperator(string op, string not, ESOSimpleType opType)
 {
     return
         (from begin in
          SimpleOperator(op, opType)
          from end in
          Parse.Chars(not).Not()
          select begin);
 }
Esempio n. 5
0
 internal static Parser <DslOrderBlock> OrderExprParse() =>
 from orderTitle in Parse.String(DslKeywords.Order).Token()
 from identifiers in
 (from item in OrderExprItemParse().Token()
  from delimiter in Parse.Chars(',').Optional()
  select item).Many()
 select new DslOrderBlock
 {
     Items = identifiers.ToArray()
 };
Esempio n. 6
0
        public static Parser <T> LineToken <T>(this Parser <T> parser)
        {
            if (parser == null)
            {
                throw new ArgumentNullException(nameof(parser));
            }

            return(from leading in Parse.Chars(' ', '\t').Many()
                   from item in parser
                   from trailing in Parse.Chars(' ', '\t').Many()
                   select item);
        }
Esempio n. 7
0
 // creates dummy generic parser for expressions with matching braces allowing commas and semicolons by default
 protected internal virtual Parser <string> GenericExpressionCore(string forbidden = null) =>
 from subExpressions in
 GenericNewExpression.Select(x => $" {x}")
 .Or(Parse.CharExcept("'/(){}[]" + forbidden).Except(GenericNewExpression).Many().Text().Token())
 .Or(Parse.Char('/').Then(_ => Parse.Not(Parse.Chars('/', '*'))).Once().Return("/"))
 .Or(CommentParser.AnyComment.Return(string.Empty))
 .Or(StringLiteral)
 .Or(GenericExpressionInBraces('(', ')').Select(x => $"({x})"))
 .Or(GenericExpressionInBraces('{', '}').Select(x => $"{{{x}}}"))
 .Or(GenericExpressionInBraces('[', ']').Select(x => $"[{x}]"))
 .Many()
 let expr = string.Join(string.Empty, subExpressions)
                where !string.IsNullOrWhiteSpace(expr)
            select expr;
        static SimpleTypeNameSerializer()
        {
            var typeCharParser = Parse.LetterOrDigit.Or(Parse.Chars("."));

            var typeNameParser = typeCharParser.AtLeastOnce().Text();

            var nameDelimiterParser    = Parse.Char(':');
            var genericDelimeterParser = Parse.Char(',');

            var simpleTypeParser =
                from typeName in typeNameParser
                from nameDelimeter in nameDelimiterParser
                from assemblyName in typeNameParser
                select typeName + "," + assemblyName;

            var emptyGenericTypeParser =
                from typeName in typeNameParser
                from genericMarker in Parse.Char('`')
                from numberOfGenerics in Parse.Number
                from nameDelimeter in nameDelimiterParser
                from assemblyName in typeNameParser
                select typeName + genericMarker + numberOfGenerics + "," + assemblyName;

            typeParser = null;

            var genericParameterParser =
                from genericBegin in Parse.Char('[')
                from nestedType in Parse.Ref(() => typeParser)
                from genericEnd in Parse.Char(']')
                from genericDelimeter in genericDelimeterParser.Optional()
                select nestedType;

            var genericParametersParser =
                from genericMarker in Parse.Char('`')
                from numberOfGenerics in Parse.Number
                from genericBegin in Parse.Char('[')
                from genericParameters in genericParameterParser.Repeat(int.Parse(numberOfGenerics))
                from genericEnd in Parse.Char(']')
                select Tuple.Create(numberOfGenerics, string.Join(",", genericParameters.Select(x => "[" + x + "]")));

            var genericTypeParser =
                from typeName in typeNameParser
                from genericParameters in genericParametersParser
                from nameDelimiter in nameDelimiterParser
                from assemblyName in typeNameParser
                select typeName + "`" + genericParameters.Item1 + "[" + genericParameters.Item2 + "]" + "," + assemblyName;

            typeParser = simpleTypeParser.Or(genericTypeParser).Or(emptyGenericTypeParser);
        }
Esempio n. 9
0
        private Parser <VariableDefinition> GetVariableDefinitionParser(Scope.Builder scopeBuilder, ErrorContext errorContext)
        {
            var variableDefinitionParser =
                from mutableMarker in Parse.Char('$').Once().Optional()
                from first in Parse.Letter.Once()
                from rest in Parse.LetterOrDigit.Or(Parse.Chars('_', '-')).Many()
                let name = new string(
                    mutableMarker.GetOrElse(Enumerable.Empty <char>())
                    .Concat(first)
                    .Concat(rest).ToArray())
                           select new VariableDefinition
            {
                Index   = GetVariableIndex(name, scopeBuilder, errorContext),
                Name    = name,
                Mutable = mutableMarker.IsDefined
            };

            return(variableDefinitionParser);
        }
Esempio n. 10
0
        /// <summary>
        /// コマンド用のパーサーを取得する
        /// </summary>
        /// <param name="cmdTxt">コマンドテキスト</param>
        /// <returns>コマンド用パーサー</returns>
        private static Parser <Command> GetCommandParser(string cmdTxt)
        {
            Parser <Command> cmdHas2ArgParser =
                from cmd in Parse.Chars("rs".ToCharArray())
                from d1 in DelimiterParser(cmdTxt)
                from txt1 in TextParser(cmdTxt)
                from d2 in DelimiterParser(cmdTxt)
                from txt2 in TextParser(cmdTxt).XOr(Parse.Return("")).End()
                select new Command(cmd, txt1, txt2);

            Parser <Command> cmdHas1ArgParser =
                from cmd in Parse.Chars("aic".ToCharArray())
                from d1 in DelimiterParser(cmdTxt)
                from txt in TextParser(cmdTxt).XOr(Parse.Return("")).End()
                select new Command(cmd, txt);

            Parser <Command> commandParser =
                NoArgumentCommand.XOr(
                    cmdHas1ArgParser).XOr(
                    cmdHas2ArgParser);

            return(commandParser);
        }
Esempio n. 11
0
        // creates dummy generic parser for expressions with matching braces allowing commas and semicolons by default
        protected internal virtual Parser <string> GenericExpressionCore(string forbidden = null, bool allowCurlyBraces = true)
        {
            var subExpressionParser = GenericNewExpression.Select(x => $" {x}")
                                      .Or(Parse.CharExcept("'/(){}[]" + forbidden).Except(GenericNewExpression).Many().Text().Token())
                                      .Or(Parse.Char('/').Then(_ => Parse.Not(Parse.Chars('/', '*'))).Once().Return("/"))
                                      .Or(CommentParser.AnyComment.Return(string.Empty))
                                      .Or(StringLiteral)
                                      .Or(GenericExpressionInBraces('(', ')').Select(x => $"({x})"))
                                      .Or(GenericExpressionInBraces('[', ']').Select(x => $"[{x}]"));

            // optionally include support for curly braces
            if (allowCurlyBraces)
            {
                subExpressionParser = subExpressionParser
                                      .Or(GenericExpressionInBraces('{', '}').Select(x => $"{{{x}}}"));
            }

            return
                (from subExpressions in subExpressionParser.Many()
                 let expr = string.Join(string.Empty, subExpressions)
                            where !string.IsNullOrWhiteSpace(expr)
                            select expr);
        }
Esempio n. 12
0
        Parser <IEnumerable <IContentSegment> > BuildParser()
        {
            // This is easiest to read from the bottom (most generic) to the top (most specific).

            Parser <string> double_quoted_text =
                from open in Parse.Char('"')
                from content in Parse.CharExcept('"').Many().Text()
                from close in Parse.Char('"')
                select content;

            Parser <string> single_quoted_text =
                from open in Parse.Char('\'')
                from content in Parse.CharExcept('\'').Many().Text()
                from close in Parse.Char('\'')
                select content;

            Parser <string> quoted_text =
                double_quoted_text.Or(single_quoted_text);

            Parser <string> token_attribute_value =
                quoted_text;

            Parser <string> token_attribute_key =
                Parse.LetterOrDigit.Or(Parse.Chars('_', '-')).AtLeastOnce().Text().Token();

            Parser <KeyValuePair <string, string> > token_attribute =
                from key in token_attribute_key
                from eq in Parse.Char('=').Token()
                from value in token_attribute_value
                select new KeyValuePair <string, string>(key, value);

            Parser <string> token_open =
                from tag in Parse.String("(!").Text()
                from ws in Parse.WhiteSpace.Many()
                select tag;

            Parser <string> token_close =
                from ws in Parse.WhiteSpace.Many()
                from tag in Parse.String("!)").Text()
                select tag;

            Parser <Token> token =
                from open in token_open
                from name in Parse.LetterOrDigit.Or(Parse.Chars('_', '-')).AtLeastOnce().Text().Token().Named("token name")
                from attributes in token_attribute.Many().Named("token attributes")
                from close in token_close
                select new Token(name, attributes);

            Parser <KeyValuePair <string, string> > registered_script_attribute =
                from name in Parse.AnyChar.Except(Parse.WhiteSpace.Or(Parse.Char('=')).Or(Parse.Char('>'))).AtLeastOnce().Text().Token().Named("token attribute name")
                from eq in Parse.Char('=').Token()
                from value in quoted_text.Or(Parse.AnyChar.Except(Parse.WhiteSpace).AtLeastOnce().Text()).Token().Named("token attribute value")
                select new KeyValuePair <string, string>(name, value);

            Parser <string> script_open =
                Parse.String("<script").Text();

            Parser <string> script_close =
                Parse.String("</script>").Text();

            Parser <Literal> script_content_literal =
                from content in Parse.AnyChar.Except(token_open.Or(script_close)).AtLeastOnce().Text()
                select new Literal(content);

            Parser <IContentSegment> script_content =
                ((Parser <IContentSegment>)token)
                .Or(script_content_literal);

            Parser <IContentSegment> registered_script =
                from tagOpen in script_open
                from attributes in registered_script_attribute.Many()
                from tagClose in Parse.Char('>')
                from content in script_content.Many()
                from scriptClose in script_close
                let registered = attributes
                                 .Where(kvp => StringComparer.OrdinalIgnoreCase.Equals(kvp.Key, "aspdnsf-registered"))
                                 .Select(kvp => kvp.Value)
                                 .LastOrDefault()
                                 let bundle = attributes
                                              .Where(kvp => StringComparer.OrdinalIgnoreCase.Equals(kvp.Key, "aspdnsf-registered-bundle"))
                                              .Select(kvp => kvp.Value)
                                              .LastOrDefault()
                                              let name = attributes
                                                         .Where(kvp => StringComparer.OrdinalIgnoreCase.Equals(kvp.Key, "aspdnsf-registered-name"))
                                                         .Select(kvp => kvp.Value)
                                                         .LastOrDefault()
                                                         let dependencies = attributes
                                                                            .Where(kvp => StringComparer.OrdinalIgnoreCase.Equals(kvp.Key, "aspdnsf-registered-dependencies"))
                                                                            .Select(kvp => kvp.Value.Split(','))
                                                                            .LastOrDefault()
                                                                            let source = attributes
                                                                                         .Where(kvp => StringComparer.OrdinalIgnoreCase.Equals(kvp.Key, "src"))
                                                                                         .Select(kvp => kvp.Value)
                                                                                         .LastOrDefault()
                                                                                         let async = attributes
                                                                                                     .Where(kvp => StringComparer.OrdinalIgnoreCase.Equals(kvp.Key, "async"))
                                                                                                     .Select(kvp => StringComparer.OrdinalIgnoreCase.Equals(bool.TrueString, kvp.Value))
                                                                                                     .LastOrDefault()
                                                                                                     where StringComparer.OrdinalIgnoreCase.Equals(registered, bool.TrueString)
                                                                                                     select string.IsNullOrWhiteSpace(source)
                                        ? (IContentSegment) new RegisteredInlineScript(name, new NestedContentSegment(content), dependencies)
                                        : string.IsNullOrWhiteSpace(bundle)
                                                ? (IContentSegment) new RegisteredScriptReference(source, async, dependencies)
                                                : (IContentSegment) new RegisteredBundledScript(bundle, source, dependencies);

            Parser <NestedContentSegment> unregistered_script =
                from tagOpen in script_open
                from content in script_content.Many()
                from tagClose in script_close
                select new NestedContentSegment(new IContentSegment[] { new Literal(tagOpen) }.Concat(content).Concat(new IContentSegment[] { new Literal(tagClose) }));

            Parser <Literal> literal =
                from content in Parse.AnyChar.Except(token_open.Or(script_open)).AtLeastOnce().Text()
                select new Literal(content);

            Parser <IContentSegment> content_segment =
                ((Parser <IContentSegment>)token)
                .Or(registered_script)
                .Or(unregistered_script)
                .Or(literal);

            return(content_segment.Many());
        }
Esempio n. 13
0
        public static Parser <IEnumerable <IProfileEntry> > GetProfile(int fileNumber, string fileName)
        {
            var nameChar = Parse.Char('\\')
                           .Then(_ => Parse.Chars("\\*.}"))
                           .Or(Parse.CharExcept("*.=}")
                               .Except(Parse.LineTerminator));

            var textNameToken = nameChar
                                .AtLeastOnce()
                                .Text()
                                .Select(parsedName =>
                                        (INameToken) new TextNameToken(parsedName));

            var substituteNameToken = Parse.Char('*')
                                      .Return((INameToken) new SubstituteNameToken())
                                      .Named("name substitute");

            var namePart = substituteNameToken
                           .Or(textNameToken)
                           .AtLeastOnce()
                           .Select(tokens => new NamePart(tokens))
                           .Named("name part");

            var qualifiedName = namePart
                                .DelimitedBy(Parse.Char('.'))
                                .Select(parsedName => new QualifiedName(parsedName))
                                .Named("qualified name");

            var textValueToken = Parse.CharExcept("*")
                                 .Except(Parse.LineTerminator)
                                 .Except(Parse.String("${"))
                                 .AtLeastOnce()
                                 .Text()
                                 .Select(text =>
                                         (IValueToken) new TextValueToken(text))
                                 .Named("text value");

            var referenceValueToken = Parse.String("${")
                                      .Then(_ => qualifiedName)
                                      .Then(parsedName => Parse.Char('}')
                                            .Return((IValueToken) new ReferenceValueToken(parsedName)))
                                      .Named("reference");

            var substituteValueToken = Parse.Char('*')
                                       .Return((IValueToken) new SubstituteValueToken())
                                       .Named("* substitute value");

            var value = referenceValueToken
                        .Or(substituteValueToken)
                        .Or(textValueToken)
                        .Many()
                        .Named("value");

            var comment = Parse.Char('#').Token()
                          .Then(_ => Parse.AnyChar
                                .Except(Parse.LineTerminator)
                                .Many()
                                .Text()
                                .Select(parsedComment =>
                                        (IProfileEntry) new Comment(parsedComment)))
                          .Named("comment");

            var payload = from parsedName in qualifiedName
                          from parsedValue in Parse.Char('=').Then(_ => value)
                          select new { parsedName, parsedValue };

            var payloadSpan = payload
                              .Named("payload")
                              .Span()
                              .Select(span =>
                                      (IProfileEntry) new Payload(
                                          span.Value.parsedName,
                                          span.Value.parsedValue,
                                          new SourceMark(fileNumber, fileName, span.Start.Line)));

            return(comment
                   .Or(payloadSpan)
                   .DelimitedBy(Parse.LineTerminator.AtLeastOnce())
                   .Contained(
                       Parse.LineTerminator.Many(),
                       Parse.LineTerminator.Many())
                   .End());
        }
 public Identifier(params char[] allowed)
     : base(Parse.Identifier(Parse.Letter, Parse.LetterOrDigit.XOr(Parse.Chars(allowed))))
 {
 }
Esempio n. 15
0
 private static Parser <char, KeyPath> PKeyPath(ISigningRepository?repo) =>
 (from x in (Parse.Digit.Or(Parse.Chars("/\'h")).XMany()).Text()
  .Then(s => Parse.TryConvert(s, KeyPath.Parse))
  select x).InjectRepository(repo);
Esempio n. 16
0
 private static Parser <string> QuotedIdentifierParse() =>
 from quote in Parse.Char('#')
 from identifier in Parse.Letter.Or(Parse.Chars('_')).AtLeastOnce().Text()
 from quoteEnd in Parse.Char('#')
 select identifier;
Esempio n. 17
0
 private static Parser <IEnumerable <string> > QuotedIdentifierListParse() =>
 (from identifier in QuotedIdentifierParse()
  from separator in Parse.Chars(',', ' ', '\t').Optional()
  select identifier).Many();
Esempio n. 18
0
 private static Parser <Operator> op()
 {
     return(from op in Parse.Chars("+-*/%").Token()
            select Operator.fromSymbol(op));
 }
Esempio n. 19
0
        public static Parser <string> CreatePhraseParser(char startPhraseDelimiter, char endPhraseDelimiter)
        {
            var StartPhraseDelimiter = Parse.Char(startPhraseDelimiter);
            var EndPhraseDelimiter   = Parse.Char(endPhraseDelimiter);
            var PhraseDelimiters     = StartPhraseDelimiter.Or(EndPhraseDelimiter);

            return(Parse.XOr(
                       Parse.AnyChar.Except(PhraseDelimiters).AtLeastOnce().Contained(StartPhraseDelimiter, EndPhraseDelimiter).Named("phrase"),
                       Parse.AnyChar.Except(PhraseDelimiters).Except(Parse.WhiteSpace).Except(Parse.Chars("()")).AtLeastOnce().Named("word")
                       ).Text());
        }