示例#1
0
 public Binding(NodeArgs args, Identifier name, Pattern pattern, IEnumerable<Node> body, params Node[] children)
     : base(args, children)
 {
     Name = name;
     Pattern = pattern;
     Body = body;
 }
示例#2
0
 public Module(NodeArgs args, QualifiedIdentifier name, IEnumerable<Node> body, params Node[] children)
     : base(args, children)
 {
     qualId = name;
     Name = qualId.Identifier;
     Body = body;
 }
示例#3
0
 public Binding(NodeArgs args, Identifier name, Pattern pattern, IEnumerable <Node> body, params Node[] children)
     : base(args, children)
 {
     Name    = name;
     Pattern = pattern;
     Body    = body;
 }
示例#4
0
 public Module(NodeArgs args, QualifiedIdentifier name, IEnumerable <Node> body, params Node[] children)
     : base(args, children)
 {
     qualId = name;
     Name   = qualId.Identifier;
     Body   = body;
 }
示例#5
0
 public QualifiedIdentifier(NodeArgs args, params Node[] children)
     : base(args, children)
 {
     Qualifiers = children
                  .Take(children.Length - 1)
                  .OfType <Identifier>()
                  .ToArray();
     Identifier = (Identifier)children.Last();
 }
示例#6
0
        public Node(NodeArgs args, params Node[] children)
        {
            this.SourceFile = args.SourceFile;
            this.Item = args.Item;
            this.Children = children;

            foreach (var child in this.Children)
                child.Parent = this;
        }
示例#7
0
 public QualifiedIdentifier(NodeArgs args, params Node[] children)
     : base(args, children)
 {
     Qualifiers = children
         .Take(children.Length - 1)
         .OfType<Identifier>()
         .ToArray();
     Identifier = (Identifier)children.Last();
 }
示例#8
0
        public Node(NodeArgs args, params Node[] children)
        {
            this.SourceFile = args.SourceFile;
            this.Item       = args.Item;
            this.Children   = children;

            foreach (var child in this.Children)
            {
                child.Parent = this;
            }
        }
示例#9
0
 public Whitespace(NodeArgs args)
     : base(args)
 {
 }
示例#10
0
 public InlineComment(NodeArgs args)
     : base(args)
 {
 }
示例#11
0
 public EndOfFile(NodeArgs args)
     : base(args)
 {
 }
示例#12
0
 protected Comment(NodeArgs args)
     : base(args)
 {
 }
示例#13
0
 public Source(NodeArgs args, params Node[] children)
     : base(args, children)
 {
 }
示例#14
0
 protected Token(NodeArgs args)
     : base(args)
 {
 }
示例#15
0
 public Punct(NodeArgs args)
     : base(args)
 {
 }
示例#16
0
 protected Comment(NodeArgs args)
     : base(args)
 {
 }
示例#17
0
 public Pattern(NodeArgs args, params Node[] children)
     : base(args, children)
 {
 }
示例#18
0
 public Leaf(NodeArgs args)
     : base(args)
 {
 }
示例#19
0
 public Leaf(NodeArgs args)
     : base(args)
 {
 }
示例#20
0
 public Pattern(NodeArgs args, params Node[] children)
     : base(args, children)
 {
 }
示例#21
0
 public Punct(NodeArgs args)
     : base(args)
 {
 }
示例#22
0
 public InlineComment(NodeArgs args)
     : base(args)
 {
 }
示例#23
0
 public Module(NodeArgs args, Identifier name, IEnumerable<Node> body, params Node[] children)
     : base(args, children)
 {
     Name = name;
     Body = body;
 }
