Beispiel #1
0
        public GraphBlock BuildIf(JToken node, GraphBlock current)
        {
            var id = current.Id;

            current.AddNode(node);

            var body = CreateBlockAfter(current, $"{id}:if_body");

            body = Build(node["body"], body);

            if (node["orelse"].Count() == 0)
            {
                var array = (JArray)node["orelse"];
                array.Add(JToken.Parse("{ \"_Name\": \"Pass\" }"));
            }

            var orelse = CreateBlockAfter(current, $"{id}:if_orelse");

            orelse = Build(node["orelse"], orelse);

            var exit = new GraphBlock($"{id}:if_exit");

            body.ConnectTo(exit);
            orelse.ConnectTo(exit);

            return(exit);
        }
Beispiel #2
0
        public GraphBlock BuildCall(JToken node, GraphBlock current)
        {
            current.AddNode(node);

            foreach (var e in _exceptionHandlers.Last())
            {
                current.ConnectTo(e);
            }

            return(CreateBlockAfter(current, "next_to_call"));
        }
Beispiel #3
0
        public GraphBlock BuildRaise(JToken node, GraphBlock current)
        {
            current.AddNode(node);
            foreach (var e in _exceptionHandlers.Last())
            {
                current.ConnectTo(e);
            }

            current.Exited = true;

            return(current);
        }
Beispiel #4
0
        private GraphBlock Build(JToken nodes, GraphBlock current)
        {
            foreach (var n in nodes)
            {
                if (n.Type != JTokenType.Object)
                {
                    throw new ArgumentException("Attempt to add non-object node");
                }

                var name = ObjectNameOf(n);
                switch (name)
                {
                case "For": current = BuildFor(n, current); break;

                case "While": current = BuildWhile(n, current); break;

                case "If": current = BuildIf(n, current); break;

                case "Raise": current = BuildRaise(n, current); break;

                case "Try": current = BuildTry(n, current); break;

                case "Break": current = BuildBreak(n, current); break;

                case "Continue": current = BuildContinue(n, current); break;

                case "Call": current = BuildCall(n, current); break;

                default:
                    current.AddNode(n);
                    break;
                }

                if (current.Exited)
                {
                    break;
                }
            }

            return(current);
        }
Beispiel #5
0
 public GraphBlock BuildContinue(JToken node, GraphBlock current)
 {
     current.AddNode(node);
     Exit(_loopEntries.Last());
     return(null);
 }
Beispiel #6
0
 public GraphBlock BuildBreak(JToken node, GraphBlock current)
 {
     current.AddNode(node);
     Exit(_loopExits.Last());
     return(null);
 }