Ejemplo n.º 1
0
    def test_lookup_reference(self):
        grammar = """
X ::= item {#0.x}
    ;

item ::= "a" {Var(x=#0)}
       | "b" {Var(x=#0)}
        ;

%%

a:"a"
b:"b"
comma:","

"""
        bootstrap = BootstrapParser(lr_type=1, whitespaces=False)
        bootstrap.parse(grammar)
        self.treemanager = TreeManager()
        self.treemanager.add_parser(bootstrap.incparser, bootstrap.inclexer,
                                    "")
        self.treemanager.set_font_test(7, 17)
        self.treemanager.key_normal("a")
        assert bootstrap.incparser.last_status == True

        # test ast generation
        root = bootstrap.incparser.previous_version.parent
        assert root.symbol.name == "Root"
        assert root.children[1].symbol.name == "X"
        E = root.children[1]
        assert E.alternate.symbol.name == "a"
Ejemplo n.º 2
0
    def loadFromJson(self, filename):
        manager = JsonManager()
        language_boxes = manager.load(filename)

        self.tm = TreeManager()

        self.tm.load_file(language_boxes)
        self.reset()
Ejemplo n.º 3
0
    def random_insertion(self):
        """Insert random characters at random locations within a program."""
        print "Running random_insert on {}".format(self.filename)
        self.reset()

        self.treemanager.import_file(self.program)
        assert self.parser.last_status == True

        self.text_compare(self.program)

        line_count = len(self.treemanager.lines)
        random_lines = range(line_count)
        random.shuffle(random_lines)

        start_version = self.treemanager.version
        for linenr in random_lines:
            cols = range(20)
            random.shuffle(cols)
            for col in cols:
                self.log.append("self.treemanager.cursor_reset()")
                self.log.append("self.move(DOWN, %s)" % linenr)
                self.log.append("self.move(RIGHT, %s)" % col)
                self.treemanager.cursor_reset()
                self.move(DOWN, linenr)
                self.move(RIGHT, col)
                k = self.get_random_key()
                self.log.append("self.treemanager.key_normal(%s)" % repr(k))
                x = self.treemanager.key_normal(k)
                if x == "eos":
                    continue
            self.log.append("self.treemanager.undo_snapshot()")
            self.treemanager.undo_snapshot()

        end_version = self.treemanager.version
        broken = self.treemanager.export_as_text()

        # undo all and compare with original
        while self.treemanager.version > start_version:
            self.treemanager.key_ctrl_z()
        self.text_compare(self.program)

        # redo all and compare with broken
        while self.treemanager.version < end_version:
            self.treemanager.key_shift_ctrl_z()
        self.text_compare(broken)

        # undo again and compare with original
        while self.treemanager.version > start_version:
            self.treemanager.key_ctrl_z()
        self.text_compare(self.program)

        t1 = TreeManager()
        parser, lexer = self.lang.load()
        t1.add_parser(parser, lexer, self.lang.name)
        t1.import_file(self.program)

        self.tree_compare(self.parser.previous_version.parent,
                          parser.previous_version.parent)
    def find_expressions(self, program, expr):
        parser, lexer = self.sub.load()
        treemanager = TreeManager()
        treemanager.add_parser(parser, lexer, self.sub.name)
        treemanager.import_file(program)

        # find all sub expressions
        l = self.find_nonterms_by_name(treemanager, expr)
        return [subtree_to_text(st).rstrip() for st in l]
 def reset(self):
     self.parser.reset()
     self.ast = self.parser.previous_version
     self.treemanager = TreeManager()
     self.treemanager.add_parser(self.parser, self.lexer, self.langname)
     self.treemanager.import_file(self.content)
     self.treemanager.option_autolbox_insert = True
     self.mainexprs = self.find_nonterms_by_name(self.treemanager,
                                                 self.main_repl_str)
Ejemplo n.º 6
0
    def setup_class(cls):
        parser, lexer = python.load()
        cls.lexer = lexer
        cls.parser = parser
        cls.parser.init_ast()
        cls.ast = cls.parser.previous_version
        cls.treemanager = TreeManager()
        cls.treemanager.add_parser(cls.parser, cls.lexer, python.name)

        cls.treemanager.set_font_test(7, 17) # hard coded. PyQt segfaults in test suite
