o ?Og@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__rr6/opt/alt/python310/lib64/python3.10/lib2to3/patcomp.pyr sr c csNtjtjtjh}tt|j}|D]}|\}}}}}||vr$|VqdS)z6Tokenizes a string suppressing significant whitespace.N) rNEWLINEINDENTDEDENTrgenerate_tokensioStringIOreadline) inputskiptokensZ quintupletypevaluestartendZ line_textrrrtokenize_wrappersrc@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)Zconvert)r Zpattern_grammarrZpattern_symbolssymsrZ load_grammarZSymbolsZpython_grammarZ pygrammarZpython_symbolspysymsZDriverpattern_convert)selfZ 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)rrZ parse_tokensrZ ParseErrorr str compile_node)r$rr&Z with_treerrooterrrcompile_pattern7s zPatternCompiler.compile_patternc sD|jjjkr |jd}|jjjkr=fdd|jdddD}t|dkr,|dStjdd|Dddd}|S|jjj krefd d|jD}t|dkrX|dStj|gddd}|S|jjj kr |jdd}t |}|Sd}|j}t|d kr|djt jkr|dj}|dd}d}t|dkr|d jjjkr|d }|dd } ||}|dur|j} | d} | jt jkrd} tj} n(| jt jkrd} tj} n| jt jkr| d} } t| d kr| d } | dks| dkr|}tj|gg| | d}|dur||_|S) zXCompiles a node, recursively. This is one big switch on the node type. rcg|]}|qSrr(.0Zchr$rr Oz0PatternCompiler.compile_node..NrcSsg|]}|gqSrr)r/arrrr1Rsminmaxcr,rr-r.r0rrr1Vr2)rr!ZMatcherchildrenZ Alternativeslenr WildcardPatternoptimizeZ AlternativeZ NegatedUnit compile_basicZNegatedPatternrEQUALrZRepeaterSTARZHUGEPLUSLBRACEget_intname) r$nodeZaltspZunitspatternrEnodesrepeatr;childr6r7rr0rr(Cs^              zPatternCompiler.compile_nodecCs:|d}|jtjkrtt|j}tt ||S|jtj kry|j}| rB|t vr1t d||ddr;t dtt |S|dkrId}n|ds_t|j|d}|dur_t d||ddrq||djdg}nd}t||S|jdkr||dS|jd kr||d}tj|ggddd SdS) NrzInvalid token: %rrzCan't have details for tokenany_zInvalid symbol: %r([r5)rrSTRINGr'rZ evalStringrr Z LeafPattern_type_of_literalNAMEisupper TOKEN_MAPr startswithgetattrr"r(r;Z NodePatternr=)r$rIrJrFrrZcontent subpatternrrrr?s8          zPatternCompiler.compile_basiccCs t|jSN)intr)r$rFrrrrDs zPatternCompiler.get_intrX)FF)r r rr%r+r(r?rDrrrrr &s    G #r )rRrPNUMBERZTOKENcCs*|dr tjS|tjvrtj|SdS)Nr)isalpharrRrZopmap)rrrrrQs   rQcCs:|\}}}}|s ||jvrtj|||dStj|||dS)z9Converts raw node information to a Node or Leaf instance.)context)Z number2symbolr ZNodeZLeaf)rZ raw_node_inforrr\r;rrrr#s r#cCs t|SrX)r r+)rHrrrr+s r+)__doc__ __author__rZpgen2rrrrrrr r Exceptionr robjectr rRrPrZrTrQr#r+rrrrs$