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"
def loadFromJson(self, filename): manager = JsonManager() language_boxes = manager.load(filename) self.tm = TreeManager() self.tm.load_file(language_boxes) self.reset()
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)
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
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
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
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
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]
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"
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")
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()
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
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"
def reset(self): self.parser.reset() self.treemanager = TreeManager() self.treemanager.add_parser(self.parser, self.lexer, self.grm)
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)
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)
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)
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)
def set_mainlanguage(self, parser, lexer, lang_name): self.tm = TreeManager() self.tm.add_parser(parser, lexer, lang_name)