Ejemplo n.º 7
0
    def setup_class(cls):
        grm = EcoFile("MultiTest", "test/calcmultistring.eco", "Multi")
        parser, lexer = grm.load()
        cls.lexer = lexer
        cls.parser = parser
        cls.parser.init_ast()
        cls.ast = cls.parser.previous_version
        cls.treemanager = TreeManager()
        cls.treemanager.add_parser(cls.parser, cls.lexer, calc.name)

        cls.treemanager.set_font_test(7, 17) # hard coded. PyQt segfaults in test suite
Ejemplo n.º 8
0
    def __init__(self, main, sub):
        parser, lexer = main.load()
        self.lexer = lexer
        self.parser = parser
        self.ast = parser.previous_version
        self.treemanager = TreeManager()
        self.treemanager.add_parser(parser, lexer, main.name)

        parser.setup_autolbox(main.name)
        self.sub = sub

        self.inserted = 0
Ejemplo n.º 9
0
 def test_bootstrapping1(self):
     bootstrap = BootstrapParser(lr_type=1, whitespaces=False)
     test_grammar = 'S ::= "abc"; %% abc:\"abc\"'
     bootstrap.parse(test_grammar)
     self.treemanager = TreeManager()
     self.treemanager.add_parser(bootstrap.incparser, bootstrap.inclexer,
                                 "")
     self.treemanager.set_font_test(7, 17)
     self.treemanager.key_normal("a")
     assert bootstrap.incparser.last_status == False
     self.treemanager.key_normal("b")
     assert bootstrap.incparser.last_status == False
     self.treemanager.key_normal("c")
     assert bootstrap.incparser.last_status == True
Ejemplo n.º 10
0
def find_subtree(grammar, program, cond):
    parser, lexer = grammar.load()
    treemanager = TreeManager()
    treemanager.add_parser(parser, lexer, grammar.name)
    try:
        treemanager.import_file(program)
    except Exception:
        return None
    if parser.last_status is False:
        return None

    # find all sub expressions
    l = find_nonterms_by_name(treemanager, cond)
    return [subtree_to_text(st).rstrip() for st in l]
Ejemplo n.º 11
0
    def test_calculator(self):
        calc = """
            E ::= T             {#0}
                | E "plus" T    {Plus(arg1=#0,arg2=#2)}
                ;
            T ::= P             {#0}
                | T "mul" P     {Mul(arg1=#0,arg2=#2)}
                ;
            P ::= "INT"         {#0}
                ;
        %%

            INT:"[0-9]+"
            plus:"\+"
            mul:"\*"
            <ws>:"[ \\t]+"
            <return>:"[\\n\\r]"
        """
        bootstrap = BootstrapParser(lr_type=1, whitespaces=False)
        bootstrap.parse(calc)
        self.treemanager = TreeManager()
        self.treemanager.add_parser(bootstrap.incparser, bootstrap.inclexer,
                                    "")
        self.treemanager.set_font_test(7, 17)
        self.treemanager.key_normal("1")
        assert bootstrap.incparser.last_status == True
        self.treemanager.key_normal("+")
        assert bootstrap.incparser.last_status == False
        self.treemanager.key_normal("2")
        assert bootstrap.incparser.last_status == True
        self.treemanager.key_normal("*")
        assert bootstrap.incparser.last_status == False
        self.treemanager.key_normal("3")
        assert bootstrap.incparser.last_status == True

        # test ast generation
        root = bootstrap.incparser.previous_version.parent
        assert root.symbol.name == "Root"
        assert root.children[1].symbol.name == "E"
        E = root.children[1]
        assert isinstance(E.alternate, AstNode)
        assert E.alternate.name == "Plus"
        plus = E.alternate
        assert plus.children['arg1'].symbol.name == "1"
        mul = plus.children['arg2']
        assert isinstance(mul, AstNode)
        assert mul.name == "Mul"
        assert mul.children['arg1'].symbol.name == "2"
        assert mul.children['arg2'].symbol.name == "3"
