Esempio n. 1
0
        private JsonValue PropertyReducer(IRule rule, INodeContext <JsonValue> page)
        {
            var name  = page.Get("name").Single <JsonPrimitive>().Text;
            var value = page.Get("value").Single();

            return(new JsonProperty(name, value));
        }
Esempio n. 2
0
        private Node ChainLink(IRule rule, INodeContext <Node> page)
        {
            var op    = page.Get("op").Single <TokenNode>();
            var value = page.Get("value").Single();

            return(new BinaryChainLink(op, value));
        }
Esempio n. 3
0
        private Node Chain(IRule rule, INodeContext <Node> page)
        {
            var head = page.Get("head").Single();
            var body = page.Get("body").Single <CollectionNode>();

            return(new BinaryChain(head, body.Nodes.OfType <BinaryChainLink>()));
        }
Esempio n. 4
0
        public INode Reduce(IRule rule, INodeContext <INode> page)
        {
            var name       = page.Get("name").Single <Value>().Text;
            var definition = page.Get("rule").Single <ProtoRule>();

            definition.RuleName = name;

            RefNamePropagation(definition);

            return(definition);
        }
Esempio n. 5
0
        public INode Reduce(IRule rule, INodeContext <INode> page)
        {
            var hasSeparator = page.Get("sep").Optional() != null;
            var min          = int.Parse(page.Get("min").Single <Value>().Text);
            var max          = int.Parse(page.Get("max").Optional <Value>()?.Text ?? "-1");

            if (!hasSeparator)
            {
                max = min;
            }
            return(new Ast.Range(min, max));
        }
Esempio n. 6
0
 public INode Reduce(IRule rule, INodeContext <INode> page)
 {
     if (page.Count > 1)
     {
         var atom = page.Get("atom").Single <ProtoRule>();
         var name = page.Get("name").Of <Value>().Select(v => v.Text).StrJoin(string.Empty);
         atom.RefName = name.Substring(1);
         return(atom);
     }
     else
     {
         return(page.Get(0));
     }
 }
Esempio n. 7
0
        public INode Reduce(IRule rule, INodeContext <INode> page)
        {
            var node = page.Get(0);

            if (node is Ast.Range)
            {
                return(node);
            }

            var special = ((Value)node).Text;

            switch (special)
            {
            case "*":
                return(new Ast.Range(0, -1));

            case "+":
                return(new Ast.Range(1, -1));

            case "?":
                return(new Ast.Range(0, 1));

            default:
                throw new InvalidOperationException();
            }
        }
Esempio n. 8
0
        public INode Reduce(IRule rule, INodeContext <INode> page)
        {
            var ruleName = ((Value)page.Get(0)).Text;
            var result   = new ProtoRule("Ref", rule => rule.Ref(ruleName));

            result.RuleName = ruleName;
            return(result);
        }
Esempio n. 9
0
        public INode Reduce(IRule rule, INodeContext <INode> page)
        {
            var prefix = page.Get("prefix").Optional <Value>()?.Text;
            var range  = page.Get("suffix").Optional <Ast.Range>();
            var atom   = page.Get("atom").Single <ProtoRule>();
            var result = atom;

            if (range != null)
            {
                result = new ProtoRule(nameof(Repeat), rule => new Repeat(rule.RuleName, rule.Single(), range.Min, range.Max));
                result.Children.Add(atom);
                atom = result;
            }

            if (prefix != null)
            {
                result = _prefixMap[prefix]();
                result.Children.Add(atom);
            }

            return(result);
        }
Esempio n. 10
0
        public INode Reduce(IRule rule, INodeContext <INode> page)
        {
            // sequence with a single item => no sequence needed
            if (page.Count == 1)
            {
                return(page.Get(0));
            }

            var result = new ProtoRule(nameof(Core.Rules.Sequence), rule => new Core.Rules.Sequence(rule.RuleName, rule.All()));

            result.AddChildren(page.GetAll().Of <ProtoRule>());

            return(result);
        }
Esempio n. 11
0
        public INode Reduce(IRule rule, INodeContext <INode> page)
        {
            // choice with a single item => no choice needed
            if (page.Count == 1)
            {
                return(page.Get(0));
            }

            var result = new ProtoRule(nameof(Core.Rules.Choice), rule => new Core.Rules.Choice(rule.RuleName, rule.All()));

            // filter out the "|" values
            result.AddChildren(page.GetAll().Of <ProtoRule>());

            return(result);
        }
Esempio n. 12
0
 public static NodeContextValue <TNode> GetLift <TNode>(this INodeContext <TNode> context)
 {
     return(context.Get(IRuleRef.LiftRefName));
 }
Esempio n. 13
0
        public INode Reduce(IRule rule, INodeContext <INode> page)
        {
            var value = ((Value)page.Get(0)).Text ?? "''";

            return(new ProtoRule(nameof(TerminalLiteral), rule => new Core.Rules.Terminal(rule.RuleName, new TokenValueMatcher(value.Substring(1, value.Length - 2)))));
        }
Esempio n. 14
0
 private IEnumerable <JsonValue> PropertiesReducer(IRule rule, INodeContext <JsonValue> page)
 {
     return(page.Get("props").As <JsonProperty>());
 }
Esempio n. 15
0
 private JsonValue ArrayReducer(IRule rule, INodeContext <JsonValue> page)
 {
     return(new JsonArray(page.Get("values").ToList()));
 }
Esempio n. 16
0
 private JsonValue ObjectReducer(IRule rule, INodeContext <JsonValue> page)
 {
     return(new JsonObject(page.Get("props").As <JsonProperty>().ToList()));
 }
Esempio n. 17
0
        public INode Reduce(IRule rule, INodeContext <INode> page)
        {
            var type = page.Get("type").Single <Value>().Text ?? string.Empty;

            return(new ProtoRule(nameof(TerminalType), rule => new Core.Rules.Terminal(rule.RuleName, type)));
        }