def main(argv): welcome() grammar_file = argv.grammar_file file_type = argv.type code_file = argv.output lex_file = argv.lexical analyzer = argv.analyzer language = argv.code ebnf_mode = argv.mode conflict_report = argv.report force_generate = argv.force lex = None if code_file is not None: fp = open(code_file, "w") end_string = "" else: fp = sys.stdout end_string = "\n\n" try: if file_type == "bnf": print("[Generate grammar analyzer code]") print("Parse grammar file...", end="") start_time = time.time() global_start_time = start_time data_package = bs_grammar_analysis(grammar_file) sentence_set = data_package["sentence set"] end_time = time.time() print("Done [%fs]" % ((end_time - start_time) / 1000)) if lex_file is not None: print("Parse lexical file...", end="") start_time = time.time() lex = BosonLexicalAnalyzer(lex_file) print("Done [%fs]" % ((end_time - start_time) / 1000)) print("Generate %s grammar analysis table..." % analyzer.upper(), end="") start_time = time.time() analyzer_table = grammar_generate_table[analyzer](sentence_set, conflict_report, force_generate) end_time = time.time() print("Done [%fs]" % ((end_time - start_time) / 1000)) print("Generate analyzer %s code..." % language.upper(), end=end_string) start_time = time.time() code_generator[language](analyzer_table, data_package, lex=lex, output=fp) end_time = time.time() print(end_string + "Done [%fs]" % ((end_time - start_time) / 1000)) if code_file is not None: fp.close() global_end_time = time.time() print("Complete!!! [%fs]" % ((global_end_time - global_start_time) / 1000)) elif file_type == "ebnf": if ebnf_mode == "translate": print("[Translate EBNF to BNF]") print("Parse grammar file and translate...", end=end_string) start_time = time.time() global_start_time = start_time bs_ebnf_to_bnf(grammar_file, output=fp) end_time = time.time() if code_file is not None: fp.close() print(end_string + "Done [%fs]" % ((end_time - start_time) / 1000)) global_end_time = time.time() print("Complete!!! [%fs]" % ((global_end_time - global_start_time) / 1000)) elif ebnf_mode == "compile": print("[Generate grammar analyzer code]") print("Parse grammar file...", end="") start_time = time.time() global_start_time = start_time sentence_set = bs_ebnf_to_sentence_set(grammar_file) end_time = time.time() print("Done [%fs]" % ((end_time - start_time) / 1000)) print("Generate %s grammar analysis table..." % analyzer.upper(), end="") start_time = time.time() analyzer_table = grammar_generate_table[analyzer](sentence_set, conflict_report, force_generate) end_time = time.time() print("Done [%fs]" % ((end_time - start_time) / 1000)) print("Generate analyzer %s code..." % language.upper(), end=end_string) start_time = time.time() reduce_code = {} for sentence in sentence_set: reduce_code[tuple(sentence)] = None data_package = { "sentence set": sentence_set, "reduce code": reduce_code, "command list": [], "section": {}, "literal map": {}, "literal reverse map": {}, } code_generator[language](analyzer_table, data_package, lex=lex, output=fp) end_time = time.time() print(end_string + "Done [%fs]" % ((end_time - start_time) / 1000)) if code_file is not None: fp.close() global_end_time = time.time() print("Complete!!! [%fs]" % ((global_end_time - global_start_time) / 1000)) else: raise Exception("Invalid ebnf mode: %s" % ebnf_mode) else: raise Exception("Invalid file type: %s" % file_type) except Exception as e: print(e) if code_file is not None: fp.close() if os.path.exists(code_file): os.remove(code_file)
reduce_code = data_package["reduce code"] command_list = data_package["command list"] literal = (data_package["literal map"], data_package["literal reverse map"]) slr_tables = bs_slr_generate_table(sentence_set) bs_generate_python_code(slr_tables, data_package, lex=lex) token_list = bs_token_list("test/not_slr_grammar.txt") data_package = bs_grammar_analyzer(token_list) sentence_set = data_package["sentence set"] reduce_code = data_package["reduce code"] command_list = data_package["command list"] literal = (data_package["literal map"], data_package["literal reverse map"]) lr_tables = bs_lr_generate_table(sentence_set) bs_generate_python_code(lr_tables, data_package, lex=lex) token_list = bs_token_list("test/not_slr_grammar.txt") data_package = bs_grammar_analyzer(token_list) sentence_set = data_package["sentence set"] reduce_code = data_package["reduce code"] command_list = data_package["command list"] literal = (data_package["literal map"], data_package["literal reverse map"]) lalr_tables = bs_lalr_generate_table(sentence_set) bs_generate_python_code(lalr_tables, data_package, lex=lex) token_list = bs_token_list("test/literal_grammar.txt") data_package = bs_grammar_analyzer(token_list) sentence_set = data_package["sentence set"] reduce_code = data_package["reduce code"] command_list = data_package["command list"] literal = (data_package["literal map"], data_package["literal reverse map"]) lalr_tables = bs_lalr_generate_table(sentence_set) bs_generate_python_code(lalr_tables, data_package, lex=lex) bs_ebnf_to_bnf("test/ebnf.txt")