Ejemplo n.º 12
0
def run(filename):
    # Load grammar
    parser, lexer = java.load()
    treemanager = TreeManager()
    treemanager.add_parser(parser, lexer, "")

    # Load file
    print("Running", filename)
    with open(filename, "r") as f:
        treemanager.import_file(f.read())

    if not parser.last_status:
        print("Couldn't parse file. Skip.")
        return

    filesize = os.path.getsize(filename)

    timings = []

    # Insert `1+` after every `=`
    node = treemanager.get_bos()
    while type(node) is not EOS:
        if node.symbol.name == "=":
            node.insert("1+", len(node.symbol.name))
            node.mark_changed()
            treemanager.relex(node)
            treemanager.post_keypress("")
            treemanager.save_current_version()
            parser.prev_version = treemanager.version
            parser.reference_version = treemanager.reference_version
            start = time()
            parser.inc_parse()
            end = time()
            parser.top_down_reuse()
            treemanager.save_current_version(
                postparse=True)  # save post parse tree
            if parser.last_status:
                treemanager.reference_version = treemanager.version
            TreeManager.version = treemanager.version

            if not parser.last_status:
                break
            timings.append(str(end - start))
        node = node.next_term

    if len(timings) > 0:
        with open("results.csv", "a+") as f:
            f.write("{} {} {}".format(filename, filesize, ",".join(timings)))
            f.write("\n")
Ejemplo n.º 13
0
 def parse(self, ecogrammar):
     # this is only called for grammars based on Eco Grammar (not Eco Grammar (Eco))
     from grammars.eco_grammar import eco_grammar as grammar
     self.lexer = IncrementalLexer(grammar.priorities)
     self.parser = IncParser(grammar.grammar, 1, True)
     self.parser.init_ast()
     self.ast = self.parser.previous_version.parent
     self.treemanager = TreeManager()
     self.treemanager.add_parser(self.parser, self.lexer, grammar.name)
     self.treemanager.import_file(ecogrammar)
     if self.parser.last_status == False:
         raise Exception("Invalid input grammar due to syntax errors")
     self.read_options()
     self.parse_both()
     self.create_parser()
     self.create_lexer()
Ejemplo n.º 14
0
    def __init__(self, lang, program, test):
        grm = lang_dict[language]
        parser, lexer = grm.load()
        parser.init_ast()
        self.parser = parser
        self.lexer = lexer
        self.grm = grm
        self.treemanager = TreeManager()
        self.treemanager.add_parser(parser, lexer, grm.name)
        self.treemanager.version = 1
        self.treemanager.last_saved_version = 1

        self.program = program
        self.test = test
        self.pos = 0
        self.lastexception = None
Ejemplo n.º 15
0
    def test_foreach(self):
        grammar = """
X ::= items {foreach(#0) Field(b=item.x)}
    ;

items ::= items "comma" item    {#0 + [#2]}
        | item                  {[#0]}
        ;

item ::= "a" {Var(x=#0)}
       | "b" {Var(x=#0)}
        ;

%%

a:"a"
b:"b"
comma:","

"""
        bootstrap = BootstrapParser(lr_type=1, whitespaces=False)
        bootstrap.parse(grammar)
        self.treemanager = TreeManager()
        self.treemanager.add_parser(bootstrap.incparser, bootstrap.inclexer,
                                    "")
        self.treemanager.set_font_test(7, 17)
        self.treemanager.key_normal("a")
        assert bootstrap.incparser.last_status == True
        self.treemanager.key_normal(",")
        assert bootstrap.incparser.last_status == False
        self.treemanager.key_normal("b")
        assert bootstrap.incparser.last_status == True

        # test ast generation
        root = bootstrap.incparser.previous_version.parent
        assert root.symbol.name == "Root"
        assert root.children[1].symbol.name == "X"
        E = root.children[1]
        assert isinstance(E.alternate, ListNode)
        assert isinstance(E.alternate.children[0], AstNode)
        assert isinstance(E.alternate.children[1], AstNode)
        assert E.alternate.children[0].name == "Field"
        assert E.alternate.children[1].name == "Field"
        assert E.alternate.children[0].children['b'].symbol.name == "a"
        assert E.alternate.children[1].children['b'].symbol.name == "b"
Ejemplo n.º 16
0
 def reset(self):
     self.parser.reset()
     self.treemanager = TreeManager()
     self.treemanager.add_parser(self.parser, self.lexer, self.grm)
