17db96d56Sopenharmony_ci"""Generate Lib/keyword.py from the Grammar and Tokens files using pgen"""
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ciimport argparse
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_cifrom .build import build_parser, generate_token_definitions
67db96d56Sopenharmony_cifrom .c_generator import CParserGenerator
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_ciTEMPLATE = r'''
97db96d56Sopenharmony_ci"""Keywords (from "Grammar/python.gram")
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ciThis file is automatically generated; please don't muck it up!
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ciTo update the symbols in this file, 'cd' to the top directory of
147db96d56Sopenharmony_cithe python source tree and run:
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ci    PYTHONPATH=Tools/peg_generator python3 -m pegen.keywordgen \
177db96d56Sopenharmony_ci        Grammar/python.gram \
187db96d56Sopenharmony_ci        Grammar/Tokens \
197db96d56Sopenharmony_ci        Lib/keyword.py
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ciAlternatively, you can run 'make regen-keyword'.
227db96d56Sopenharmony_ci"""
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ci__all__ = ["iskeyword", "issoftkeyword", "kwlist", "softkwlist"]
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_cikwlist = [
277db96d56Sopenharmony_ci{keywords}
287db96d56Sopenharmony_ci]
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_cisoftkwlist = [
317db96d56Sopenharmony_ci{soft_keywords}
327db96d56Sopenharmony_ci]
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_ciiskeyword = frozenset(kwlist).__contains__
357db96d56Sopenharmony_ciissoftkeyword = frozenset(softkwlist).__contains__
367db96d56Sopenharmony_ci'''.lstrip()
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_ciEXTRA_KEYWORDS = ["async", "await"]
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci
417db96d56Sopenharmony_cidef main() -> None:
427db96d56Sopenharmony_ci    parser = argparse.ArgumentParser(
437db96d56Sopenharmony_ci        description="Generate the Lib/keywords.py file from the grammar."
447db96d56Sopenharmony_ci    )
457db96d56Sopenharmony_ci    parser.add_argument(
467db96d56Sopenharmony_ci        "grammar", type=str, help="The file with the grammar definition in PEG format"
477db96d56Sopenharmony_ci    )
487db96d56Sopenharmony_ci    parser.add_argument(
497db96d56Sopenharmony_ci        "tokens_file", type=argparse.FileType("r"), help="The file with the token definitions"
507db96d56Sopenharmony_ci    )
517db96d56Sopenharmony_ci    parser.add_argument(
527db96d56Sopenharmony_ci        "keyword_file",
537db96d56Sopenharmony_ci        type=argparse.FileType("w"),
547db96d56Sopenharmony_ci        help="The path to write the keyword definitions",
557db96d56Sopenharmony_ci    )
567db96d56Sopenharmony_ci    args = parser.parse_args()
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci    grammar, _, _ = build_parser(args.grammar)
597db96d56Sopenharmony_ci    with args.tokens_file as tok_file:
607db96d56Sopenharmony_ci        all_tokens, exact_tok, non_exact_tok = generate_token_definitions(tok_file)
617db96d56Sopenharmony_ci    gen = CParserGenerator(grammar, all_tokens, exact_tok, non_exact_tok, file=None)
627db96d56Sopenharmony_ci    gen.collect_rules()
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci    with args.keyword_file as thefile:
657db96d56Sopenharmony_ci        all_keywords = sorted(list(gen.keywords.keys()) + EXTRA_KEYWORDS)
667db96d56Sopenharmony_ci        all_soft_keywords = sorted(gen.soft_keywords)
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ci        keywords = "" if not all_keywords else "    " + ",\n    ".join(map(repr, all_keywords))
697db96d56Sopenharmony_ci        soft_keywords = (
707db96d56Sopenharmony_ci            "" if not all_soft_keywords else "    " + ",\n    ".join(map(repr, all_soft_keywords))
717db96d56Sopenharmony_ci        )
727db96d56Sopenharmony_ci        thefile.write(TEMPLATE.format(keywords=keywords, soft_keywords=soft_keywords))
737db96d56Sopenharmony_ci
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ciif __name__ == "__main__":
767db96d56Sopenharmony_ci    main()
77