Пример #1
0
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)
Пример #2
0
    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")