� {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    cCs=tj|j|j�}|j�d}d}d }}}} } d} x�|D]�} | \}}}} } |||fkr ||f|ks�t||f|f��|\} }|| kr�| d| |7} | }d}n||kr | | ||!7} |}q n|tjtj fkr`| |7} | \}}|j d�rQ|d7}d}qQqQn|t j krtj |}n|r�|jjdt j||| �n|j||| |f�r�|r�|jjd�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 tsetupRtAssertionErrorRtCOMMENTtNLtendswithRtOPtopmapR tdebugttok_nametaddtokent ParseErrortrootnode(R ttokensRtptlinenotcolumnttypetvaluetstarttendt line_texttprefixt quintuplets_linenots_column((s,/usr/lib64/python2.7/lib2to3/pgen2/driver.pyt parse_tokens'sT  *              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.R5R8(((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 RHt_newertinfoRtgenerate_grammartdumptIOErrorRtGrammartload(REtgptsavetforceR 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.pyRI�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>tisfileRRHtbasenametpkgutiltget_dataRRNtloads(tpackagetgrammar_sourcet pickled_nametdataRS((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)sRQRR(RCtargvRt basicConfigtINFOtstdoutRRV(targsRE((s,/usr/lib64/python2.7/lib2to3/pgen2/driver.pytmain�s t__main__(t__doc__t __author__t__all__R0R=RR\R6RCRRRRRRtobjectRRHRRVR;RRIRcRkR9texittint(((s,/usr/lib64/python2.7/lib2to3/pgen2/driver.pyt s$       (P