Example #1
0
        public IEnumerable <string> Generate(string before, string after)
        {
            var result = new List <string>();

            //parse code
            var beforeAst = Parse(before);
            var afterAast = Parse(after);

            //run tree edit distance
            var zss          = new PythonZss(beforeAst, afterAast);
            var editDistance = zss.Compute();

            //get primary edits
            var rootAndNonRootEdits = WitnessFunctions.SplitEditsByRootsAndNonRoots(editDistance);
            //replace insert and delete by update
            var unparser = new Unparser();

            foreach (var edit in rootAndNonRootEdits.Item1)
            {
                if (edit is Update)
                {
                    result.Add("Update " + unparser.Unparse(edit.TargetNode) + " to " + unparser.Unparse(edit.ModifiedNode));
                }
                else if (edit is Insert)
                {
                    result.Add("Insert " + unparser.Unparse(edit.ModifiedNode));
                }
            }
            //for each edit, create a hint
            return(result);
        }
Example #2
0
        public static ExampleSpec WitnessPatch(GrammarRule rule, int parameter,
                                               ExampleSpec spec)
        {
            var examples = new Dictionary <State, object>();

            foreach (State input in spec.ProvidedInputs)
            {
                var before = (PythonNode)input[rule.Body[0]];
                var after  = (PythonNode)spec.Examples[input];

                var zss          = new PythonZss(before, after);
                var editDistance = zss.Compute();

                var rootAndNonRootEdits = SplitEditsByRootsAndNonRoots(editDistance);
                var edits = ExtractPrimaryEdits(rootAndNonRootEdits, editDistance);

                //todo fix some big examples that are not working
                //if (edits.Count > 18)
                //    return null;

                var patch = new Patch();
                edits.ForEach(e => patch.EditSets.Add(new List <Edit>()
                {
                    e
                }));
                examples[input] = patch;
            }
            return(new ExampleSpec(examples));
        }