� {fc@sdZdZddgZddlZddlZddlZddlZddlZddlZddl m Z m Z m Z m Z mZdefd��YZd �Zd deedd �Zd �Zd �Zd�Zedkrejee� ��ndS(sZParser driver. This provides a high-level interface to parse a file into a syntax tree. s#Guido van Rossum tDrivert load_grammari����Ni(tgrammartparsettokenttokenizetpgencBsVeZddd�Zed�Zed�Zed�Zded�Zed�Z RS(cCs:||_|dkr$tj�}n||_||_dS(N(RtNonetloggingt getLoggertloggertconvert(tselfRR R ((s,/usr/lib64/python2.7/lib2to3/pgen2/driver.pyt__init__ s    cCstj|j|j�}|j�d}d}d }}}} } d} x�|D]�} | \}}}} } |||fkr�|\} }|| kr�| d| |7} | }d}n||kr�| | ||!7} |}q�n|tjtjfkr6| |7} | \}}|j d�rQ|d7}d}qQqQn|t j krUtj |}n|r~|j jdt j||| �n|j||| |f�r�|r�|j jd�nPnd} | \}}|j d�rQ|d7}d}qQqQWtjd||| |f��|jS( s4Parse a series of tokens and return the syntax tree.iius s%s %r (prefix=%r)sStop.tsincomplete inputN(RtParserRR tsetupRRtCOMMENTtNLtendswithRtOPtopmapR tdebugttok_nametaddtokent ParseErrortrootnode(R ttokensRtptlinenotcolumnttypetvaluetstarttendt line_texttprefixt quintuplets_linenots_column((s,/usr/lib64/python2.7/lib2to3/pgen2/driver.pyt parse_tokens'sR                cCs"tj|j�}|j||�S(s*Parse a stream and return the syntax tree.(Rtgenerate_tokenstreadlineR((R tstreamRR((s,/usr/lib64/python2.7/lib2to3/pgen2/driver.pytparse_stream_rawWscCs|j||�S(s*Parse a stream and return the syntax tree.(R,(R R+R((s,/usr/lib64/python2.7/lib2to3/pgen2/driver.pyt parse_stream\scCs;tj|d|�}z|j||�SWd|j�XdS(s(Parse a file and return the syntax tree.trN(tcodecstopenR-tclose(R tfilenametencodingRR+((s,/usr/lib64/python2.7/lib2to3/pgen2/driver.pyt parse_file`scCs+tjtj|�j�}|j||�S(s*Parse a string and return the syntax tree.(RR)tStringIOR*R((R ttextRR((s,/usr/lib64/python2.7/lib2to3/pgen2/driver.pyt parse_stringhsN( t__name__t __module__RR tFalseR(R,R-R4R7(((s,/usr/lib64/python2.7/lib2to3/pgen2/driver.pyRs  0  cCsRtjj|�\}}|dkr-d}n||djtttj��dS(Ns.txtRt.s.pickle(tostpathtsplitexttjointmaptstrtsyst version_info(tgttheadttail((s,/usr/lib64/python2.7/lib2to3/pgen2/driver.pyt_generate_pickle_namens  s Grammar.txtcCs�|dkrtj�}n|dkr3t|�n|}|sOt||� r�|jd|�tj|�}|r�|jd|�y|j|�Wq�t k r�}|jd|�q�Xq�nt j �}|j |�|S(s'Load the grammar (maybe from a pickle).s!Generating grammar tables from %ssWriting grammar tables to %ssWriting failed: %sN( RRR RGt_newertinfoRtgenerate_grammartdumptIOErrorRtGrammartload(RDtgptsavetforceR tgte((s,/usr/lib64/python2.7/lib2to3/pgen2/driver.pyRus   cCsNtjj|�stStjj|�s,tStjj|�tjj|�kS(s0Inquire whether file a was written since file b.(R<R=texistsR:tTruetgetmtime(tatb((s,/usr/lib64/python2.7/lib2to3/pgen2/driver.pyRH�s cCsctjj|�rt|�Sttjj|��}tj||�}tj �}|j |�|S(s�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. ( R<R=tisfileRRGtbasenametpkgutiltget_dataRRMtloads(tpackagetgrammar_sourcet pickled_nametdataRR((s,/usr/lib64/python2.7/lib2to3/pgen2/driver.pytload_packaged_grammar�s    cGsc|stjd}ntjdtjdtjdd�x$|D]}t|dtdt�q?WtS(s�Main program, when run as a script: produce grammar pickle files. Calls load_grammar for each argument, a path to a grammar text file. itlevelR+tformats %(message)sRPRQ(RBtargvRt basicConfigtINFOtstdoutRRU(targsRD((s,/usr/lib64/python2.7/lib2to3/pgen2/driver.pytmain�s t__main__(t__doc__t __author__t__all__R/R<RR[R5RBRRRRRRtobjectRRGRRUR:RRHRbRjR8texittint(((s,/usr/lib64/python2.7/lib2to3/pgen2/driver.pyt s$       (P