Ejemplo n.º 17
0
    def random_insertdelete(self):
        """Insert and delete random characters at random locations within a
        program."""
        print "Running random_insertdelete on {}".format(self.filename)
        self.reset()

        self.treemanager.import_file(self.program)
        assert self.parser.last_status == True

        self.text_compare(self.program)

        line_count = len(self.treemanager.lines)
        random_lines = range(line_count)
        random.shuffle(random_lines)
        random_lines = random_lines[:
                                    20]  # restrict to 20 lines to reduce runtime

        start_version = self.treemanager.version
        for linenr in random_lines:
            cols = range(20)
            random.shuffle(cols)
            for col in cols:
                self.log.append("self.treemanager.cursor_reset()")
                self.log.append("self.move(%s, %s)" % (DOWN, linenr))
                self.log.append("self.move(%s, %s)" % (RIGHT, col))
                self.treemanager.cursor_reset()
                self.move(DOWN, linenr)
                self.move(RIGHT, col)
                k = self.get_random_key()
                if k in [
                        "a", "c", "e", "g", "i", "k", "m", "1", "3", "5", "7"
                ]:
                    # for a few characters DELETE instead of INSERT
                    self.log.append("self.treemanager.key_delete()")
                    x = self.treemanager.key_delete()
                else:
                    rk = self.get_random_key()
                    self.log.append("self.treemanager.key_normal(%s)" % rk)
                    x = self.treemanager.key_normal(rk)
                if x == "eos":
                    continue
            self.log.append("self.treemanager.undo_snapshot()")
            self.treemanager.undo_snapshot()

        end_version = self.treemanager.version
        broken = self.treemanager.export_as_text()

        # undo all and compare with original
        while self.treemanager.version > start_version:
            self.treemanager.key_ctrl_z()
        self.text_compare(self.program)

        # redo all and compare with broken
        while self.treemanager.version < end_version:
            self.treemanager.key_shift_ctrl_z()
        self.text_compare(broken)

        # undo again and compare with original
        while self.treemanager.version > start_version:
            self.treemanager.key_ctrl_z()
        self.text_compare(self.program)

        t1 = TreeManager()
        parser, lexer = self.lang.load()
        t1.add_parser(parser, lexer, self.lang.name)
        t1.import_file(self.program)

        self.tree_compare(self.parser.previous_version.parent,
                          parser.previous_version.parent)
Ejemplo n.º 18
0
 def setlang(self, lang):
     self.lang = lang_dict[lang]
     self.parser, self.lexer = lang_dict[lang].load()
     self.treemanager = TreeManager()
     self.treemanager.add_parser(self.parser, self.lexer, self.lang.name)
Ejemplo n.º 19
0
 def reset(self):
     self.parser.reset()
     self.treemanager = TreeManager()
     self.treemanager.add_parser(self.parser, self.lexer, calc.name)
     self.treemanager.set_font_test(7, 17)
Ejemplo n.º 20
0
    def random_deletion(self):
        """Delete random characters within a program."""
        print "Running random_deletion on {}".format(self.filename)
        program = self.program

        self.treemanager.import_file(program)
        assert self.parser.last_status == True

        self.text_compare(program)

        line_count = len(self.treemanager.lines)
        random_lines = range(line_count)
        random.shuffle(random_lines)
        random_lines = random_lines[:
                                    20]  # restrict to 20 lines to reduce runtime

        start_version = self.treemanager.version
        for linenr in random_lines:
            cols = range(20)
            random.shuffle(cols)
            for col in cols:
                self.treemanager.cursor_reset()
                self.log.append("self.treemanager.cursor_reset()")
                self.move(DOWN, linenr)
                self.log.append("self.move(DOWN, %s)" % linenr)
                self.move(RIGHT, col)
                self.log.append("self.move(RIGHT, %s)" % col)
                self.log.append("self.treemanager.key_delete()")
                x = self.treemanager.key_delete()
                if x == "eos":
                    continue
            self.treemanager.undo_snapshot()
            self.log.append("self.treemanager.undo_snapshot()")

        end_version = self.treemanager.version
        broken = self.treemanager.export_as_text()

        # undo all and compare with original
        while self.treemanager.version > start_version:
            self.treemanager.key_ctrl_z()
        self.text_compare(program)

        # redo all and compare with broken
        while self.treemanager.version < end_version:
            self.treemanager.key_shift_ctrl_z()
        self.text_compare(broken)

        # undo again and compare with original
        while self.treemanager.version > start_version:
            self.treemanager.key_ctrl_z()
        self.text_compare(program)

        t1 = TreeManager()
        parser, lexer = self.lang.load()
        parser.init_ast()
        t1.add_parser(parser, lexer, self.lang.name)
        t1.set_font_test(7, 17)
        t1.import_file(self.program)

        assert self.parser.last_status == True
        assert parser.last_status == True

        self.tree_compare(self.parser.previous_version.parent,
                          parser.previous_version.parent)
Ejemplo n.º 21
0
 def set_mainlanguage(self, parser, lexer, lang_name):
     self.tm = TreeManager()
     self.tm.add_parser(parser, lexer, lang_name)