3 \Œã@s´dZdZddgZddlZddlZddlZddlZddlZddlZddl m Z m Z m Z m Z mZGdd„deƒZd d „Zddd„Zdd„Zdd„Zdd„Zedkr°ejeeƒ ƒƒdS)zZParser driver. This provides a high-level interface to parse a file into a syntax tree. z#Guido van Rossum ÚDriverÚ load_grammaréNé)ÚgrammarÚparseÚtokenÚtokenizeÚpgenc@sHeZdZddd„Zddd„Zddd„Zdd d „Zdd d „Zdd d„ZdS)rNcCs&||_|dkrtjƒ}||_||_dS)N)rÚloggingÚ getLoggerÚloggerÚconvert)Úselfrr r ©rú,/usr/lib64/python3.6/lib2to3/pgen2/driver.pyÚ__init__ s zDriver.__init__FcCsvtj|j|jƒ}|jƒd}d}d}}}} } d} �x4|D�]} | \}}}} } |||fkr¤|\} }|| krˆ| d| |7} | }d}||kr¤| | ||…7} |}|tjtjfkrÜ| |7} | \}}|jdƒr@|d7}d}q@|t j krðtj |}|�r|j j dt j||| ƒ|j||| |fƒ�r6|�r4|j j dƒPd} | \}}|jdƒr@|d7}d}q@Wtjd||| |fƒ‚|jS) z4Parse a series of tokens and return the syntax tree.rrNÚÚ z%s %r (prefix=%r)zStop.zincomplete input)rZParserrr ZsetuprÚCOMMENTÚNLÚendswithrÚOPZopmapr ÚdebugÚtok_nameZaddtokenZ ParseErrorZrootnode)rÚtokensrÚpÚlinenoÚcolumnÚtypeÚvalueÚstartÚendZ line_textÚprefixZ quintupleZs_linenoZs_columnrrrÚ parse_tokens'sR      zDriver.parse_tokenscCstj|jƒ}|j||ƒS)z*Parse a stream and return the syntax tree.)rÚgenerate_tokensÚreadliner#)rÚstreamrrrrrÚparse_stream_rawWs zDriver.parse_stream_rawcCs |j||ƒS)z*Parse a stream and return the syntax tree.)r')rr&rrrrÚ parse_stream\szDriver.parse_streamc Cs*tj|d|ƒ}z |j||ƒS|jƒXdS)z(Parse a file and return the syntax tree.ÚrN)ÚcodecsÚopenr(Úclose)rÚfilenameÚencodingrr&rrrÚ parse_file`s zDriver.parse_filecCstjtj|ƒjƒ}|j||ƒS)z*Parse a string and return the syntax tree.)rr$ÚioÚStringIOr%r#)rÚtextrrrrrÚ parse_stringhszDriver.parse_string)NN)F)F)F)NF)F) Ú__name__Ú __module__Ú __qualname__rr#r'r(r/r3rrrrrs   0   cCs:tjj|ƒ\}}|dkrd}||djtttjƒƒdS)Nz.txtrÚ.z.pickle)ÚosÚpathÚsplitextÚjoinÚmapÚstrÚsysÚ version_info)ÚgtÚheadÚtailrrrÚ_generate_pickle_namensrCú Grammar.txtTFcCs°|dkrtjƒ}|dkr t|ƒn|}|s4t||ƒ rš|jd|ƒtj|ƒ}|r¬|jd|ƒy|j|ƒWq¬tk r–}z|jd|ƒWYdd}~Xq¬Xnt j ƒ}|j |ƒ|S)z'Load the grammar (maybe from a pickle).Nz!Generating grammar tables from %szWriting grammar tables to %szWriting failed: %s) r r rCÚ_newerÚinfor Zgenerate_grammarÚdumpÚOSErrorrÚGrammarÚload)r@ZgpÚsaveÚforcer ÚgÚerrrrus     cCs8tjj|ƒsdStjj|ƒs dStjj|ƒtjj|ƒkS)z0Inquire whether file a was written since file b.FT)r8r9ÚexistsÚgetmtime)ÚaÚbrrrrEŠs   rEcCsFtjj|ƒrt|ƒSttjj|ƒƒ}tj||ƒ}tj ƒ}|j |ƒ|S)aÙNormally, 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. ) r8r9ÚisfilerrCÚbasenameÚpkgutilÚget_datarrIÚloads)ÚpackageZgrammar_sourceZ pickled_nameÚdatarMrrrÚload_packaged_grammar“s   rZcGsF|stjdd…}tjtjtjdd�x|D]}t|ddd�q,WdS)z�Main 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)rKrL)r>Úargvr Z basicConfigÚINFOÚstdoutr)Úargsr@rrrÚmain§s  raÚ__main__)rDNTFN)Ú__doc__Ú __author__Ú__all__r*r0r8r rUr>rrrrrr ÚobjectrrCrrErZrar4ÚexitÚintrrrrÚ s$P