B y `o!@shdZdZddgZddlZddlZddlZddlZddlZddlZddl m Z m Z m Z m Z mZmZmZmZmZmZddlmZmZmZmZmZdd lmZdd lmZmZdd lmZee d fZ!Gd dde"Z#d e!ee!edddZ$d!eeee%e%eeedddZ&eee%dddZ'd"e eee!ejdddZ(ee%dddZ)e*dkrde+e,e) dS)#zZParser driver. This provides a high-level interface to parse a file into a syntax tree. z#Guido van Rossum Driver load_grammarN) AnyCallableIOIterableListOptionalTextTupleUnionSequence)grammarparsetokentokenizepgen)Logger)_ConvertNL)Grammarzos.PathLike[str]c@seZdZdeeeeeddddZdee e e dddZ de ee e d d d Zde ee e d d d Zdeeee e dddZdee e dddZeeeeefdddZdS)rN)rconvertloggerreturncCs(||_|dkrtt}||_||_dS)N)rlogging getLogger__name__rr)selfrrrr9/tmp/pip-unpacked-wheel-qq0fnpma/blib2to3/pgen2/driver.py__init__0s  zDriver.__init__F)tokensdebugrcCst|j|j}|d}d}g}d}}} } } d} x|D]} | \}}} } } | ||fkr||f| kst||f| f| \}}||kr| d||7} |}d}||kr| | ||7} |}|tjtjfkr| |7} | \}}| drD|d7}d}qD|t j krtj |}|r0|j dt j||| |t jkr\|t|| |}d} d}n$|t jkr|}|| |\} }|||| | fr|r|j dPd} |t jt jhkr|} | \}}| drD|d7}d}qDW| dk sttd||| | f|jdk st|jS) z4Parse a series of tokens and return the syntax tree.rrN z%s %r (prefix=%r)zStop.zincomplete input)rParserrrsetupAssertionErrorrCOMMENTrendswithrOPopmaprr#tok_nameINDENTappendlenDEDENTpop_partially_consume_prefixZaddtoken ParseErrorrootnode)rr"r#plinenocolumnZindent_columnstypevaluestartendZ line_textprefixZ quintupleZs_linenoZs_column_prefixZ _indent_colrrr parse_tokens<sl        zDriver.parse_tokens)streamr#rcCstj|j|jd}|||S)z*Parse a stream and return the syntax tree.)r)rgenerate_tokensreadlinerr?)rr@r#r"rrr parse_stream_rawyszDriver.parse_stream_rawcCs |||S)z*Parse a stream and return the syntax tree.)rC)rr@r#rrr parse_stream~szDriver.parse_stream)filenameencodingr#rc Cs(tj|d|d}|||SQRXdS)z(Parse a file and return the syntax tree.r)rFN)ioopenrD)rrErFr#r@rrr parse_fileszDriver.parse_file)textr#rcCs$tjt|j|jd}|||S)z*Parse a string and return the syntax tree.)r)rrArHStringIOrBrr?)rrKr#r"rrr parse_stringszDriver.parse_string)r=r8rc Csg}d}d}d}x|D]}||7}|rt|dkr|r\||kr\d|}||t|dfS||d}d}d}q|dkr|d7}q|dkrd}qd}qWd||fS)Nr$rFr%z rT)stripjoinr0r/) rr=r8lines current_lineZcurrent_columnZ wait_for_nlcharresrrr r3s*    z Driver._partially_consume_prefix)NN)F)F)F)NF)F)r __module__ __qualname__rr rrr!rrboolrr?rr rCrDPathrJrMintr r3rrrr r/s= )gt cache_dirrcCs\tj|\}}|dkrd}||dtttjd}|rTtj|tj|S|SdS)Nz.txtr$.z.pickle) ospathsplitextrOmapstrsys version_infobasename)rYrZheadtailnamerrr _generate_pickle_namesrg Grammar.txtTF)rYgpsaveforcerrc Cs|dkrtt}|dkr"t|n|}|s4t||s|d|t|}|r|d|y||Wqt k r}z|d|Wdd}~XYqXnt }| ||S)z'Load the grammar (maybe from a pickle).Nz!Generating grammar tables from %szWriting grammar tables to %szWriting failed: %s) rrrrg_newerinforZgenerate_grammardumpOSErrorrrload)rYrirjrkrgerrr rs      )abrcCs8tj|sdStj|s dStj|tj|kS)z0Inquire whether file a was written since file b.FT)r\r]existsgetmtime)rsrtrrr rls   rl)packagegrammar_sourcerZrcCsjtj|r*|rt||nd}t||dSttj||}t||}|dk sTtt }| ||S)aNormally, loads a pickled grammar by doing pkgutil.get_data(package, pickled_grammar) where *pickled_grammar* is computed from *grammar_source* by adding the Python version and using a ``.pickle`` extension. However, if *grammar_source* is an extant file, load_grammar(grammar_source) is called instead. This facilitates using a packaged grammar file when needed but preserves load_grammar's automatic regeneration behavior when possible. N)ri) r\r]isfilergrrcpkgutilget_datar(rrloads)rwrxrZriZ pickled_namedatarqrrr load_packaged_grammars     r~)argsrcGsJ|sttjdd}tjtjtjddx|D]}t|dddq0WdS)zMain program, when run as a script: produce grammar pickle files. Calls load_grammar for each argument, a path to a grammar text file. rNz %(message)s)levelr@formatT)rjrk)tupleraargvr basicConfigINFOstdoutr)rrYrrr mains  r__main__)N)rhNTFN)N)-__doc__ __author____all__codecsrHr\rrzratypingrrrrrr r r r r r$rrrrrrZblib2to3.pytreerrZblib2to3.pgen2.grammarrr`rWobjectrrgrVrrlr~rrexitrXrrrr  s80   }