219 lines
5.6 KiB
Python
219 lines
5.6 KiB
Python
# Copyright 2006 Google, Inc. All Rights Reserved.
|
|
# Licensed to PSF under a Contributor Agreement.
|
|
|
|
"""Export the Python grammar and symbols."""
|
|
|
|
# Python imports
|
|
import os
|
|
|
|
from typing import Union
|
|
|
|
# Local imports
|
|
from .pgen2 import token
|
|
from .pgen2 import driver
|
|
|
|
from .pgen2.grammar import Grammar
|
|
|
|
# Moved into initialize because mypyc can't handle __file__ (XXX bug)
|
|
# # The grammar file
|
|
# _GRAMMAR_FILE = os.path.join(os.path.dirname(__file__), "Grammar.txt")
|
|
# _PATTERN_GRAMMAR_FILE = os.path.join(os.path.dirname(__file__),
|
|
# "PatternGrammar.txt")
|
|
|
|
|
|
class Symbols(object):
|
|
def __init__(self, grammar: Grammar) -> None:
|
|
"""Initializer.
|
|
|
|
Creates an attribute for each grammar symbol (nonterminal),
|
|
whose value is the symbol's type (an int >= 256).
|
|
"""
|
|
for name, symbol in grammar.symbol2number.items():
|
|
setattr(self, name, symbol)
|
|
|
|
|
|
class _python_symbols(Symbols):
|
|
and_expr: int
|
|
and_test: int
|
|
annassign: int
|
|
arglist: int
|
|
argument: int
|
|
arith_expr: int
|
|
asexpr_test: int
|
|
assert_stmt: int
|
|
async_funcdef: int
|
|
async_stmt: int
|
|
atom: int
|
|
augassign: int
|
|
break_stmt: int
|
|
case_block: int
|
|
classdef: int
|
|
comp_for: int
|
|
comp_if: int
|
|
comp_iter: int
|
|
comp_op: int
|
|
comparison: int
|
|
compound_stmt: int
|
|
continue_stmt: int
|
|
decorated: int
|
|
decorator: int
|
|
decorators: int
|
|
del_stmt: int
|
|
dictsetmaker: int
|
|
dotted_as_name: int
|
|
dotted_as_names: int
|
|
dotted_name: int
|
|
encoding_decl: int
|
|
eval_input: int
|
|
except_clause: int
|
|
exec_stmt: int
|
|
expr: int
|
|
expr_stmt: int
|
|
exprlist: int
|
|
factor: int
|
|
file_input: int
|
|
flow_stmt: int
|
|
for_stmt: int
|
|
funcdef: int
|
|
global_stmt: int
|
|
guard: int
|
|
if_stmt: int
|
|
import_as_name: int
|
|
import_as_names: int
|
|
import_from: int
|
|
import_name: int
|
|
import_stmt: int
|
|
lambdef: int
|
|
listmaker: int
|
|
match_stmt: int
|
|
namedexpr_test: int
|
|
not_test: int
|
|
old_comp_for: int
|
|
old_comp_if: int
|
|
old_comp_iter: int
|
|
old_lambdef: int
|
|
old_test: int
|
|
or_test: int
|
|
parameters: int
|
|
pass_stmt: int
|
|
pattern: int
|
|
patterns: int
|
|
power: int
|
|
print_stmt: int
|
|
raise_stmt: int
|
|
return_stmt: int
|
|
shift_expr: int
|
|
simple_stmt: int
|
|
single_input: int
|
|
sliceop: int
|
|
small_stmt: int
|
|
subject_expr: int
|
|
star_expr: int
|
|
stmt: int
|
|
subscript: int
|
|
subscriptlist: int
|
|
suite: int
|
|
term: int
|
|
test: int
|
|
testlist: int
|
|
testlist1: int
|
|
testlist_gexp: int
|
|
testlist_safe: int
|
|
testlist_star_expr: int
|
|
tfpdef: int
|
|
tfplist: int
|
|
tname: int
|
|
tname_star: int
|
|
trailer: int
|
|
try_stmt: int
|
|
typedargslist: int
|
|
varargslist: int
|
|
vfpdef: int
|
|
vfplist: int
|
|
vname: int
|
|
while_stmt: int
|
|
with_stmt: int
|
|
xor_expr: int
|
|
yield_arg: int
|
|
yield_expr: int
|
|
yield_stmt: int
|
|
|
|
|
|
class _pattern_symbols(Symbols):
|
|
Alternative: int
|
|
Alternatives: int
|
|
Details: int
|
|
Matcher: int
|
|
NegatedUnit: int
|
|
Repeater: int
|
|
Unit: int
|
|
|
|
|
|
python_grammar: Grammar
|
|
python_grammar_no_print_statement: Grammar
|
|
python_grammar_no_print_statement_no_exec_statement: Grammar
|
|
python_grammar_no_print_statement_no_exec_statement_async_keywords: Grammar
|
|
python_grammar_no_exec_statement: Grammar
|
|
pattern_grammar: Grammar
|
|
python_grammar_soft_keywords: Grammar
|
|
|
|
python_symbols: _python_symbols
|
|
pattern_symbols: _pattern_symbols
|
|
|
|
|
|
def initialize(cache_dir: Union[str, "os.PathLike[str]", None] = None) -> None:
|
|
global python_grammar
|
|
global python_grammar_no_print_statement
|
|
global python_grammar_no_print_statement_no_exec_statement
|
|
global python_grammar_no_print_statement_no_exec_statement_async_keywords
|
|
global python_grammar_soft_keywords
|
|
global python_symbols
|
|
global pattern_grammar
|
|
global pattern_symbols
|
|
|
|
# The grammar file
|
|
_GRAMMAR_FILE = os.path.join(os.path.dirname(__file__), "Grammar.txt")
|
|
_PATTERN_GRAMMAR_FILE = os.path.join(
|
|
os.path.dirname(__file__), "PatternGrammar.txt"
|
|
)
|
|
|
|
# Python 2
|
|
python_grammar = driver.load_packaged_grammar("blib2to3", _GRAMMAR_FILE, cache_dir)
|
|
python_grammar.version = (2, 0)
|
|
|
|
soft_keywords = python_grammar.soft_keywords.copy()
|
|
python_grammar.soft_keywords.clear()
|
|
|
|
python_symbols = _python_symbols(python_grammar)
|
|
|
|
# Python 2 + from __future__ import print_function
|
|
python_grammar_no_print_statement = python_grammar.copy()
|
|
del python_grammar_no_print_statement.keywords["print"]
|
|
|
|
# Python 3.0-3.6
|
|
python_grammar_no_print_statement_no_exec_statement = python_grammar.copy()
|
|
del python_grammar_no_print_statement_no_exec_statement.keywords["print"]
|
|
del python_grammar_no_print_statement_no_exec_statement.keywords["exec"]
|
|
python_grammar_no_print_statement_no_exec_statement.version = (3, 0)
|
|
|
|
# Python 3.7+
|
|
python_grammar_no_print_statement_no_exec_statement_async_keywords = (
|
|
python_grammar_no_print_statement_no_exec_statement.copy()
|
|
)
|
|
python_grammar_no_print_statement_no_exec_statement_async_keywords.async_keywords = (
|
|
True
|
|
)
|
|
python_grammar_no_print_statement_no_exec_statement_async_keywords.version = (3, 7)
|
|
|
|
# Python 3.10+
|
|
python_grammar_soft_keywords = (
|
|
python_grammar_no_print_statement_no_exec_statement_async_keywords.copy()
|
|
)
|
|
python_grammar_soft_keywords.soft_keywords = soft_keywords
|
|
python_grammar_soft_keywords.version = (3, 10)
|
|
|
|
pattern_grammar = driver.load_packaged_grammar(
|
|
"blib2to3", _PATTERN_GRAMMAR_FILE, cache_dir
|
|
)
|
|
pattern_symbols = _pattern_symbols(pattern_grammar)
|