o bc@sdZdZddlZddlmZmZmZmZmZm Z ddl m Z ddl m Z Gdd d e Zd d ZGd d d eZejejejddZddZddZddZdS)zPattern compiler. The grammar is taken from PatternGrammar.txt. The compiler compiles a pattern to a pytree.*Pattern instance. z#Guido van Rossum N)driverliteralstokentokenizeparsegrammar)pytree)pygramc@s eZdZdS)PatternSyntaxErrorN)__name__ __module__ __qualname__rr&/usr/lib/python3.10/lib2to3/patcomp.pyr sr c csNtjtjtjh}tt|j}|D]}|\}}}}}||vr$|VqdS)z6Tokenizes a string suppressing significant whitespace.N) rNEWLINEINDENTDEDENTrgenerate_tokensioStringIOreadline) inputskiptokens quintupletypevaluestartend line_textrrrtokenize_wrappersr!c@s:eZdZd ddZdddZddZd d d Zd d ZdS)PatternCompilerNcCsZ|dur tj|_tj|_n t||_t|j|_tj|_ tj |_ tj |jt d|_dS)z^Initializer. Takes an optional alternative filename for the pattern grammar. N)convert)r pattern_grammarrpattern_symbolssymsr load_grammarSymbolspython_grammar pygrammarpython_symbolspysymsDriverpattern_convert)self grammar_filerrr__init__(s  zPatternCompiler.__init__Fc Csbt|}z |jj||d}Wntjy"}ztt|dd}~ww|r,|||fS||S)z=Compiles a pattern string to a nested pytree.*Pattern object.)debugN)r!r parse_tokensr ParseErrorr str compile_node)r/rr2 with_treerrooterrrcompile_pattern7s zPatternCompiler.compile_patternc s|jjjkr |jd}|jjjkr=fdd|jdddD}t|dkr,|dStjdd|Dddd}|S|jjj krefd d|jD}t|dkrX|dStj|gddd}|S|jjj kr |jdd}t |}|S|jjj ksJd}|j}t|d kr|djtjkr|dj}|dd}d}t|dkr|d jjjkr|d }|dd } ||}|durA|jjjksJ|j} | d} | jtjkrd} tj} nA| jtjkrd} tj} n5| jtjkr'| d jtjksJt| d vsJ| d} } t| d kr&| d } nJ| dks3| dkrA|}tj|gg| | d}|durI||_|S)zXCompiles a node, recursively. This is one big switch on the node type. rcg|]}|qSrr6.0chr/rr Oz0PatternCompiler.compile_node..NrcSsg|]}|gqSrr)r>arrrrARsminmaxcr;rr<r=r@rrrAVrB)rHrJ)rr&Matcherchildren Alternativeslenr WildcardPatternoptimize Alternative NegatedUnit compile_basicNegatedPatternUnitrEQUALrRepeaterSTARHUGEPLUSLBRACERBRACEget_intname) r/nodealtspunitspatternr^nodesrepeatrLchildrFrGrr@rr6Csj            zPatternCompiler.compile_nodecCsZt|dksJ|d}|jtjkr"tt|j}t t ||S|jtj kr|j}| rJ|t vr9td||ddrCtdt t |S|dkrQd}n|dsgt|j|d}|durgtd||ddry||djdg}nd}t||S|jdkr||dS|jd kr|dusJ||d}tj|ggddd SJ|) NrrzInvalid token: %rzCan't have details for tokenany_zInvalid symbol: %r([rE)rNrrSTRINGr5r evalStringrr LeafPattern_type_of_literalNAMEisupper TOKEN_MAPr startswithgetattrr,r6rL NodePatternrO)r/rdrer_rrcontent subpatternrrrrSs<           zPatternCompiler.compile_basiccCs|jtjksJt|jSN)rrNUMBERintr)r/r_rrrr]s zPatternCompiler.get_intrw)FF)r r rr1r:r6rSr]rrrrr"&s    G #r")rorkrxTOKENcCs*|dr tjS|tjvrtj|SdS)Nr)isalpharroropmap)rrrrrns   rncCs:|\}}}}|s ||jvrtj|||dStj|||dS)z9Converts raw node information to a Node or Leaf instance.)context) number2symbolr NodeLeaf)r raw_node_inforrr}rLrrrr.s r.cCs t|Srw)r"r:)rcrrrr:s r:)__doc__ __author__rpgen2rrrrrrr r Exceptionr r!objectr"rorkrxrqrnr.r:rrrrs$