a ch@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__rr0/opt/imh-python/lib/python3.9/lib2to3/patcomp.pyr sr c csLtjtjtjh}tt|j}|D] }|\}}}}}||vr&|Vq&dS)z6Tokenizes a string suppressing significant whitespace.N) rNEWLINEINDENTDEDENTrgenerate_tokensioStringIOreadline) inputskiptokensZ quintupletypevaluestartendZ line_textrrrtokenize_wrappers rc@s:eZdZd ddZdddZddZdd d Zd d ZdS)PatternCompilerNcCsZ|durtj|_tj|_nt||_t|j|_tj|_ tj |_ tj |jt d|_dS)z^Initializer. Takes an optional alternative filename for the pattern grammar. N)convert)r Zpattern_grammarrZpattern_symbolssymsrZ load_grammarZSymbolsZpython_grammarZ pygrammarZpython_symbolspysymsZDriverpattern_convert)selfZ grammar_filerrr__init__(s  zPatternCompiler.__init__Fc Csrt|}z|jj||d}Wn4tjyP}ztt|dWYd}~n d}~00|rd|||fS||SdS)z=Compiles a pattern string to a nested pytree.*Pattern object.)debugN)rrZ parse_tokensrZ ParseErrorr str compile_node)r%rr'Z with_treerrooterrrcompile_pattern7s$zPatternCompiler.compile_patternc s|jjjkr|jd}|jjjkrzfdd|jdddD}t|dkrX|dStjdd|Dddd}|S|jjj krʇfd d|jD}t|dkr|dStj|gddd}|S|jjj kr |jdd}t |}|S|jjj ksJd}|j}t|d krR|djtjkrR|dj}|dd}d}t|dkr|d jjjkr|d }|dd } ||}|dur|jjjksJ|j} | d} | jtjkrd} tj} n| jtjkrd} tj} np| jtjkr^| d jtjksJt| d vs.J| d} } t| d krh| d } n dshJ| dks|| dkr|}tj|gg| | d}|dur||_|S)zXCompiles a node, recursively. This is one big switch on the node type. rcsg|]}|qSrr).0Zchr%rr Oz0PatternCompiler.compile_node..NrcSsg|] }|gqSrr)r/arrrr1Rr2minmaxcsg|]}|qSrr-r.r0rrr1Vr2)r8r:F)rr"ZMatcherchildrenZ Alternativeslenr WildcardPatternoptimizeZ AlternativeZ NegatedUnit compile_basicZNegatedPatternZUnitrEQUALrZRepeaterSTARZHUGEPLUSLBRACERBRACEget_intname) r%nodeZaltspZunitspatternrFnodesrepeatr;childr6r7rr0rr)Csh       "     zPatternCompiler.compile_nodecCsnt|dksJ|d}|jtjkrDtt|j}t t ||S|jtj kr|j}| r|t vrttd||ddrtdt t |S|dkrd}n,|dst|j|d}|durtd||ddr||djdg}nd}t||SnV|jdkr ||dS|jd kr\|dus:J||d}tj|ggddd Sd sjJ|dS) NrrzInvalid token: %rzCan't have details for tokenany_zInvalid symbol: %r([r5F)r<rrSTRINGr(rZ evalStringrr Z LeafPattern_type_of_literalNAMEisupper TOKEN_MAPr startswithgetattrr#r)r;Z NodePatternr=)r%rJrKrGrrZcontent subpatternrrrr?s<        zPatternCompiler.compile_basiccCs|jtjksJt|jSN)rrNUMBERintr)r%rGrrrrEszPatternCompiler.get_int)N)FF)N)r r rr&r,r)r?rErrrrr &s   G #r )rSrQrZZTOKENcCs.|drtjS|tjvr&tj|SdSdS)Nr)isalpharrSrZopmap)rrrrrRs    rRcCs>|\}}}}|s||jvr*tj|||dStj|||dSdS)z9Converts raw node information to a Node or Leaf instance.)contextN)Z number2symbolr ZNodeZLeaf)rZ raw_node_inforrr]r;rrrr$s r$cCs t|SrY)r r,)rIrrrr,sr,)__doc__ __author__rZpgen2rrrrrrr r Exceptionr robjectr rSrQrZrUrRr$r,rrrrs"