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