示例#24
0
        protected T Make <T>(SyntaxItem item, object parms, params Syntax.Node[] children)
            where T : Syntax.Node
        {
            var nodeArgs = new Syntax.NodeArgs();

            nodeArgs.SourceFile = this.SourceFile;
            nodeArgs.Item       = item;

            var parmValues = parms != null
                ? parms.GetType().GetProperties().ToDictionary(pi => pi.Name, pi => pi.GetValue(parms))
                : new Dictionary <string, object>();

            var ctors = typeof(T)
                        .GetConstructors()
                        .OrderByDescending(ctor => ctor.GetParameters().Length);

            if (children == null || children.Length == 0)
            {
                children = item.Results.ToArray();
            }

            var arguments = new List <object>();

            foreach (var ctor in ctors)
            {
                bool failed = false;
                foreach (var parm in ctor.GetParameters())
                {
                    object parmValue;

                    if (typeof(Syntax.NodeArgs).IsAssignableFrom(parm.ParameterType))
                    {
                        if (parm.Name != "args")
                        {
                            throw new InternalException(ErrorMessages.E_0001_ParserImpl_MakeNodeArgs);
                        }
                        arguments.Add(nodeArgs);
                    }
                    else if (typeof(Syntax.Node[]).IsAssignableFrom(parm.ParameterType))
                    {
                        if (parm.Name != "children")
                        {
                            throw new InternalException(ErrorMessages.E_0002_ParserImpl_MakeNodeChildren);
                        }
                        arguments.Add(children);
                    }
                    else if (parmValues.TryGetValue(parm.Name, out parmValue))
                    {
                        arguments.Add(parmValue);
                    }
                    else
                    {
                        failed = true;
                        break;
                    }
                }

                if (failed)
                {
                    continue;
                }

                return((T)ctor.Invoke(arguments.ToArray()));
            }

            throw new InternalException(string.Format(ErrorMessages.E_0003_ParserImpl_MakeNodeNoCtor, typeof(T).FullName));
        }
示例#25
0
 public ErrorSection(NodeArgs args, params Node[] children)
     : base(args, children)
 {
 }
示例#26
0
 public Literal(NodeArgs args, object value, Type valueType)
     : base(args)
 {
     this.Value = value;
     this.ValueType = valueType;
 }
示例#27
0
 public EndOfFile(NodeArgs args)
     : base(args)
 {
 }
示例#28
0
 public Directive(NodeArgs args, params Node[] children)
     : base(args, children)
 {
 }
示例#29
0
 public Literal(NodeArgs args, object value, Type valueType)
     : base(args)
 {
     this.Value     = value;
     this.ValueType = valueType;
 }
示例#30
0
 public EndComment(NodeArgs args)
     : base(args)
 {
 }
示例#31
0
 public Identifier(NodeArgs args)
     : base(args)
 {
 }
示例#32
0
 public EndOfLine(NodeArgs args)
     : base(args)
 {
 }
示例#33
0
 public EndOfLine(NodeArgs args)
     : base(args)
 {
 }
示例#34
0
 protected Space(NodeArgs args)
     : base(args)
 {
 }
示例#35
0
 public Source(NodeArgs args, params Node[] children)
     : base(args, children)
 {
 }
示例#36
0
 protected Token(NodeArgs args)
     : base(args)
 {
 }
示例#37
0
 public Whitespace(NodeArgs args)
     : base(args)
 {
 }
示例#38
0
 public Keyword(NodeArgs args)
     : base(args)
 {
 }
示例#39
0
 public EndComment(NodeArgs args)
     : base(args)
 {
 }
示例#40
0
 public Module(NodeArgs args, Identifier name, IEnumerable <Node> body, params Node[] children)
     : base(args, children)
 {
     Name = name;
     Body = body;
 }
示例#41
0
 public Identifier(NodeArgs args)
     : base(args)
 {
 }
示例#42
0
 public Directive(NodeArgs args, params Node[] children)
     : base(args, children)
 {
 }
示例#43
0
 public Keyword(NodeArgs args)
     : base(args)
 {
 }
示例#44
0
 public ErrorSection(NodeArgs args, params Node[] children)
     : base(args, children)
 {
 }
示例#45
0
 protected Space(NodeArgs args)
     : base(args)
 {
 }