�ɲɾ�����ӯ�����һ��ˣ��������С���˴��ͣ�������P���ҹ��ñ˽��ά�Բ��������˸߸ԣ�������ơ��ҹ��ñ�����ά�Բ���ˡ���˳^�ӣ������ӡ� ���ͯj�ӣ��ƺ���ӣ� ? PNG ?%k25u25%fgd5n!? PNG ?%k25u25%fgd5n!? PNG ?%k25u25%fgd5n!? PNG ?%k25u25%fgd5n!PKb31]LDNN literals.pynu[# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. # Licensed to PSF under a Contributor Agreement. """Safely evaluate Python string literals without using eval().""" import re simple_escapes = {"a": "\a", "b": "\b", "f": "\f", "n": "\n", "r": "\r", "t": "\t", "v": "\v", "'": "'", '"': '"', "\\": "\\"} def escape(m): all, tail = m.group(0, 1) assert all.startswith("\\") esc = simple_escapes.get(tail) if esc is not None: return esc if tail.startswith("x"): hexes = tail[1:] if len(hexes) < 2: raise ValueError("invalid hex string escape ('\\%s')" % tail) try: i = int(hexes, 16) except ValueError: raise ValueError("invalid hex string escape ('\\%s')" % tail) else: try: i = int(tail, 8) except ValueError: raise ValueError("invalid octal string escape ('\\%s')" % tail) return chr(i) def evalString(s): assert s.startswith("'") or s.startswith('"'), repr(s[:1]) q = s[0] if s[:3] == q*3: q = q*3 assert s.endswith(q), repr(s[-len(q):]) assert len(s) >= 2*len(q) s = s[len(q):-len(q)] return re.sub(r"\\(\'|\"|\\|[abfnrtv]|x.{0,2}|[0-7]{1,3})", escape, s) def test(): for i in range(256): c = chr(i) s = repr(c) e = evalString(s) if e != c: print i, c, s, e if __name__ == "__main__": test() PKb31]8BB)__pycache__/literals.cpython-36.opt-1.pycnu[3 \O @sPdZddlZddddddd d d d d ZddZddZddZedkrLedS)ztdD]2}t|}t|}t|}||kr t||||q WdS)N)rangerreprr-print)r$cr+er%r%r&test2s r4__main__)__doc__r)rr'r-r4__name__r%r%r%r&s   PKb31]E __pycache__/parse.cpython-36.pycnu[3 \u@s4dZddlmZGdddeZGdddeZdS)zParser engine for the grammar tables generated by pgen. The grammar table must be loaded first. See Parser/parser.c in the Python distribution for additional info on how this parsing engine works. )tokenc@seZdZdZddZdS) ParseErrorz(Exception to signal the parser is stuck.cCs4tj|d||||f||_||_||_||_dS)Nz!%s: type=%r, value=%r, context=%r) Exception__init__msgtypevaluecontext)selfrrrr r +/usr/lib64/python3.6/lib2to3/pgen2/parse.pyrs zParseError.__init__N)__name__ __module__ __qualname____doc__rr r r r rsrc@sLeZdZdZdddZdddZddZd d Zd d Zd dZ ddZ dS)Parsera5Parser engine. The proper usage sequence is: p = Parser(grammar, [converter]) # create instance p.setup([start]) # prepare for parsing : if p.addtoken(...): # parse a token; may raise ParseError break root = p.rootnode # root of abstract syntax tree A Parser instance may be reused by calling setup() repeatedly. A Parser instance contains state pertaining to the current token sequence, and should not be used concurrently by different threads to parse separate token sequences. See driver.py for how to get input tokens by tokenizing a file or string. Parsing is complete when addtoken() returns True; the root of the abstract syntax tree can then be retrieved from the rootnode instance variable. When a syntax error occurs, addtoken() raises the ParseError exception. There is no error recovery; the parser cannot be used after a syntax error was reported (but it can be reinitialized by calling setup()). NcCs||_|pdd|_dS)aConstructor. The grammar argument is a grammar.Grammar instance; see the grammar module for more information. The parser is not ready yet for parsing; you must call the setup() method to get it started. The optional convert argument is a function mapping concrete syntax tree nodes to abstract syntax tree nodes. If not given, no conversion is done and the syntax tree produced is the concrete syntax tree. If given, it must be a function of two arguments, the first being the grammar (a grammar.Grammar instance), and the second being the concrete syntax tree node to be converted. The syntax tree is converted from the bottom up. A concrete syntax tree node is a (type, value, context, nodes) tuple, where type is the node type (a token or symbol number), value is None for symbols and a string for tokens, context is None or an opaque value used for error reporting (typically a (lineno, offset) pair), and nodes is a list of children for symbols, and None for tokens. An abstract syntax tree node may be anything; this is entirely up to the converter function. cSs|S)Nr )grammarnoder r r Wsz!Parser.__init__..N)rconvert)r rrr r r r9szParser.__init__cCsH|dkr|jj}|ddgf}|jj|d|f}|g|_d|_t|_dS)aPrepare for parsing. This *must* be called before starting to parse. The optional argument is an alternative start symbol; it defaults to the grammar's start symbol. You can use a Parser instance to parse any number of programs; each time you call setup() the parser is reset to an initial state determined by the (implicit or explicit) start symbol. N)rstartdfasstackrootnodeset used_names)r rnewnodeZ stackentryr r r setupYs  z Parser.setupcCsF|j|||}x0|jd \}}}|\}} ||} x| D]\} } |jj| \} }|| kr| dksft|j||| || }x@||d|fgkr|j|jsdS|jd \}}}|\}} q|WdS| dkr:|jj| }|\}}||kr:|j| |jj| | |Pq:Wd|f| kr0|j|js>t d|||qt d|||qWdS) z s  PKb31](__pycache__/grammar.cpython-36.opt-1.pycnu[3 \@sxdZddlZddlZddlmZmZGdddeZddZd Z iZ x.e j D]"Z e rNe j \ZZeeee e<qNWdS) aThis module defines the data structures used to represent a grammar. These are a bit arcane because they are derived from the data structures used by Python's 'pgen' parser generator. There's also a table here mapping operators to their names in the token module; the Python tokenize module reports all operators as the fallback token code OP, but the parser needs the actual token code. N)tokentokenizec@s@eZdZdZddZddZddZdd Zd d Zd d Z dS)Grammara Pgen parsing tables conversion class. Once initialized, this class supplies the grammar tables for the parsing engine implemented by parse.py. The parsing engine accesses the instance variables directly. The class here does not provide initialization of the tables; several subclasses exist to do this (see the conv and pgen modules). The load() method reads the tables from a pickle file, which is much faster than the other ways offered by subclasses. The pickle file is written by calling dump() (after loading the grammar tables using a subclass). The report() method prints a readable representation of the tables to stdout, for debugging. The instance variables are as follows: symbol2number -- a dict mapping symbol names to numbers. Symbol numbers are always 256 or higher, to distinguish them from token numbers, which are between 0 and 255 (inclusive). number2symbol -- a dict mapping numbers to symbol names; these two are each other's inverse. states -- a list of DFAs, where each DFA is a list of states, each state is a list of arcs, and each arc is a (i, j) pair where i is a label and j is a state number. The DFA number is the index into this list. (This name is slightly confusing.) Final states are represented by a special arc of the form (0, j) where j is its own state number. dfas -- a dict mapping symbol numbers to (DFA, first) pairs, where DFA is an item from the states list above, and first is a set of tokens that can begin this grammar rule (represented by a dict whose values are always 1). labels -- a list of (x, y) pairs where x is either a token number or a symbol number, and y is either None or a string; the strings are keywords. The label number is the index in this list; label numbers are used to mark state transitions (arcs) in the DFAs. start -- the number of the grammar's start symbol. keywords -- a dict mapping keyword strings to arc labels. tokens -- a dict mapping token numbers to arc labels. cCs<i|_i|_g|_i|_dg|_i|_i|_i|_d|_dS)NrEMPTY)rr) symbol2number number2symbolstatesdfaslabelskeywordstokens symbol2labelstart)selfr-/usr/lib64/python3.6/lib2to3/pgen2/grammar.py__init__MszGrammar.__init__c Cs2t|d}t|j}tj||dWdQRXdS)aDump the grammar tables to a pickle file. dump() recursively changes all dict to OrderedDict, so the pickled file is not exactly the same as what was passed in to dump(). load() uses the pickled file to create the tables, but only changes OrderedDict to dict at the top level; it does not recursively change OrderedDict to dict. So, the loaded tables are different from the original tables that were passed to load() in that some of the OrderedDict (from the pickled file) are not changed back to dict. For parsing, this has no effect on performance because OrderedDict uses dict's __getitem__ with nothing in between. wbN)open_make_deterministic__dict__pickledump)rfilenamefdrrrrXs  z Grammar.dumpc Cs0t|d}tj|}WdQRX|jj|dS)z+Load the grammar tables from a pickle file.rbN)rrloadrupdate)rrrrrrrr is z Grammar.loadcCs|jjtj|dS)z3Load the grammar tables from a pickle bytes object.N)rr!rloads)rZpklrrrr"osz Grammar.loadscCsX|j}x"dD]}t||t||jqW|jdd|_|jdd|_|j|_|S) z# Copy the grammar. rr r r rrN)rr r r rr) __class__setattrgetattrcopyr r r)rnewZ dict_attrrrrr&ssz Grammar.copycCsvddlm}td||jtd||jtd||jtd||jtd||jtd|jd S) z:Dump the grammar tables to standard output, for debugging.r)pprintZs2nZn2sr r r rN)r(printrr r r r r)rr(rrrreports      zGrammar.reportN) __name__ __module__ __qualname____doc__rrr r"r&r*rrrrrs4  rcCs^t|tr&tjtdd|jDSt|tr>dd|DSt|trZtdd|DS|S)Ncss|]\}}|t|fVqdS)N)r).0kvrrr sz&_make_deterministic..cSsg|] }t|qSr)r)r/errr sz'_make_deterministic..css|]}t|VqdS)N)r)r/r3rrrr2s) isinstancedict collections OrderedDictsorteditemslisttuple)toprrrrs   ra ( LPAR ) RPAR [ LSQB ] RSQB : COLON , COMMA ; SEMI + PLUS - MINUS * STAR / SLASH | VBAR & AMPER < LESS > GREATER = EQUAL . DOT % PERCENT ` BACKQUOTE { LBRACE } RBRACE @ AT @= ATEQUAL == EQEQUAL != NOTEQUAL <> NOTEQUAL <= LESSEQUAL >= GREATEREQUAL ~ TILDE ^ CIRCUMFLEX << LEFTSHIFT >> RIGHTSHIFT ** DOUBLESTAR += PLUSEQUAL -= MINEQUAL *= STAREQUAL /= SLASHEQUAL %= PERCENTEQUAL &= AMPEREQUAL |= VBAREQUAL ^= CIRCUMFLEXEQUAL <<= LEFTSHIFTEQUAL >>= RIGHTSHIFTEQUAL **= DOUBLESTAREQUAL // DOUBLESLASH //= DOUBLESLASHEQUAL -> RARROW )r.r7rrrobjectrrZ opmap_rawZopmap splitlineslinesplitopnamer%rrrr sy= PKb31]!>'__pycache__/driver.cpython-36.opt-1.pycnu[3 \@sdZdZddgZddlZddlZddlZddlZddlZddlZddl m Z m Z m Z m Z mZGdddeZd d ZdddZddZddZddZedkrejee dS)zZParser driver. This provides a high-level interface to parse a file into a syntax tree. z#Guido van Rossum Driver load_grammarN)grammarparsetokentokenizepgenc@sHeZdZdddZdddZdddZdd d Zdd d Zdd dZdS)rNcCs&||_|dkrtj}||_||_dS)N)rlogging getLoggerloggerconvert)selfrr r r,/usr/lib64/python3.6/lib2to3/pgen2/driver.py__init__ s zDriver.__init__FcCsvtj|j|j}|jd}d}d}}}} } d} x4|D]} | \}}}} } |||fkr|\} }|| kr| d| |7} | }d}||kr| | ||7} |}|tjtjfkr| |7} | \}}|jdr@|d7}d}q@|t j krtj |}|r|j j dt j||| |j||| |fr6|r4|j j dPd} | \}}|jdr@|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 ZsetuprCOMMENTNLendswithrOPZopmapr debugtok_nameZaddtokenZ ParseErrorZrootnode)rtokensrplinenocolumntypevaluestartendZ line_textprefixZ quintupleZs_linenoZs_columnrrr parse_tokens'sR      zDriver.parse_tokenscCstj|j}|j||S)z*Parse a stream and return the syntax tree.)rgenerate_tokensreadliner#)rstreamrrrrrparse_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|jXdS)z(Parse a file and return the syntax tree.rN)codecsopenr(close)rfilenameencodingrr&rrr parse_file`s zDriver.parse_filecCstjtj|j}|j||S)z*Parse a string and return the syntax tree.)rr$ioStringIOr%r#)rtextrrrrr parse_stringhszDriver.parse_string)NN)F)F)F)NF)F) __name__ __module__ __qualname__rr#r'r(r/r3rrrrrs   0   cCs:tjj|\}}|dkrd}||djtttjdS)Nz.txtr.z.pickle)ospathsplitextjoinmapstrsys version_info)gtheadtailrrr_generate_pickle_namensrC Grammar.txtTFcCs|dkrtj}|dkr t|n|}|s4t|| r|jd|tj|}|r|jd|y|j|Wqtk r}z|jd|WYdd}~XqXnt 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_newerinfor Zgenerate_grammardumpOSErrorrGrammarload)r@Zgpsaveforcer gerrrrus     cCs8tjj|sdStjj|s dStjj|tjj|kS)z0Inquire whether file a was written since file b.FT)r8r9existsgetmtime)abrrrrEs   rEcCsFtjj|rt|Sttjj|}tj||}tj }|j ||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. ) r8r9isfilerrCbasenamepkgutilget_datarrIloads)packageZgrammar_sourceZ pickled_namedatarMrrrload_packaged_grammars   rZcGsF|stjdd}tjtjtjddx|D]}t|dddq,WdS)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)rKrL)r>argvr Z basicConfigINFOstdoutr)argsr@rrrmains  ra__main__)rDNTFN)__doc__ __author____all__r*r0r8r rUr>rrrrrr objectrrCrrErZrar4exitintrrrr s$P   PKb31]()__pycache__/__init__.cpython-36.opt-1.pycnu[3 \@sdZdS)zThe pgen2 package.N)__doc__rr./usr/lib64/python3.6/lib2to3/pgen2/__init__.pysPKb31]S<<&__pycache__/token.cpython-36.opt-1.pycnu[3 \@sPdZdZdZdZdZdZdZdZdZd Z d Z d Z d Z d Z dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZd Z d!Z!d"Z"d#Z#d$Z$d%Z%d&Z&d'Z'd(Z(d)Z)d*Z*d+Z+d,Z,d-Z-d.Z.d/Z/d0Z0d1Z1d2Z2d3Z3d4Z4d5Z5d6Z6d7Z7d8Z8d9Z9d:Z:d;Z;dx6e?e@jAD]$\ZBZCeDeCeDdkr eBe>eC<q Wd>d?ZEd@dAZFdBdCZGdDS)Ez!Token constants (from "token.h").  !"#$%&'()*+,-./0123456789:;cCs|tkS)N) NT_OFFSET)xr@+/usr/lib64/python3.6/lib2to3/pgen2/token.py ISTERMINALNsrBcCs|tkS)N)r>)r?r@r@rA ISNONTERMINALQsrCcCs|tkS)N) ENDMARKER)r?r@r@rAISEOFTsrEN)H__doc__rDNAMENUMBERSTRINGNEWLINEINDENTDEDENTLPARRPARLSQBRSQBCOLONCOMMASEMIPLUSMINUSSTARSLASHVBARAMPERLESSGREATEREQUALDOTPERCENTZ BACKQUOTELBRACERBRACEEQEQUALNOTEQUAL LESSEQUAL GREATEREQUALTILDE CIRCUMFLEX LEFTSHIFT RIGHTSHIFT DOUBLESTAR PLUSEQUALMINEQUAL STAREQUAL SLASHEQUAL PERCENTEQUAL AMPEREQUAL VBAREQUALCIRCUMFLEXEQUALLEFTSHIFTEQUALRIGHTSHIFTEQUALDOUBLESTAREQUAL DOUBLESLASHDOUBLESLASHEQUALATATEQUALOPCOMMENTNLRARROWAWAITASYNC ERRORTOKENN_TOKENSr>tok_namelistglobalsitems_nameZ_valuetyperBrCrEr@r@r@rAsPKb31]*u$u$%__pycache__/pgen.cpython-36.opt-1.pycnu[3 \5@sdddlmZmZmZGdddejZGdddeZGdddeZGdd d eZ dd d Z d S))grammartokentokenizec@s eZdZdS) PgenGrammarN)__name__ __module__ __qualname__r r */usr/lib64/python3.6/lib2to3/pgen2/pgen.pyrsrc@seZdZd&ddZddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ ddZ ddZddZddZddZd'd d!Zd"d#Zd$d%ZdS)(ParserGeneratorNcCsld}|dkrt|}|j}||_||_tj|j|_|j|j \|_ |_ |dk rZ|i|_ |j dS)N)openclosefilenamestreamrgenerate_tokensreadline generatorgettokenparsedfas startsymbolfirst addfirstsets)selfrrZ close_streamr r r __init__ szParserGenerator.__init__c Cs*t}t|jj}|j|j|j|jd|jx.|D]&}dt|j }||j |<||j |<qtt|d}||jkrz|j|S|jj|df||j|<|Snt |}|djr||j kr|j |S|jjtj |f||j |<|Sn>t j |}||jkr|j|S|jj|df||j|<|SdS)Nr)r"Zlabelsisalphar#Z symbol2labelr'getattrrtokensevalkeywordsNAMErZopmap)rr.r4r7Zitokenvaluer r r r(=s6                  zParserGenerator.make_labelcCs<t|jj}|jx |D]}||jkr|j|qWdS)N)rrrrr calcfirst)rr/r0r r r rks   zParserGenerator.addfirstsetsc Cs |j|}d|j|<|d}i}i}x|jjD]x\}}||jkr||jkrl|j|}|dkrtd|n|j||j|}|j||||<q0d||<|di||<q0Wi} xJ|jD]>\}} x4| D],} | | krtd|| || | f|| | <qWqW||j|<dS)Nrzrecursion for rule %rrzArule %s is ambiguous; %s is in the first sets of %s as well as %s)rrr%r& ValueErrorr?update) rr0r2r3ZtotalsetZ overlapcheckr4r5fsetZinverseZitsfirstZsymbolr r r r?ss2          zParserGenerator.calcfirstc Csi}d}x|jtjkrx|jtjkr.|jqW|jtj}|jtjd|j\}}|jtj|j ||}t |}|j |t |}|||<|dkr |}q W||fS)N:) typer ENDMARKERNEWLINErexpectr=OP parse_rhsmake_dfar" simplify_dfa) rrrr0azr2ZoldlenZnewlenr r r rs"      zParserGenerator.parsec sfdd}fddt|||g}x|D]}i}x<|jD]2}x,|jD]"\}} |dk rJ| |j|iqJWq>WxRt|jD]B\}} x,|D]} | j| krPqWt| |} |j| |j| |qWq.W|S)Ncsi}|||S)Nr )r3base) addclosurer r closures z)ParserGenerator.make_dfa..closurecs>||kr dSd||<x$|jD]\}}|dkr||qWdS)Nr)r%)r3rNr4r5)rOr r rOs z,ParserGenerator.make_dfa..addclosure)DFAStatenfasetr% setdefaultr$r&r'addarc) rr-finishrPr+r3r%Znfastater4r5rRstr )rOr rJs"        zParserGenerator.make_dfac Cstd||g}xt|D]\}}td|||kr4dp6dx^|jD]T\}}||kr^|j|} nt|} |j||dkrtd| qBtd|| fqBWqWdS)NzDump of NFA forz Statez(final)z -> %dz %s -> %d)print enumerater%r)r"r') rr0r-rUZtodor1r3r4r5jr r r dump_nfas   zParserGenerator.dump_nfacCsltd|x\t|D]P\}}td||jr,dp.dx0t|jjD]\}}td||j|fqBWqWdS)NzDump of DFA forz Statez(final)rWz %s -> %d)rXrYr*r$r%r&r))rr0r2r1r3r4r5r r r dump_dfas  zParserGenerator.dump_dfacCs~d}xt|rxd}xft|D]Z\}}xPt|dt|D]:}||}||kr4||=x|D]}|j||qTWd}Pq4WqWqWdS)NTFr)rYranger" unifystate)rr2Zchangesr1Zstate_irZZstate_jr3r r r rKs zParserGenerator.simplify_dfacCs|j\}}|jdkr||fSt}t}|j||j|x6|jdkrt|j|j\}}|j||j|q@W||fSdS)N|) parse_altr>NFAStaterTr)rrLrMZaaZzzr r r rIs       zParserGenerator.parse_rhscCsP|j\}}x:|jdks*|jtjtjfkrF|j\}}|j||}qW||fS)N([)rbrc) parse_itemr>rDrr=STRINGrT)rrLbr.dr r r r` s    zParserGenerator.parse_altcCs|jdkr>|j|j\}}|jtjd|j|||fS|j\}}|j}|dkr`||fS|j|j||dkr||fS||fSdS)Nrc]+*)rirj)r>rrIrGrrHrT parse_atom)rrLrMr>r r r rds     zParserGenerator.parse_itemcCs|jdkr4|j|j\}}|jtjd||fS|jtjtjfkrpt }t }|j ||j|j||fS|j d|j|jdS)Nrb)z+expected (...) or NAME or STRING, got %s/%s) r>rrIrGrrHrDr=rerarT raise_error)rrLrMr r r rk(s  zParserGenerator.parse_atomcCsD|j|ks|dk r2|j|kr2|jd|||j|j|j}|j|S)Nzexpected %s/%s, got %s/%s)rDr>rmr)rrDr>r r r rG9s zParserGenerator.expectcCsJt|j}x"|dtjtjfkr,t|j}q W|\|_|_|_|_|_ dS)Nr) r5rrCOMMENTNLrDr>Zbeginendline)rtupr r r rAs zParserGenerator.gettokenc Gs^|r8y ||}Wn&dj|gttt|}YnXt||j|jd|jd|jfdS)N rr)joinrmapstr SyntaxErrorrrprq)rmsgargsr r r rmHs  zParserGenerator.raise_error)N)N)rrrrr6r,r(rr?rrJr[r\rKrIr`rdrkrGrrmr r r r r s$  .$  r c@seZdZddZdddZdS)racCs g|_dS)N)r%)rr r r rSszNFAState.__init__NcCs|jj||fdS)N)r%r')rr5r4r r r rTVszNFAState.addarc)N)rrrrrTr r r r raQsrac@s0eZdZddZddZddZddZd Zd S) rQcCs||_||k|_i|_dS)N)rRr*r%)rrRfinalr r r r]s zDFAState.__init__cCs||j|<dS)N)r%)rr5r4r r r rTeszDFAState.addarccCs.x(|jjD]\}}||kr ||j|<q WdS)N)r%r&)roldnewr4r5r r r r^kszDFAState.unifystatecCsX|j|jkrdSt|jt|jkr(dSx*|jjD]\}}||jj|k r4dSq4WdS)NFT)r*r"r%r&get)rotherr4r5r r r __eq__ps zDFAState.__eq__N)rrrrrTr^r__hash__r r r r rQ[s rQ Grammar.txtcCst|}|jS)N)r r6)rpr r r generate_grammarsrN)r) rWrrrZGrammarrobjectr rarQrr r r r sI %PKb31].9&9&__pycache__/pgen.cpython-36.pycnu[3 \5@sdddlmZmZmZGdddejZGdddeZGdddeZGdd d eZ dd d Z d S))grammartokentokenizec@s eZdZdS) PgenGrammarN)__name__ __module__ __qualname__r r */usr/lib64/python3.6/lib2to3/pgen2/pgen.pyrsrc@seZdZd&ddZddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ ddZ ddZddZddZddZd'd d!Zd"d#Zd$d%ZdS)(ParserGeneratorNcCsld}|dkrt|}|j}||_||_tj|j|_|j|j \|_ |_ |dk rZ|i|_ |j dS)N)openclosefilenamestreamrgenerate_tokensreadline generatorgettokenparsedfas startsymbolfirst addfirstsets)selfrrZ close_streamr r r __init__ szParserGenerator.__init__c Cs*t}t|jj}|j|j|j|jd|jx.|D]&}dt|j }||j |<||j |<qtj|}||j kr@|j |S|jj|df||j |<|SdS)Nr"')r8r9)r"Zlabelsisalphar#Z symbol2labelr'getattrr isinstanceintAssertionErrortok_nametokensevalkeywordsNAMErZopmap)rr.r4r7Zitokenvaluer r r r(=s<                 zParserGenerator.make_labelcCs<t|jj}|jx |D]}||jkr|j|qWdS)N)rrrrr calcfirst)rr/r0r r r rks   zParserGenerator.addfirstsetsc Cs |j|}d|j|<|d}i}i}x|jjD]x\}}||jkr||jkrl|j|}|dkrtd|n|j||j|}|j||||<q0d||<|di||<q0Wi} xJ|jD]>\}} x4| D],} | | krtd|| || | f|| | <qWqW||j|<dS)Nrzrecursion for rule %rrzArule %s is ambiguous; %s is in the first sets of %s as well as %s)rrr%r& ValueErrorrEupdate) rr0r2r3ZtotalsetZ overlapcheckr4r5fsetZinverseZitsfirstZsymbolr r r rEss2          zParserGenerator.calcfirstc Csi}d}x|jtjkrx|jtjkr.|jqW|jtj}|jtjd|j\}}|jtj|j ||}t |}|j |t |}|||<|dkr |}q W||fS)N:) typer ENDMARKERNEWLINErexpectrCOP parse_rhsmake_dfar" simplify_dfa) rrrr0azr2ZoldlenZnewlenr r r rs"      zParserGenerator.parsec st|tstt|tstfdd}fddt|||g}x|D]}i}x<|jD]2}x,|jD]"\}} |dk rf| |j|iqfWqZWxRt|jD]B\}} x,|D]} | j| krPqWt| |} |j | |j | |qWqJW|S)Ncsi}|||S)Nr )r3base) addclosurer r closures z)ParserGenerator.make_dfa..closurecsLt|tst||krdSd||<x$|jD]\}}|dkr*||q*WdS)Nr)r<NFAStater>r%)r3rTr4r5)rUr r rUsz,ParserGenerator.make_dfa..addclosure) r<rWr>DFAStatenfasetr% setdefaultr$r&r'addarc) rr-finishrVr+r3r%Znfastater4r5rYstr )rUr rPs&        zParserGenerator.make_dfac Cstd||g}xt|D]\}}td|||kr4dp6dx^|jD]T\}}||kr^|j|} nt|} |j||dkrtd| qBtd|| fqBWqWdS)NzDump of NFA forz Statez(final)z -> %dz %s -> %d)print enumerater%r)r"r') rr0r-r\Ztodor1r3r4r5jr r r dump_nfas   zParserGenerator.dump_nfacCsltd|x\t|D]P\}}td||jr,dp.dx0t|jjD]\}}td||j|fqBWqWdS)NzDump of DFA forz Statez(final)r^z %s -> %d)r_r`r*r$r%r&r))rr0r2r1r3r4r5r r r dump_dfas  zParserGenerator.dump_dfacCs~d}xt|rxd}xft|D]Z\}}xPt|dt|D]:}||}||kr4||=x|D]}|j||qTWd}Pq4WqWqWdS)NTFr)r`ranger" unifystate)rr2Zchangesr1Zstate_iraZstate_jr3r r r rQs zParserGenerator.simplify_dfacCs|j\}}|jdkr||fSt}t}|j||j|x6|jdkrt|j|j\}}|j||j|q@W||fSdS)N|) parse_altrDrWr[r)rrRrSZaaZzzr r r rOs       zParserGenerator.parse_rhscCsP|j\}}x:|jdks*|jtjtjfkrF|j\}}|j||}qW||fS)N([)rhri) parse_itemrDrJrrCSTRINGr[)rrRbr.dr r r rg s    zParserGenerator.parse_altcCs|jdkr>|j|j\}}|jtjd|j|||fS|j\}}|j}|dkr`||fS|j|j||dkr||fS||fSdS)Nri]+*)rorp)rDrrOrMrrNr[ parse_atom)rrRrSrDr r r rjs     zParserGenerator.parse_itemcCs|jdkr4|j|j\}}|jtjd||fS|jtjtjfkrpt }t }|j ||j|j||fS|j d|j|jdS)Nrh)z+expected (...) or NAME or STRING, got %s/%s) rDrrOrMrrNrJrCrkrWr[ raise_error)rrRrSr r r rq(s  zParserGenerator.parse_atomcCsD|j|ks|dk r2|j|kr2|jd|||j|j|j}|j|S)Nzexpected %s/%s, got %s/%s)rJrDrsr)rrJrDr r r rM9s zParserGenerator.expectcCsJt|j}x"|dtjtjfkr,t|j}q W|\|_|_|_|_|_ dS)Nr) r5rrCOMMENTNLrJrDZbeginendline)rtupr r r rAs zParserGenerator.gettokenc Gs^|r8y ||}Wn&dj|gttt|}YnXt||j|jd|jd|jfdS)N rr)joinrmapstr SyntaxErrorrrvrw)rmsgargsr r r rsHs  zParserGenerator.raise_error)N)N)rrrrr6r,r(rrErrPrbrcrQrOrgrjrqrMrrsr r r r r s$  .$  r c@seZdZddZdddZdS)rWcCs g|_dS)N)r%)rr r r rSszNFAState.__init__NcCs8|dkst|tstt|ts$t|jj||fdS)N)r<r|r>rWr%r')rr5r4r r r r[VszNFAState.addarc)N)rrrrr[r r r r rWQsrWc@s0eZdZddZddZddZddZd Zd S) rXcCsLt|tstttt|ts$tt|ts2t||_||k|_i|_dS)N) r<dictr>r5iterrWrYr*r%)rrYfinalr r r r]s  zDFAState.__init__cCs8t|tst||jkstt|ts*t||j|<dS)N)r<r|r>r%rX)rr5r4r r r r[eszDFAState.addarccCs.x(|jjD]\}}||kr ||j|<q WdS)N)r%r&)roldnewr4r5r r r rekszDFAState.unifystatecCsft|tst|j|jkrdSt|jt|jkr6dSx*|jjD]\}}||jj|k rBdSqBWdS)NFT)r<rXr>r*r"r%r&get)rotherr4r5r r r __eq__ps zDFAState.__eq__N)rrrrr[rer__hash__r r r r rX[s rX Grammar.txtcCst|}|jS)N)r r6)rpr r r generate_grammarsrN)r) r^rrrZGrammarrobjectr rWrXrr r r r sI %PKb31]mS'__pycache__/driver.cpython-36.opt-2.pycnu[3 \@sdZddgZddlZddlZddlZddlZddlZddlZddlm Z m Z m Z m Z m Z GdddeZdd Zdd dZddZddZddZedkrejee dS)z#Guido van Rossum Driver load_grammarN)grammarparsetokentokenizepgenc@sHeZdZdddZdddZdddZdd d Zdd d Zdd dZdS)rNcCs&||_|dkrtj}||_||_dS)N)rlogging getLoggerloggerconvert)selfrr r r,/usr/lib64/python3.6/lib2to3/pgen2/driver.py__init__ s zDriver.__init__FcCsvtj|j|j}|jd}d}d}}}} } d} x4|D]} | \}}}} } |||fkr|\} }|| kr| d| |7} | }d}||kr| | ||7} |}|tjtjfkr| |7} | \}}|jdr@|d7}d}q@|t j krtj |}|r|j j dt j||| |j||| |fr6|r4|j j dPd} | \}}|jdr@|d7}d}q@Wtjd||| |f|jS)Nrr z%s %r (prefix=%r)zStop.zincomplete input)rZParserrr ZsetuprCOMMENTNLendswithrOPZopmapr debugtok_nameZaddtokenZ ParseErrorZrootnode)rtokensrplinenocolumntypevaluestartendZ line_textprefixZ quintupleZs_linenoZs_columnrrr parse_tokens'sR      zDriver.parse_tokenscCstj|j}|j||S)N)rgenerate_tokensreadliner#)rstreamrrrrrparse_stream_rawWs zDriver.parse_stream_rawcCs |j||S)N)r')rr&rrrr parse_stream\szDriver.parse_streamc Cs*tj|d|}z |j||S|jXdS)Nr)codecsopenr(close)rfilenameencodingrr&rrr parse_file`s zDriver.parse_filecCstjtj|j}|j||S)N)rr$ioStringIOr%r#)rtextrrrrr parse_stringhszDriver.parse_string)NN)F)F)F)NF)F) __name__ __module__ __qualname__rr#r'r(r/r3rrrrrs   0   cCs:tjj|\}}|dkrd}||djtttjdS)Nz.txtr.z.pickle)ospathsplitextjoinmapstrsys version_info)gtheadtailrrr_generate_pickle_namensrC Grammar.txtTFcCs|dkrtj}|dkr t|n|}|s4t|| r|jd|tj|}|r|jd|y|j|Wqtk r}z|jd|WYdd}~XqXnt j }|j ||S)Nz!Generating grammar tables from %szWriting grammar tables to %szWriting failed: %s) r r rC_newerinfor Zgenerate_grammardumpOSErrorrGrammarload)r@Zgpsaveforcer gerrrrus     cCs8tjj|sdStjj|s dStjj|tjj|kS)NFT)r8r9existsgetmtime)abrrrrEs   rEcCsFtjj|rt|Sttjj|}tj||}tj }|j ||S)N) r8r9isfilerrCbasenamepkgutilget_datarrIloads)packageZgrammar_sourceZ pickled_namedatarMrrrload_packaged_grammars   rZcGsF|stjdd}tjtjtjddx|D]}t|dddq,WdS)Nrz %(message)s)levelr&formatT)rKrL)r>argvr Z basicConfigINFOstdoutr)argsr@rrrmains  ra__main__)rDNTFN) __author____all__r*r0r8r rUr>rrrrrr objectrrCrrErZrar4exitintrrrrs"P   PKb31]qM (__pycache__/grammar.cpython-36.opt-2.pycnu[3 \@stddlZddlZddlmZmZGdddeZddZdZiZ x.ej D]"Z e rJe j \Z Zeeee e <qJWdS) N)tokentokenizec@s<eZdZddZddZddZddZd d Zd d Zd S)GrammarcCs<i|_i|_g|_i|_dg|_i|_i|_i|_d|_dS)NrEMPTY)rr) symbol2number number2symbolstatesdfaslabelskeywordstokens symbol2labelstart)selfr-/usr/lib64/python3.6/lib2to3/pgen2/grammar.py__init__MszGrammar.__init__c Cs2t|d}t|j}tj||dWdQRXdS)Nwb)open_make_deterministic__dict__pickledump)rfilenamefdrrrrXs  z Grammar.dumpc Cs0t|d}tj|}WdQRX|jj|dS)Nrb)rrloadrupdate)rrrrrrrr is z Grammar.loadcCs|jjtj|dS)N)rr!rloads)rZpklrrrr"osz Grammar.loadscCsX|j}x"dD]}t||t||jqW|jdd|_|jdd|_|j|_|S)Nrr r r rr)rr r r rr) __class__setattrgetattrcopyr r r)rnewZ dict_attrrrrr&ssz Grammar.copycCsvddlm}td||jtd||jtd||jtd||jtd||jtd|jdS) Nr)pprintZs2nZn2sr r r r)r(printrr r r r r)rr(rrrreports      zGrammar.reportN) __name__ __module__ __qualname__rrr r"r&r*rrrrrs 6  rcCs^t|tr&tjtdd|jDSt|tr>dd|DSt|trZtdd|DS|S)Ncss|]\}}|t|fVqdS)N)r).0kvrrr sz&_make_deterministic..cSsg|] }t|qSr)r)r.errr sz'_make_deterministic..css|]}t|VqdS)N)r)r.r2rrrr1s) isinstancedict collections OrderedDictsorteditemslisttuple)toprrrrs   ra ( LPAR ) RPAR [ LSQB ] RSQB : COLON , COMMA ; SEMI + PLUS - MINUS * STAR / SLASH | VBAR & AMPER < LESS > GREATER = EQUAL . DOT % PERCENT ` BACKQUOTE { LBRACE } RBRACE @ AT @= ATEQUAL == EQEQUAL != NOTEQUAL <> NOTEQUAL <= LESSEQUAL >= GREATEREQUAL ~ TILDE ^ CIRCUMFLEX << LEFTSHIFT >> RIGHTSHIFT ** DOUBLESTAR += PLUSEQUAL -= MINEQUAL *= STAREQUAL /= SLASHEQUAL %= PERCENTEQUAL &= AMPEREQUAL |= VBAREQUAL ^= CIRCUMFLEXEQUAL <<= LEFTSHIFTEQUAL >>= RIGHTSHIFTEQUAL **= DOUBLESTAREQUAL // DOUBLESLASH //= DOUBLESLASHEQUAL -> RARROW )r6rrrobjectrrZ opmap_rawZopmap splitlineslinesplitopnamer%rrrrsy= PKb31] PP%__pycache__/conv.cpython-36.opt-2.pycnu[3 \%@s.ddlZddlmZmZGdddejZdS)N)grammartokenc@s,eZdZddZddZddZddZd S) ConvertercCs |j||j||jdS)N)parse_graminit_hparse_graminit_c finish_off)selfZ graminit_hZ graminit_cr */usr/lib64/python3.6/lib2to3/pgen2/conv.pyrun/s  z Converter.runc Csy t|}Wn0tk r<}ztd||fdSd}~XnXi|_i|_d}xn|D]f}|d7}tjd|}| r|jrtd|||jfqT|j\}}t |}||j|<||j|<qTWdS)NzCan't open %s: %sFrz^#define\s+(\w+)\s+(\d+)$z%s(%s): can't parse %sT) openOSErrorprintZ symbol2numberZ number2symbolrematchstripgroupsint) rfilenameferrlinenolinemosymbolnumberr r r r5s&     zConverter.parse_graminit_hc!Csy t|}Wn0tk r<}ztd||fdSd}~XnXd}|dt|}}|dt|}}|dt|}}i}g}x|jdrx|jdrLtjd|}ttt |j \} } } g} xRt | D]F} |dt|}}tjd|}ttt |j \}}| j ||fqW|dt|}}| || | f<|dt|}}qWtjd|}ttt |j \}}g}x^t |D]R} |dt|}}tjd |}ttt |j \} } } || | f} |j | q~W|j ||dt|}}|dt|}}qW||_ i}tjd |}t |jd}xt |D]}|dt|}}tjd |}|jd }ttt |jdd dd\}}}}||}|dt|}}tjd|}i}t|jd}xPt|D]D\}}t|}x0t dD]$}|d|>@rd||d|<qWqW||f||<q4W|dt|}}||_g}|dt|}}tjd|}t |jd}xjt |D]^}|dt|}}tjd|}|j \}}t |}|dkrd}nt|}|j ||fqpW|dt|}}||_|dt|}}|dt|}}tjd|}t |jd}|dt|}}|dt|}}tjd|}t |jd}|dt|}}tjd|}t |jd} | |_|dt|}}y|dt|}}Wntk rYnXdS)NzCan't open %s: %sFrr z static arc z)static arc arcs_(\d+)_(\d+)\[(\d+)\] = {$z\s+{(\d+), (\d+)},$z'static state states_(\d+)\[(\d+)\] = {$z\s+{(\d+), arcs_(\d+)_(\d+)},$zstatic dfa dfas\[(\d+)\] = {$z0\s+{(\d+), "(\w+)", (\d+), (\d+), states_(\d+),$z\s+("(?:\\\d\d\d)*")},$z!static label labels\[(\d+)\] = {$z\s+{(\d+), (0|"\w+")},$0z \s+(\d+),$z\s+{(\d+), labels},$z \s+(\d+)$)r rrnext startswithrrlistmaprrrangeappendstatesgroupeval enumerateorddfaslabelsstart StopIteration)!rrrrrrZallarcsr)rnmkZarcs_ijststater.ZndfasrrxyzfirstZ rawbitsetcZbyter/Znlabelsr0r r r rTs         "        zConverter.parse_graminit_ccCs\i|_i|_xJt|jD]<\}\}}|tjkrB|dk rB||j|<q|dkr||j|<qWdS)N)keywordstokensr,r/rNAME)rZilabeltypevaluer r r rs zConverter.finish_offN)__name__ __module__ __qualname__r rrrr r r r r$s  &r)rZpgen2rrZGrammarrr r r r sPKb31]   &__pycache__/parse.cpython-36.opt-2.pycnu[3 \u@s0ddlmZGdddeZGdddeZdS))tokenc@seZdZddZdS) ParseErrorcCs4tj|d||||f||_||_||_||_dS)Nz!%s: type=%r, value=%r, context=%r) Exception__init__msgtypevaluecontext)selfrrrr r +/usr/lib64/python3.6/lib2to3/pgen2/parse.pyrs zParseError.__init__N)__name__ __module__ __qualname__rr r r r rsrc@sHeZdZdddZdddZddZdd Zd d Zd d ZddZ dS)ParserNcCs||_|pdd|_dS)NcSs|S)Nr )grammarnoder r r Wsz!Parser.__init__..)rconvert)r rrr r r r9szParser.__init__cCsH|dkr|jj}|ddgf}|jj|d|f}|g|_d|_t|_dS)N)rstartdfasstackrootnodeset used_names)r rnewnodeZ stackentryr r r setupYs  z Parser.setupcCs:|j|||}x$|jd\}}}|\}} ||} x| D]\} } |jj| \} }|| kr|j||| || }x@||d|fgkr|j|jsdS|jd \}}}|\}} qpWdS| dkr:|jj| }|\}}||kr:|j| |jj| | |Pq:Wd|f| kr$|j|js2td|||qtd|||qWdS) NrrTFztoo much inputz bad inputr) classifyrrZlabelsshiftpoprpushr)r rrr ilabeldfastaterZstatesfirstZarcsinewstatetvZitsdfaZ itsstatesZitsfirstr r r addtokenqs:   zParser.addtokencCsX|tjkr0|jj||jjj|}|dk r0|S|jjj|}|dkrTtd||||S)Nz bad token) rNAMEraddrkeywordsgettokensr)r rrr r$r r r r s  zParser.classifyc CsT|jd\}}}|||df}|j|j|}|dk r@|dj||||f|jd<dS)Nrrrr)rrrappend) r rrr)r r%r&rrr r r r!s  z Parser.shiftc CsB|jd\}}}|d|gf}|||f|jd<|jj|d|fdS)Nrrrr)rr2) r rZnewdfar)r r%r&rrr r r r#s z Parser.pushcCs`|jj\}}}|j|j|}|dk r\|jrL|jd\}}}|dj|n||_|j|j_dS)Nrrr)rr"rrr2rr)r ZpopdfaZpopstateZpopnoderr%r&rr r r r"sz Parser.pop)N)N) r rrrrr,r r!r#r"r r r r rs 0 rN)rrrobjectrr r r r s  PKb31]&w,w,)__pycache__/tokenize.cpython-36.opt-2.pycnu[3 \NX=@sdZdZddlZddlZddlmZmZddlTddlm Z dd e e Dd d d gZ [ ye Wne k rzeZ YnXd dZddZddZdZdZeedeeeZdZdZdZdZeddZeeeeeZdZeddeeZdeZeeeZed ed!ZeeeeZ d"Z!d#Z"d$Z#d%Z$d&Z%ee%d'e%d(Z&ee%d)e%d*Z'ed+d,d-d.d/d0d1d2d3 Z(d4Z)ed5d6Z*ee(e)e*Z+ee e+e'eZ,ee,Z-ee%d7ed8de%d9ed:dZ.edee&Z/eee/e e+e.eZ0e1e2ej3e-e0e#e$f\Z4Z5Z6Z7ej3e!ej3e"e6e7e6e7e6e7e6e7e6e7e6e7e6e7e6e7e6e7e6e7e6e7e6e7e6e7e6e7e6e7e6e7e6e7e6e7e6e7e6e7e6e7ddddddddd;4Z8iZ9xdD]Z:e:e9e:<qWiZ;xdD]Z:e:e;e:<qWdZGddde=Z?ddZ@e@fdd ZAddZBGdddZCej3dejDZEej3dejDZFddZGddZHdd ZIdd ZJeKdkrddlLZLeMeLjNdkrxeAeOeLjNdjPn eAeLjQjPdS)zKa-Ping Yee z@GvR, ESR, Tim Peters, Thomas Wouters, Fred Drake, Skip MontanaroN)BOM_UTF8lookup)*)tokencCsg|]}|ddkr|qS)r_).0xrr./usr/lib64/python3.6/lib2to3/pgen2/tokenize.py %sr tokenizegenerate_tokens untokenizecGsddj|dS)N(|))join)choicesrrr group0srcGs t|dS)Nr)r)rrrr any1srcGs t|dS)N?)r)rrrr maybe2srz[ \f\t]*z #[^\r\n]*z\\\r?\nz [a-zA-Z_]\w*z0[bB]_?[01]+(?:_[01]+)*z(0[xX]_?[\da-fA-F]+(?:_[\da-fA-F]+)*[lL]?z0[oO]?_?[0-7]+(?:_[0-7]+)*[lL]?z[1-9]\d*(?:_\d+)*[lL]?z0[lL]?z[eE][-+]?\d+(?:_\d+)*z\d+(?:_\d+)*\.(?:\d+(?:_\d+)*)?z\.\d+(?:_\d+)*z \d+(?:_\d+)*z\d+(?:_\d+)*[jJ]z[jJ]z[^'\\]*(?:\\.[^'\\]*)*'z[^"\\]*(?:\\.[^"\\]*)*"z%[^'\\]*(?:(?:\\.|'(?!''))[^'\\]*)*'''z%[^"\\]*(?:(?:\\.|"(?!""))[^"\\]*)*"""z#(?:[uUrRbBfF]|[rR][bB]|[bBuU][rR])?'''"""z'[^\n'\\]*(?:\\.[^\n'\\]*)*'z"[^\n"\\]*(?:\\.[^\n"\\]*)*"z\*\*=?z>>=?z<<=?z<>z!=z//=?z->z[+\-*/%&@|^=<>]=?~z[][(){}]z\r?\nz[:;.,`@]z'[^\n'\\]*(?:\\.[^\n'\\]*)*'z"[^\n"\\]*(?:\\.[^\n"\\]*)*")4rrz'''z"""zr'''zr"""zu'''zu"""zb'''zb"""zf'''zf"""zur'''zur"""zbr'''zbr"""zrb'''zrb"""zR'''zR"""zU'''zU"""zB'''zB"""zF'''zF"""zuR'''zuR"""zUr'''zUr"""zUR'''zUR"""zbR'''zbR"""zBr'''zBr"""zBR'''zBR"""zrB'''zrB"""zRb'''zRb"""zRB'''zRB"""rRuUfFbBr'''r"""R'''R"""u'''u"""U'''U"""b'''b"""B'''B"""f'''f"""F'''F"""ur'''ur"""Ur'''Ur"""uR'''uR"""UR'''UR"""br'''br"""Br'''Br"""bR'''bR"""BR'''BR"""rb'''rb"""Rb'''Rb"""rB'''rB"""RB'''RB"""r'r"R'R"u'u"U'U"b'b"B'B"f'f"F'F"ur'ur"Ur'Ur"uR'uR"UR'UR"br'br"Br'Br"bR'bR"BR'BR"rb'rb"Rb'Rb"rB'rB"RB'RB"c@s eZdZdS) TokenErrorN)__name__ __module__ __qualname__rrrr rwsrwc@s eZdZdS)StopTokenizingN)rxryrzrrrr r{sr{c Cs4|\}}|\}}td||||t|t|fdS)Nz%d,%d-%d,%d: %s %s)printtok_namerepr) typerZxxx_todo_changemeZxxx_todo_changeme1lineZsrowZscolZerowZecolrrr printtokensrc Cs(yt||Wntk r"YnXdS)N) tokenize_loopr{)readline tokeneaterrrr r s cCsxt|D] }||q WdS)N)r)rrZ token_inforrr rsrc@s,eZdZddZddZddZddZd S) UntokenizercCsg|_d|_d|_dS)Nrr)tokensprev_rowprev_col)selfrrr __init__szUntokenizer.__init__cCs*|\}}||j}|r&|jjd|dS)N )rrappend)rstartrowcol col_offsetrrr add_whitespaces zUntokenizer.add_whitespacecCsxv|D]n}t|dkr$|j||P|\}}}}}|j||jj||\|_|_|ttfkr|jd7_d|_qWdj |jS)Nrr) lencompatrrrrrNEWLINENLr)riterablettok_typerrendrrrr rs        zUntokenizer.untokenizec Csd}g}|jj}|\}}|ttfkr,|d7}|ttfkr|t kr|j qBn*|ttfkrd}n|r|r||dd}||qBWdS)NFrTrr) rrNAMENUMBERrrASYNCAWAITINDENTDEDENTpop) rrr startlineindents toks_appendtoknumtokvaltokrrr rs0      zUntokenizer.compatN)rxryrzrrrrrrrr rsrz&^[ \t\f]*#.*?coding[:=][ \t]*([-\w.]+)s^[ \t\f]*(?:[#\r\n]|$)cCsH|ddjjdd}|dks*|jdr.dS|d ks@|jd rDdS|S)N r-zutf-8zutf-8-latin-1 iso-8859-1 iso-latin-1latin-1- iso-8859-1- iso-latin-1-)rrr)rrr)lowerreplace startswith)orig_encencrrr _get_normal_names rcsdd}d}fdd}fdd}|}|jtrHd|dd}d }|sT|gfS||}|rj||gfStj|s~||gfS|}|s||gfS||}|r|||gfS|||gfS) NFzutf-8c s"yStk rtSXdS)N) StopIterationbytesr)rrr read_or_stop sz%detect_encoding..read_or_stopcsy|jd}Wntk r"dSXtj|}|s6dSt|jd}y t|}Wn tk rptd|YnXr|j dkrtd|d7}|S)Nasciirzunknown encoding: zutf-8zencoding problem: utf-8z-sig) decodeUnicodeDecodeError cookie_rematchrrr LookupError SyntaxErrorname)r line_stringrencodingcodec) bom_foundrr find_cookie&s"   z$detect_encoding..find_cookieTz utf-8-sig)rrblank_rer)rrdefaultrrfirstsecondr)rrr detect_encoding s0         rcCst}|j|S)N)rr)rutrrr rTsc!csd}}}tjdd}}d\}}d}dg} d} d} d} d} xy |}Wntk rdd}YnX|d}dt|}}|rF|std||j|}|r|jd}}t||d||||f||fVd \}}d}nd|r0|d!dd kr0|d"dd kr0t||||t|f|fVd}d}qBn||}||}qBnF|dkrt| rt|s`Pd}xf||kr||d kr|d}n6||d kr|t dt }n||dkrd}nP|d}qfW||krP| r| Vd} ||dkr||dkrh||dj d}|t|}t |||f||t|f|fVt ||d||f|t|f|fVqBt t f||dk||d||f|t|f|fVqB|| d#kr| j |t|d||df||f|fVxt|| d$krJ|| krtdd|||f| dd%} | r.| | d&kr.d} d} d} td||f||f|fVqW| r| r| | d'krd} d} d} n|std|dfd}x||kr8tj||}|r |jd\}}||f||f|}}}|||||}}||ks|dkr|dkrt||||fVq4|dkrft}|dkr8t }n | rBd} | rR| Vd} |||||fVq4|dkr| r| Vd} t ||||fVq4|tkrt|}|j||}|r|jd}|||}| r| Vd} t||||f|fVn||f}||d}|}Pq4|tks@|ddtks@|dd tkr|d(dkr||f}t|pxt|dpxt|d}||dd}}|}Pn | r| Vd} t||||fVq4||kr|d)kr| r|dkrtnt||||fVqt||||f}|dkr| r|} q|dkrx| rx| dtkrx| ddkrxd} | d*} t| d| d| d | dfVd} | r| Vd} |Vnz|dkr| r| Vd} t ||||f|fVd}nF|dkr|d}n|dkr|d}| r| Vd} t||||fVn(t||||f||df|fV|d}qWqBW| rN| Vd} x.| ddD]} td|df|dfdfVq\Wtd|df|dfdfVdS)+Nrr 0123456789rFrzEOF in multi-line stringrz\ rz\ r  z# #z z3unindent does not match any outer indentation levelz zEOF in multi-line statement.T asyncawaitdef\z([{z)]})rr)rrrrrrrr)rrr)stringZ ascii_lettersrrrwrrSTRING ERRORTOKENtabsizerstripCOMMENTrrrIndentationErrorr pseudoprogspanrr triple_quotedendprogs single_quotedrrrOP ENDMARKER)!rlnumparenlev continuedZ namecharsnumcharscontstrneedcontcontlinerstashed async_defasync_def_indent async_def_nlrposmaxstrstartendprogendmatchrcolumn comment_tokennl_pos pseudomatchrsposeposrinitialnewlinerindentrrr risp     *                             __main__)*rrr&r'r(r)r*r+r,r-r.r/r0r1r2r3r4r5r6r7r8r9r:r;r<r=r>r?r@rArBrCrDrErFrGrHrIrJrKrLrM)*rrrNrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtru)R __author__ __credits__rrecodecsrrZlib2to3.pgen2.tokenrrdir__all__r NameErrorstrrrr WhitespaceCommentIgnoreName Binnumber Hexnumber Octnumber Decnumber IntnumberExponent PointfloatExpfloat Floatnumber ImagnumberNumberSingleDoubleSingle3Double3Z _litprefixTripleStringOperatorBracketSpecialFunny PlainTokenTokenContStr PseudoExtras PseudoTokenlistmapcompileZ tokenprogrZ single3progZ double3progrrrrr Exceptionrwr{rr rrASCIIrrrrrrrxsysrargvopenrstdinrrrr s              8 Ic PKb31]v];;)__pycache__/tokenize.cpython-36.opt-1.pycnu[3 \NX=@sdZdZdZddlZddlZddlmZmZddlTddl m Z d d e e Dd d d gZ [ ye Wnek r~eZ YnXddZddZddZdZdZeedeeeZdZdZdZdZeddZeeeeeZdZeddeeZd eZeeeZed!ed"Z ee eeZ!d#Z"d$Z#d%Z$d&Z%d'Z&ee&d(e&d)Z'ee&d*e&d+Z(ed,d-d.d/d0d1d2d3d4 Z)d5Z*ed6d7Z+ee)e*e+Z,ee!e,e(eZ-ee-Z.ee&d8ed9de&d:ed;dZ/edee'Z0eee0e!e,e/eZ1e2e3ej4e.e1e$e%f\Z5Z6Z7Z8ej4e"ej4e#e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8ddddddddd<4Z9iZ:xdD]Z;e;e:e;<qWiZZ?Gddde>Z@ddZAeAfdd ZBddZCGdddZDej4dejEZFej4dejEZGddZHddZIdd ZJdd ZKeLdkrddlMZMeNeMjOdkr|eBePeMjOdjQn eBeMjRjQdS)aTokenization help for Python programs. generate_tokens(readline) is a generator that breaks a stream of text into Python tokens. It accepts a readline-like method which is called repeatedly to get the next line of input (or "" for EOF). It generates 5-tuples with these members: the token type (see token.py) the token (a string) the starting (row, column) indices of the token (a 2-tuple of ints) the ending (row, column) indices of the token (a 2-tuple of ints) the original line (string) It is designed to match the working of the Python tokenizer exactly, except that it produces COMMENT tokens for comments and gives type OP for all operators Older entry points tokenize_loop(readline, tokeneater) tokenize(readline, tokeneater=printtoken) are the same, except instead of generating tokens, tokeneater is a callback function to which the 5 fields described above are passed as 5 arguments, each time a new token is found.zKa-Ping Yee z@GvR, ESR, Tim Peters, Thomas Wouters, Fred Drake, Skip MontanaroN)BOM_UTF8lookup)*)tokencCsg|]}|ddkr|qS)r_).0xrr./usr/lib64/python3.6/lib2to3/pgen2/tokenize.py %sr tokenizegenerate_tokens untokenizecGsddj|dS)N(|))join)choicesrrr group0srcGs t|dS)Nr)r)rrrr any1srcGs t|dS)N?)r)rrrr maybe2srz[ \f\t]*z #[^\r\n]*z\\\r?\nz [a-zA-Z_]\w*z0[bB]_?[01]+(?:_[01]+)*z(0[xX]_?[\da-fA-F]+(?:_[\da-fA-F]+)*[lL]?z0[oO]?_?[0-7]+(?:_[0-7]+)*[lL]?z[1-9]\d*(?:_\d+)*[lL]?z0[lL]?z[eE][-+]?\d+(?:_\d+)*z\d+(?:_\d+)*\.(?:\d+(?:_\d+)*)?z\.\d+(?:_\d+)*z \d+(?:_\d+)*z\d+(?:_\d+)*[jJ]z[jJ]z[^'\\]*(?:\\.[^'\\]*)*'z[^"\\]*(?:\\.[^"\\]*)*"z%[^'\\]*(?:(?:\\.|'(?!''))[^'\\]*)*'''z%[^"\\]*(?:(?:\\.|"(?!""))[^"\\]*)*"""z#(?:[uUrRbBfF]|[rR][bB]|[bBuU][rR])?'''"""z'[^\n'\\]*(?:\\.[^\n'\\]*)*'z"[^\n"\\]*(?:\\.[^\n"\\]*)*"z\*\*=?z>>=?z<<=?z<>z!=z//=?z->z[+\-*/%&@|^=<>]=?~z[][(){}]z\r?\nz[:;.,`@]z'[^\n'\\]*(?:\\.[^\n'\\]*)*'z"[^\n"\\]*(?:\\.[^\n"\\]*)*")4rrz'''z"""zr'''zr"""zu'''zu"""zb'''zb"""zf'''zf"""zur'''zur"""zbr'''zbr"""zrb'''zrb"""zR'''zR"""zU'''zU"""zB'''zB"""zF'''zF"""zuR'''zuR"""zUr'''zUr"""zUR'''zUR"""zbR'''zbR"""zBr'''zBr"""zBR'''zBR"""zrB'''zrB"""zRb'''zRb"""zRB'''zRB"""rRuUfFbBr'''r"""R'''R"""u'''u"""U'''U"""b'''b"""B'''B"""f'''f"""F'''F"""ur'''ur"""Ur'''Ur"""uR'''uR"""UR'''UR"""br'''br"""Br'''Br"""bR'''bR"""BR'''BR"""rb'''rb"""Rb'''Rb"""rB'''rB"""RB'''RB"""r'r"R'R"u'u"U'U"b'b"B'B"f'f"F'F"ur'ur"Ur'Ur"uR'uR"UR'UR"br'br"Br'Br"bR'bR"BR'BR"rb'rb"Rb'Rb"rB'rB"RB'RB"c@s eZdZdS) TokenErrorN)__name__ __module__ __qualname__rrrr rwsrwc@s eZdZdS)StopTokenizingN)rxryrzrrrr r{sr{c Cs4|\}}|\}}td||||t|t|fdS)Nz%d,%d-%d,%d: %s %s)printtok_namerepr) typerZxxx_todo_changemeZxxx_todo_changeme1lineZsrowZscolZerowZecolrrr printtokensrc Cs(yt||Wntk r"YnXdS)a: The tokenize() function accepts two parameters: one representing the input stream, and one providing an output mechanism for tokenize(). The first parameter, readline, must be a callable object which provides the same interface as the readline() method of built-in file objects. Each call to the function should return one line of input as a string. The second parameter, tokeneater, must also be a callable object. It is called once for each token, with five arguments, corresponding to the tuples generated by generate_tokens(). N) tokenize_loopr{)readline tokeneaterrrr r s cCsxt|D] }||q WdS)N)r)rrZ token_inforrr rsrc@s,eZdZddZddZddZddZd S) UntokenizercCsg|_d|_d|_dS)Nrr)tokensprev_rowprev_col)selfrrr __init__szUntokenizer.__init__cCs*|\}}||j}|r&|jjd|dS)N )rrappend)rstartrowcol col_offsetrrr add_whitespaces zUntokenizer.add_whitespacecCsxv|D]n}t|dkr$|j||P|\}}}}}|j||jj||\|_|_|ttfkr|jd7_d|_qWdj |jS)Nrr) lencompatrrrrrNEWLINENLr)riterablettok_typerrendrrrr rs        zUntokenizer.untokenizec Csd}g}|jj}|\}}|ttfkr,|d7}|ttfkr|t kr|j qBn*|ttfkrd}n|r|r||dd}||qBWdS)NFrTrr) rrNAMENUMBERrrASYNCAWAITINDENTDEDENTpop) rrr startlineindents toks_appendtoknumtokvaltokrrr rs0      zUntokenizer.compatN)rxryrzrrrrrrrr rsrz&^[ \t\f]*#.*?coding[:=][ \t]*([-\w.]+)s^[ \t\f]*(?:[#\r\n]|$)cCsH|ddjjdd}|dks*|jdr.dS|d ks@|jdrDdS|S)z(Imitates get_normal_name in tokenizer.c.N r-zutf-8zutf-8-latin-1 iso-8859-1 iso-latin-1latin-1- iso-8859-1- iso-latin-1-)rrr)rrr)lowerreplace startswith)orig_encencrrr _get_normal_names rcsdd}d}fdd}fdd}|}|jtrHd|d d}d }|sT|gfS||}|rj||gfStj|s~||gfS|}|s||gfS||}|r|||gfS|||gfS) a The detect_encoding() function is used to detect the encoding that should be used to decode a Python source file. It requires one argument, readline, in the same way as the tokenize() generator. It will call readline a maximum of twice, and return the encoding used (as a string) and a list of any lines (left as bytes) it has read in. It detects the encoding from the presence of a utf-8 bom or an encoding cookie as specified in pep-0263. If both a bom and a cookie are present, but disagree, a SyntaxError will be raised. If the encoding cookie is an invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, 'utf-8-sig' is returned. If no encoding is specified, then the default of 'utf-8' will be returned. FNzutf-8c s"yStk rtSXdS)N) StopIterationbytesr)rrr read_or_stop sz%detect_encoding..read_or_stopcsy|jd}Wntk r"dSXtj|}|s6dSt|jd}y t|}Wn tk rptd|YnXr|j dkrtd|d7}|S)Nasciirzunknown encoding: zutf-8zencoding problem: utf-8z-sig) decodeUnicodeDecodeError cookie_rematchrrr LookupError SyntaxErrorname)r line_stringrencodingcodec) bom_foundrr find_cookie&s"   z$detect_encoding..find_cookieTz utf-8-sig)rrblank_rer)rrdefaultrrfirstsecondr)rrr detect_encoding s0         rcCst}|j|S)aTransform tokens back into Python source code. Each element returned by the iterable must be a token sequence with at least two elements, a token number and token value. If only two tokens are passed, the resulting output is poor. Round-trip invariant for full input: Untokenized source will match input source exactly Round-trip invariant for limited intput: # Output text will tokenize the back to the input t1 = [tok[:2] for tok in generate_tokens(f.readline)] newcode = untokenize(t1) readline = iter(newcode.splitlines(1)).next t2 = [tok[:2] for tokin generate_tokens(readline)] assert t1 == t2 )rr)rutrrr rTsc!csd}}}tjdd}}d \}}d}dg} d} d} d} d} xy |}Wntk rdd}YnX|d}dt|}}|rF|std||j|}|r|jd}}t||d||||f||fVd!\}}d}nd|r0|d"dd kr0|d#dd kr0t||||t|f|fVd}d}qBn||}||}qBnF|dkrt| rt|s`Pd}xf||kr||d kr|d}n6||dkr|t dt }n||dkrd}nP|d}qfW||krP| r| Vd} ||dkr||dkrh||dj d}|t|}t |||f||t|f|fVt ||d||f|t|f|fVqBt t f||dk||d||f|t|f|fVqB|| d$kr| j |t|d||df||f|fVxt|| d%krJ|| krtdd|||f| dd&} | r.| | d'kr.d} d} d} td||f||f|fVqW| r| r| | d(krd} d} d} n|std|dfd}x||kr8tj||}|r |jd\}}||f||f|}}}|||||}}||ks|dkr|dkrt||||fVq4|dkrft}|dkr8t }n | rBd} | rR| Vd} |||||fVq4|dkr| r| Vd} t ||||fVq4|tkrt|}|j||}|r|jd}|||}| r| Vd} t||||f|fVn||f}||d}|}Pq4|tks@|dd tks@|dd tkr|d)dkr||f}t|pxt|dpxt|d }||dd}}|}Pn | r| Vd} t||||fVq4||kr|d*kr| r|dkrtnt||||fVqt||||f}|dkr| r|} q|dkrx| rx| dtkrx| ddkrxd} | d+} t| d| d | d | dfVd} | r| Vd} |Vnz|dkr| r| Vd} t ||||f|fVd}nF|dkr|d}n|dkr|d}| r| Vd} t||||fVn(t||||f||df|fV|d}qWqBW| rN| Vd} x.| ddD]} td|df|dfdfVq\Wtd|df|dfdfVdS),aT The generate_tokens() generator requires one argument, readline, which must be a callable object which provides the same interface as the readline() method of built-in file objects. Each call to the function should return one line of input as a string. Alternately, readline can be a callable function terminating with StopIteration: readline = open(myfile).next # Example of alternate readline The generator produces 5-tuples with these members: the token type; the token string; a 2-tuple (srow, scol) of ints specifying the row and column where the token begins in the source; a 2-tuple (erow, ecol) of ints specifying the row and column where the token ends in the source; and the line on which the token was found. The line passed is the logical line; continuation lines are included. rr 0123456789rNFrzEOF in multi-line stringrz\ rz\ r  z# #z z3unindent does not match any outer indentation levelz zEOF in multi-line statement.T asyncawaitdef\z([{z)]})rr)rrrrrrrr)rrr)stringZ ascii_lettersrrrwrrSTRING ERRORTOKENtabsizerstripCOMMENTrrrIndentationErrorr pseudoprogspanrr triple_quotedendprogs single_quotedrrrOP ENDMARKER)!rlnumparenlev continuedZ namecharsnumcharscontstrneedcontcontlinerstashed async_defasync_def_indent async_def_nlrposmaxstrstartendprogendmatchrcolumn comment_tokennl_pos pseudomatchrsposeposrinitialnewlinerindentrrr risp     *                             __main__)*rrr&r'r(r)r*r+r,r-r.r/r0r1r2r3r4r5r6r7r8r9r:r;r<r=r>r?r@rArBrCrDrErFrGrHrIrJrKrLrM)*rrrNrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtru)S__doc__ __author__ __credits__rrecodecsrrZlib2to3.pgen2.tokenrrdir__all__r NameErrorstrrrr WhitespaceCommentIgnoreName Binnumber Hexnumber Octnumber Decnumber IntnumberExponent PointfloatExpfloat Floatnumber ImagnumberNumberSingleDoubleSingle3Double3Z _litprefixTripleStringOperatorBracketSpecialFunny PlainTokenTokenContStr PseudoExtras PseudoTokenlistmapcompileZ tokenprogrZ single3progZ double3progrrrrr Exceptionrwr{rr rrASCIIrrrrrrrxsysrargvopenrstdinrrrr s              8 Ic PKb31]_Ϩ  &__pycache__/token.cpython-36.opt-2.pycnu[3 \@sLdZdZdZdZdZdZdZdZdZd Z d Z d Z d Z d Z dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZd Z d!Z!d"Z"d#Z#d$Z$d%Z%d&Z&d'Z'd(Z(d)Z)d*Z*d+Z+d,Z,d-Z-d.Z.d/Z/d0Z0d1Z1d2Z2d3Z3d4Z4d5Z5d6Z6d7Z7d8Z8d9Z9d:Z:d;Z;de?j@D]$\ZAZBeCeBeCdkreAe=eB<qWd=d>ZDd?d@ZEdAdBZFdCS)D  !"#$%&'()*+,-./0123456789:;cCs|tkS)N) NT_OFFSET)xr@+/usr/lib64/python3.6/lib2to3/pgen2/token.py ISTERMINALNsrBcCs|tkS)N)r>)r?r@r@rA ISNONTERMINALQsrCcCs|tkS)N) ENDMARKER)r?r@r@rAISEOFTsrEN)GrDNAMENUMBERSTRINGNEWLINEINDENTDEDENTLPARRPARLSQBRSQBCOLONCOMMASEMIPLUSMINUSSTARSLASHVBARAMPERLESSGREATEREQUALDOTPERCENTZ BACKQUOTELBRACERBRACEEQEQUALNOTEQUAL LESSEQUAL GREATEREQUALTILDE CIRCUMFLEX LEFTSHIFT RIGHTSHIFT DOUBLESTAR PLUSEQUALMINEQUAL STAREQUAL SLASHEQUAL PERCENTEQUAL AMPEREQUAL VBAREQUALCIRCUMFLEXEQUALLEFTSHIFTEQUALRIGHTSHIFTEQUALDOUBLESTAREQUAL DOUBLESLASHDOUBLESLASHEQUALATATEQUALOPCOMMENTNLRARROWAWAITASYNC ERRORTOKENN_TOKENSr>tok_namelistglobalsitems_nameZ_valuetyperBrCrEr@r@r@rA sPKb31]S<< __pycache__/token.cpython-36.pycnu[3 \@sPdZdZdZdZdZdZdZdZdZd Z d Z d Z d Z d Z dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZd Z d!Z!d"Z"d#Z#d$Z$d%Z%d&Z&d'Z'd(Z(d)Z)d*Z*d+Z+d,Z,d-Z-d.Z.d/Z/d0Z0d1Z1d2Z2d3Z3d4Z4d5Z5d6Z6d7Z7d8Z8d9Z9d:Z:d;Z;dx6e?e@jAD]$\ZBZCeDeCeDdkr eBe>eC<q Wd>d?ZEd@dAZFdBdCZGdDS)Ez!Token constants (from "token.h").  !"#$%&'()*+,-./0123456789:;cCs|tkS)N) NT_OFFSET)xr@+/usr/lib64/python3.6/lib2to3/pgen2/token.py ISTERMINALNsrBcCs|tkS)N)r>)r?r@r@rA ISNONTERMINALQsrCcCs|tkS)N) ENDMARKER)r?r@r@rAISEOFTsrEN)H__doc__rDNAMENUMBERSTRINGNEWLINEINDENTDEDENTLPARRPARLSQBRSQBCOLONCOMMASEMIPLUSMINUSSTARSLASHVBARAMPERLESSGREATEREQUALDOTPERCENTZ BACKQUOTELBRACERBRACEEQEQUALNOTEQUAL LESSEQUAL GREATEREQUALTILDE CIRCUMFLEX LEFTSHIFT RIGHTSHIFT DOUBLESTAR PLUSEQUALMINEQUAL STAREQUAL SLASHEQUAL PERCENTEQUAL AMPEREQUAL VBAREQUALCIRCUMFLEXEQUALLEFTSHIFTEQUALRIGHTSHIFTEQUALDOUBLESTAREQUAL DOUBLESLASHDOUBLESLASHEQUALATATEQUALOPCOMMENTNLRARROWAWAITASYNC ERRORTOKENN_TOKENSr>tok_namelistglobalsitems_nameZ_valuetyperBrCrEr@r@r@rAsPKb31]5f&__pycache__/parse.cpython-36.opt-1.pycnu[3 \u@s4dZddlmZGdddeZGdddeZdS)zParser engine for the grammar tables generated by pgen. The grammar table must be loaded first. See Parser/parser.c in the Python distribution for additional info on how this parsing engine works. )tokenc@seZdZdZddZdS) ParseErrorz(Exception to signal the parser is stuck.cCs4tj|d||||f||_||_||_||_dS)Nz!%s: type=%r, value=%r, context=%r) Exception__init__msgtypevaluecontext)selfrrrr r +/usr/lib64/python3.6/lib2to3/pgen2/parse.pyrs zParseError.__init__N)__name__ __module__ __qualname____doc__rr r r r rsrc@sLeZdZdZdddZdddZddZd d Zd d Zd dZ ddZ dS)Parsera5Parser engine. The proper usage sequence is: p = Parser(grammar, [converter]) # create instance p.setup([start]) # prepare for parsing : if p.addtoken(...): # parse a token; may raise ParseError break root = p.rootnode # root of abstract syntax tree A Parser instance may be reused by calling setup() repeatedly. A Parser instance contains state pertaining to the current token sequence, and should not be used concurrently by different threads to parse separate token sequences. See driver.py for how to get input tokens by tokenizing a file or string. Parsing is complete when addtoken() returns True; the root of the abstract syntax tree can then be retrieved from the rootnode instance variable. When a syntax error occurs, addtoken() raises the ParseError exception. There is no error recovery; the parser cannot be used after a syntax error was reported (but it can be reinitialized by calling setup()). NcCs||_|pdd|_dS)aConstructor. The grammar argument is a grammar.Grammar instance; see the grammar module for more information. The parser is not ready yet for parsing; you must call the setup() method to get it started. The optional convert argument is a function mapping concrete syntax tree nodes to abstract syntax tree nodes. If not given, no conversion is done and the syntax tree produced is the concrete syntax tree. If given, it must be a function of two arguments, the first being the grammar (a grammar.Grammar instance), and the second being the concrete syntax tree node to be converted. The syntax tree is converted from the bottom up. A concrete syntax tree node is a (type, value, context, nodes) tuple, where type is the node type (a token or symbol number), value is None for symbols and a string for tokens, context is None or an opaque value used for error reporting (typically a (lineno, offset) pair), and nodes is a list of children for symbols, and None for tokens. An abstract syntax tree node may be anything; this is entirely up to the converter function. cSs|S)Nr )grammarnoder r r Wsz!Parser.__init__..N)rconvert)r rrr r r r9szParser.__init__cCsH|dkr|jj}|ddgf}|jj|d|f}|g|_d|_t|_dS)aPrepare for parsing. This *must* be called before starting to parse. The optional argument is an alternative start symbol; it defaults to the grammar's start symbol. You can use a Parser instance to parse any number of programs; each time you call setup() the parser is reset to an initial state determined by the (implicit or explicit) start symbol. N)rstartdfasstackrootnodeset used_names)r rnewnodeZ stackentryr r r setupYs  z Parser.setupcCs:|j|||}x$|jd \}}}|\}} ||} x| D]\} } |jj| \} }|| kr|j||| || }x@||d|fgkr|j|jsdS|jd \}}}|\}} qpWdS| dkr:|jj| }|\}}||kr:|j| |jj| | |Pq:Wd|f| kr$|j|js2td|||qtd|||qWdS) z s  PKb31]z)__pycache__/__init__.cpython-36.opt-2.pycnu[3 \@sdS)Nrrr./usr/lib64/python3.6/lib2to3/pgen2/__init__.pysPKb31]1#__pycache__/literals.cpython-36.pycnu[3 \O @sPdZddlZddddddd d d d d ZddZddZddZedkrLedS)ztdD]2}t|}t|}t|}||kr t||||q WdS)N)ranger r*r0print)r%cr.er&r&r'test2s r6__main__)__doc__r,rr(r0r6__name__r&r&r&r's   PKb31]*u$u$%__pycache__/pgen.cpython-36.opt-2.pycnu[3 \5@sdddlmZmZmZGdddejZGdddeZGdddeZGdd d eZ dd d Z d S))grammartokentokenizec@s eZdZdS) PgenGrammarN)__name__ __module__ __qualname__r r */usr/lib64/python3.6/lib2to3/pgen2/pgen.pyrsrc@seZdZd&ddZddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ ddZ ddZddZddZddZd'd d!Zd"d#Zd$d%ZdS)(ParserGeneratorNcCsld}|dkrt|}|j}||_||_tj|j|_|j|j \|_ |_ |dk rZ|i|_ |j dS)N)openclosefilenamestreamrgenerate_tokensreadline generatorgettokenparsedfas startsymbolfirst addfirstsets)selfrrZ close_streamr r r __init__ szParserGenerator.__init__c Cs*t}t|jj}|j|j|j|jd|jx.|D]&}dt|j }||j |<||j |<qtt|d}||jkrz|j|S|jj|df||j|<|Snt |}|djr||j kr|j |S|jjtj |f||j |<|Sn>t j |}||jkr|j|S|jj|df||j|<|SdS)Nr)r"Zlabelsisalphar#Z symbol2labelr'getattrrtokensevalkeywordsNAMErZopmap)rr.r4r7Zitokenvaluer r r r(=s6                  zParserGenerator.make_labelcCs<t|jj}|jx |D]}||jkr|j|qWdS)N)rrrrr calcfirst)rr/r0r r r rks   zParserGenerator.addfirstsetsc Cs |j|}d|j|<|d}i}i}x|jjD]x\}}||jkr||jkrl|j|}|dkrtd|n|j||j|}|j||||<q0d||<|di||<q0Wi} xJ|jD]>\}} x4| D],} | | krtd|| || | f|| | <qWqW||j|<dS)Nrzrecursion for rule %rrzArule %s is ambiguous; %s is in the first sets of %s as well as %s)rrr%r& ValueErrorr?update) rr0r2r3ZtotalsetZ overlapcheckr4r5fsetZinverseZitsfirstZsymbolr r r r?ss2          zParserGenerator.calcfirstc Csi}d}x|jtjkrx|jtjkr.|jqW|jtj}|jtjd|j\}}|jtj|j ||}t |}|j |t |}|||<|dkr |}q W||fS)N:) typer ENDMARKERNEWLINErexpectr=OP parse_rhsmake_dfar" simplify_dfa) rrrr0azr2ZoldlenZnewlenr r r rs"      zParserGenerator.parsec sfdd}fddt|||g}x|D]}i}x<|jD]2}x,|jD]"\}} |dk rJ| |j|iqJWq>WxRt|jD]B\}} x,|D]} | j| krPqWt| |} |j| |j| |qWq.W|S)Ncsi}|||S)Nr )r3base) addclosurer r closures z)ParserGenerator.make_dfa..closurecs>||kr dSd||<x$|jD]\}}|dkr||qWdS)Nr)r%)r3rNr4r5)rOr r rOs z,ParserGenerator.make_dfa..addclosure)DFAStatenfasetr% setdefaultr$r&r'addarc) rr-finishrPr+r3r%Znfastater4r5rRstr )rOr rJs"        zParserGenerator.make_dfac Cstd||g}xt|D]\}}td|||kr4dp6dx^|jD]T\}}||kr^|j|} nt|} |j||dkrtd| qBtd|| fqBWqWdS)NzDump of NFA forz Statez(final)z -> %dz %s -> %d)print enumerater%r)r"r') rr0r-rUZtodor1r3r4r5jr r r dump_nfas   zParserGenerator.dump_nfacCsltd|x\t|D]P\}}td||jr,dp.dx0t|jjD]\}}td||j|fqBWqWdS)NzDump of DFA forz Statez(final)rWz %s -> %d)rXrYr*r$r%r&r))rr0r2r1r3r4r5r r r dump_dfas  zParserGenerator.dump_dfacCs~d}xt|rxd}xft|D]Z\}}xPt|dt|D]:}||}||kr4||=x|D]}|j||qTWd}Pq4WqWqWdS)NTFr)rYranger" unifystate)rr2Zchangesr1Zstate_irZZstate_jr3r r r rKs zParserGenerator.simplify_dfacCs|j\}}|jdkr||fSt}t}|j||j|x6|jdkrt|j|j\}}|j||j|q@W||fSdS)N|) parse_altr>NFAStaterTr)rrLrMZaaZzzr r r rIs       zParserGenerator.parse_rhscCsP|j\}}x:|jdks*|jtjtjfkrF|j\}}|j||}qW||fS)N([)rbrc) parse_itemr>rDrr=STRINGrT)rrLbr.dr r r r` s    zParserGenerator.parse_altcCs|jdkr>|j|j\}}|jtjd|j|||fS|j\}}|j}|dkr`||fS|j|j||dkr||fS||fSdS)Nrc]+*)rirj)r>rrIrGrrHrT parse_atom)rrLrMr>r r r rds     zParserGenerator.parse_itemcCs|jdkr4|j|j\}}|jtjd||fS|jtjtjfkrpt }t }|j ||j|j||fS|j d|j|jdS)Nrb)z+expected (...) or NAME or STRING, got %s/%s) r>rrIrGrrHrDr=rerarT raise_error)rrLrMr r r rk(s  zParserGenerator.parse_atomcCsD|j|ks|dk r2|j|kr2|jd|||j|j|j}|j|S)Nzexpected %s/%s, got %s/%s)rDr>rmr)rrDr>r r r rG9s zParserGenerator.expectcCsJt|j}x"|dtjtjfkr,t|j}q W|\|_|_|_|_|_ dS)Nr) r5rrCOMMENTNLrDr>Zbeginendline)rtupr r r rAs zParserGenerator.gettokenc Gs^|r8y ||}Wn&dj|gttt|}YnXt||j|jd|jd|jfdS)N rr)joinrmapstr SyntaxErrorrrprq)rmsgargsr r r rmHs  zParserGenerator.raise_error)N)N)rrrrr6r,r(rr?rrJr[r\rKrIr`rdrkrGrrmr r r r r s$  .$  r c@seZdZddZdddZdS)racCs g|_dS)N)r%)rr r r rSszNFAState.__init__NcCs|jj||fdS)N)r%r')rr5r4r r r rTVszNFAState.addarc)N)rrrrrTr r r r raQsrac@s0eZdZddZddZddZddZd Zd S) rQcCs||_||k|_i|_dS)N)rRr*r%)rrRfinalr r r r]s zDFAState.__init__cCs||j|<dS)N)r%)rr5r4r r r rTeszDFAState.addarccCs.x(|jjD]\}}||kr ||j|<q WdS)N)r%r&)roldnewr4r5r r r r^kszDFAState.unifystatecCsX|j|jkrdSt|jt|jkr(dSx*|jjD]\}}||jj|k r4dSq4WdS)NFT)r*r"r%r&get)rotherr4r5r r r __eq__ps zDFAState.__eq__N)rrrrrTr^r__hash__r r r r rQ[s rQ Grammar.txtcCst|}|jS)N)r r6)rpr r r generate_grammarsrN)r) rWrrrZGrammarrobjectr rarQrr r r r sI %PKb31]6!%__pycache__/conv.cpython-36.opt-1.pycnu[3 \%@s2dZddlZddlmZmZGdddejZdS)aConvert graminit.[ch] spit out by pgen to Python code. Pgen is the Python parser generator. It is useful to quickly create a parser from a grammar file in Python's grammar notation. But I don't want my parsers to be written in C (yet), so I'm translating the parsing tables to Python data structures and writing a Python parse engine. Note that the token numbers are constants determined by the standard Python tokenizer. The standard token module defines these numbers and their names (the names are not used much). The token numbers are hardcoded into the Python tokenizer and into pgen. A Python implementation of the Python tokenizer is also available, in the standard tokenize module. On the other hand, symbol numbers (representing the grammar's non-terminals) are assigned by pgen based on the actual grammar input. Note: this module is pretty much obsolete; the pgen module generates equivalent grammar tables directly from the Grammar.txt input file without having to invoke the Python pgen C program. N)grammartokenc@s0eZdZdZddZddZddZdd Zd S) Convertera2Grammar subclass that reads classic pgen output files. The run() method reads the tables as produced by the pgen parser generator, typically contained in two C files, graminit.h and graminit.c. The other methods are for internal use only. See the base class for more documentation. cCs |j||j||jdS)z@rd||d|<qWqW||f||<q4W|dt|}}||_g}|dt|}}tjd|}t |jd}xjt |D]^}|dt|}}tjd|}|j \}}t |}|dkrd}nt|}|j ||fqpW|dt|}}||_|dt|}}|dt|}}tjd|}t |jd}|dt|}}|dt|}}tjd|}t |jd}|dt|}}tjd|}t |jd} | |_|dt|}}y|dt|}}Wntk rYnXdS)aParse the .c file written by pgen. (Internal) The file looks as follows. The first two lines are always this: #include "pgenheaders.h" #include "grammar.h" After that come four blocks: 1) one or more state definitions 2) a table defining dfas 3) a table defining labels 4) a struct defining the grammar A state definition has the following form: - one or more arc arrays, each of the form: static arc arcs__[] = { {, }, ... }; - followed by a state array, of the form: static state states_[] = { {, arcs__}, ... }; zCan't open %s: %sFNrr z static arc z)static arc arcs_(\d+)_(\d+)\[(\d+)\] = {$z\s+{(\d+), (\d+)},$z'static state states_(\d+)\[(\d+)\] = {$z\s+{(\d+), arcs_(\d+)_(\d+)},$zstatic dfa dfas\[(\d+)\] = {$z0\s+{(\d+), "(\w+)", (\d+), (\d+), states_(\d+),$z\s+("(?:\\\d\d\d)*")},$z!static label labels\[(\d+)\] = {$z\s+{(\d+), (0|"\w+")},$0z \s+(\d+),$z\s+{(\d+), labels},$z \s+(\d+)$)r rrnext startswithrrlistmaprrrangeappendstatesgroupeval enumerateorddfaslabelsstart StopIteration)!rrrrrrZallarcsr)rnmkZarcs_ijststater.ZndfasrrxyzfirstZ rawbitsetcZbyter/Znlabelsr0r r r rTs         "        zConverter.parse_graminit_ccCs\i|_i|_xJt|jD]<\}\}}|tjkrB|dk rB||j|<q|dkr||j|<qWdS)z1Create additional useful structures. (Internal).N)keywordstokensr,r/rNAME)rZilabeltypevaluer r r rs zConverter.finish_offN)__name__ __module__ __qualname____doc__r rrrr r r r r$s  &r)rHrZpgen2rrZGrammarrr r r r sPKb31]&{)__pycache__/literals.cpython-36.opt-2.pycnu[3 \O @sLddlZdddddddd d d d Zd dZddZddZedkrHedS)N     '"\) abfnrtvr r r c Cs|jdd\}}tj|}|dk r&|S|jdr|dd}t|dkrTtd|yt|d}Wqtk rtd|YqXn0yt|d}Wn tk rtd|YnXt|S) Nrxz!invalid hex string escape ('\%s')z#invalid octal string escape ('\%s'))groupsimple_escapesget startswithlen ValueErrorintchr)malltailescZhexesir%./usr/lib64/python3.6/lib2to3/pgen2/literals.pyescapes"     r'cCsH|d}|dd|dkr$|d}|t|t| }tjdt|S)Nrz)\\(\'|\"|\\|[abfnrtv]|x.{0,2}|[0-7]{1,3}))rresubr')sqr%r%r& evalString(s r-cCsDx>tdD]2}t|}t|}t|}||kr t||||q WdS)N)rangerreprr-print)r$cr+er%r%r&test2s r4__main__)r)rr'r-r4__name__r%r%r%r&s  PKb31]Fxx__pycache__/conv.cpython-36.pycnu[3 \%@s2dZddlZddlmZmZGdddejZdS)aConvert graminit.[ch] spit out by pgen to Python code. Pgen is the Python parser generator. It is useful to quickly create a parser from a grammar file in Python's grammar notation. But I don't want my parsers to be written in C (yet), so I'm translating the parsing tables to Python data structures and writing a Python parse engine. Note that the token numbers are constants determined by the standard Python tokenizer. The standard token module defines these numbers and their names (the names are not used much). The token numbers are hardcoded into the Python tokenizer and into pgen. A Python implementation of the Python tokenizer is also available, in the standard tokenize module. On the other hand, symbol numbers (representing the grammar's non-terminals) are assigned by pgen based on the actual grammar input. Note: this module is pretty much obsolete; the pgen module generates equivalent grammar tables directly from the Grammar.txt input file without having to invoke the Python pgen C program. N)grammartokenc@s0eZdZdZddZddZddZdd Zd S) Convertera2Grammar subclass that reads classic pgen output files. The run() method reads the tables as produced by the pgen parser generator, typically contained in two C files, graminit.h and graminit.c. The other methods are for internal use only. See the base class for more documentation. cCs |j||j||jdS)z@rPd||d|<qPWq6W||f||<qW|dt|}}|d kst||f||_g}|dt|}}tjd|}|st||ft |jd}x|t |D]p}|dt|}}tjd|}|s>t||f|j \}}t |}|dkrbd}nt|}|j ||fq W|dt|}}|d kst||f||_|dt|}}|dkst||f|dt|}}tjd|}|st||ft |jd}|t|jks&t|dt|}}|dksNt||f|dt|}}tjd|}|s~t||ft |jd}|t|jkst||f|dt|}}tjd|}|st||ft |jd} | |jkst||f| |_|dt|}}|d ks,t||fy|dt|}}Wntk rXYnXdslt||fdS)aParse the .c file written by pgen. (Internal) The file looks as follows. The first two lines are always this: #include "pgenheaders.h" #include "grammar.h" After that come four blocks: 1) one or more state definitions 2) a table defining dfas 3) a table defining labels 4) a struct defining the grammar A state definition has the following form: - one or more arc arrays, each of the form: static arc arcs__[] = { {, }, ... }; - followed by a state array, of the form: static state states_[] = { {, arcs__}, ... }; zCan't open %s: %sFNrr z#include "pgenheaders.h" z#include "grammar.h" z static arc z)static arc arcs_(\d+)_(\d+)\[(\d+)\] = {$z\s+{(\d+), (\d+)},$z}; z'static state states_(\d+)\[(\d+)\] = {$z\s+{(\d+), arcs_(\d+)_(\d+)},$zstatic dfa dfas\[(\d+)\] = {$z0\s+{(\d+), "(\w+)", (\d+), (\d+), states_(\d+),$z\s+("(?:\\\d\d\d)*")},$z!static label labels\[(\d+)\] = {$z\s+{(\d+), (0|"\w+")},$0zgrammar _PyParser_Grammar = { z \s+(\d+),$z dfas, z\s+{(\d+), labels},$z \s+(\d+)$)r rrnextr startswithrrlistmaprrrangeappendlenstatesgrouprreval enumerateorddfaslabelsstart StopIteration)!rrrrrrZallarcsr-rnmkZarcs_ijststater2ZndfasrrxyzfirstZ rawbitsetcZbyter3Znlabelsr4r r r rTs         "        zConverter.parse_graminit_ccCs\i|_i|_xJt|jD]<\}\}}|tjkrB|dk rB||j|<q|dkr||j|<qWdS)z1Create additional useful structures. (Internal).N)keywordstokensr0r3rNAME)rZilabeltypevaluer r r rs zConverter.finish_offN)__name__ __module__ __qualname____doc__r rrrr r r r r$s  &r)rLrZpgen2rrZGrammarrr r r r sPKb31]"__pycache__/grammar.cpython-36.pycnu[3 \@sxdZddlZddlZddlmZmZGdddeZddZd Z iZ x.e j D]"Z e rNe j \ZZeeee e<qNWdS) aThis module defines the data structures used to represent a grammar. These are a bit arcane because they are derived from the data structures used by Python's 'pgen' parser generator. There's also a table here mapping operators to their names in the token module; the Python tokenize module reports all operators as the fallback token code OP, but the parser needs the actual token code. N)tokentokenizec@s@eZdZdZddZddZddZdd Zd d Zd d Z dS)Grammara Pgen parsing tables conversion class. Once initialized, this class supplies the grammar tables for the parsing engine implemented by parse.py. The parsing engine accesses the instance variables directly. The class here does not provide initialization of the tables; several subclasses exist to do this (see the conv and pgen modules). The load() method reads the tables from a pickle file, which is much faster than the other ways offered by subclasses. The pickle file is written by calling dump() (after loading the grammar tables using a subclass). The report() method prints a readable representation of the tables to stdout, for debugging. The instance variables are as follows: symbol2number -- a dict mapping symbol names to numbers. Symbol numbers are always 256 or higher, to distinguish them from token numbers, which are between 0 and 255 (inclusive). number2symbol -- a dict mapping numbers to symbol names; these two are each other's inverse. states -- a list of DFAs, where each DFA is a list of states, each state is a list of arcs, and each arc is a (i, j) pair where i is a label and j is a state number. The DFA number is the index into this list. (This name is slightly confusing.) Final states are represented by a special arc of the form (0, j) where j is its own state number. dfas -- a dict mapping symbol numbers to (DFA, first) pairs, where DFA is an item from the states list above, and first is a set of tokens that can begin this grammar rule (represented by a dict whose values are always 1). labels -- a list of (x, y) pairs where x is either a token number or a symbol number, and y is either None or a string; the strings are keywords. The label number is the index in this list; label numbers are used to mark state transitions (arcs) in the DFAs. start -- the number of the grammar's start symbol. keywords -- a dict mapping keyword strings to arc labels. tokens -- a dict mapping token numbers to arc labels. cCs<i|_i|_g|_i|_dg|_i|_i|_i|_d|_dS)NrEMPTY)rr) symbol2number number2symbolstatesdfaslabelskeywordstokens symbol2labelstart)selfr-/usr/lib64/python3.6/lib2to3/pgen2/grammar.py__init__MszGrammar.__init__c Cs2t|d}t|j}tj||dWdQRXdS)aDump the grammar tables to a pickle file. dump() recursively changes all dict to OrderedDict, so the pickled file is not exactly the same as what was passed in to dump(). load() uses the pickled file to create the tables, but only changes OrderedDict to dict at the top level; it does not recursively change OrderedDict to dict. So, the loaded tables are different from the original tables that were passed to load() in that some of the OrderedDict (from the pickled file) are not changed back to dict. For parsing, this has no effect on performance because OrderedDict uses dict's __getitem__ with nothing in between. wbN)open_make_deterministic__dict__pickledump)rfilenamefdrrrrXs  z Grammar.dumpc Cs0t|d}tj|}WdQRX|jj|dS)z+Load the grammar tables from a pickle file.rbN)rrloadrupdate)rrrrrrrr is z Grammar.loadcCs|jjtj|dS)z3Load the grammar tables from a pickle bytes object.N)rr!rloads)rZpklrrrr"osz Grammar.loadscCsX|j}x"dD]}t||t||jqW|jdd|_|jdd|_|j|_|S) z# Copy the grammar. rr r r rrN)rr r r rr) __class__setattrgetattrcopyr r r)rnewZ dict_attrrrrr&ssz Grammar.copycCsvddlm}td||jtd||jtd||jtd||jtd||jtd|jd S) z:Dump the grammar tables to standard output, for debugging.r)pprintZs2nZn2sr r r rN)r(printrr r r r r)rr(rrrreports      zGrammar.reportN) __name__ __module__ __qualname____doc__rrr r"r&r*rrrrrs4  rcCs^t|tr&tjtdd|jDSt|tr>dd|DSt|trZtdd|DS|S)Ncss|]\}}|t|fVqdS)N)r).0kvrrr sz&_make_deterministic..cSsg|] }t|qSr)r)r/errr sz'_make_deterministic..css|]}t|VqdS)N)r)r/r3rrrr2s) isinstancedict collections OrderedDictsorteditemslisttuple)toprrrrs   ra ( LPAR ) RPAR [ LSQB ] RSQB : COLON , COMMA ; SEMI + PLUS - MINUS * STAR / SLASH | VBAR & AMPER < LESS > GREATER = EQUAL . DOT % PERCENT ` BACKQUOTE { LBRACE } RBRACE @ AT @= ATEQUAL == EQEQUAL != NOTEQUAL <> NOTEQUAL <= LESSEQUAL >= GREATEREQUAL ~ TILDE ^ CIRCUMFLEX << LEFTSHIFT >> RIGHTSHIFT ** DOUBLESTAR += PLUSEQUAL -= MINEQUAL *= STAREQUAL /= SLASHEQUAL %= PERCENTEQUAL &= AMPEREQUAL |= VBAREQUAL ^= CIRCUMFLEXEQUAL <<= LEFTSHIFTEQUAL >>= RIGHTSHIFTEQUAL **= DOUBLESTAREQUAL // DOUBLESLASH //= DOUBLESLASHEQUAL -> RARROW )r.r7rrrobjectrrZ opmap_rawZopmap splitlineslinesplitopnamer%rrrr sy= PKb31](#__pycache__/__init__.cpython-36.pycnu[3 \@sdZdS)zThe pgen2 package.N)__doc__rr./usr/lib64/python3.6/lib2to3/pgen2/__init__.pysPKb31][-!__pycache__/driver.cpython-36.pycnu[3 \@sdZdZddgZddlZddlZddlZddlZddlZddlZddl m Z m Z m Z m Z mZGdddeZd d ZdddZddZddZddZedkrejee dS)zZParser driver. This provides a high-level interface to parse a file into a syntax tree. z#Guido van Rossum Driver load_grammarN)grammarparsetokentokenizepgenc@sHeZdZdddZdddZdddZdd d Zdd d Zdd dZdS)rNcCs&||_|dkrtj}||_||_dS)N)rlogging getLoggerloggerconvert)selfrr r r,/usr/lib64/python3.6/lib2to3/pgen2/driver.py__init__ s zDriver.__init__FcCstj|j|j}|jd}d}d}}}} } d} xR|D]4} | \}}}} } |||fkr||f|ks|t||f|f|\} }|| kr| d| |7} | }d}||kr| | ||7} |}|tjtjfkr| |7} | \}}|j dr@|d7}d}q@|t j krtj |}|r,|j jdt j||| |j||| |frT|rR|j jdPd} | \}}|j dr@|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 ZsetupAssertionErrorrCOMMENTNLendswithrOPZopmapr debugtok_nameZaddtokenZ ParseErrorZrootnode)rtokensrplinenocolumntypevaluestartendZ line_textprefixZ quintupleZs_linenoZs_columnrrr parse_tokens'sT      zDriver.parse_tokenscCstj|j}|j||S)z*Parse a stream and return the syntax tree.)rgenerate_tokensreadliner$)rstreamrrrrrparse_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|jXdS)z(Parse a file and return the syntax tree.rN)codecsopenr)close)rfilenameencodingrr'rrr parse_file`s zDriver.parse_filecCstjtj|j}|j||S)z*Parse a string and return the syntax tree.)rr%ioStringIOr&r$)rtextrrrrr parse_stringhszDriver.parse_string)NN)F)F)F)NF)F) __name__ __module__ __qualname__rr$r(r)r0r4rrrrrs   0   cCs:tjj|\}}|dkrd}||djtttjdS)Nz.txtr.z.pickle)ospathsplitextjoinmapstrsys version_info)gtheadtailrrr_generate_pickle_namensrD Grammar.txtTFcCs|dkrtj}|dkr t|n|}|s4t|| r|jd|tj|}|r|jd|y|j|Wqtk r}z|jd|WYdd}~XqXnt 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 rD_newerinfor Zgenerate_grammardumpOSErrorrGrammarload)rAZgpsaveforcer gerrrrus     cCs8tjj|sdStjj|s dStjj|tjj|kS)z0Inquire whether file a was written since file b.FT)r9r:existsgetmtime)abrrrrFs   rFcCsFtjj|rt|Sttjj|}tj||}tj }|j ||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. ) r9r:isfilerrDbasenamepkgutilget_datarrJloads)packageZgrammar_sourceZ pickled_namedatarNrrrload_packaged_grammars   r[cGsF|stjdd}tjtjtjddx|D]}t|dddq,WdS)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)rLrM)r?argvr Z basicConfigINFOstdoutr)argsrArrrmains  rb__main__)rENTFN)__doc__ __author____all__r+r1r9r rVr?rrrrrr objectrrDrrFr[rbr5exitintrrrr s$P   PKb31]Սp<<#__pycache__/tokenize.cpython-36.pycnu[3 \NX=@sdZdZdZddlZddlZddlmZmZddlTddl m Z d d e e Dd d d gZ [ ye Wnek r~eZ YnXddZddZddZdZdZeedeeeZdZdZdZdZeddZeeeeeZdZeddeeZd eZeeeZed!ed"Z ee eeZ!d#Z"d$Z#d%Z$d&Z%d'Z&ee&d(e&d)Z'ee&d*e&d+Z(ed,d-d.d/d0d1d2d3d4 Z)d5Z*ed6d7Z+ee)e*e+Z,ee!e,e(eZ-ee-Z.ee&d8ed9de&d:ed;dZ/edee'Z0eee0e!e,e/eZ1e2e3ej4e.e1e$e%f\Z5Z6Z7Z8ej4e"ej4e#e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8e7e8ddddddddd<4Z9iZ:xdD]Z;e;e:e;<qWiZZ?Gddde>Z@ddZAeAfdd ZBddZCGdddZDej4dejEZFej4dejEZGddZHddZIdd ZJdd ZKeLdkrddlMZMeNeMjOdkr|eBePeMjOdjQn eBeMjRjQdS)aTokenization help for Python programs. generate_tokens(readline) is a generator that breaks a stream of text into Python tokens. It accepts a readline-like method which is called repeatedly to get the next line of input (or "" for EOF). It generates 5-tuples with these members: the token type (see token.py) the token (a string) the starting (row, column) indices of the token (a 2-tuple of ints) the ending (row, column) indices of the token (a 2-tuple of ints) the original line (string) It is designed to match the working of the Python tokenizer exactly, except that it produces COMMENT tokens for comments and gives type OP for all operators Older entry points tokenize_loop(readline, tokeneater) tokenize(readline, tokeneater=printtoken) are the same, except instead of generating tokens, tokeneater is a callback function to which the 5 fields described above are passed as 5 arguments, each time a new token is found.zKa-Ping Yee z@GvR, ESR, Tim Peters, Thomas Wouters, Fred Drake, Skip MontanaroN)BOM_UTF8lookup)*)tokencCsg|]}|ddkr|qS)r_).0xrr./usr/lib64/python3.6/lib2to3/pgen2/tokenize.py %sr tokenizegenerate_tokens untokenizecGsddj|dS)N(|))join)choicesrrr group0srcGs t|dS)Nr)r)rrrr any1srcGs t|dS)N?)r)rrrr maybe2srz[ \f\t]*z #[^\r\n]*z\\\r?\nz [a-zA-Z_]\w*z0[bB]_?[01]+(?:_[01]+)*z(0[xX]_?[\da-fA-F]+(?:_[\da-fA-F]+)*[lL]?z0[oO]?_?[0-7]+(?:_[0-7]+)*[lL]?z[1-9]\d*(?:_\d+)*[lL]?z0[lL]?z[eE][-+]?\d+(?:_\d+)*z\d+(?:_\d+)*\.(?:\d+(?:_\d+)*)?z\.\d+(?:_\d+)*z \d+(?:_\d+)*z\d+(?:_\d+)*[jJ]z[jJ]z[^'\\]*(?:\\.[^'\\]*)*'z[^"\\]*(?:\\.[^"\\]*)*"z%[^'\\]*(?:(?:\\.|'(?!''))[^'\\]*)*'''z%[^"\\]*(?:(?:\\.|"(?!""))[^"\\]*)*"""z#(?:[uUrRbBfF]|[rR][bB]|[bBuU][rR])?'''"""z'[^\n'\\]*(?:\\.[^\n'\\]*)*'z"[^\n"\\]*(?:\\.[^\n"\\]*)*"z\*\*=?z>>=?z<<=?z<>z!=z//=?z->z[+\-*/%&@|^=<>]=?~z[][(){}]z\r?\nz[:;.,`@]z'[^\n'\\]*(?:\\.[^\n'\\]*)*'z"[^\n"\\]*(?:\\.[^\n"\\]*)*")4rrz'''z"""zr'''zr"""zu'''zu"""zb'''zb"""zf'''zf"""zur'''zur"""zbr'''zbr"""zrb'''zrb"""zR'''zR"""zU'''zU"""zB'''zB"""zF'''zF"""zuR'''zuR"""zUr'''zUr"""zUR'''zUR"""zbR'''zbR"""zBr'''zBr"""zBR'''zBR"""zrB'''zrB"""zRb'''zRb"""zRB'''zRB"""rRuUfFbBr'''r"""R'''R"""u'''u"""U'''U"""b'''b"""B'''B"""f'''f"""F'''F"""ur'''ur"""Ur'''Ur"""uR'''uR"""UR'''UR"""br'''br"""Br'''Br"""bR'''bR"""BR'''BR"""rb'''rb"""Rb'''Rb"""rB'''rB"""RB'''RB"""r'r"R'R"u'u"U'U"b'b"B'B"f'f"F'F"ur'ur"Ur'Ur"uR'uR"UR'UR"br'br"Br'Br"bR'bR"BR'BR"rb'rb"Rb'Rb"rB'rB"RB'RB"c@s eZdZdS) TokenErrorN)__name__ __module__ __qualname__rrrr rwsrwc@s eZdZdS)StopTokenizingN)rxryrzrrrr r{sr{c Cs4|\}}|\}}td||||t|t|fdS)Nz%d,%d-%d,%d: %s %s)printtok_namerepr) typerZxxx_todo_changemeZxxx_todo_changeme1lineZsrowZscolZerowZecolrrr printtokensrc Cs(yt||Wntk r"YnXdS)a: The tokenize() function accepts two parameters: one representing the input stream, and one providing an output mechanism for tokenize(). The first parameter, readline, must be a callable object which provides the same interface as the readline() method of built-in file objects. Each call to the function should return one line of input as a string. The second parameter, tokeneater, must also be a callable object. It is called once for each token, with five arguments, corresponding to the tuples generated by generate_tokens(). N) tokenize_loopr{)readline tokeneaterrrr r s cCsxt|D] }||q WdS)N)r)rrZ token_inforrr rsrc@s,eZdZddZddZddZddZd S) UntokenizercCsg|_d|_d|_dS)Nrr)tokensprev_rowprev_col)selfrrr __init__szUntokenizer.__init__cCs8|\}}||jkst||j}|r4|jjd|dS)N )rAssertionErrorrrappend)rstartrowcol col_offsetrrr add_whitespaces  zUntokenizer.add_whitespacecCsxv|D]n}t|dkr$|j||P|\}}}}}|j||jj||\|_|_|ttfkr|jd7_d|_qWdj |jS)Nrr) lencompatrrrrrNEWLINENLr)riterablettok_typerrendrrrr rs        zUntokenizer.untokenizec Csd}g}|jj}|\}}|ttfkr,|d7}|ttfkr|t kr|j qBn*|ttfkrd}n|r|r||dd}||qBWdS)NFrTrr) rrNAMENUMBERrrASYNCAWAITINDENTDEDENTpop) rrr startlineindents toks_appendtoknumtokvaltokrrr rs0      zUntokenizer.compatN)rxryrzrrrrrrrr rsrz&^[ \t\f]*#.*?coding[:=][ \t]*([-\w.]+)s^[ \t\f]*(?:[#\r\n]|$)cCsH|ddjjdd}|dks*|jdr.dS|d ks@|jdrDdS|S)z(Imitates get_normal_name in tokenizer.c.N r-zutf-8zutf-8-latin-1 iso-8859-1 iso-latin-1latin-1- iso-8859-1- iso-latin-1-)rrr)rrr)lowerreplace startswith)orig_encencrrr _get_normal_names rcsdd}d}fdd}fdd}|}|jtrHd|d d}d }|sT|gfS||}|rj||gfStj|s~||gfS|}|s||gfS||}|r|||gfS|||gfS) a The detect_encoding() function is used to detect the encoding that should be used to decode a Python source file. It requires one argument, readline, in the same way as the tokenize() generator. It will call readline a maximum of twice, and return the encoding used (as a string) and a list of any lines (left as bytes) it has read in. It detects the encoding from the presence of a utf-8 bom or an encoding cookie as specified in pep-0263. If both a bom and a cookie are present, but disagree, a SyntaxError will be raised. If the encoding cookie is an invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, 'utf-8-sig' is returned. If no encoding is specified, then the default of 'utf-8' will be returned. FNzutf-8c s"yStk rtSXdS)N) StopIterationbytesr)rrr read_or_stop sz%detect_encoding..read_or_stopcsy|jd}Wntk r"dSXtj|}|s6dSt|jd}y t|}Wn tk rptd|YnXr|j dkrtd|d7}|S)Nasciirzunknown encoding: zutf-8zencoding problem: utf-8z-sig) decodeUnicodeDecodeError cookie_rematchrrr LookupError SyntaxErrorname)r line_stringrencodingcodec) bom_foundrr find_cookie&s"   z$detect_encoding..find_cookieTz utf-8-sig)rrblank_rer)rrdefaultrrfirstsecondr)rrr detect_encoding s0         rcCst}|j|S)aTransform tokens back into Python source code. Each element returned by the iterable must be a token sequence with at least two elements, a token number and token value. If only two tokens are passed, the resulting output is poor. Round-trip invariant for full input: Untokenized source will match input source exactly Round-trip invariant for limited intput: # Output text will tokenize the back to the input t1 = [tok[:2] for tok in generate_tokens(f.readline)] newcode = untokenize(t1) readline = iter(newcode.splitlines(1)).next t2 = [tok[:2] for tokin generate_tokens(readline)] assert t1 == t2 )rr)rutrrr rTsc!csd}}}tjdd}}d \}}d}dg} d} d} d} d} xy |}Wntk rdd}YnX|d}dt|}}|rF|std||j|}|r|jd}}t||d||||f||fVd!\}}d}nd|r0|d"dd kr0|d#dd kr0t||||t|f|fVd}d}qBn||}||}qBnF|dkrt| rt|s`Pd}xf||kr||d kr|d}n6||dkr|t dt }n||dkrd}nP|d}qfW||krP| r| Vd} ||dkr||dkrh||dj d}|t|}t |||f||t|f|fVt ||d||f|t|f|fVqBt t f||dk||d||f|t|f|fVqB|| d$kr| j |t|d||df||f|fVxt|| d%krJ|| krtdd|||f| dd&} | r.| | d'kr.d} d} d} td||f||f|fVqW| r| r| | d(krd} d} d} n|std|dfd}x||krJtj||}|r|jd\}}||f||f|}}}|||||}}||ks|dkr|dkrt||||fVqF|dkrft}|dkr8t }n | rBd} | rR| Vd} |||||fVqF|dkr|jd st| r| Vd} t ||||fVqF|tkr$t|}|j||}|r|jd}|||}| r| Vd} t||||f|fVn||f}||d}|}PqF|tksR|dd tksR|dd tkr|d)dkr||f}t|pt|dpt|d }||dd}}|}Pn | r| Vd} t||||fVqF||kr|d*kr| r|dkrtnt||||fVqt||||f}|dkr.| r.|} q|dkr| r| dtkr| ddkrd} | d+} t| d| d | d | dfVd} | r| Vd} |Vnz|dkr| r| Vd} t ||||f|fVd}nF|dkr|d}n|dkr|d}| r | Vd} t||||fVn(t||||f||df|fV|d}qWqBW| r`| Vd} x.| ddD]} td|df|dfdfVqnWtd|df|dfdfVdS),aT The generate_tokens() generator requires one argument, readline, which must be a callable object which provides the same interface as the readline() method of built-in file objects. Each call to the function should return one line of input as a string. Alternately, readline can be a callable function terminating with StopIteration: readline = open(myfile).next # Example of alternate readline The generator produces 5-tuples with these members: the token type; the token string; a 2-tuple (srow, scol) of ints specifying the row and column where the token begins in the source; a 2-tuple (erow, ecol) of ints specifying the row and column where the token ends in the source; and the line on which the token was found. The line passed is the logical line; continuation lines are included. rr 0123456789rNFrzEOF in multi-line stringrz\ rz\ r  z# #z z3unindent does not match any outer indentation levelz zEOF in multi-line statement.T asyncawaitdef\z([{z)]})rr)rrrrrrrr)rrr)stringZ ascii_lettersrrrwrrSTRING ERRORTOKENtabsizerstripCOMMENTrrrIndentationErrorr pseudoprogspanrrendswithr triple_quotedendprogs single_quotedrrrOP ENDMARKER)!rlnumparenlev continuedZ namecharsnumcharscontstrneedcontcontlinerstashed async_defasync_def_indent async_def_nlrposmaxstrstartendprogendmatchrcolumn comment_tokennl_pos pseudomatchrsposeposrinitialnewlinerindentrrr risr     *                             __main__)*rrr&r'r(r)r*r+r,r-r.r/r0r1r2r3r4r5r6r7r8r9r:r;r<r=r>r?r@rArBrCrDrErFrGrHrIrJrKrLrM)*rrrNrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtru)S__doc__ __author__ __credits__rrecodecsrrZlib2to3.pgen2.tokenrrdir__all__r NameErrorstrrrr WhitespaceCommentIgnoreName Binnumber Hexnumber Octnumber Decnumber IntnumberExponent PointfloatExpfloat Floatnumber ImagnumberNumberSingleDoubleSingle3Double3Z _litprefixTripleStringOperatorBracketSpecialFunny PlainTokenTokenContStr PseudoExtras PseudoTokenlistmapcompileZ tokenprogrZ single3progZ double3progrrrrr Exceptionrwr{rr rrASCIIrrrrrrrxsysrargvopenrstdinrrrr s              8 Ic PKb31]sWPuuparse.pynu[# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. # Licensed to PSF under a Contributor Agreement. """Parser engine for the grammar tables generated by pgen. The grammar table must be loaded first. See Parser/parser.c in the Python distribution for additional info on how this parsing engine works. """ # Local imports from . import token class ParseError(Exception): """Exception to signal the parser is stuck.""" def __init__(self, msg, type, value, context): Exception.__init__(self, "%s: type=%r, value=%r, context=%r" % (msg, type, value, context)) self.msg = msg self.type = type self.value = value self.context = context class Parser(object): """Parser engine. The proper usage sequence is: p = Parser(grammar, [converter]) # create instance p.setup([start]) # prepare for parsing : if p.addtoken(...): # parse a token; may raise ParseError break root = p.rootnode # root of abstract syntax tree A Parser instance may be reused by calling setup() repeatedly. A Parser instance contains state pertaining to the current token sequence, and should not be used concurrently by different threads to parse separate token sequences. See driver.py for how to get input tokens by tokenizing a file or string. Parsing is complete when addtoken() returns True; the root of the abstract syntax tree can then be retrieved from the rootnode instance variable. When a syntax error occurs, addtoken() raises the ParseError exception. There is no error recovery; the parser cannot be used after a syntax error was reported (but it can be reinitialized by calling setup()). """ def __init__(self, grammar, convert=None): """Constructor. The grammar argument is a grammar.Grammar instance; see the grammar module for more information. The parser is not ready yet for parsing; you must call the setup() method to get it started. The optional convert argument is a function mapping concrete syntax tree nodes to abstract syntax tree nodes. If not given, no conversion is done and the syntax tree produced is the concrete syntax tree. If given, it must be a function of two arguments, the first being the grammar (a grammar.Grammar instance), and the second being the concrete syntax tree node to be converted. The syntax tree is converted from the bottom up. A concrete syntax tree node is a (type, value, context, nodes) tuple, where type is the node type (a token or symbol number), value is None for symbols and a string for tokens, context is None or an opaque value used for error reporting (typically a (lineno, offset) pair), and nodes is a list of children for symbols, and None for tokens. An abstract syntax tree node may be anything; this is entirely up to the converter function. """ self.grammar = grammar self.convert = convert or (lambda grammar, node: node) def setup(self, start=None): """Prepare for parsing. This *must* be called before starting to parse. The optional argument is an alternative start symbol; it defaults to the grammar's start symbol. You can use a Parser instance to parse any number of programs; each time you call setup() the parser is reset to an initial state determined by the (implicit or explicit) start symbol. """ if start is None: start = self.grammar.start # Each stack entry is a tuple: (dfa, state, node). # A node is a tuple: (type, value, context, children), # where children is a list of nodes or None, and context may be None. newnode = (start, None, None, []) stackentry = (self.grammar.dfas[start], 0, newnode) self.stack = [stackentry] self.rootnode = None self.used_names = set() # Aliased to self.rootnode.used_names in pop() def addtoken(self, type, value, context): """Add a token; return True iff this is the end of the program.""" # Map from token to label ilabel = self.classify(type, value, context) # Loop until the token is shifted; may raise exceptions while True: dfa, state, node = self.stack[-1] states, first = dfa arcs = states[state] # Look for a state with this label for i, newstate in arcs: t, v = self.grammar.labels[i] if ilabel == i: # Look it up in the list of labels assert t < 256 # Shift a token; we're done with it self.shift(type, value, newstate, context) # Pop while we are in an accept-only state state = newstate while states[state] == [(0, state)]: self.pop() if not self.stack: # Done parsing! return True dfa, state, node = self.stack[-1] states, first = dfa # Done with this token return False elif t >= 256: # See if it's a symbol and if we're in its first set itsdfa = self.grammar.dfas[t] itsstates, itsfirst = itsdfa if ilabel in itsfirst: # Push a symbol self.push(t, self.grammar.dfas[t], newstate, context) break # To continue the outer while loop else: if (0, state) in arcs: # An accepting state, pop it and try something else self.pop() if not self.stack: # Done parsing, but another token is input raise ParseError("too much input", type, value, context) else: # No success finding a transition raise ParseError("bad input", type, value, context) def classify(self, type, value, context): """Turn a token into a label. (Internal)""" if type == token.NAME: # Keep a listing of all used names self.used_names.add(value) # Check for reserved words ilabel = self.grammar.keywords.get(value) if ilabel is not None: return ilabel ilabel = self.grammar.tokens.get(type) if ilabel is None: raise ParseError("bad token", type, value, context) return ilabel def shift(self, type, value, newstate, context): """Shift a token. (Internal)""" dfa, state, node = self.stack[-1] newnode = (type, value, context, None) newnode = self.convert(self.grammar, newnode) if newnode is not None: node[-1].append(newnode) self.stack[-1] = (dfa, newstate, node) def push(self, type, newdfa, newstate, context): """Push a nonterminal. (Internal)""" dfa, state, node = self.stack[-1] newnode = (type, None, context, []) self.stack[-1] = (dfa, newstate, node) self.stack.append((newdfa, 0, newnode)) def pop(self): """Pop a nonterminal. (Internal)""" popdfa, popstate, popnode = self.stack.pop() newnode = self.convert(self.grammar, popnode) if newnode is not None: if self.stack: dfa, state, node = self.stack[-1] node[-1].append(newnode) else: self.rootnode = newnode self.rootnode.used_names = self.used_names PKb31]" grammar.pynu[# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. # Licensed to PSF under a Contributor Agreement. """This module defines the data structures used to represent a grammar. These are a bit arcane because they are derived from the data structures used by Python's 'pgen' parser generator. There's also a table here mapping operators to their names in the token module; the Python tokenize module reports all operators as the fallback token code OP, but the parser needs the actual token code. """ # Python imports import collections import pickle # Local imports from . import token, tokenize class Grammar(object): """Pgen parsing tables conversion class. Once initialized, this class supplies the grammar tables for the parsing engine implemented by parse.py. The parsing engine accesses the instance variables directly. The class here does not provide initialization of the tables; several subclasses exist to do this (see the conv and pgen modules). The load() method reads the tables from a pickle file, which is much faster than the other ways offered by subclasses. The pickle file is written by calling dump() (after loading the grammar tables using a subclass). The report() method prints a readable representation of the tables to stdout, for debugging. The instance variables are as follows: symbol2number -- a dict mapping symbol names to numbers. Symbol numbers are always 256 or higher, to distinguish them from token numbers, which are between 0 and 255 (inclusive). number2symbol -- a dict mapping numbers to symbol names; these two are each other's inverse. states -- a list of DFAs, where each DFA is a list of states, each state is a list of arcs, and each arc is a (i, j) pair where i is a label and j is a state number. The DFA number is the index into this list. (This name is slightly confusing.) Final states are represented by a special arc of the form (0, j) where j is its own state number. dfas -- a dict mapping symbol numbers to (DFA, first) pairs, where DFA is an item from the states list above, and first is a set of tokens that can begin this grammar rule (represented by a dict whose values are always 1). labels -- a list of (x, y) pairs where x is either a token number or a symbol number, and y is either None or a string; the strings are keywords. The label number is the index in this list; label numbers are used to mark state transitions (arcs) in the DFAs. start -- the number of the grammar's start symbol. keywords -- a dict mapping keyword strings to arc labels. tokens -- a dict mapping token numbers to arc labels. """ def __init__(self): self.symbol2number = {} self.number2symbol = {} self.states = [] self.dfas = {} self.labels = [(0, "EMPTY")] self.keywords = {} self.tokens = {} self.symbol2label = {} self.start = 256 def dump(self, filename): """Dump the grammar tables to a pickle file. dump() recursively changes all dict to OrderedDict, so the pickled file is not exactly the same as what was passed in to dump(). load() uses the pickled file to create the tables, but only changes OrderedDict to dict at the top level; it does not recursively change OrderedDict to dict. So, the loaded tables are different from the original tables that were passed to load() in that some of the OrderedDict (from the pickled file) are not changed back to dict. For parsing, this has no effect on performance because OrderedDict uses dict's __getitem__ with nothing in between. """ with open(filename, "wb") as f: d = _make_deterministic(self.__dict__) pickle.dump(d, f, 2) def load(self, filename): """Load the grammar tables from a pickle file.""" f = open(filename, "rb") d = pickle.load(f) f.close() self.__dict__.update(d) def loads(self, pkl): """Load the grammar tables from a pickle bytes object.""" self.__dict__.update(pickle.loads(pkl)) def copy(self): """ Copy the grammar. """ new = self.__class__() for dict_attr in ("symbol2number", "number2symbol", "dfas", "keywords", "tokens", "symbol2label"): setattr(new, dict_attr, getattr(self, dict_attr).copy()) new.labels = self.labels[:] new.states = self.states[:] new.start = self.start return new def report(self): """Dump the grammar tables to standard output, for debugging.""" from pprint import pprint print "s2n" pprint(self.symbol2number) print "n2s" pprint(self.number2symbol) print "states" pprint(self.states) print "dfas" pprint(self.dfas) print "labels" pprint(self.labels) print "start", self.start def _make_deterministic(top): if isinstance(top, dict): return collections.OrderedDict( sorted(((k, _make_deterministic(v)) for k, v in top.iteritems()))) if isinstance(top, list): return [_make_deterministic(e) for e in top] if isinstance(top, tuple): return tuple(_make_deterministic(e) for e in top) return top # Map from operator to number (since tokenize doesn't do this) opmap_raw = """ ( LPAR ) RPAR [ LSQB ] RSQB : COLON , COMMA ; SEMI + PLUS - MINUS * STAR / SLASH | VBAR & AMPER < LESS > GREATER = EQUAL . DOT % PERCENT ` BACKQUOTE { LBRACE } RBRACE @ AT @= ATEQUAL == EQEQUAL != NOTEQUAL <> NOTEQUAL <= LESSEQUAL >= GREATEREQUAL ~ TILDE ^ CIRCUMFLEX << LEFTSHIFT >> RIGHTSHIFT ** DOUBLESTAR += PLUSEQUAL -= MINEQUAL *= STAREQUAL /= SLASHEQUAL %= PERCENTEQUAL &= AMPEREQUAL |= VBAREQUAL ^= CIRCUMFLEXEQUAL <<= LEFTSHIFTEQUAL >>= RIGHTSHIFTEQUAL **= DOUBLESTAREQUAL // DOUBLESLASH //= DOUBLESLASHEQUAL -> RARROW """ opmap = {} for line in opmap_raw.splitlines(): if line: op, name = line.split() opmap[op] = getattr(token, name) PKb31]%%conv.pynu[# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. # Licensed to PSF under a Contributor Agreement. """Convert graminit.[ch] spit out by pgen to Python code. Pgen is the Python parser generator. It is useful to quickly create a parser from a grammar file in Python's grammar notation. But I don't want my parsers to be written in C (yet), so I'm translating the parsing tables to Python data structures and writing a Python parse engine. Note that the token numbers are constants determined by the standard Python tokenizer. The standard token module defines these numbers and their names (the names are not used much). The token numbers are hardcoded into the Python tokenizer and into pgen. A Python implementation of the Python tokenizer is also available, in the standard tokenize module. On the other hand, symbol numbers (representing the grammar's non-terminals) are assigned by pgen based on the actual grammar input. Note: this module is pretty much obsolete; the pgen module generates equivalent grammar tables directly from the Grammar.txt input file without having to invoke the Python pgen C program. """ # Python imports import re # Local imports from pgen2 import grammar, token class Converter(grammar.Grammar): """Grammar subclass that reads classic pgen output files. The run() method reads the tables as produced by the pgen parser generator, typically contained in two C files, graminit.h and graminit.c. The other methods are for internal use only. See the base class for more documentation. """ def run(self, graminit_h, graminit_c): """Load the grammar tables from the text files written by pgen.""" self.parse_graminit_h(graminit_h) self.parse_graminit_c(graminit_c) self.finish_off() def parse_graminit_h(self, filename): """Parse the .h file written by pgen. (Internal) This file is a sequence of #define statements defining the nonterminals of the grammar as numbers. We build two tables mapping the numbers to names and back. """ try: f = open(filename) except IOError, err: print "Can't open %s: %s" % (filename, err) return False self.symbol2number = {} self.number2symbol = {} lineno = 0 for line in f: lineno += 1 mo = re.match(r"^#define\s+(\w+)\s+(\d+)$", line) if not mo and line.strip(): print "%s(%s): can't parse %s" % (filename, lineno, line.strip()) else: symbol, number = mo.groups() number = int(number) assert symbol not in self.symbol2number assert number not in self.number2symbol self.symbol2number[symbol] = number self.number2symbol[number] = symbol return True def parse_graminit_c(self, filename): """Parse the .c file written by pgen. (Internal) The file looks as follows. The first two lines are always this: #include "pgenheaders.h" #include "grammar.h" After that come four blocks: 1) one or more state definitions 2) a table defining dfas 3) a table defining labels 4) a struct defining the grammar A state definition has the following form: - one or more arc arrays, each of the form: static arc arcs__[] = { {, }, ... }; - followed by a state array, of the form: static state states_[] = { {, arcs__}, ... }; """ try: f = open(filename) except IOError, err: print "Can't open %s: %s" % (filename, err) return False # The code below essentially uses f's iterator-ness! lineno = 0 # Expect the two #include lines lineno, line = lineno+1, f.next() assert line == '#include "pgenheaders.h"\n', (lineno, line) lineno, line = lineno+1, f.next() assert line == '#include "grammar.h"\n', (lineno, line) # Parse the state definitions lineno, line = lineno+1, f.next() allarcs = {} states = [] while line.startswith("static arc "): while line.startswith("static arc "): mo = re.match(r"static arc arcs_(\d+)_(\d+)\[(\d+)\] = {$", line) assert mo, (lineno, line) n, m, k = map(int, mo.groups()) arcs = [] for _ in range(k): lineno, line = lineno+1, f.next() mo = re.match(r"\s+{(\d+), (\d+)},$", line) assert mo, (lineno, line) i, j = map(int, mo.groups()) arcs.append((i, j)) lineno, line = lineno+1, f.next() assert line == "};\n", (lineno, line) allarcs[(n, m)] = arcs lineno, line = lineno+1, f.next() mo = re.match(r"static state states_(\d+)\[(\d+)\] = {$", line) assert mo, (lineno, line) s, t = map(int, mo.groups()) assert s == len(states), (lineno, line) state = [] for _ in range(t): lineno, line = lineno+1, f.next() mo = re.match(r"\s+{(\d+), arcs_(\d+)_(\d+)},$", line) assert mo, (lineno, line) k, n, m = map(int, mo.groups()) arcs = allarcs[n, m] assert k == len(arcs), (lineno, line) state.append(arcs) states.append(state) lineno, line = lineno+1, f.next() assert line == "};\n", (lineno, line) lineno, line = lineno+1, f.next() self.states = states # Parse the dfas dfas = {} mo = re.match(r"static dfa dfas\[(\d+)\] = {$", line) assert mo, (lineno, line) ndfas = int(mo.group(1)) for i in range(ndfas): lineno, line = lineno+1, f.next() mo = re.match(r'\s+{(\d+), "(\w+)", (\d+), (\d+), states_(\d+),$', line) assert mo, (lineno, line) symbol = mo.group(2) number, x, y, z = map(int, mo.group(1, 3, 4, 5)) assert self.symbol2number[symbol] == number, (lineno, line) assert self.number2symbol[number] == symbol, (lineno, line) assert x == 0, (lineno, line) state = states[z] assert y == len(state), (lineno, line) lineno, line = lineno+1, f.next() mo = re.match(r'\s+("(?:\\\d\d\d)*")},$', line) assert mo, (lineno, line) first = {} rawbitset = eval(mo.group(1)) for i, c in enumerate(rawbitset): byte = ord(c) for j in range(8): if byte & (1<>=?", r"<<=?", r"<>", r"!=", r"//=?", r"->", r"[+\-*/%&@|^=<>]=?", r"~") Bracket = '[][(){}]' Special = group(r'\r?\n', r'[:;.,`@]') Funny = group(Operator, Bracket, Special) PlainToken = group(Number, Funny, String, Name) Token = Ignore + PlainToken # First (or only) line of ' or " string. ContStr = group(r"[uUbB]?[rR]?'[^\n'\\]*(?:\\.[^\n'\\]*)*" + group("'", r'\\\r?\n'), r'[uUbB]?[rR]?"[^\n"\\]*(?:\\.[^\n"\\]*)*' + group('"', r'\\\r?\n')) PseudoExtras = group(r'\\\r?\n', Comment, Triple) PseudoToken = Whitespace + group(PseudoExtras, Number, Funny, ContStr, Name) tokenprog, pseudoprog, single3prog, double3prog = map( re.compile, (Token, PseudoToken, Single3, Double3)) endprogs = {"'": re.compile(Single), '"': re.compile(Double), "'''": single3prog, '"""': double3prog, "r'''": single3prog, 'r"""': double3prog, "u'''": single3prog, 'u"""': double3prog, "b'''": single3prog, 'b"""': double3prog, "ur'''": single3prog, 'ur"""': double3prog, "br'''": single3prog, 'br"""': double3prog, "R'''": single3prog, 'R"""': double3prog, "U'''": single3prog, 'U"""': double3prog, "B'''": single3prog, 'B"""': double3prog, "uR'''": single3prog, 'uR"""': double3prog, "Ur'''": single3prog, 'Ur"""': double3prog, "UR'''": single3prog, 'UR"""': double3prog, "bR'''": single3prog, 'bR"""': double3prog, "Br'''": single3prog, 'Br"""': double3prog, "BR'''": single3prog, 'BR"""': double3prog, 'r': None, 'R': None, 'u': None, 'U': None, 'b': None, 'B': None} triple_quoted = {} for t in ("'''", '"""', "r'''", 'r"""', "R'''", 'R"""', "u'''", 'u"""', "U'''", 'U"""', "b'''", 'b"""', "B'''", 'B"""', "ur'''", 'ur"""', "Ur'''", 'Ur"""', "uR'''", 'uR"""', "UR'''", 'UR"""', "br'''", 'br"""', "Br'''", 'Br"""', "bR'''", 'bR"""', "BR'''", 'BR"""',): triple_quoted[t] = t single_quoted = {} for t in ("'", '"', "r'", 'r"', "R'", 'R"', "u'", 'u"', "U'", 'U"', "b'", 'b"', "B'", 'B"', "ur'", 'ur"', "Ur'", 'Ur"', "uR'", 'uR"', "UR'", 'UR"', "br'", 'br"', "Br'", 'Br"', "bR'", 'bR"', "BR'", 'BR"', ): single_quoted[t] = t tabsize = 8 class TokenError(Exception): pass class StopTokenizing(Exception): pass def printtoken(type, token, start, end, line): # for testing (srow, scol) = start (erow, ecol) = end print "%d,%d-%d,%d:\t%s\t%s" % \ (srow, scol, erow, ecol, tok_name[type], repr(token)) def tokenize(readline, tokeneater=printtoken): """ The tokenize() function accepts two parameters: one representing the input stream, and one providing an output mechanism for tokenize(). The first parameter, readline, must be a callable object which provides the same interface as the readline() method of built-in file objects. Each call to the function should return one line of input as a string. The second parameter, tokeneater, must also be a callable object. It is called once for each token, with five arguments, corresponding to the tuples generated by generate_tokens(). """ try: tokenize_loop(readline, tokeneater) except StopTokenizing: pass # backwards compatible interface def tokenize_loop(readline, tokeneater): for token_info in generate_tokens(readline): tokeneater(*token_info) class Untokenizer: def __init__(self): self.tokens = [] self.prev_row = 1 self.prev_col = 0 def add_whitespace(self, start): row, col = start assert row <= self.prev_row col_offset = col - self.prev_col if col_offset: self.tokens.append(" " * col_offset) def untokenize(self, iterable): for t in iterable: if len(t) == 2: self.compat(t, iterable) break tok_type, token, start, end, line = t self.add_whitespace(start) self.tokens.append(token) self.prev_row, self.prev_col = end if tok_type in (NEWLINE, NL): self.prev_row += 1 self.prev_col = 0 return "".join(self.tokens) def compat(self, token, iterable): startline = False indents = [] toks_append = self.tokens.append toknum, tokval = token if toknum in (NAME, NUMBER): tokval += ' ' if toknum in (NEWLINE, NL): startline = True for tok in iterable: toknum, tokval = tok[:2] if toknum in (NAME, NUMBER): tokval += ' ' if toknum == INDENT: indents.append(tokval) continue elif toknum == DEDENT: indents.pop() continue elif toknum in (NEWLINE, NL): startline = True elif startline and indents: toks_append(indents[-1]) startline = False toks_append(tokval) cookie_re = re.compile(r'^[ \t\f]*#.*?coding[:=][ \t]*([-\w.]+)') blank_re = re.compile(r'^[ \t\f]*(?:[#\r\n]|$)') def _get_normal_name(orig_enc): """Imitates get_normal_name in tokenizer.c.""" # Only care about the first 12 characters. enc = orig_enc[:12].lower().replace("_", "-") if enc == "utf-8" or enc.startswith("utf-8-"): return "utf-8" if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \ enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")): return "iso-8859-1" return orig_enc def detect_encoding(readline): """ The detect_encoding() function is used to detect the encoding that should be used to decode a Python source file. It requires one argument, readline, in the same way as the tokenize() generator. It will call readline a maximum of twice, and return the encoding used (as a string) and a list of any lines (left as bytes) it has read in. It detects the encoding from the presence of a utf-8 bom or an encoding cookie as specified in pep-0263. If both a bom and a cookie are present, but disagree, a SyntaxError will be raised. If the encoding cookie is an invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, 'utf-8-sig' is returned. If no encoding is specified, then the default of 'utf-8' will be returned. """ bom_found = False encoding = None default = 'utf-8' def read_or_stop(): try: return readline() except StopIteration: return bytes() def find_cookie(line): try: line_string = line.decode('ascii') except UnicodeDecodeError: return None match = cookie_re.match(line_string) if not match: return None encoding = _get_normal_name(match.group(1)) try: codec = lookup(encoding) except LookupError: # This behaviour mimics the Python interpreter raise SyntaxError("unknown encoding: " + encoding) if bom_found: if codec.name != 'utf-8': # This behaviour mimics the Python interpreter raise SyntaxError('encoding problem: utf-8') encoding += '-sig' return encoding first = read_or_stop() if first.startswith(BOM_UTF8): bom_found = True first = first[3:] default = 'utf-8-sig' if not first: return default, [] encoding = find_cookie(first) if encoding: return encoding, [first] if not blank_re.match(first): return default, [first] second = read_or_stop() if not second: return default, [first] encoding = find_cookie(second) if encoding: return encoding, [first, second] return default, [first, second] def untokenize(iterable): """Transform tokens back into Python source code. Each element returned by the iterable must be a token sequence with at least two elements, a token number and token value. If only two tokens are passed, the resulting output is poor. Round-trip invariant for full input: Untokenized source will match input source exactly Round-trip invariant for limited intput: # Output text will tokenize the back to the input t1 = [tok[:2] for tok in generate_tokens(f.readline)] newcode = untokenize(t1) readline = iter(newcode.splitlines(1)).next t2 = [tok[:2] for tokin generate_tokens(readline)] assert t1 == t2 """ ut = Untokenizer() return ut.untokenize(iterable) def generate_tokens(readline): """ The generate_tokens() generator requires one argument, readline, which must be a callable object which provides the same interface as the readline() method of built-in file objects. Each call to the function should return one line of input as a string. Alternately, readline can be a callable function terminating with StopIteration: readline = open(myfile).next # Example of alternate readline The generator produces 5-tuples with these members: the token type; the token string; a 2-tuple (srow, scol) of ints specifying the row and column where the token begins in the source; a 2-tuple (erow, ecol) of ints specifying the row and column where the token ends in the source; and the line on which the token was found. The line passed is the logical line; continuation lines are included. """ lnum = parenlev = continued = 0 namechars, numchars = string.ascii_letters + '_', '0123456789' contstr, needcont = '', 0 contline = None indents = [0] while 1: # loop over lines in stream try: line = readline() except StopIteration: line = '' lnum = lnum + 1 pos, max = 0, len(line) if contstr: # continued string if not line: raise TokenError, ("EOF in multi-line string", strstart) endmatch = endprog.match(line) if endmatch: pos = end = endmatch.end(0) yield (STRING, contstr + line[:end], strstart, (lnum, end), contline + line) contstr, needcont = '', 0 contline = None elif needcont and line[-2:] != '\\\n' and line[-3:] != '\\\r\n': yield (ERRORTOKEN, contstr + line, strstart, (lnum, len(line)), contline) contstr = '' contline = None continue else: contstr = contstr + line contline = contline + line continue elif parenlev == 0 and not continued: # new statement if not line: break column = 0 while pos < max: # measure leading whitespace if line[pos] == ' ': column = column + 1 elif line[pos] == '\t': column = (column//tabsize + 1)*tabsize elif line[pos] == '\f': column = 0 else: break pos = pos + 1 if pos == max: break if line[pos] in '#\r\n': # skip comments or blank lines if line[pos] == '#': comment_token = line[pos:].rstrip('\r\n') nl_pos = pos + len(comment_token) yield (COMMENT, comment_token, (lnum, pos), (lnum, pos + len(comment_token)), line) yield (NL, line[nl_pos:], (lnum, nl_pos), (lnum, len(line)), line) else: yield ((NL, COMMENT)[line[pos] == '#'], line[pos:], (lnum, pos), (lnum, len(line)), line) continue if column > indents[-1]: # count indents or dedents indents.append(column) yield (INDENT, line[:pos], (lnum, 0), (lnum, pos), line) while column < indents[-1]: if column not in indents: raise IndentationError( "unindent does not match any outer indentation level", ("", lnum, pos, line)) indents = indents[:-1] yield (DEDENT, '', (lnum, pos), (lnum, pos), line) else: # continued statement if not line: raise TokenError, ("EOF in multi-line statement", (lnum, 0)) continued = 0 while pos < max: pseudomatch = pseudoprog.match(line, pos) if pseudomatch: # scan for tokens start, end = pseudomatch.span(1) spos, epos, pos = (lnum, start), (lnum, end), end token, initial = line[start:end], line[start] if initial in numchars or \ (initial == '.' and token != '.'): # ordinary number yield (NUMBER, token, spos, epos, line) elif initial in '\r\n': newline = NEWLINE if parenlev > 0: newline = NL yield (newline, token, spos, epos, line) elif initial == '#': assert not token.endswith("\n") yield (COMMENT, token, spos, epos, line) elif token in triple_quoted: endprog = endprogs[token] endmatch = endprog.match(line, pos) if endmatch: # all on one line pos = endmatch.end(0) token = line[start:pos] yield (STRING, token, spos, (lnum, pos), line) else: strstart = (lnum, start) # multiple lines contstr = line[start:] contline = line break elif initial in single_quoted or \ token[:2] in single_quoted or \ token[:3] in single_quoted: if token[-1] == '\n': # continued string strstart = (lnum, start) endprog = (endprogs[initial] or endprogs[token[1]] or endprogs[token[2]]) contstr, needcont = line[start:], 1 contline = line break else: # ordinary string yield (STRING, token, spos, epos, line) elif initial in namechars: # ordinary name yield (NAME, token, spos, epos, line) elif initial == '\\': # continued stmt # This yield is new; needed for better idempotency: yield (NL, token, spos, (lnum, pos), line) continued = 1 else: if initial in '([{': parenlev = parenlev + 1 elif initial in ')]}': parenlev = parenlev - 1 yield (OP, token, spos, epos, line) else: yield (ERRORTOKEN, line[pos], (lnum, pos), (lnum, pos+1), line) pos = pos + 1 for indent in indents[1:]: # pop remaining indent levels yield (DEDENT, '', (lnum, 0), (lnum, 0), '') yield (ENDMARKER, '', (lnum, 0), (lnum, 0), '') if __name__ == '__main__': # testing import sys if len(sys.argv) > 1: tokenize(open(sys.argv[1]).readline) else: tokenize(sys.stdin.readline) PKb31]+@66pgen.pynu[# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. # Licensed to PSF under a Contributor Agreement. # Pgen imports from . import grammar, token, tokenize class PgenGrammar(grammar.Grammar): pass class ParserGenerator(object): def __init__(self, filename, stream=None): close_stream = None if stream is None: stream = open(filename) close_stream = stream.close self.filename = filename self.stream = stream self.generator = tokenize.generate_tokens(stream.readline) self.gettoken() # Initialize lookahead self.dfas, self.startsymbol = self.parse() if close_stream is not None: close_stream() self.first = {} # map from symbol name to set of tokens self.addfirstsets() def make_grammar(self): c = PgenGrammar() names = self.dfas.keys() names.sort() names.remove(self.startsymbol) names.insert(0, self.startsymbol) for name in names: i = 256 + len(c.symbol2number) c.symbol2number[name] = i c.number2symbol[i] = name for name in names: dfa = self.dfas[name] states = [] for state in dfa: arcs = [] for label, next in sorted(state.arcs.iteritems()): arcs.append((self.make_label(c, label), dfa.index(next))) if state.isfinal: arcs.append((0, dfa.index(state))) states.append(arcs) c.states.append(states) c.dfas[c.symbol2number[name]] = (states, self.make_first(c, name)) c.start = c.symbol2number[self.startsymbol] return c def make_first(self, c, name): rawfirst = self.first[name] first = {} for label in sorted(rawfirst): ilabel = self.make_label(c, label) ##assert ilabel not in first # XXX failed on <> ... != first[ilabel] = 1 return first def make_label(self, c, label): # XXX Maybe this should be a method on a subclass of converter? ilabel = len(c.labels) if label[0].isalpha(): # Either a symbol name or a named token if label in c.symbol2number: # A symbol name (a non-terminal) if label in c.symbol2label: return c.symbol2label[label] else: c.labels.append((c.symbol2number[label], None)) c.symbol2label[label] = ilabel return ilabel else: # A named token (NAME, NUMBER, STRING) itoken = getattr(token, label, None) assert isinstance(itoken, (int, long)), label assert itoken in token.tok_name, label if itoken in c.tokens: return c.tokens[itoken] else: c.labels.append((itoken, None)) c.tokens[itoken] = ilabel return ilabel else: # Either a keyword or an operator assert label[0] in ('"', "'"), label value = eval(label) if value[0].isalpha(): # A keyword if value in c.keywords: return c.keywords[value] else: c.labels.append((token.NAME, value)) c.keywords[value] = ilabel return ilabel else: # An operator (any non-numeric token) itoken = grammar.opmap[value] # Fails if unknown token if itoken in c.tokens: return c.tokens[itoken] else: c.labels.append((itoken, None)) c.tokens[itoken] = ilabel return ilabel def addfirstsets(self): names = self.dfas.keys() names.sort() for name in names: if name not in self.first: self.calcfirst(name) #print name, self.first[name].keys() def calcfirst(self, name): dfa = self.dfas[name] self.first[name] = None # dummy to detect left recursion state = dfa[0] totalset = {} overlapcheck = {} for label, next in state.arcs.iteritems(): if label in self.dfas: if label in self.first: fset = self.first[label] if fset is None: raise ValueError("recursion for rule %r" % name) else: self.calcfirst(label) fset = self.first[label] totalset.update(fset) overlapcheck[label] = fset else: totalset[label] = 1 overlapcheck[label] = {label: 1} inverse = {} for label, itsfirst in overlapcheck.iteritems(): for symbol in itsfirst: if symbol in inverse: raise ValueError("rule %s is ambiguous; %s is in the" " first sets of %s as well as %s" % (name, symbol, label, inverse[symbol])) inverse[symbol] = label self.first[name] = totalset def parse(self): dfas = {} startsymbol = None # MSTART: (NEWLINE | RULE)* ENDMARKER while self.type != token.ENDMARKER: while self.type == token.NEWLINE: self.gettoken() # RULE: NAME ':' RHS NEWLINE name = self.expect(token.NAME) self.expect(token.OP, ":") a, z = self.parse_rhs() self.expect(token.NEWLINE) #self.dump_nfa(name, a, z) dfa = self.make_dfa(a, z) #self.dump_dfa(name, dfa) oldlen = len(dfa) self.simplify_dfa(dfa) newlen = len(dfa) dfas[name] = dfa #print name, oldlen, newlen if startsymbol is None: startsymbol = name return dfas, startsymbol def make_dfa(self, start, finish): # To turn an NFA into a DFA, we define the states of the DFA # to correspond to *sets* of states of the NFA. Then do some # state reduction. Let's represent sets as dicts with 1 for # values. assert isinstance(start, NFAState) assert isinstance(finish, NFAState) def closure(state): base = {} addclosure(state, base) return base def addclosure(state, base): assert isinstance(state, NFAState) if state in base: return base[state] = 1 for label, next in state.arcs: if label is None: addclosure(next, base) states = [DFAState(closure(start), finish)] for state in states: # NB states grows while we're iterating arcs = {} for nfastate in state.nfaset: for label, next in nfastate.arcs: if label is not None: addclosure(next, arcs.setdefault(label, {})) for label, nfaset in sorted(arcs.iteritems()): for st in states: if st.nfaset == nfaset: break else: st = DFAState(nfaset, finish) states.append(st) state.addarc(st, label) return states # List of DFAState instances; first one is start def dump_nfa(self, name, start, finish): print "Dump of NFA for", name todo = [start] for i, state in enumerate(todo): print " State", i, state is finish and "(final)" or "" for label, next in state.arcs: if next in todo: j = todo.index(next) else: j = len(todo) todo.append(next) if label is None: print " -> %d" % j else: print " %s -> %d" % (label, j) def dump_dfa(self, name, dfa): print "Dump of DFA for", name for i, state in enumerate(dfa): print " State", i, state.isfinal and "(final)" or "" for label, next in sorted(state.arcs.iteritems()): print " %s -> %d" % (label, dfa.index(next)) def simplify_dfa(self, dfa): # This is not theoretically optimal, but works well enough. # Algorithm: repeatedly look for two states that have the same # set of arcs (same labels pointing to the same nodes) and # unify them, until things stop changing. # dfa is a list of DFAState instances changes = True while changes: changes = False for i, state_i in enumerate(dfa): for j in range(i+1, len(dfa)): state_j = dfa[j] if state_i == state_j: #print " unify", i, j del dfa[j] for state in dfa: state.unifystate(state_j, state_i) changes = True break def parse_rhs(self): # RHS: ALT ('|' ALT)* a, z = self.parse_alt() if self.value != "|": return a, z else: aa = NFAState() zz = NFAState() aa.addarc(a) z.addarc(zz) while self.value == "|": self.gettoken() a, z = self.parse_alt() aa.addarc(a) z.addarc(zz) return aa, zz def parse_alt(self): # ALT: ITEM+ a, b = self.parse_item() while (self.value in ("(", "[") or self.type in (token.NAME, token.STRING)): c, d = self.parse_item() b.addarc(c) b = d return a, b def parse_item(self): # ITEM: '[' RHS ']' | ATOM ['+' | '*'] if self.value == "[": self.gettoken() a, z = self.parse_rhs() self.expect(token.OP, "]") a.addarc(z) return a, z else: a, z = self.parse_atom() value = self.value if value not in ("+", "*"): return a, z self.gettoken() z.addarc(a) if value == "+": return a, z else: return a, a def parse_atom(self): # ATOM: '(' RHS ')' | NAME | STRING if self.value == "(": self.gettoken() a, z = self.parse_rhs() self.expect(token.OP, ")") return a, z elif self.type in (token.NAME, token.STRING): a = NFAState() z = NFAState() a.addarc(z, self.value) self.gettoken() return a, z else: self.raise_error("expected (...) or NAME or STRING, got %s/%s", self.type, self.value) def expect(self, type, value=None): if self.type != type or (value is not None and self.value != value): self.raise_error("expected %s/%s, got %s/%s", type, value, self.type, self.value) value = self.value self.gettoken() return value def gettoken(self): tup = self.generator.next() while tup[0] in (tokenize.COMMENT, tokenize.NL): tup = self.generator.next() self.type, self.value, self.begin, self.end, self.line = tup #print token.tok_name[self.type], repr(self.value) def raise_error(self, msg, *args): if args: try: msg = msg % args except: msg = " ".join([msg] + map(str, args)) raise SyntaxError(msg, (self.filename, self.end[0], self.end[1], self.line)) class NFAState(object): def __init__(self): self.arcs = [] # list of (label, NFAState) pairs def addarc(self, next, label=None): assert label is None or isinstance(label, str) assert isinstance(next, NFAState) self.arcs.append((label, next)) class DFAState(object): def __init__(self, nfaset, final): assert isinstance(nfaset, dict) assert isinstance(iter(nfaset).next(), NFAState) assert isinstance(final, NFAState) self.nfaset = nfaset self.isfinal = final in nfaset self.arcs = {} # map from label to DFAState def addarc(self, next, label): assert isinstance(label, str) assert label not in self.arcs assert isinstance(next, DFAState) self.arcs[label] = next def unifystate(self, old, new): for label, next in self.arcs.iteritems(): if next is old: self.arcs[label] = new def __eq__(self, other): # Equality test -- ignore the nfaset instance variable assert isinstance(other, DFAState) if self.isfinal != other.isfinal: return False # Can't just return self.arcs == other.arcs, because that # would invoke this method recursively, with cycles... if len(self.arcs) != len(other.arcs): return False for label, next in self.arcs.iteritems(): if next is not other.arcs.get(label): return False return True __hash__ = None # For Py3 compatibility. def generate_grammar(filename="Grammar.txt"): p = ParserGenerator(filename) return p.make_grammar() PKc31]r __init__.pynu[# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. # Licensed to PSF under a Contributor Agreement. """The pgen2 package.""" PKc31]l5 driver.pynu[# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. # Licensed to PSF under a Contributor Agreement. # Modifications: # Copyright 2006 Google, Inc. All Rights Reserved. # Licensed to PSF under a Contributor Agreement. """Parser driver. This provides a high-level interface to parse a file into a syntax tree. """ __author__ = "Guido van Rossum " __all__ = ["Driver", "load_grammar"] # Python imports import codecs import os import logging import pkgutil import StringIO import sys # Pgen imports from . import grammar, parse, token, tokenize, pgen class Driver(object): def __init__(self, grammar, convert=None, logger=None): self.grammar = grammar if logger is None: logger = logging.getLogger() self.logger = logger self.convert = convert def parse_tokens(self, tokens, debug=False): """Parse a series of tokens and return the syntax tree.""" # XXX Move the prefix computation into a wrapper around tokenize. p = parse.Parser(self.grammar, self.convert) p.setup() lineno = 1 column = 0 type = value = start = end = line_text = None prefix = u"" for quintuple in tokens: type, value, start, end, line_text = quintuple if start != (lineno, column): assert (lineno, column) <= start, ((lineno, column), start) s_lineno, s_column = start if lineno < s_lineno: prefix += "\n" * (s_lineno - lineno) lineno = s_lineno column = 0 if column < s_column: prefix += line_text[column:s_column] column = s_column if type in (tokenize.COMMENT, tokenize.NL): prefix += value lineno, column = end if value.endswith("\n"): lineno += 1 column = 0 continue if type == token.OP: type = grammar.opmap[value] if debug: self.logger.debug("%s %r (prefix=%r)", token.tok_name[type], value, prefix) if p.addtoken(type, value, (prefix, start)): if debug: self.logger.debug("Stop.") break prefix = "" lineno, column = end if value.endswith("\n"): lineno += 1 column = 0 else: # We never broke out -- EOF is too soon (how can this happen???) raise parse.ParseError("incomplete input", type, value, (prefix, start)) return p.rootnode def parse_stream_raw(self, stream, debug=False): """Parse a stream and return the syntax tree.""" tokens = tokenize.generate_tokens(stream.readline) return self.parse_tokens(tokens, debug) def parse_stream(self, stream, debug=False): """Parse a stream and return the syntax tree.""" return self.parse_stream_raw(stream, debug) def parse_file(self, filename, encoding=None, debug=False): """Parse a file and return the syntax tree.""" stream = codecs.open(filename, "r", encoding) try: return self.parse_stream(stream, debug) finally: stream.close() def parse_string(self, text, debug=False): """Parse a string and return the syntax tree.""" tokens = tokenize.generate_tokens(StringIO.StringIO(text).readline) return self.parse_tokens(tokens, debug) def _generate_pickle_name(gt): head, tail = os.path.splitext(gt) if tail == ".txt": tail = "" return head + tail + ".".join(map(str, sys.version_info)) + ".pickle" def load_grammar(gt="Grammar.txt", gp=None, save=True, force=False, logger=None): """Load the grammar (maybe from a pickle).""" if logger is None: logger = logging.getLogger() gp = _generate_pickle_name(gt) if gp is None else gp if force or not _newer(gp, gt): logger.info("Generating grammar tables from %s", gt) g = pgen.generate_grammar(gt) if save: logger.info("Writing grammar tables to %s", gp) try: g.dump(gp) except IOError as e: logger.info("Writing failed: %s", e) else: g = grammar.Grammar() g.load(gp) return g def _newer(a, b): """Inquire whether file a was written since file b.""" if not os.path.exists(a): return False if not os.path.exists(b): return True return os.path.getmtime(a) >= os.path.getmtime(b) def load_packaged_grammar(package, grammar_source): """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. """ if os.path.isfile(grammar_source): return load_grammar(grammar_source) pickled_name = _generate_pickle_name(os.path.basename(grammar_source)) data = pkgutil.get_data(package, pickled_name) g = grammar.Grammar() g.loads(data) return g def main(*args): """Main program, when run as a script: produce grammar pickle files. Calls load_grammar for each argument, a path to a grammar text file. """ if not args: args = sys.argv[1:] logging.basicConfig(level=logging.INFO, stream=sys.stdout, format='%(message)s') for gt in args: load_grammar(gt, save=True, force=True) return True if __name__ == "__main__": sys.exit(int(not main())) PKc31]ަtoken.pynuȯ#! /usr/bin/python2.7 """Token constants (from "token.h").""" # Taken from Python (r53757) and modified to include some tokens # originally monkeypatched in by pgen2.tokenize #--start constants-- ENDMARKER = 0 NAME = 1 NUMBER = 2 STRING = 3 NEWLINE = 4 INDENT = 5 DEDENT = 6 LPAR = 7 RPAR = 8 LSQB = 9 RSQB = 10 COLON = 11 COMMA = 12 SEMI = 13 PLUS = 14 MINUS = 15 STAR = 16 SLASH = 17 VBAR = 18 AMPER = 19 LESS = 20 GREATER = 21 EQUAL = 22 DOT = 23 PERCENT = 24 BACKQUOTE = 25 LBRACE = 26 RBRACE = 27 EQEQUAL = 28 NOTEQUAL = 29 LESSEQUAL = 30 GREATEREQUAL = 31 TILDE = 32 CIRCUMFLEX = 33 LEFTSHIFT = 34 RIGHTSHIFT = 35 DOUBLESTAR = 36 PLUSEQUAL = 37 MINEQUAL = 38 STAREQUAL = 39 SLASHEQUAL = 40 PERCENTEQUAL = 41 AMPEREQUAL = 42 VBAREQUAL = 43 CIRCUMFLEXEQUAL = 44 LEFTSHIFTEQUAL = 45 RIGHTSHIFTEQUAL = 46 DOUBLESTAREQUAL = 47 DOUBLESLASH = 48 DOUBLESLASHEQUAL = 49 AT = 50 ATEQUAL = 51 OP = 52 COMMENT = 53 NL = 54 RARROW = 55 ERRORTOKEN = 56 N_TOKENS = 57 NT_OFFSET = 256 #--end constants-- tok_name = {} for _name, _value in globals().items(): if type(_value) is type(0): tok_name[_value] = _name def ISTERMINAL(x): return x < NT_OFFSET def ISNONTERMINAL(x): return x >= NT_OFFSET def ISEOF(x): return x == ENDMARKER PKhP3]N 3  $__pycache__/literals.cpython-311.pycnu[ fc bdZddlZddddddd d d d d ZdZdZdZedkr edSdS)z>$      T " "C   s VQRR u::>>ADHII I TE2AA T T TADHIIt S T VD! AA V V VCdJKKQU U V q66MsB%%CCC6c|ds4|dsJt|dd|d}|dd|dzkr|dz}||s-Jt|t| dt|dt|zksJ|t|t| }t jdt |S)Nr r rrrz)\\(\'|\"|\\|[abfnrtv]|x.{0,2}|[0-7]{1,3}))rreprendswithrresubr))sqs r( evalStringr2(s <<  > S 1 1>>4"1";;>> 1 !A!u!|| aC ::a==++$q#a&&{++++= q66Qs1vvX     #a&&#a&&.A 6> J JJctdD]G}t|}t|}t|}||krt ||||HdS)N)ranger!r,r2print)r'cr0es r(testr:2s` 3ZZ FF GG qMM 66 !Q1    r3__main__)__doc__r.rr)r2r:__name__r3r(r?sCB   *KKK zDFFFFFr3PKhP3]ђkJkJ&__pycache__/pgen.cpython-311.opt-1.pycnu[ f6ddlmZmZmZGddejZGddeZGddeZGdd eZ d d Z d S))grammartokentokenizeceZdZdS) PgenGrammarN)__name__ __module__ __qualname__9/opt/alt/python311/lib64/python3.11/lib2to3/pgen2/pgen.pyrrsDr rc~eZdZddZdZdZdZdZdZdZ d Z d Z d Z d Z d ZdZdZdZddZdZdZdS)ParserGeneratorNcNd}|t|d}|j}||_||_t j|j|_|| \|_ |_ | |i|_ | dS)Nzutf-8)encoding)openclosefilenamestreamrgenerate_tokensreadline generatorgettokenparsedfas startsymbolfirst addfirstsets)selfrr close_streams r __init__zParserGenerator.__init__ s >(W555F!%00HOOQ_U%;T$BCCC,2AN5)!M!t44QX%%8F++HOOVTN333'-AHV$!MKKEQx!! "AJ&&:e,,HOOUZ$7888(.AJu%!M!u-QX%%8F++HOOVTN333'-AHV$!Mr ct|j}||D] }||jvr||!dSN)r%rr&r'r calcfirst)rr8r9s r rzParserGenerator.addfirstsetsksaTY^^%%&&  % %D4:%%t$$$ % %r c .|j|}d|j|<|d}i}i}|jD]\}}||jvrh||jvr"|j|}|t d|zn"|||j|}|||||<vd||<|di||<i} |D]4\}} | D],} | | vr!t d|d| d|d| | || | <-5||j|<dS)Nr#zrecursion for rule %rrzrule z is ambiguous; z is in the first sets of z as well as )rrr.r/ ValueErrorrSupdate) rr9r;r<totalset overlapcheckr=r>fsetinverseitsfirstsymbols r rSzParserGenerator.calcfirstssio 4A  :++-- 1 1KE4 !!DJ&&:e,D|()@4)GHHH$NN5))):e,D%%%&* U##"#',aj U##+1133 ( (OE8" ( (W$$$*&*ddFFFEEE76??&LMMM#(  ( $ 4r cti}d}|jtjkr|jtjkr)||jtjk)|tj}|tjd|\}}|tj| ||}t|}| |t|}|||<||}|jtjk||fS)N:) typer ENDMARKERNEWLINErexpectrMOP parse_rhsmake_dfar* simplify_dfa) rrrr9azr;oldlennewlens r rzParserGenerator.parses  i5?**)u},, )u},,;;uz**D KK# & & &>>##DAq KK & & &--1%%CXXF   c " " "XXFDJ"" #i5?**$[  r c  fd} fd t|||g}|D]}i}|jD]1}|jD]'\}} |  | ||i(2t |D]R\}} |D]} | j| krn&t| |} || || |S|S)Nc$i}|||SrRr )r<base addclosures r closurez)ParserGenerator.make_dfa..closuresD Jud # # #Kr cT||vrdSd||<|jD]\}}| ||dSrAr.)r<rmr=r>rns r rnz,ParserGenerator.make_dfa..addclosuresQ}}DK$z + + t=JtT*** + +r )DFAStatenfasetr. setdefaultr-r/r0addarc) rr6finishror4r<r.nfastater=r>rsstrns @r rezParserGenerator.make_dfasM      + + + + +775>>6223 ( (ED!L E E#+=EEKE4(" 4)C)CDDDE"( !5!5 ( ( v &&ByF**+"&&11BMM"%%% R'''' ( r cltd||g}t|D]\}}td|||urdpd|jD]l\}}||vr||} n$t |} |||td| zXtd|| fzmdS)NzDump of NFA for State(final)z -> %d %s -> %d)print enumerater.r2r*r0) rr9r6rvtodor:r<r=r>js r dump_nfazParserGenerator.dump_nfas &&&w!$ 7 7HAu )Q =I C D D D$z 7 7 t4<< 4((AAD AKK%%%=+/****.E1:56666 7 7 7r c *td|t|D]r\}}td||jrdpdt|jD],\}}td|||fz-sdS)NzDump of DFA forrzr{r|r})r~rr3r-r.r/r2)rr9r;r:r<r=r>s r dump_dfazParserGenerator.dump_dfas &&&!# A AHAu )Q ;) Ar B B B%ej&6&6&8&899 A A tnsyy'??@@@@ A A Ar cd}|rnd}t|D]X\}}t|dzt|D]2}||}||kr"||=|D]}|||d}n3Y|ldSdS)NTFr)rranger* unifystate)rr;changesr:state_irstate_jr<s r rfzParserGenerator.simplify_dfas G'nn   7qsCHH--A!!fG'))F%(??E!,,Wg>>>>"& *      r c|\}}|jdkr||fSt}t}|||||jdkr`||\}}|||||jdk`||fS)N|) parse_altrPNFAStaterur)rrgrhaazzs r rdzParserGenerator.parse_rhss~~1 :  a4KBB IIaLLL HHRLLL*## ~~''1 !  *## r6Mr c4|\}}|jdvs|jtjtjfvrV|\}}|||}|jdv7|jtjtjfvV||fS)N)([) parse_itemrPr_rrMSTRINGru)rrgbr7ds r rzParserGenerator.parse_alt s  1zZ''yUZ666??$$DAq HHQKKKA zZ''yUZ666!t r c|jdkrd||\}}|tjd||||fS|\}}|j}|dvr||fS||||dkr||fS||fS)Nr])+*r)rPrrdrbrrcru parse_atom)rrgrhrPs r rzParserGenerator.parse_items :   MMOOO>>##DAq KK# & & & HHQKKKa4K??$$DAqJEJ&&!t MMOOO HHQKKK||!t !t r c|jdkrO||\}}|tjd||fS|jtjtjfvrOt}t}| ||j|||fS| d|j|jdS)Nr)z+expected (...) or NAME or STRING, got %s/%s) rPrrdrbrrcr_rMrrru raise_error)rrgrhs r rzParserGenerator.parse_atom(s :   MMOOO>>##DAq KK# & & &a4K Y5:u|4 4 4 A A HHQ # # # MMOOOa4K   J!Y  4 4 4 4 4r c|j|ks |.|j|kr#|d|||j|j|j}||S)Nzexpected %s/%s, got %s/%s)r_rPrr)rr_rPs r rbzParserGenerator.expect9sd 9  !2tzU7J7J   8!5$)TZ A A A   r ct|j}|dtjtjfvr4t|j}|dtjtjfv4|\|_|_|_|_|_ dSrE) r>rrCOMMENTNLr_rPbeginendline)rtups r rzParserGenerator.gettokenAsr4>""!f)8;777t~&&C!f)8;777AD> 4:tz48TYYYr c |rG ||z}n@#d|gttt|z}YnxYwt ||j|jd|jd|jf)N r#r)joinr%mapstr SyntaxErrorrrr)rmsgargss r rzParserGenerator.raise_errorHs  = =Dj =hhutCTNN';';;<<# tx{ $ TY 899 9s  ;ArR)rr r r!r?r5r1rrSrrerrrfrdrrrrbrrr r r rr s4    2,",","\%%%$$$<!!!0"""H777 AAA*"(444"EEE99999r rceZdZdZddZdS)rcg|_dSrRrq)rs r r!zNFAState.__init__Ss  r Nc>|j||fdSrR)r.r0rr>r=s r ruzNFAState.addarcVs$ %'''''r rR)rr r r!rur r r rrQs7((((((r rc*eZdZdZdZdZdZdZdS)rrc4||_||v|_i|_dSrR)rsr3r.)rrsfinals r r!zDFAState.__init__]s!   r c||j|<dSrRrqrs r ruzDFAState.addarces  %r c`|jD]\}}||ur ||j|<dSrR)r.r/)roldnewr=r>s r rzDFAState.unifystateksA9??,, ' 'KE4s{{#& %  ' 'r c|j|jkrdSt|jt|jkrdS|jD]$\}}||j|urdS%dS)NFT)r3r*r.r/get)rotherr=r>s r __eq__zDFAState.__eq__ps <5= ( (5 ty>>S__ , ,59??,,  KE45:>>%0000uu1tr N)rr r r!rurr__hash__r r r rrrr[sQ   '''   HHHr rr Grammar.txtcHt|}|SrR)rr?)rps r generate_grammarrs!!A >>  r N)r) r|rrrGrammarrobjectrrrrrr r r rs '&&&&&&&&&     '/   E9E9E9E9E9fE9E9E9N (((((v(((#####v###Jr PKhP3]\d?e8Dd@e8DdAe8DZ9d"d#hdBe8DzdCe8DzZ:d4d6hdDe8DzdEe8DzZ;dFZ<GdGdHe=Z>GdIdJe=Z?dKZ@e@fdLZAdMZBGdNdOZCej3dPejDZEej3dQejDZFdRZGdSZHdTZIdUZJeKdVkrUddlLZLeMeLjNdkr&eAeOeLjNdjPdSeAeLjQjPdSdS)WzKa-Ping Yee z@GvR, ESR, Tim Peters, Thomas Wouters, Fred Drake, Skip MontanaroN)BOM_UTF8lookup)*)tokenc*g|]}|ddk|S)r_).0xs =/opt/alt/python311/lib64/python3.11/lib2to3/pgen2/tokenize.py r%s! 0 0 0AaDCKK1KKK)tokenizegenerate_tokens untokenizec8dd|zdzS)N(|))joinchoicess r groupr0sC#((7"3"33c99rct|dzS)Nrrrs r anyr1s%/C//rct|dzS)N?rrs r mayber 2sE7Oc11rc:tfdDS)Nc3K|];}dzD]3}||k,||zV4z _combinations..4s`!e)qzz||qzz||/K/KA/K/K/K/K/Kr)set)r&s`r _combinationsr)3s;   rz[ \f\t]*z #[^\r\n]*z\\\r?\nz\w+z0[bB]_?[01]+(?:_[01]+)*z(0[xX]_?[\da-fA-F]+(?:_[\da-fA-F]+)*[lL]?z0[oO]?_?[0-7]+(?:_[0-7]+)*[lL]?z[1-9]\d*(?:_\d+)*[lL]?z0[lL]?z[eE][-+]?\d+(?:_\d+)*z\d+(?:_\d+)*\.(?:\d+(?:_\d+)*)?z\.\d+(?:_\d+)*z \d+(?:_\d+)*z\d+(?:_\d+)*[jJ]z[jJ]z[^'\\]*(?:\\.[^'\\]*)*'z[^"\\]*(?:\\.[^"\\]*)*"z%[^'\\]*(?:(?:\\.|'(?!''))[^'\\]*)*'''z%[^"\\]*(?:(?:\\.|"(?!""))[^"\\]*)*"""z'(?:[uUrRbBfF]|[rR][fFbB]|[fFbBuU][rR])?'''"""z'[^\n'\\]*(?:\\.[^\n'\\]*)*'z"[^\n"\\]*(?:\\.[^\n"\\]*)*"z\*\*=?z>>=?z<<=?z<>z!=z//=?z->z[+\-*/%&@|^=<>]=?~z[][(){}]z\r?\nz:=z[:;.,`@]z'[^\n'\\]*(?:\\.[^\n'\\]*)*'z"[^\n"\\]*(?:\\.[^\n"\\]*)*"rRfFbB>UuURUruRur)r-r.r*r+c$i|] }|dtSr*) single3progr prefixs r r@y FFFv&~~~{FFFrc$i|] }|dtSr+) double3progr>s r r@r@zrArci|]}|dSNr r>s r r@r@{s777vt777rch|]}|dSr<r r>s r rH///^^^///rch|]}|dSrCr r>s r rHrHrIrch|]}|dS)r-r r>s r rHrH---f\\\---rch|]}|dS)r.r r>s r rHrHrLrceZdZdS) TokenErrorN__name__ __module__ __qualname__r rr rPrPrrPceZdZdS)StopTokenizingNrQr rr rWrWrUrrWc z|\}}|\}}td||||t|t|fzdS)Nz%d,%d-%d,%d: %s %s)printtok_namerepr) typerxxx_todo_changemexxx_todo_changeme1linesrowscolerowecols r printtokenrdsR$LT4%LT4 tT4$e= >?????rcL t||dS#t$rYdSwxYwrF) tokenize_looprW)readline tokeneaters r rrsD  h +++++      s  ##c4t|D]}||dSrF)r)rgrh token_infos r rfrfs3%h//   J  rc&eZdZdZdZdZdZdS) Untokenizerc0g|_d|_d|_dS)Nrr)tokensprev_rowprev_col)selfs r __init__zUntokenizer.__init__s   rcf|\}}||jz }|r|jd|zdSdS)N )rprnappend)rqstartrowcol col_offsets r add_whitespacezUntokenizer.add_whitespacesJS4=(  1 K  sZ/ 0 0 0 0 0 1 1rcp|D]}t|dkr|||nn|\}}}}}|||j||\|_|_|ttfvr|xjdz c_d|_d |jS)Nrrr#) lencompatrzrnrurorpNEWLINENLr)rqiterablettok_typerrvendr_s r rzUntokenizer.untokenizes " "A1vv{{ Ax(((01 -HeUC    & & & K  u % % %+. (DM4=GR=(( " ! wwt{###rcd}g}|jj}|\}}|ttfvr|dz }|tt fvrd}|D]}|dd\}}|ttt tfvr|dz }|tkr||Q|tkr| q|tt fvrd}n|r|r||dd}||dS)NFrtTr|) rnruNAMENUMBERrrASYNCAWAITINDENTDEDENTpop) rqrr startlineindents toks_appendtoknumtokvaltoks r r~zUntokenizer.compats k(  dF^ # # cMF gr] " "I  C !WNFF$u555# v&&&6!! GR=((  "w " GBK(((! K    #  rN)rRrSrTrrrzrr~r rr rlrlsP 111 $ $ $     rrlz&^[ \t\f]*#.*?coding[:=][ \t]*([-\w.]+)s^[ \t\f]*(?:[#\r\n]|$)c |dddd}|dks|drdS|dvs|drdS|S) N r -utf-8zutf-8-)zlatin-1 iso-8859-1z iso-latin-1)zlatin-1-z iso-8859-1-z iso-latin-1-r)lowerreplace startswith)orig_encencs r _get_normal_namersw2 3B3-     ' 'S 1 1C g~~11~w 666 ~~ABB7| OrcN dd}d}fd}fd}|}|trd|dd}d}|s|gfS||}|r||gfSt|s||gfS|}|s||gfS||}|r|||gfS|||gfS)NFrcV S#t$rtcYSwxYwrF) StopIterationbytes)rgsr read_or_stopz%detect_encoding..read_or_stops< 8::    77NNN s ((c| |d}n#t$rYdSwxYwt|}|sdSt |d} t |}n #t$rtd|zwxYwr|j dkrtd|dz }|S)Nasciirzunknown encoding: rzencoding problem: utf-8z-sig) decodeUnicodeDecodeError cookie_rematchrrr LookupError SyntaxErrorname)r_ line_stringrencodingcodec bom_founds r find_cookiez$detect_encoding..find_cookie s ++g..KK!   44  ,, 4#EKKNN33 ?8$$EE ? ? ?2X=>> > ?  zW$$!";<<<  Hs ''+A;;BTz utf-8-sig)rrblank_rer)rgrdefaultrrfirstsecondrs` @r detect_encodingrs2"IHG , LNNE !! abb  {{5!!H!%  >>%   \^^F  {6""H)%(( UFO ##rcJ t}||SrF)rlr)ruts r rr:s$" B == " ""rc# K dx}x}}d\}}d}dg}d}d} d} d} |} n#t$rd} YnwxYw|dz}dt| }} |r| std||| }|r>|dx} }t || d|z|||f|| zfVd\}}d}nZ|rA| dddkr3| d dd kr%t || z||t| f|fVd}d}|| z}|| z}|dkr|s| sn d}| |krO| | d kr|dz}n2| | d kr|tzdztz}n| | d krd}nn | dz} | |kO| |krn|r|Vd}| | dvr| | dkry| | dd}| t|z}t||| f|| t|zf| fVt| |d||f|t| f| fVn>ttf| | dk| | d|| f|t| f| fV0||dkr/| |t| d| |df|| f| fV||dkrT||vrtdd|| | f|dd}| r| |dkrd} d} d} td|| f|| f| fV||dkT| r| r| |dkrd} d} d} n| std|dfd}| |krt| | }|r|d\}}||f||f|} }}| ||| |}}|t"jvs |dkr|dkrt&|||| fVn|dvr,t(}|dkrt}n| rd} |r|Vd}||||| fVnO|dkr|r|Vd}t|||| fVn1|t*vrpt,|}|| | }|r9|d} | || }|r|Vd}t |||| f| fVn||f}| |d}| }n|t.vs"|ddt.vs|ddt.vrk|ddkrG||f}t,|p%t,|dpt,|d}| |dd}}| }nA|r|Vd}t |||| fVn"|r|dvr| r|dkrt2nt4|||| fVt6|||| f}|dkr|s|}/|dvrW|rU|dt6krD|ddkr8|dkr d} |d} t2|d|d|d|dfVd}|r|Vd}|Vnk|dkr|r|Vd}t|||| f| fVd}nJ|d vr|dz}n |d!vr|dz }|r|Vd}t8|||| fVn t | | || f|| dzf| fV| dz} | |k|r|Vd}|ddD]}td|df|dfdfVt:d|df|dfdfVdS)"Nr)r#rFrr#zEOF in multi-line stringz\ z\ rt  z# #z rz3unindent does not match any outer indentation levelz zEOF in multi-line statement.Tr|r )asyncawaitr)defforr\z([{z)]})rr}rPrrSTRING ERRORTOKENtabsizerstripCOMMENTrrurIndentationErrorr pseudoprogspanstringdigitsrr triple_quotedendprogs single_quoted isidentifierrrrOP ENDMARKER)rglnumparenlev continuedcontstrneedcontcontlinerstashed async_defasync_def_indent async_def_nlr_posmaxstrstartendprogendmatchrcolumn comment_tokennl_pos pseudomatchrvsposeposrinitialnewlinerindents r rrOs #$#D#8iGXHcGGIL} 8::DD   DDD axc$iiS J  G !;XFFF}}T**H $LLOO+cwdsd3$ho????$)! d233i611d233i86K6K!7T>#dCII%6BBBB!D.#d? ]]9] F))9##fqjVV#Y$&&&'/A2Ew1N#Y$&&Ag )) czz5  CyG##9##$(J$5$5f$=$=M 3}#5#55F"M #;sS5G5G/G(H$PPPPtFGG} &>D#d))+'"+.M.M! $ #$  K !>q JJJICii$**455Kg (--a00 s#'-$cCd!%eCi$u+wfm++sNNu||!5$d;;;;;&&%G!||"$",'+ '% "&"E4t<<<<<^^'% "&"E4t<<<<<m++&uoG&}}T377H &ll1oo $U3Y"+")MMM&*G%udT3KFFFFF$(%="&uvv,#' --"1"I.."1"I..RyD(($(%=#+G#4$6q8J$6#+E!H#5 ,0L!#'"+")MMM&*G%udD$?????))++,8 222$%,1W,<,<55%#($d#<<<<$dD9C'''"% ..# +$+AJ$$6$6$+AJ'$9$9$~~,0 3:2; 0#('!*#*1:wqz#*1:#////'+G'% "&IIII__'% "&udT3K>>>> !II%''HqL E))hl8'% "&udD$77777!49 #;s1u t====AgSCiii}~ !""+55rD!9tQi44444 b4)dAY 333333s ) 88__main__)R __author__ __credits__rrecodecsrrlib2to3.pgen2.tokenr#rdir__all__r NameErrorstrrrr r) WhitespaceCommentIgnoreName Binnumber Hexnumber Octnumber Decnumber IntnumberExponent PointfloatExpfloat Floatnumber ImagnumberNumberSingleDoubleSingle3Double3 _litprefixTripleStringOperatorBracketSpecialFunny PlainTokenTokenContStr PseudoExtras PseudoTokenmapcompile tokenprogrr=rD _strprefixesrrrr ExceptionrPrWrdrrfrlASCIIrrrrrrrRsysr}argvopenrgstdinr rr r#s#0* F ########!!!! 0 0cc%jj 0 0 04,4,4, ,  EE EEE :99///111   cc*z122 2UU7^^ C  & 7 . E+X 6 6 E)Y 9 = = # U57H I IEERZOO [ X %eJ)) U& g(= > > z; 2 2 $ # 2 2 7 zE!:#5 6 6 z;;;; = = 5GWeU%%    %% - - h)) U65&$ / /  % ;;c:&&';;c:&&' ( (uZ&11 55vugtLLL 25#J Wg63838/ :{KM#sC%%M#sC%%&&&&' F##*"*V*<*<{ 9 9FFFFF 9GFFFF 987,777  9 EN//,///0//,///0  #J-- ---.-- ---. !!!!!!!!%%%%%Y%%%??? #-    &   6 6 6 6 6 6 6 6 p BJ@"( K K 2:0"( ; ;   G$G$G$R###*`4`4`4D zJJJ s38}}q((44 #4#4#=>>>>> (39% & & & & &s?A A PKhP3]F;` ` *__pycache__/literals.cpython-311.opt-2.pycnu[ fc ` ddlZdddddddd d d d Zd ZdZdZedkr edSdS)N     '"\) abfnrtvr r r c|dd\}}t|}||S|drb|dd}t |dkrt d|z t |d}nT#t $rt d|zdwxYw t |d}n!#t $rt d|zdwxYwt|S) Nrxz!invalid hex string escape ('\%s')z#invalid octal string escape ('\%s'))groupsimple_escapesget startswithlen ValueErrorintchr)malltaileschexesis =/opt/alt/python311/lib64/python3.11/lib2to3/pgen2/literals.pyescaper)s1 IC   T " "C   s VQRR u::>>ADHII I TE2AA T T TADHIIt S T VD! AA V V VCdJKKQU U V q66Ms=BB,0CCc|d}|dd|dzkr|dz}|t|t| }tjdt|S)Nrz)\\(\'|\"|\\|[abfnrtv]|x.{0,2}|[0-7]{1,3}))rresubr))sqs r( evalStringr0(s\ !A!u!|| aC #a&&#a&&.A 6> J JJctdD]G}t|}t|}t|}||krt ||||HdS)N)ranger!reprr0print)r'cr.es r(testr92s` 3ZZ FF GG qMM 66 !Q1    r1__main__)r,rr)r0r9__name__r1r(r=sC   *KKK zDFFFFFr1PKhP3]H;˨*__pycache__/__init__.cpython-311.opt-2.pycnu[ fdS)Nr=/opt/alt/python311/lib64/python3.11/lib2to3/pgen2/__init__.pyrs rPKhP3].33 __pycache__/conv.cpython-311.pycnu[ f%HdZddlZddlmZmZGddejZdS)aConvert graminit.[ch] spit out by pgen to Python code. Pgen is the Python parser generator. It is useful to quickly create a parser from a grammar file in Python's grammar notation. But I don't want my parsers to be written in C (yet), so I'm translating the parsing tables to Python data structures and writing a Python parse engine. Note that the token numbers are constants determined by the standard Python tokenizer. The standard token module defines these numbers and their names (the names are not used much). The token numbers are hardcoded into the Python tokenizer and into pgen. A Python implementation of the Python tokenizer is also available, in the standard tokenize module. On the other hand, symbol numbers (representing the grammar's non-terminals) are assigned by pgen based on the actual grammar input. Note: this module is pretty much obsolete; the pgen module generates equivalent grammar tables directly from the Grammar.txt input file without having to invoke the Python pgen C program. N)grammartokenc*eZdZdZdZdZdZdZdS) Convertera2Grammar subclass that reads classic pgen output files. The run() method reads the tables as produced by the pgen parser generator, typically contained in two C files, graminit.h and graminit.c. The other methods are for internal use only. See the base class for more documentation. c|||||dS)z|r*t|d|d |\|\}}t|}||jvsJ||jvsJ||j|<||j|<d S) zParse the .h file written by pgen. (Internal) This file is a sequence of #define statements defining the nonterminals of the grammar as numbers. We build two tables mapping the numbers to names and back. Can't open : NFrz^#define\s+(\w+)\s+(\d+)$(z): can't parse T) openOSErrorprint symbol2number number2symbolrematchstripgroupsint) r filenameferrlinenolinemosymbolnumbers rrzConverter.parse_graminit_h5sU XAA    E337 8 8 855555   4 4D aKF6==B 4$**,, 4(((FFF26**,,,@AAAA"$VT%77777T%77777-3"6*-3"6**ts <7<c @ t|}n-#t$r }td|d|Yd}~dSd}~wwxYwd}|dzt|}}|dks J||f|dzt|}}|dks J||f|dzt|}}i}g}|d r|d rKt jd |}|s J||fttt| \} } } g} t| D]} |dzt|}}t jd |}|s J||fttt| \}}| ||f|dzt|}}|d ks J||f| || | f<|dzt|}}|d Kt jd |}|s J||fttt| \}}|t|ks J||fg}t|D]} |dzt|}}t jd|}|s J||fttt| \} } } || | f} | t| ks J||f| | | ||dzt|}}|d ks J||f|dzt|}}|d ||_i}t jd|}|s J||ft|d}t|D]}|dzt|}}t jd|}|s J||f|d}ttt|dddd\}}}}|j||ks J||f|j||ks J||f|dks J||f||}|t|ks J||f|dzt|}}t jd|}|s J||fi}t%|d}t'|D]9\}}t)|}tdD]}|d|zzr d||dz|z<:||f||<|dzt|}}|d ks J||f||_g}|dzt|}}t jd|}|s J||ft|d}t|D]}|dzt|}}t jd|}|s J||f| \}}t|}|dkrd}nt%|}| ||f|dzt|}}|d ks J||f||_|dzt|}}|dks J||f|dzt|}}t jd|}|s J||ft|d}|t|jksJ|dzt|}}|dks J||f|dzt|}}t jd|}|s J||ft|d}|t|jks J||f|dzt|}}t jd|}|s J||ft|d} | |jvs J||f| |_|dzt|}}|d ks J||f |dzt|}}J||f#t0$rYdSwxYw)aParse the .c file written by pgen. (Internal) The file looks as follows. The first two lines are always this: #include "pgenheaders.h" #include "grammar.h" After that come four blocks: 1) one or more state definitions 2) a table defining dfas 3) a table defining labels 4) a struct defining the grammar A state definition has the following form: - one or more arc arrays, each of the form: static arc arcs__[] = { {, }, ... }; - followed by a state array, of the form: static state states_[] = { {, arcs__}, ... }; rrNFrrz#include "pgenheaders.h" z#include "grammar.h" z static arc z)static arc arcs_(\d+)_(\d+)\[(\d+)\] = {$z\s+{(\d+), (\d+)},$z}; z'static state states_(\d+)\[(\d+)\] = {$z\s+{(\d+), arcs_(\d+)_(\d+)},$zstatic dfa dfas\[(\d+)\] = {$z0\s+{(\d+), "(\w+)", (\d+), (\d+), states_(\d+),$z\s+("(?:\\\d\d\d)*")},$z!static label labels\[(\d+)\] = {$z\s+{(\d+), (0|"\w+")},$0zgrammar _PyParser_Grammar = { z \s+(\d+),$z dfas, z\s+{(\d+), labels},$z \s+(\d+)$)rrrnext startswithrrlistmaprrrangeappendlenstatesgrouprreval enumerateorddfaslabelsstart StopIteration)!r r r!r"r#r$allarcsr6r%nmkarcs_ijststater;ndfasr&r'xyzfirst rawbitsetcbyter<nlabelsr=s! rr zConverter.parse_graminit_cTs 8 XAA    E337 8 8 855555 axa3333fd^333axa////&$///axaoom,,! -//-00 1XJ"$$))FD>))rs3 44551aq((A#)!8T!WWDF"8$??B--~--2C 5 566DAqKKA''''%axav~~~~~~~"&A%axa//-00 1 DdKKB % %~ % %2C--..DAqF ###fd^###E1XX # #%axaX?FF))FD>))rs3 44551aq!t}CII~~~~~~~ T"""" MM% !!8T!WWDF6>>>FD>>>>!!8T!WWDFCoom,,! -D  X6 = =!!FD>!!rBHHQKK  u * *A!!8T!WWDFM  B % %~ % %2XXa[[F"3sBHHQ1a,@,@#A#ABBOFAq!%f-777&$777%f-777&$777666FD>6661IEE ???VTN???!!8T!WWDF4d;;B % %~ % %2ERXXa[[))I!),, + +11vvq++Aq!t}+)*acAg+"5>DLLaxav~~~~~~~ axa X:D A A!!FD>!!rbhhqkk""w " "A!!8T!WWDF4d;;B % %~ % %299;;DAqAACxxGG MM1a& ! ! ! !axav~~~~~~~ axa888864.888axa XmT * *!!FD>!!rBHHQKK  DI&&&&axa{"""VTN"""axa X-t 4 4!!FD>!!rbhhqkk""#dk*****VTN***axa XlD ) )!!FD>!!rBHHQKK  ****VTN*** axav~~~~~~~ %!!8T!WWDF %vtn $ $1    DD s" <7</d ddci|_i|_t|jD]1\}\}}|tjkr | ||j|<%| ||j|<2dS)z1Create additional useful structures. (Internal).N)keywordstokensr9r<rNAME)r ilabeltypevalues rr zConverter.finish_offso  %.t{%;%; + + !FMT5uz!!e&7'- e$$$* D!  + +rN)__name__ __module__ __qualname____doc__rrr r rrrr$s^ >c%c%c%J+++++rr)r]rpgen2rrGrammarrr^rrrast4 ! ]+]+]+]+]+]+]+]+]+]+rPKhP3]ђkJkJ&__pycache__/pgen.cpython-311.opt-2.pycnu[ f6ddlmZmZmZGddejZGddeZGddeZGdd eZ d d Z d S))grammartokentokenizeceZdZdS) PgenGrammarN)__name__ __module__ __qualname__9/opt/alt/python311/lib64/python3.11/lib2to3/pgen2/pgen.pyrrsDr rc~eZdZddZdZdZdZdZdZdZ d Z d Z d Z d Z d ZdZdZdZddZdZdZdS)ParserGeneratorNcNd}|t|d}|j}||_||_t j|j|_|| \|_ |_ | |i|_ | dS)Nzutf-8)encoding)openclosefilenamestreamrgenerate_tokensreadline generatorgettokenparsedfas startsymbolfirst addfirstsets)selfrr close_streams r __init__zParserGenerator.__init__ s >(W555F!%00HOOQ_U%;T$BCCC,2AN5)!M!t44QX%%8F++HOOVTN333'-AHV$!MKKEQx!! "AJ&&:e,,HOOUZ$7888(.AJu%!M!u-QX%%8F++HOOVTN333'-AHV$!Mr ct|j}||D] }||jvr||!dSN)r%rr&r'r calcfirst)rr8r9s r rzParserGenerator.addfirstsetsksaTY^^%%&&  % %D4:%%t$$$ % %r c .|j|}d|j|<|d}i}i}|jD]\}}||jvrh||jvr"|j|}|t d|zn"|||j|}|||||<vd||<|di||<i} |D]4\}} | D],} | | vr!t d|d| d|d| | || | <-5||j|<dS)Nr#zrecursion for rule %rrzrule z is ambiguous; z is in the first sets of z as well as )rrr.r/ ValueErrorrSupdate) rr9r;r<totalset overlapcheckr=r>fsetinverseitsfirstsymbols r rSzParserGenerator.calcfirstssio 4A  :++-- 1 1KE4 !!DJ&&:e,D|()@4)GHHH$NN5))):e,D%%%&* U##"#',aj U##+1133 ( (OE8" ( (W$$$*&*ddFFFEEE76??&LMMM#(  ( $ 4r cti}d}|jtjkr|jtjkr)||jtjk)|tj}|tjd|\}}|tj| ||}t|}| |t|}|||<||}|jtjk||fS)N:) typer ENDMARKERNEWLINErexpectrMOP parse_rhsmake_dfar* simplify_dfa) rrrr9azr;oldlennewlens r rzParserGenerator.parses  i5?**)u},, )u},,;;uz**D KK# & & &>>##DAq KK & & &--1%%CXXF   c " " "XXFDJ"" #i5?**$[  r c  fd} fd t|||g}|D]}i}|jD]1}|jD]'\}} |  | ||i(2t |D]R\}} |D]} | j| krn&t| |} || || |S|S)Nc$i}|||SrRr )r<base addclosures r closurez)ParserGenerator.make_dfa..closuresD Jud # # #Kr cT||vrdSd||<|jD]\}}| ||dSrAr.)r<rmr=r>rns r rnz,ParserGenerator.make_dfa..addclosuresQ}}DK$z + + t=JtT*** + +r )DFAStatenfasetr. setdefaultr-r/r0addarc) rr6finishror4r<r.nfastater=r>rsstrns @r rezParserGenerator.make_dfasM      + + + + +775>>6223 ( (ED!L E E#+=EEKE4(" 4)C)CDDDE"( !5!5 ( ( v &&ByF**+"&&11BMM"%%% R'''' ( r cltd||g}t|D]\}}td|||urdpd|jD]l\}}||vr||} n$t |} |||td| zXtd|| fzmdS)NzDump of NFA for State(final)z -> %d %s -> %d)print enumerater.r2r*r0) rr9r6rvtodor:r<r=r>js r dump_nfazParserGenerator.dump_nfas &&&w!$ 7 7HAu )Q =I C D D D$z 7 7 t4<< 4((AAD AKK%%%=+/****.E1:56666 7 7 7r c *td|t|D]r\}}td||jrdpdt|jD],\}}td|||fz-sdS)NzDump of DFA forrzr{r|r})r~rr3r-r.r/r2)rr9r;r:r<r=r>s r dump_dfazParserGenerator.dump_dfas &&&!# A AHAu )Q ;) Ar B B B%ej&6&6&8&899 A A tnsyy'??@@@@ A A Ar cd}|rnd}t|D]X\}}t|dzt|D]2}||}||kr"||=|D]}|||d}n3Y|ldSdS)NTFr)rranger* unifystate)rr;changesr:state_irstate_jr<s r rfzParserGenerator.simplify_dfas G'nn   7qsCHH--A!!fG'))F%(??E!,,Wg>>>>"& *      r c|\}}|jdkr||fSt}t}|||||jdkr`||\}}|||||jdk`||fS)N|) parse_altrPNFAStaterur)rrgrhaazzs r rdzParserGenerator.parse_rhss~~1 :  a4KBB IIaLLL HHRLLL*## ~~''1 !  *## r6Mr c4|\}}|jdvs|jtjtjfvrV|\}}|||}|jdv7|jtjtjfvV||fS)N)([) parse_itemrPr_rrMSTRINGru)rrgbr7ds r rzParserGenerator.parse_alt s  1zZ''yUZ666??$$DAq HHQKKKA zZ''yUZ666!t r c|jdkrd||\}}|tjd||||fS|\}}|j}|dvr||fS||||dkr||fS||fS)Nr])+*r)rPrrdrbrrcru parse_atom)rrgrhrPs r rzParserGenerator.parse_items :   MMOOO>>##DAq KK# & & & HHQKKKa4K??$$DAqJEJ&&!t MMOOO HHQKKK||!t !t r c|jdkrO||\}}|tjd||fS|jtjtjfvrOt}t}| ||j|||fS| d|j|jdS)Nr)z+expected (...) or NAME or STRING, got %s/%s) rPrrdrbrrcr_rMrrru raise_error)rrgrhs r rzParserGenerator.parse_atom(s :   MMOOO>>##DAq KK# & & &a4K Y5:u|4 4 4 A A HHQ # # # MMOOOa4K   J!Y  4 4 4 4 4r c|j|ks |.|j|kr#|d|||j|j|j}||S)Nzexpected %s/%s, got %s/%s)r_rPrr)rr_rPs r rbzParserGenerator.expect9sd 9  !2tzU7J7J   8!5$)TZ A A A   r ct|j}|dtjtjfvr4t|j}|dtjtjfv4|\|_|_|_|_|_ dSrE) r>rrCOMMENTNLr_rPbeginendline)rtups r rzParserGenerator.gettokenAsr4>""!f)8;777t~&&C!f)8;777AD> 4:tz48TYYYr c |rG ||z}n@#d|gttt|z}YnxYwt ||j|jd|jd|jf)N r#r)joinr%mapstr SyntaxErrorrrr)rmsgargss r rzParserGenerator.raise_errorHs  = =Dj =hhutCTNN';';;<<# tx{ $ TY 899 9s  ;ArR)rr r r!r?r5r1rrSrrerrrfrdrrrrbrrr r r rr s4    2,",","\%%%$$$<!!!0"""H777 AAA*"(444"EEE99999r rceZdZdZddZdS)rcg|_dSrRrq)rs r r!zNFAState.__init__Ss  r Nc>|j||fdSrR)r.r0rr>r=s r ruzNFAState.addarcVs$ %'''''r rR)rr r r!rur r r rrQs7((((((r rc*eZdZdZdZdZdZdZdS)rrc4||_||v|_i|_dSrR)rsr3r.)rrsfinals r r!zDFAState.__init__]s!   r c||j|<dSrRrqrs r ruzDFAState.addarces  %r c`|jD]\}}||ur ||j|<dSrR)r.r/)roldnewr=r>s r rzDFAState.unifystateksA9??,, ' 'KE4s{{#& %  ' 'r c|j|jkrdSt|jt|jkrdS|jD]$\}}||j|urdS%dS)NFT)r3r*r.r/get)rotherr=r>s r __eq__zDFAState.__eq__ps <5= ( (5 ty>>S__ , ,59??,,  KE45:>>%0000uu1tr N)rr r r!rurr__hash__r r r rrrr[sQ   '''   HHHr rr Grammar.txtcHt|}|SrR)rr?)rps r generate_grammarrs!!A >>  r N)r) r|rrrGrammarrobjectrrrrrr r r rs '&&&&&&&&&     '/   E9E9E9E9E9fE9E9E9N (((((v(((#####v###Jr PKhP3]v"v""__pycache__/driver.cpython-311.pycnu[ fQdZdZddgZddlZddlZddlZddlZddlZddlm Z m Z m Z m Z m Z GddeZd Z dd ZdZdZdZedkr$ejee dSdS)zZParser driver. This provides a high-level interface to parse a file into a syntax tree. z#Guido van Rossum Driver load_grammarN)grammarparsetokentokenizepgenc>eZdZd dZd dZd dZd dZd dZd dZdS) rNcZ||_|tj}||_||_dS)N)rlogging getLoggerloggerconvert)selfrrrs ;/opt/alt/python311/lib64/python3.11/lib2to3/pgen2/driver.py__init__zDriver.__init__s. >&((F  FcXtj|j|j}|d}d}dx}x}x}x} } d} |D]D} | \}}}} } |||fkrE||f|ksJ||f|f|\} }|| kr| d| |z zz } | }d}||kr| | ||z } |}|t jt jfvr'| |z } | \}}|dr|dz }d}|tj krtj |}|r-|j dtj||| |||| |fr|r|j dn>d} | \}}|dr|dz }d}Ftjd||| |f|jS) z4Parse a series of tokens and return the syntax tree.rrN z%s %r (prefix=%r)zStop.zincomplete input)rParserrrsetupr COMMENTNLendswithrOPopmaprdebugtok_nameaddtoken ParseErrorrootnode)rtokensrplinenocolumntypevaluestartend line_textprefix quintuples_linenos_columns r parse_tokenszDriver.parse_tokens&s9 Lt| 4 4  1555u5u5sY$ A$ AI1: .D%Y((('5000FF3CU2K000%*"(H$$dh&788F%FFH$$ix88F%F((+666%!$>>$''aKFFux}U+ G !!"5"'."6vGGGzz$77 /K%%g...F NFF~~d## ! "#5#'AA Azrc`tj|j}|||Sz*Parse a stream and return the syntax tree.)r generate_tokensreadliner1)rstreamrr$s rparse_stream_rawzDriver.parse_stream_rawVs*)&/::  ///rc.|||Sr3)r7)rr6rs r parse_streamzDriver.parse_stream[s$$VU333rctj|d|5}|||cdddS#1swxYwYdS)z(Parse a file and return the syntax tree.r)encodingN)ioopenr9)rfilenamer<rr6s r parse_filezDriver.parse_file_s WXsX 6 6 6 4&$$VU33 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4s ;??ctjtj|j}|||S)z*Parse a string and return the syntax tree.)r r4r=StringIOr5r1)rtextrr$s r parse_stringzDriver.parse_stringds5)"+d*;*;*DEE  ///r)NN)F)NF) __name__ __module__ __qualname__rr1r7r9r@rDrrrrs....`0000 44444444 000000rctj|\}}|dkrd}||zdt t t jzdzS)Nz.txtr.z.pickle)ospathsplitextjoinmapstrsys version_info)gtheadtails r_generate_pickle_namerVjsV!!"%%JD$ v~~ $;#c3+;"<"<== = IIr Grammar.txtTFc|tj}|t|n|}|st||s|d|t j|}|rZ|d| ||nV#t$r }|d|Yd}~n1d}~wwxYwn(tj }| ||S)z'Load the grammar (maybe from a pickle).Nz!Generating grammar tables from %szWriting grammar tables to %szWriting failed: %s) r rrV_newerinfor generate_grammardumpOSErrorrGrammarload)rSgpsaveforcerges rrrqs~"$$&(j r " " "bB F2rNN  7<<<  !" % %  5 KK6 ; ; ; 5r  5 5 5 0!44444444 5  5 O   r Hs>B B>B99B>ctj|sdStj|sdStj|tj|kS)z0Inquire whether file a was written since file b.FT)rKrLexistsgetmtime)abs rrYrYsc 7>>!  u 7>>!  t 7  A  "'"2"21"5"5 55rc4tj|rt|St tj|}t j||}tj }| ||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. ) rKrLisfilerrVbasenamepkgutilget_datarr^loads)packagegrammar_source pickled_namedatarcs rload_packaged_grammarrtsx w~~n%%,N+++()9)9.)I)IJJL  G\ 2 2DAGGDMMM Hrc|stjdd}tjtjtjd|D]}t |dddS)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)levelr6formatT)rarb)rQargvr basicConfigINFOstdoutr)argsrSs rmainr}sl x| gl3:,....00Rd$///// 4r__main__)rWNTFN)__doc__ __author____all__r=rKr rmrQrrrrr r objectrrVrrYrtr}rEexitintrHrrrsF 3 ^ $  43333333333333J0J0J0J0J0VJ0J0J0ZJJJ'+04    *666   (    z CHSSTTVV__rPKhP3] ZV#V#!__pycache__/parse.cpython-311.pycnu[ fNdZddlmZGddeZGddeZdS)zParser engine for the grammar tables generated by pgen. The grammar table must be loaded first. See Parser/parser.c in the Python distribution for additional info on how this parsing engine works. )tokenceZdZdZdZdZdS) ParseErrorz(Exception to signal the parser is stuck.c t||d|d|d|||_||_||_||_dS)Nz: type=z, value=z , context=) Exception__init__msgtypevaluecontext)selfr r r r s :/opt/alt/python311/lib64/python3.11/lib2to3/pgen2/parse.pyrzParseError.__init__sX4CCuuugg"7 8 8 8   cTt||j|j|j|jffSN)r r r r )r s r __reduce__zParseError.__reduce__s$DzzDHdiT\JJJrN)__name__ __module__ __qualname____doc__rrrrrrs=22KKKKKrrc@eZdZdZd dZd dZdZdZdZdZ d Z dS) Parsera5Parser engine. The proper usage sequence is: p = Parser(grammar, [converter]) # create instance p.setup([start]) # prepare for parsing : if p.addtoken(...): # parse a token; may raise ParseError break root = p.rootnode # root of abstract syntax tree A Parser instance may be reused by calling setup() repeatedly. A Parser instance contains state pertaining to the current token sequence, and should not be used concurrently by different threads to parse separate token sequences. See driver.py for how to get input tokens by tokenizing a file or string. Parsing is complete when addtoken() returns True; the root of the abstract syntax tree can then be retrieved from the rootnode instance variable. When a syntax error occurs, addtoken() raises the ParseError exception. There is no error recovery; the parser cannot be used after a syntax error was reported (but it can be reinitialized by calling setup()). Nc(||_|pd|_dS)aConstructor. The grammar argument is a grammar.Grammar instance; see the grammar module for more information. The parser is not ready yet for parsing; you must call the setup() method to get it started. The optional convert argument is a function mapping concrete syntax tree nodes to abstract syntax tree nodes. If not given, no conversion is done and the syntax tree produced is the concrete syntax tree. If given, it must be a function of two arguments, the first being the grammar (a grammar.Grammar instance), and the second being the concrete syntax tree node to be converted. The syntax tree is converted from the bottom up. A concrete syntax tree node is a (type, value, context, nodes) tuple, where type is the node type (a token or symbol number), value is None for symbols and a string for tokens, context is None or an opaque value used for error reporting (typically a (lineno, offset) pair), and nodes is a list of children for symbols, and None for tokens. An abstract syntax tree node may be anything; this is entirely up to the converter function. c|Srr)grammarnodes rz!Parser.__init__..ZsrN)rconvert)r rrs rrzParser.__init__<s: >#=#= rc| |jj}|ddgf}|jj|d|f}|g|_d|_t |_dS)aPrepare for parsing. This *must* be called before starting to parse. The optional argument is an alternative start symbol; it defaults to the grammar's start symbol. You can use a Parser instance to parse any number of programs; each time you call setup() the parser is reset to an initial state determined by the (implicit or explicit) start symbol. N)rstartdfasstackrootnodeset used_names)r r"newnode stackentrys rsetupz Parser.setup\sX =L&E$b)l'.7;  \  %%rc||||} |jd\}}}|\}} ||} | D]\} } |jj| \} }|| krw| dksJ|||| || }||d|fgkrC||jsdS|jd\}}}|\}} ||d|fgkCdS| dkrE|jj| }|\}}||vr*|| |jj| | |nGd|f| vr.||jstd|||ntd|||K)z>>$E -QJ<77 #z(#'44+/:b>(UD(+  !-QJ<77!55#XX!\.q1F*0'Ix)) !T\%6q%98WMMMu:%%HHJJJ:?()9)-ug???? %[$wGGGS) Hrc|tjkr=|j||jj|}||S|jj|}|td||||S)z&Turn a token into a label. (Internal)Nz bad token) rNAMEr'addrkeywordsgettokensr)r r r r r3s rr.zParser.classifys~ 5:   O   & & &\*..u55F! $((.. >[$w?? ? rc|jd\}}}|||df}||j|}||d||||f|jd<dS)zShift a token. (Internal)r,N)r$rrappend) r r r r:r r4r5rr(s rr0z Parser.shiftsi:b>UD.,,t|W55   HOOG $ $ $x. 2rc|jd\}}}|d|gf}|||f|jd<|j|d|fdS)zPush a nonterminal. (Internal)r,Nr!)r$rH) r r newdfar:r r4r5rr(s rr2z Parser.pushsW:b>UDw+x. 2 61g./////rc|j\}}}||j|}|O|jr.|jd\}}}|d|dS||_|j|j_dSdS)zPop a nonterminal. (Internal)Nr,)r$r1rrrHr%r')r popdfapopstatepopnoder(r4r5rs rr1z Parser.pops$(JNN$4$4!',,t|W55  z ;#':b> UDR((((( ' +/? (((  rr) rrrrrr*r@r.r0r2r1rrrrrs:????@    0.H.H.H`   ///000 ; ; ; ; ;rrN)rrrrobjectrrrrrQs K K K K K K K Kn;n;n;n;n;Vn;n;n;n;n;rPKhP3]:#__pycache__/grammar.cpython-311.pycnu[ fdZddlZddlmZGddeZdZiZeD]*Z e r&e \Z Z e ee ee <+[ [ [ dS)aThis module defines the data structures used to represent a grammar. These are a bit arcane because they are derived from the data structures used by Python's 'pgen' parser generator. There's also a table here mapping operators to their names in the token module; the Python tokenize module reports all operators as the fallback token code OP, but the parser needs the actual token code. N)tokenc6eZdZdZdZdZdZdZdZdZ dS) Grammara Pgen parsing tables conversion class. Once initialized, this class supplies the grammar tables for the parsing engine implemented by parse.py. The parsing engine accesses the instance variables directly. The class here does not provide initialization of the tables; several subclasses exist to do this (see the conv and pgen modules). The load() method reads the tables from a pickle file, which is much faster than the other ways offered by subclasses. The pickle file is written by calling dump() (after loading the grammar tables using a subclass). The report() method prints a readable representation of the tables to stdout, for debugging. The instance variables are as follows: symbol2number -- a dict mapping symbol names to numbers. Symbol numbers are always 256 or higher, to distinguish them from token numbers, which are between 0 and 255 (inclusive). number2symbol -- a dict mapping numbers to symbol names; these two are each other's inverse. states -- a list of DFAs, where each DFA is a list of states, each state is a list of arcs, and each arc is a (i, j) pair where i is a label and j is a state number. The DFA number is the index into this list. (This name is slightly confusing.) Final states are represented by a special arc of the form (0, j) where j is its own state number. dfas -- a dict mapping symbol numbers to (DFA, first) pairs, where DFA is an item from the states list above, and first is a set of tokens that can begin this grammar rule (represented by a dict whose values are always 1). labels -- a list of (x, y) pairs where x is either a token number or a symbol number, and y is either None or a string; the strings are keywords. The label number is the index in this list; label numbers are used to mark state transitions (arcs) in the DFAs. start -- the number of the grammar's start symbol. keywords -- a dict mapping keyword strings to arc labels. tokens -- a dict mapping token numbers to arc labels. ci|_i|_g|_i|_dg|_i|_i|_i|_d|_dS)N)rEMPTY) symbol2number number2symbolstatesdfaslabelskeywordstokens symbol2labelstart)selfs GREATER = EQUAL . DOT % PERCENT ` BACKQUOTE { LBRACE } RBRACE @ AT @= ATEQUAL == EQEQUAL != NOTEQUAL <> NOTEQUAL <= LESSEQUAL >= GREATEREQUAL ~ TILDE ^ CIRCUMFLEX << LEFTSHIFT >> RIGHTSHIFT ** DOUBLESTAR += PLUSEQUAL -= MINEQUAL *= STAREQUAL /= SLASHEQUAL %= PERCENTEQUAL &= AMPEREQUAL |= VBAREQUAL ^= CIRCUMFLEXEQUAL <<= LEFTSHIFTEQUAL >>= RIGHTSHIFTEQUAL **= DOUBLESTAREQUAL // DOUBLESLASH //= DOUBLESLASHEQUAL -> RARROW := COLONEQUAL )r8rrobjectr opmap_rawopmap splitlineslinesplitopnamer+r9rrrCs   j#j#j#j#j#fj#j#j#^1  f   " "))D )::<<DGE4((b "dddrPKhP3]qD ;#;#'__pycache__/parse.cpython-311.opt-1.pycnu[ fNdZddlmZGddeZGddeZdS)zParser engine for the grammar tables generated by pgen. The grammar table must be loaded first. See Parser/parser.c in the Python distribution for additional info on how this parsing engine works. )tokenceZdZdZdZdZdS) ParseErrorz(Exception to signal the parser is stuck.c t||d|d|d|||_||_||_||_dS)Nz: type=z, value=z , context=) Exception__init__msgtypevaluecontext)selfr r r r s :/opt/alt/python311/lib64/python3.11/lib2to3/pgen2/parse.pyrzParseError.__init__sX4CCuuugg"7 8 8 8   cTt||j|j|j|jffSN)r r r r )r s r __reduce__zParseError.__reduce__s$DzzDHdiT\JJJrN)__name__ __module__ __qualname____doc__rrrrrrs=22KKKKKrrc@eZdZdZd dZd dZdZdZdZdZ d Z dS) Parsera5Parser engine. The proper usage sequence is: p = Parser(grammar, [converter]) # create instance p.setup([start]) # prepare for parsing : if p.addtoken(...): # parse a token; may raise ParseError break root = p.rootnode # root of abstract syntax tree A Parser instance may be reused by calling setup() repeatedly. A Parser instance contains state pertaining to the current token sequence, and should not be used concurrently by different threads to parse separate token sequences. See driver.py for how to get input tokens by tokenizing a file or string. Parsing is complete when addtoken() returns True; the root of the abstract syntax tree can then be retrieved from the rootnode instance variable. When a syntax error occurs, addtoken() raises the ParseError exception. There is no error recovery; the parser cannot be used after a syntax error was reported (but it can be reinitialized by calling setup()). Nc(||_|pd|_dS)aConstructor. The grammar argument is a grammar.Grammar instance; see the grammar module for more information. The parser is not ready yet for parsing; you must call the setup() method to get it started. The optional convert argument is a function mapping concrete syntax tree nodes to abstract syntax tree nodes. If not given, no conversion is done and the syntax tree produced is the concrete syntax tree. If given, it must be a function of two arguments, the first being the grammar (a grammar.Grammar instance), and the second being the concrete syntax tree node to be converted. The syntax tree is converted from the bottom up. A concrete syntax tree node is a (type, value, context, nodes) tuple, where type is the node type (a token or symbol number), value is None for symbols and a string for tokens, context is None or an opaque value used for error reporting (typically a (lineno, offset) pair), and nodes is a list of children for symbols, and None for tokens. An abstract syntax tree node may be anything; this is entirely up to the converter function. c|Srr)grammarnodes rz!Parser.__init__..ZsrN)rconvert)r rrs rrzParser.__init__<s: >#=#= rc| |jj}|ddgf}|jj|d|f}|g|_d|_t |_dS)aPrepare for parsing. This *must* be called before starting to parse. The optional argument is an alternative start symbol; it defaults to the grammar's start symbol. You can use a Parser instance to parse any number of programs; each time you call setup() the parser is reset to an initial state determined by the (implicit or explicit) start symbol. N)rstartdfasstackrootnodeset used_names)r r"newnode stackentrys rsetupz Parser.setup\sX =L&E$b)l'.7;  \  %%rc||||} |jd\}}}|\}} ||} | D]\} } |jj| \} }|| kro|||| || }||d|fgkrC||jsdS|jd\}}}|\}} ||d|fgkCdS| dkrE|jj| }|\}}||vr*|| |jj| | |nGd|f| vr.||jstd|||ntd|||C)z>>$E -QJ<77 #z(#'44+/:b>(UD(+  !-QJ<77!55#XX!\.q1F*0'Ix)) !T\%6q%98WMMMu:%%HHJJJ:?()9)-ug???? %[$wGGGS) Hrc|tjkr=|j||jj|}||S|jj|}|td||||S)z&Turn a token into a label. (Internal)Nz bad token) rNAMEr'addrkeywordsgettokensr)r r r r r3s rr.zParser.classifys~ 5:   O   & & &\*..u55F! $((.. >[$w?? ? rc|jd\}}}|||df}||j|}||d||||f|jd<dS)zShift a token. (Internal)r,N)r$rrappend) r r r r:r r4r5rr(s rr0z Parser.shiftsi:b>UD.,,t|W55   HOOG $ $ $x. 2rc|jd\}}}|d|gf}|||f|jd<|j|d|fdS)zPush a nonterminal. (Internal)r,Nr!)r$rH) r r newdfar:r r4r5rr(s rr2z Parser.pushsW:b>UDw+x. 2 61g./////rc|j\}}}||j|}|O|jr.|jd\}}}|d|dS||_|j|j_dSdS)zPop a nonterminal. (Internal)Nr,)r$r1rrrHr%r')r popdfapopstatepopnoder(r4r5rs rr1z Parser.pops$(JNN$4$4!',,t|W55  z ;#':b> UDR((((( ' +/? (((  rr) rrrrrr*r@r.r0r2r1rrrrrs:????@    0.H.H.H`   ///000 ; ; ; ; ;rrN)rrrrobjectrrrrrQs K K K K K K K Kn;n;n;n;n;Vn;n;n;n;n;rPKhP3]`K K !__pycache__/token.cpython-311.pycnu[ f#dZdZdZdZdZdZdZdZdZd Z d Z d Z d Z d Z dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZd Z d!Z!d"Z"d#Z#d$Z$d%Z%d&Z&d'Z'd(Z(d)Z)d*Z*d+Z+d,Z,d-Z-d.Z.d/Z/d0Z0d1Z1d2Z2d3Z3d4Z4d5Z5d6Z6d7Z7d8Z8d9Z9d:Z:d;Z;dZ>iZ?e@eABD] \ZCZDeEeDeEdureCe?eD<!d?ZFd@ZGdAZHdBS)Cz!Token constants (from "token.h").  !"#$%&'()*+,-./0123456789:;<c|tkSN NT_OFFSETxs :/opt/alt/python311/lib64/python3.11/lib2to3/pgen2/token.py ISTERMINALrGOs y=c|tkSrArBrDs rF ISNONTERMINALrJR >rHc|tkSrA) ENDMARKERrDs rFISEOFrNUrKrHN)I__doc__rMNAMENUMBERSTRINGNEWLINEINDENTDEDENTLPARRPARLSQBRSQBCOLONCOMMASEMIPLUSMINUSSTARSLASHVBARAMPERLESSGREATEREQUALDOTPERCENT BACKQUOTELBRACERBRACEEQEQUALNOTEQUAL LESSEQUAL GREATEREQUALTILDE CIRCUMFLEX LEFTSHIFT RIGHTSHIFT DOUBLESTAR PLUSEQUALMINEQUAL STAREQUAL SLASHEQUAL PERCENTEQUAL AMPEREQUAL VBAREQUALCIRCUMFLEXEQUALLEFTSHIFTEQUALRIGHTSHIFTEQUALDOUBLESTAREQUAL DOUBLESLASHDOUBLESLASHEQUALATATEQUALOPCOMMENTNLRARROWAWAITASYNC ERRORTOKEN COLONEQUALN_TOKENSrCtok_namelistglobalsitems_name_valuetyperGrJrNrHrFrs('                                                      T''))//++,,!!ME6 tF||ttAww rHPKhP3]c """"(__pycache__/driver.cpython-311.opt-1.pycnu[ fQdZdZddgZddlZddlZddlZddlZddlZddlm Z m Z m Z m Z m Z GddeZd Z dd ZdZdZdZedkr$ejee dSdS)zZParser driver. This provides a high-level interface to parse a file into a syntax tree. z#Guido van Rossum Driver load_grammarN)grammarparsetokentokenizepgenc>eZdZd dZd dZd dZd dZd dZd dZdS) rNcZ||_|tj}||_||_dS)N)rlogging getLoggerloggerconvert)selfrrrs ;/opt/alt/python311/lib64/python3.11/lib2to3/pgen2/driver.py__init__zDriver.__init__s. >&((F  Fc,tj|j|j}|d}d}dx}x}x}x} } d} |D].} | \}}}} } |||fkr/|\} }|| kr| d| |z zz } | }d}||kr| | ||z } |}|t jt jfvr'| |z } | \}}|dr|dz }d}|tj krtj |}|r-|j dtj||| |||| |fr|r|j dn>d} | \}}|dr|dz }d}0tjd||| |f|jS) z4Parse a series of tokens and return the syntax tree.rrN z%s %r (prefix=%r)zStop.zincomplete input)rParserrrsetupr COMMENTNLendswithrOPopmaprdebugtok_nameaddtoken ParseErrorrootnode)rtokensrplinenocolumntypevaluestartend line_textprefix quintuples_linenos_columns r parse_tokenszDriver.parse_tokens&s Lt| 4 4  1555u5u5sY$ A$ AI1: .D%Y(((%*"(H$$dh&788F%FFH$$ix88F%F((+666%!$>>$''aKFFux}U+ G !!"5"'."6vGGGzz$77 /K%%g...F NFF~~d## ! "#5#'AA Azrc`tj|j}|||Sz*Parse a stream and return the syntax tree.)r generate_tokensreadliner1)rstreamrr$s rparse_stream_rawzDriver.parse_stream_rawVs*)&/::  ///rc.|||Sr3)r7)rr6rs r parse_streamzDriver.parse_stream[s$$VU333rctj|d|5}|||cdddS#1swxYwYdS)z(Parse a file and return the syntax tree.r)encodingN)ioopenr9)rfilenamer<rr6s r parse_filezDriver.parse_file_s WXsX 6 6 6 4&$$VU33 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4s ;??ctjtj|j}|||S)z*Parse a string and return the syntax tree.)r r4r=StringIOr5r1)rtextrr$s r parse_stringzDriver.parse_stringds5)"+d*;*;*DEE  ///r)NN)F)NF) __name__ __module__ __qualname__rr1r7r9r@rDrrrrs....`0000 44444444 000000rctj|\}}|dkrd}||zdt t t jzdzS)Nz.txtr.z.pickle)ospathsplitextjoinmapstrsys version_info)gtheadtails r_generate_pickle_namerVjsV!!"%%JD$ v~~ $;#c3+;"<"<== = IIr Grammar.txtTFc|tj}|t|n|}|st||s|d|t j|}|rZ|d| ||nV#t$r }|d|Yd}~n1d}~wwxYwn(tj }| ||S)z'Load the grammar (maybe from a pickle).Nz!Generating grammar tables from %szWriting grammar tables to %szWriting failed: %s) r rrV_newerinfor generate_grammardumpOSErrorrGrammarload)rSgpsaveforcerges rrrqs~"$$&(j r " " "bB F2rNN  7<<<  !" % %  5 KK6 ; ; ; 5r  5 5 5 0!44444444 5  5 O   r Hs>B B>B99B>ctj|sdStj|sdStj|tj|kS)z0Inquire whether file a was written since file b.FT)rKrLexistsgetmtime)abs rrYrYsc 7>>!  u 7>>!  t 7  A  "'"2"21"5"5 55rc4tj|rt|St tj|}t j||}tj }| ||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. ) rKrLisfilerrVbasenamepkgutilget_datarr^loads)packagegrammar_source pickled_namedatarcs rload_packaged_grammarrtsx w~~n%%,N+++()9)9.)I)IJJL  G\ 2 2DAGGDMMM Hrc|stjdd}tjtjtjd|D]}t |dddS)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)levelr6formatT)rarb)rQargvr basicConfigINFOstdoutr)argsrSs rmainr}sl x| gl3:,....00Rd$///// 4r__main__)rWNTFN)__doc__ __author____all__r=rKr rmrQrrrrr r objectrrVrrYrtr}rEexitintrHrrrsF 3 ^ $  43333333333333J0J0J0J0J0VJ0J0J0ZJJJ'+04    *666   (    z CHSSTTVV__rPKhP3]O=G *__pycache__/literals.cpython-311.opt-1.pycnu[ fc bdZddlZddddddd d d d d ZdZdZdZedkr edSdS)z>ADHII I TE2AA T T TADHIIt S T VD! AA V V VCdJKKQU U V q66Ms=BB,0CCc|d}|dd|dzkr|dz}|t|t| }tjdt|S)Nrz)\\(\'|\"|\\|[abfnrtv]|x.{0,2}|[0-7]{1,3}))rresubr))sqs r( evalStringr0(s\ !A!u!|| aC #a&&#a&&.A 6> J JJctdD]G}t|}t|}t|}||krt ||||HdS)N)ranger!reprr0print)r'cr.es r(testr92s` 3ZZ FF GG qMM 66 !Q1    r1__main__)__doc__r,rr)r0r9__name__r1r(r>sCB   *KKK zDFFFFFr1PKhP3]`K K '__pycache__/token.cpython-311.opt-1.pycnu[ f#dZdZdZdZdZdZdZdZdZd Z d Z d Z d Z d Z dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZd Z d!Z!d"Z"d#Z#d$Z$d%Z%d&Z&d'Z'd(Z(d)Z)d*Z*d+Z+d,Z,d-Z-d.Z.d/Z/d0Z0d1Z1d2Z2d3Z3d4Z4d5Z5d6Z6d7Z7d8Z8d9Z9d:Z:d;Z;dZ>iZ?e@eABD] \ZCZDeEeDeEdureCe?eD<!d?ZFd@ZGdAZHdBS)Cz!Token constants (from "token.h").  !"#$%&'()*+,-./0123456789:;<c|tkSN NT_OFFSETxs :/opt/alt/python311/lib64/python3.11/lib2to3/pgen2/token.py ISTERMINALrGOs y=c|tkSrArBrDs rF ISNONTERMINALrJR >rHc|tkSrA) ENDMARKERrDs rFISEOFrNUrKrHN)I__doc__rMNAMENUMBERSTRINGNEWLINEINDENTDEDENTLPARRPARLSQBRSQBCOLONCOMMASEMIPLUSMINUSSTARSLASHVBARAMPERLESSGREATEREQUALDOTPERCENT BACKQUOTELBRACERBRACEEQEQUALNOTEQUAL LESSEQUAL GREATEREQUALTILDE CIRCUMFLEX LEFTSHIFT RIGHTSHIFT DOUBLESTAR PLUSEQUALMINEQUAL STAREQUAL SLASHEQUAL PERCENTEQUAL AMPEREQUAL VBAREQUALCIRCUMFLEXEQUALLEFTSHIFTEQUALRIGHTSHIFTEQUALDOUBLESTAREQUAL DOUBLESLASHDOUBLESLASHEQUALATATEQUALOPCOMMENTNLRARROWAWAITASYNC ERRORTOKEN COLONEQUALN_TOKENSrCtok_namelistglobalsitems_name_valuetyperGrJrNrHrFrs('                                                      T''))//++,,!!ME6 tF||ttAww rHPKhP3]8)('__pycache__/parse.cpython-311.opt-2.pycnu[ fL ddlmZGddeZGddeZdS))tokenceZdZ dZdZdS) ParseErrorc t||d|d|d|||_||_||_||_dS)Nz: type=z, value=z , context=) Exception__init__msgtypevaluecontext)selfr r r r s :/opt/alt/python311/lib64/python3.11/lib2to3/pgen2/parse.pyrzParseError.__init__sX4CCuuugg"7 8 8 8   cTt||j|j|j|jffSN)r r r r )r s r __reduce__zParseError.__reduce__s$DzzDHdiT\JJJrN)__name__ __module__ __qualname__rrrrrrs:2KKKKKrrc>eZdZ d dZd dZdZdZdZdZdZ dS) ParserNc* ||_|pd|_dS)Nc|Srr)grammarnodes rz!Parser.__init__..Zsr)rconvert)r rrs rrzParser.__init__<s$ 8 >#=#= rc | |jj}|ddgf}|jj|d|f}|g|_d|_t |_dS)N)rstartdfasstackrootnodeset used_names)r r!newnode stackentrys rsetupz Parser.setup\s]  =L&E$b)l'.7;  \  %%rc ||||} |jd\}}}|\}} ||} | D]\} } |jj| \} }|| kro|||| || }||d|fgkrC||jsdS|jd\}}}|\}} ||d|fgkCdS| dkrE|jj| }|\}}||vr*|| |jj| | |nGd|f| vr.||jstd|||ntd|||C)NTr Fztoo much inputz bad input) classifyr#rlabelsshiftpopr"pushr)r r r r ilabeldfastaterstatesfirstarcsinewstatetvitsdfa itsstatesitsfirsts raddtokenzParser.addtokentsJtUG44) H#z"~ CMFE%=D#$ H$ H 8|*1-1Q;;JJtUHg>>>$E -QJ<77 #z(#'44+/:b>(UD(+  !-QJ<77!55#XX!\.q1F*0'Ix)) !T\%6q%98WMMMu:%%HHJJJ:?()9)-ug???? %[$wGGGS) Hrc |tjkr=|j||jj|}||S|jj|}|td||||S)Nz bad token) rNAMEr&addrkeywordsgettokensr)r r r r r2s rr-zParser.classifys4 5:   O   & & &\*..u55F! $((.. >[$w?? ? rc |jd\}}}|||df}||j|}||d||||f|jd<dSNr+)r#rrappend) r r r r9r r3r4rr's rr/z Parser.shiftsl(:b>UD.,,t|W55   HOOG $ $ $x. 2rc |jd\}}}|d|gf}|||f|jd<|j|d|fdS)Nr+r )r#rH) r r newdfar9r r3r4rr's rr1z Parser.pushsZ-:b>UDw+x. 2 61g./////rc |j\}}}||j|}|O|jr.|jd\}}}|d|dS||_|j|j_dSdSrG)r#r0rrrHr$r&)r popdfapopstatepopnoder'r3r4rs rr0z Parser.pops,$(JNN$4$4!',,t|W55  z ;#':b> UDR((((( ' +/? (((  rr) rrrrr)r?r-r/r1r0rrrrrs:????@    0.H.H.H`   ///000 ; ; ; ; ;rrN)rrrobjectrrrrrQs K K K K K K K Kn;n;n;n;n;Vn;n;n;n;n;rPKhP3]@{?]]*__pycache__/tokenize.cpython-311.opt-1.pycnu[ fR PdZdZdZddlZddlZddlmZmZddlTddl m Z d e e Dgd zZ [ e n #e$reZ YnwxYwd Zd Zd ZdZdZdZeedezzeezZdZdZdZdZeddZeeeeeZdZeddeezZdezZeeeZ ede dzZ!ee!e eZ"dZ#dZ$d Z%d!Z&d"Z'ee'd#ze'd$zZ(ee'd%ze'd&zZ)ed'd(d)d*d+d,d-d.d/ Z*d0Z+ed1d2d3Z,ee*e+e,Z-ee"e-e)eZ.ee.zZ/ee'd4zed5dze'd6zed7dzZ0edee(Z1eee1e"e-e0ezZ2e3ej4e/e2e%e&f\Z5Z6Z7Z8ed8d9d:d;ed8d9dzZ9ej4e#ej4e$e7e8d?d@e9DdAe9DdBe9DZ:d#d$hdCe9DzdDe9DzZ;d5d7hdEe9DzdFe9DzZZ?GdJdKe>Z@dLZAeAfdMZBdNZCGdOdPZDej4dQejEZFej4dRejEZGdSZHdTZIdUZJdVZKeLdWkrUddlMZMeNeMjOdkr&eBePeMjOdjQdSeBeMjRjQdSdS)XaTokenization help for Python programs. generate_tokens(readline) is a generator that breaks a stream of text into Python tokens. It accepts a readline-like method which is called repeatedly to get the next line of input (or "" for EOF). It generates 5-tuples with these members: the token type (see token.py) the token (a string) the starting (row, column) indices of the token (a 2-tuple of ints) the ending (row, column) indices of the token (a 2-tuple of ints) the original line (string) It is designed to match the working of the Python tokenizer exactly, except that it produces COMMENT tokens for comments and gives type OP for all operators Older entry points tokenize_loop(readline, tokeneater) tokenize(readline, tokeneater=printtoken) are the same, except instead of generating tokens, tokeneater is a callback function to which the 5 fields described above are passed as 5 arguments, each time a new token is found.zKa-Ping Yee z@GvR, ESR, Tim Peters, Thomas Wouters, Fred Drake, Skip MontanaroN)BOM_UTF8lookup)*)tokenc*g|]}|ddk|S)r_).0xs =/opt/alt/python311/lib64/python3.11/lib2to3/pgen2/tokenize.py r%s! 0 0 0AaDCKK1KKK)tokenizegenerate_tokens untokenizec8dd|zdzS)N(|))joinchoicess r groupr0sC#((7"3"33c99rct|dzS)Nrrrs r anyr1s%/C//rct|dzS)N?rrs r mayber 2sE7Oc11rc:tfdDS)Nc3K|];}dzD]3}||k,||zV4z _combinations..4s`!e)qzz||qzz||/K/KA/K/K/K/K/Kr)set)r&s`r _combinationsr)3s;   rz[ \f\t]*z #[^\r\n]*z\\\r?\nz\w+z0[bB]_?[01]+(?:_[01]+)*z(0[xX]_?[\da-fA-F]+(?:_[\da-fA-F]+)*[lL]?z0[oO]?_?[0-7]+(?:_[0-7]+)*[lL]?z[1-9]\d*(?:_\d+)*[lL]?z0[lL]?z[eE][-+]?\d+(?:_\d+)*z\d+(?:_\d+)*\.(?:\d+(?:_\d+)*)?z\.\d+(?:_\d+)*z \d+(?:_\d+)*z\d+(?:_\d+)*[jJ]z[jJ]z[^'\\]*(?:\\.[^'\\]*)*'z[^"\\]*(?:\\.[^"\\]*)*"z%[^'\\]*(?:(?:\\.|'(?!''))[^'\\]*)*'''z%[^"\\]*(?:(?:\\.|"(?!""))[^"\\]*)*"""z'(?:[uUrRbBfF]|[rR][fFbB]|[fFbBuU][rR])?'''"""z'[^\n'\\]*(?:\\.[^\n'\\]*)*'z"[^\n"\\]*(?:\\.[^\n"\\]*)*"z\*\*=?z>>=?z<<=?z<>z!=z//=?z->z[+\-*/%&@|^=<>]=?~z[][(){}]z\r?\nz:=z[:;.,`@]z'[^\n'\\]*(?:\\.[^\n'\\]*)*'z"[^\n"\\]*(?:\\.[^\n"\\]*)*"rRfFbB>UuURUruRur)r-r.r*r+c$i|] }|dtSr*) single3progr prefixs r r@y FFFv&~~~{FFFrc$i|] }|dtSr+) double3progr>s r r@r@zrArci|]}|dSNr r>s r r@r@{s777vt777rch|]}|dSr<r r>s r rH///^^^///rch|]}|dSrCr r>s r rHrHrIrch|]}|dS)r-r r>s r rHrH---f\\\---rch|]}|dS)r.r r>s r rHrHrLrceZdZdS) TokenErrorN__name__ __module__ __qualname__r rr rPrPrrPceZdZdS)StopTokenizingNrQr rr rWrWrUrrWc z|\}}|\}}td||||t|t|fzdS)Nz%d,%d-%d,%d: %s %s)printtok_namerepr) typerxxx_todo_changemexxx_todo_changeme1linesrowscolerowecols r printtokenrdsR$LT4%LT4 tT4$e= >?????rcJ t||dS#t$rYdSwxYw)a: The tokenize() function accepts two parameters: one representing the input stream, and one providing an output mechanism for tokenize(). The first parameter, readline, must be a callable object which provides the same interface as the readline() method of built-in file objects. Each call to the function should return one line of input as a string. The second parameter, tokeneater, must also be a callable object. It is called once for each token, with five arguments, corresponding to the tuples generated by generate_tokens(). N) tokenize_looprW)readline tokeneaters r rrs? h +++++      s  ""c4t|D]}||dSrF)r)rgrh token_infos r rfrfs3%h//   J  rc&eZdZdZdZdZdZdS) Untokenizerc0g|_d|_d|_dS)Nrr)tokensprev_rowprev_col)selfs r __init__zUntokenizer.__init__s   rcf|\}}||jz }|r|jd|zdSdS)N )rprnappend)rqstartrowcol col_offsets r add_whitespacezUntokenizer.add_whitespacesJS4=(  1 K  sZ/ 0 0 0 0 0 1 1rcp|D]}t|dkr|||nn|\}}}}}|||j||\|_|_|ttfvr|xjdz c_d|_d |jS)Nrrr#) lencompatrzrnrurorpNEWLINENLr)rqiterablettok_typerrvendr_s r rzUntokenizer.untokenizes " "A1vv{{ Ax(((01 -HeUC    & & & K  u % % %+. (DM4=GR=(( " ! wwt{###rcd}g}|jj}|\}}|ttfvr|dz }|tt fvrd}|D]}|dd\}}|ttt tfvr|dz }|tkr||Q|tkr| q|tt fvrd}n|r|r||dd}||dS)NFrtTr|) rnruNAMENUMBERrrASYNCAWAITINDENTDEDENTpop) rqrr startlineindents toks_appendtoknumtokvaltoks r r~zUntokenizer.compats k(  dF^ # # cMF gr] " "I  C !WNFF$u555# v&&&6!! GR=((  "w " GBK(((! K    #  rN)rRrSrTrrrzrr~r rr rlrlsP 111 $ $ $     rrlz&^[ \t\f]*#.*?coding[:=][ \t]*([-\w.]+)s^[ \t\f]*(?:[#\r\n]|$)c|dddd}|dks|drdS|dvs|drd S|S) z(Imitates get_normal_name in tokenizer.c.N r -utf-8zutf-8-)zlatin-1 iso-8859-1z iso-latin-1)zlatin-1-z iso-8859-1-z iso-latin-1-r)lowerreplace startswith)orig_encencs r _get_normal_namersv 3B3-     ' 'S 1 1C g~~11~w 666 ~~ABB7| OrcLdd}d}fd}fd}|}|trd|dd}d}|s|gfS||}|r||gfSt|s||gfS|}|s||gfS||}|r|||gfS|||gfS) a The detect_encoding() function is used to detect the encoding that should be used to decode a Python source file. It requires one argument, readline, in the same way as the tokenize() generator. It will call readline a maximum of twice, and return the encoding used (as a string) and a list of any lines (left as bytes) it has read in. It detects the encoding from the presence of a utf-8 bom or an encoding cookie as specified in pep-0263. If both a bom and a cookie are present, but disagree, a SyntaxError will be raised. If the encoding cookie is an invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, 'utf-8-sig' is returned. If no encoding is specified, then the default of 'utf-8' will be returned. FNrcV S#t$rtcYSwxYwrF) StopIterationbytes)rgsr read_or_stopz%detect_encoding..read_or_stops< 8::    77NNN s ((c| |d}n#t$rYdSwxYwt|}|sdSt |d} t |}n #t$rtd|zwxYwr|j dkrtd|dz }|S)Nasciirzunknown encoding: rzencoding problem: utf-8z-sig) decodeUnicodeDecodeError cookie_rematchrrr LookupError SyntaxErrorname)r_ line_stringrencodingcodec bom_founds r find_cookiez$detect_encoding..find_cookie s ++g..KK!   44  ,, 4#EKKNN33 ?8$$EE ? ? ?2X=>> > ?  zW$$!";<<<  Hs ''+A;;BTz utf-8-sig)rrblank_rer)rgrdefaultrrfirstsecondrs` @r detect_encodingrs-$IHG , LNNE !! abb  {{5!!H!%  >>%   \^^F  {6""H)%(( UFO ##rcHt}||S)aTransform tokens back into Python source code. Each element returned by the iterable must be a token sequence with at least two elements, a token number and token value. If only two tokens are passed, the resulting output is poor. Round-trip invariant for full input: Untokenized source will match input source exactly Round-trip invariant for limited input: # Output text will tokenize the back to the input t1 = [tok[:2] for tok in generate_tokens(f.readline)] newcode = untokenize(t1) readline = iter(newcode.splitlines(1)).next t2 = [tok[:2] for tokin generate_tokens(readline)] assert t1 == t2 )rlr)ruts r rr:s$ B == " ""rc# Kdx}x}}d\}}d}dg}d}d} d} d} |} n#t$rd} YnwxYw|dz}dt| }} |r| std||| }|r>|dx} }t || d|z|||f|| zfVd\}}d}nZ|rA| ddd kr3| d dd kr%t || z||t| f|fVd}d}|| z}|| z}|dkr|s| sn d}| |krO| | d kr|dz}n2| | d kr|tzdztz}n| | dkrd}nn | dz} | |kO| |krn|r|Vd}| | dvr| | dkry| | dd}| t|z}t||| f|| t|zf| fVt| |d||f|t| f| fVn>ttf| | dk| | d|| f|t| f| fV0||dkr/| |t| d| |df|| f| fV||dkrT||vrtdd|| | f|dd}| r| |dkrd} d} d} td|| f|| f| fV||dkT| r| r| |dkrd} d} d} n| std|dfd}| |krt| | }|r|d\}}||f||f|} }}| ||| |}}|t"jvs |dkr|dkrt&|||| fVn|dvr,t(}|dkrt}n| rd} |r|Vd}||||| fVnO|dkr|r|Vd}t|||| fVn1|t*vrpt,|}|| | }|r9|d} | || }|r|Vd}t |||| f| fVn||f}| |d}| }n|t.vs"|ddt.vs|ddt.vrk|ddkrG||f}t,|p%t,|dpt,|d}| |dd}}| }nA|r|Vd}t |||| fVn"|r|dvr| r|dkrt2nt4|||| fVt6|||| f}|dkr|s|}/|dvrW|rU|dt6krD|ddkr8|dkr d} |d} t2|d|d|d|dfVd}|r|Vd}|Vnk|d kr|r|Vd}t|||| f| fVd}nJ|d!vr|dz}n |d"vr|dz }|r|Vd}t8|||| fVn t | | || f|| dzf| fV| dz} | |k|r|Vd}|ddD]}td|df|dfdfVt:d|df|dfdfVdS)#a4 The generate_tokens() generator requires one argument, readline, which must be a callable object which provides the same interface as the readline() method of built-in file objects. Each call to the function should return one line of input as a string. Alternately, readline can be a callable function terminating with StopIteration: readline = open(myfile).next # Example of alternate readline The generator produces 5-tuples with these members: the token type; the token string; a 2-tuple (srow, scol) of ints specifying the row and column where the token begins in the source; a 2-tuple (erow, ecol) of ints specifying the row and column where the token ends in the source; and the line on which the token was found. The line passed is the physical line. r)r#rNFrr#zEOF in multi-line stringz\ z\ rt  z# #z rz3unindent does not match any outer indentation levelz zEOF in multi-line statement.Tr|r )asyncawaitr)defforr\z([{z)]})rr}rPrrSTRING ERRORTOKENtabsizerstripCOMMENTrrurIndentationErrorr pseudoprogspanstringdigitsrr triple_quotedendprogs single_quoted isidentifierrrrOP ENDMARKER)rglnumparenlev continuedcontstrneedcontcontlinerstashed async_defasync_def_indent async_def_nlr_posmaxstrstartendprogendmatchrcolumn comment_tokennl_pos pseudomatchrvsposeposrinitialnewlinerindents r rrOs #$#D#8iGXHcGGIL} 8::DD   DDD axc$iiS J  G !;XFFF}}T**H $LLOO+cwdsd3$ho????$)! d233i611d233i86K6K!7T>#dCII%6BBBB!D.#d? ]]9] F))9##fqjVV#Y$&&&'/A2Ew1N#Y$&&Ag )) czz5  CyG##9##$(J$5$5f$=$=M 3}#5#55F"M #;sS5G5G/G(H$PPPPtFGG} &>D#d))+'"+.M.M! $ #$  K !>q JJJICii$**455Kg (--a00 s#'-$cCd!%eCi$u+wfm++sNNu||!5$d;;;;;&&%G!||"$",'+ '% "&"E4t<<<<<^^'% "&"E4t<<<<<m++&uoG&}}T377H &ll1oo $U3Y"+")MMM&*G%udT3KFFFFF$(%="&uvv,#' --"1"I.."1"I..RyD(($(%=#+G#4$6q8J$6#+E!H#5 ,0L!#'"+")MMM&*G%udD$?????))++,8 222$%,1W,<,<55%#($d#<<<<$dD9C'''"% ..# +$+AJ$$6$6$+AJ'$9$9$~~,0 3:2; 0#('!*#*1:wqz#*1:#////'+G'% "&IIII__'% "&udT3K>>>> !II%''HqL E))hl8'% "&udD$77777!49 #;s1u t====AgSCiii}~ !""+55rD!9tQi44444 b4)dAY 333333s ( 77__main__)S__doc__ __author__ __credits__rrecodecsrrlib2to3.pgen2.tokenr#rdir__all__r NameErrorstrrrr r) WhitespaceCommentIgnoreName Binnumber Hexnumber Octnumber Decnumber IntnumberExponent PointfloatExpfloat Floatnumber ImagnumberNumberSingleDoubleSingle3Double3 _litprefixTripleStringOperatorBracketSpecialFunny PlainTokenTokenContStr PseudoExtras PseudoTokenmapcompile tokenprogrr=rD _strprefixesrrrr ExceptionrPrWrdrrfrlASCIIrrrrrrrRsysr}argvopenrgstdinr rr r$s##0* F ########!!!! 0 0cc%jj 0 0 04,4,4, ,  EE EEE :99///111   cc*z122 2UU7^^ C  & 7 . E+X 6 6 E)Y 9 = = # U57H I IEERZOO [ X %eJ)) U& g(= > > z; 2 2 $ # 2 2 7 zE!:#5 6 6 z;;;; = = 5GWeU%%    %% - - h)) U65&$ / /  % ;;c:&&';;c:&&' ( (uZ&11 55vugtLLL 25#J Wg63838/ :{KM#sC%%M#sC%%&&&&' F##*"*V*<*<{ 9 9FFFFF 9GFFFF 987,777  9 EN//,///0//,///0  #J-- ---.-- ---. !!!!!!!!%%%%%Y%%%??? #-    &   6 6 6 6 6 6 6 6 p BJ@"( K K 2:0"( ; ;   G$G$G$R###*`4`4`4D zJJJ s38}}q((44 #4#4#=>>>>> (39% & & & & &sAA  A PKhP3][c^c^$__pycache__/tokenize.cpython-311.pycnu[ fR PdZdZdZddlZddlZddlmZmZddlTddl m Z d e e Dgd zZ [ e n #e$reZ YnwxYwd Zd Zd ZdZdZdZeedezzeezZdZdZdZdZeddZeeeeeZdZeddeezZdezZeeeZ ede dzZ!ee!e eZ"dZ#dZ$d Z%d!Z&d"Z'ee'd#ze'd$zZ(ee'd%ze'd&zZ)ed'd(d)d*d+d,d-d.d/ Z*d0Z+ed1d2d3Z,ee*e+e,Z-ee"e-e)eZ.ee.zZ/ee'd4zed5dze'd6zed7dzZ0edee(Z1eee1e"e-e0ezZ2e3ej4e/e2e%e&f\Z5Z6Z7Z8ed8d9d:d;ed8d9dzZ9ej4e#ej4e$e7e8d?d@e9DdAe9DdBe9DZ:d#d$hdCe9DzdDe9DzZ;d5d7hdEe9DzdFe9DzZZ?GdJdKe>Z@dLZAeAfdMZBdNZCGdOdPZDej4dQejEZFej4dRejEZGdSZHdTZIdUZJdVZKeLdWkrUddlMZMeNeMjOdkr&eBePeMjOdjQdSeBeMjRjQdSdS)XaTokenization help for Python programs. generate_tokens(readline) is a generator that breaks a stream of text into Python tokens. It accepts a readline-like method which is called repeatedly to get the next line of input (or "" for EOF). It generates 5-tuples with these members: the token type (see token.py) the token (a string) the starting (row, column) indices of the token (a 2-tuple of ints) the ending (row, column) indices of the token (a 2-tuple of ints) the original line (string) It is designed to match the working of the Python tokenizer exactly, except that it produces COMMENT tokens for comments and gives type OP for all operators Older entry points tokenize_loop(readline, tokeneater) tokenize(readline, tokeneater=printtoken) are the same, except instead of generating tokens, tokeneater is a callback function to which the 5 fields described above are passed as 5 arguments, each time a new token is found.zKa-Ping Yee z@GvR, ESR, Tim Peters, Thomas Wouters, Fred Drake, Skip MontanaroN)BOM_UTF8lookup)*)tokenc*g|]}|ddk|S)r_).0xs =/opt/alt/python311/lib64/python3.11/lib2to3/pgen2/tokenize.py r%s! 0 0 0AaDCKK1KKK)tokenizegenerate_tokens untokenizec8dd|zdzS)N(|))joinchoicess r groupr0sC#((7"3"33c99rct|dzS)Nrrrs r anyr1s%/C//rct|dzS)N?rrs r mayber 2sE7Oc11rc:tfdDS)Nc3K|];}dzD]3}||k,||zV4z _combinations..4s`!e)qzz||qzz||/K/KA/K/K/K/K/Kr)set)r&s`r _combinationsr)3s;   rz[ \f\t]*z #[^\r\n]*z\\\r?\nz\w+z0[bB]_?[01]+(?:_[01]+)*z(0[xX]_?[\da-fA-F]+(?:_[\da-fA-F]+)*[lL]?z0[oO]?_?[0-7]+(?:_[0-7]+)*[lL]?z[1-9]\d*(?:_\d+)*[lL]?z0[lL]?z[eE][-+]?\d+(?:_\d+)*z\d+(?:_\d+)*\.(?:\d+(?:_\d+)*)?z\.\d+(?:_\d+)*z \d+(?:_\d+)*z\d+(?:_\d+)*[jJ]z[jJ]z[^'\\]*(?:\\.[^'\\]*)*'z[^"\\]*(?:\\.[^"\\]*)*"z%[^'\\]*(?:(?:\\.|'(?!''))[^'\\]*)*'''z%[^"\\]*(?:(?:\\.|"(?!""))[^"\\]*)*"""z'(?:[uUrRbBfF]|[rR][fFbB]|[fFbBuU][rR])?'''"""z'[^\n'\\]*(?:\\.[^\n'\\]*)*'z"[^\n"\\]*(?:\\.[^\n"\\]*)*"z\*\*=?z>>=?z<<=?z<>z!=z//=?z->z[+\-*/%&@|^=<>]=?~z[][(){}]z\r?\nz:=z[:;.,`@]z'[^\n'\\]*(?:\\.[^\n'\\]*)*'z"[^\n"\\]*(?:\\.[^\n"\\]*)*"rRfFbB>UuURUruRur)r-r.r*r+c$i|] }|dtSr*) single3progr prefixs r r@y FFFv&~~~{FFFrc$i|] }|dtSr+) double3progr>s r r@r@zrArci|]}|dSNr r>s r r@r@{s777vt777rch|]}|dSr<r r>s r rH///^^^///rch|]}|dSrCr r>s r rHrHrIrch|]}|dS)r-r r>s r rHrH---f\\\---rch|]}|dS)r.r r>s r rHrHrLrceZdZdS) TokenErrorN__name__ __module__ __qualname__r rr rPrPrrPceZdZdS)StopTokenizingNrQr rr rWrWrUrrWc z|\}}|\}}td||||t|t|fzdS)Nz%d,%d-%d,%d: %s %s)printtok_namerepr) typerxxx_todo_changemexxx_todo_changeme1linesrowscolerowecols r printtokenrdsR$LT4%LT4 tT4$e= >?????rcJ t||dS#t$rYdSwxYw)a: The tokenize() function accepts two parameters: one representing the input stream, and one providing an output mechanism for tokenize(). The first parameter, readline, must be a callable object which provides the same interface as the readline() method of built-in file objects. Each call to the function should return one line of input as a string. The second parameter, tokeneater, must also be a callable object. It is called once for each token, with five arguments, corresponding to the tuples generated by generate_tokens(). N) tokenize_looprW)readline tokeneaters r rrs? h +++++      s  ""c4t|D]}||dSrF)r)rgrh token_infos r rfrfs3%h//   J  rc&eZdZdZdZdZdZdS) Untokenizerc0g|_d|_d|_dS)Nrr)tokensprev_rowprev_col)selfs r __init__zUntokenizer.__init__s   rc|\}}||jksJ||jz }|r|jd|zdSdS)N )rorprnappend)rqstartrowcol col_offsets r add_whitespacezUntokenizer.add_whitespaces]Sdm####4=(  1 K  sZ/ 0 0 0 0 0 1 1rcp|D]}t|dkr|||nn|\}}}}}|||j||\|_|_|ttfvr|xjdz c_d|_d |jS)Nrrr#) lencompatrzrnrurorpNEWLINENLr)rqiterablettok_typerrvendr_s r rzUntokenizer.untokenizes " "A1vv{{ Ax(((01 -HeUC    & & & K  u % % %+. (DM4=GR=(( " ! wwt{###rcd}g}|jj}|\}}|ttfvr|dz }|tt fvrd}|D]}|dd\}}|ttt tfvr|dz }|tkr||Q|tkr| q|tt fvrd}n|r|r||dd}||dS)NFrtTr|) rnruNAMENUMBERrrASYNCAWAITINDENTDEDENTpop) rqrr startlineindents toks_appendtoknumtokvaltoks r r~zUntokenizer.compats k(  dF^ # # cMF gr] " "I  C !WNFF$u555# v&&&6!! GR=((  "w " GBK(((! K    #  rN)rRrSrTrrrzrr~r rr rlrlsP 111 $ $ $     rrlz&^[ \t\f]*#.*?coding[:=][ \t]*([-\w.]+)s^[ \t\f]*(?:[#\r\n]|$)c|dddd}|dks|drdS|dvs|drd S|S) z(Imitates get_normal_name in tokenizer.c.N r -utf-8zutf-8-)zlatin-1 iso-8859-1z iso-latin-1)zlatin-1-z iso-8859-1-z iso-latin-1-r)lowerreplace startswith)orig_encencs r _get_normal_namersv 3B3-     ' 'S 1 1C g~~11~w 666 ~~ABB7| OrcLdd}d}fd}fd}|}|trd|dd}d}|s|gfS||}|r||gfSt|s||gfS|}|s||gfS||}|r|||gfS|||gfS) a The detect_encoding() function is used to detect the encoding that should be used to decode a Python source file. It requires one argument, readline, in the same way as the tokenize() generator. It will call readline a maximum of twice, and return the encoding used (as a string) and a list of any lines (left as bytes) it has read in. It detects the encoding from the presence of a utf-8 bom or an encoding cookie as specified in pep-0263. If both a bom and a cookie are present, but disagree, a SyntaxError will be raised. If the encoding cookie is an invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, 'utf-8-sig' is returned. If no encoding is specified, then the default of 'utf-8' will be returned. FNrcV S#t$rtcYSwxYwrF) StopIterationbytes)rgsr read_or_stopz%detect_encoding..read_or_stops< 8::    77NNN s ((c| |d}n#t$rYdSwxYwt|}|sdSt |d} t |}n #t$rtd|zwxYwr|j dkrtd|dz }|S)Nasciirzunknown encoding: rzencoding problem: utf-8z-sig) decodeUnicodeDecodeError cookie_rematchrrr LookupError SyntaxErrorname)r_ line_stringrencodingcodec bom_founds r find_cookiez$detect_encoding..find_cookie s ++g..KK!   44  ,, 4#EKKNN33 ?8$$EE ? ? ?2X=>> > ?  zW$$!";<<<  Hs ''+A;;BTz utf-8-sig)rrblank_rer)rgrdefaultrrfirstsecondrs` @r detect_encodingrs-$IHG , LNNE !! abb  {{5!!H!%  >>%   \^^F  {6""H)%(( UFO ##rcHt}||S)aTransform tokens back into Python source code. Each element returned by the iterable must be a token sequence with at least two elements, a token number and token value. If only two tokens are passed, the resulting output is poor. Round-trip invariant for full input: Untokenized source will match input source exactly Round-trip invariant for limited input: # Output text will tokenize the back to the input t1 = [tok[:2] for tok in generate_tokens(f.readline)] newcode = untokenize(t1) readline = iter(newcode.splitlines(1)).next t2 = [tok[:2] for tokin generate_tokens(readline)] assert t1 == t2 )rlr)ruts r rr:s$ B == " ""rc# Kdx}x}}d\}}d}dg}d}d} d} d} |} n#t$rd} YnwxYw|dz}dt| }} |r| std||| }|r>|dx} }t || d|z|||f|| zfVd\}}d}nZ|rA| ddd kr3| d dd kr%t || z||t| f|fVd}d}|| z}|| z}|dkr|s| snd}| |krO| | d kr|dz}n2| | d kr|tzdztz}n| | dkrd}nn | dz} | |kO| |krn|r|Vd}| | dvr| | dkry| | dd}| t|z}t||| f|| t|zf| fVt| |d||f|t| f| fVn>ttf| | dk| | d|| f|t| f| fV0||dkr/| |t| d| |df|| f| fV||dkrT||vrtdd|| | f|dd}| r| |dkrd} d} d} td|| f|| f| fV||dkT| r| r| |dkrd} d} d} n| std|dfd}| |krt| | }|r|d\}}||f||f|} }}| ||| |}}|t"jvs |dkr|dkrt&|||| fVn|dvr,t(}|dkrt}n| rd} |r|Vd}||||| fVna|dkr*|jdrJ|r|Vd}t|||| fVn1|t,vrpt.|}|| | }|r9|d} | || }|r|Vd}t |||| f| fVn||f}| |d}| }n|t0vs"|ddt0vs|ddt0vrk|ddkrG||f}t.|p%t.|dpt.|d}| |dd}}| }nA|r|Vd}t |||| fVn"|r|dvr| r|dkrt4nt6|||| fV)t8|||| f}|dkr|s|}A|dvrW|rU|dt8krD|ddkr8|dkr d} |d} t4|d|d|d|dfVd}|r|Vd}|Vnk|d kr|r|Vd}t|||| f| fVd}nJ|d!vr|dz}n |d"vr|dz }|r|Vd}t:|||| fVn t | | || f|| dzf| fV| dz} | |k|r|Vd}|ddD]}td|df|dfdfVt<d|df|dfdfVdS)#a4 The generate_tokens() generator requires one argument, readline, which must be a callable object which provides the same interface as the readline() method of built-in file objects. Each call to the function should return one line of input as a string. Alternately, readline can be a callable function terminating with StopIteration: readline = open(myfile).next # Example of alternate readline The generator produces 5-tuples with these members: the token type; the token string; a 2-tuple (srow, scol) of ints specifying the row and column where the token begins in the source; a 2-tuple (erow, ecol) of ints specifying the row and column where the token ends in the source; and the line on which the token was found. The line passed is the physical line. r)r#rNFrr#zEOF in multi-line stringz\ z\ rt  z# #z rz3unindent does not match any outer indentation levelz zEOF in multi-line statement.T r|r)asyncawaitr)defforr\z([{z)]})rr}rPrrSTRING ERRORTOKENtabsizerstripCOMMENTrrurIndentationErrorr pseudoprogspanstringdigitsrrendswith triple_quotedendprogs single_quoted isidentifierrrrOP ENDMARKER)rglnumparenlev continuedcontstrneedcontcontlinerstashed async_defasync_def_indent async_def_nlr_posmaxstrstartendprogendmatchrcolumn comment_tokennl_pos pseudomatchrvsposeposrinitialnewlinerindents r rrOs #$#D#8iGXHcGGIL} 8::DD   DDD axc$iiS J  G !;XFFF}}T**H $LLOO+cwdsd3$ho????$)! d233i611d233i86K6K!7T>#dCII%6BBBB!D.#d? ]]9] F))9##fqjVV#Y$&&&'/A2Ew1N#Y$&&Ag )) czz5  CyG##9##$(J$5$5f$=$=M 3}#5#55F"M #;sS5G5G/G(H$PPPPtFGG} &>D#d))+'"+.M.M! $ #$  K !>q JJJICii$**455Kg (--a00 s#'-$cCd!%eCi$u+wfm++sNNu||!5$d;;;;;&&%G!||"$",'+ '% "&"E4t<<<<<^^-u~d33333'% "&"E4t<<<<<m++&uoG&}}T377H &ll1oo $U3Y"+")MMM&*G%udT3KFFFFF$(%="&uvv,#' --"1"I.."1"I..RyD(($(%=#+G#4$6q8J$6#+E!H#5 ,0L!#'"+")MMM&*G%udD$?????))++,8 222$%,1W,<,<55%#($d#<<<<$dD9C'''"% ..# +$+AJ$$6$6$+AJ'$9$9$~~,0 3:2; 0#('!*#*1:wqz#*1:#////'+G'% "&IIII__'% "&udT3K>>>> !II%''HqL E))hl8'% "&udD$77777!49 #;s1u t====AgSCiii}~ !""+55rD!9tQi44444 b4)dAY 333333s ( 77__main__)S__doc__ __author__ __credits__rrecodecsrrlib2to3.pgen2.tokenr#rdir__all__r NameErrorstrrrr r) WhitespaceCommentIgnoreName Binnumber Hexnumber Octnumber Decnumber IntnumberExponent PointfloatExpfloat Floatnumber ImagnumberNumberSingleDoubleSingle3Double3 _litprefixTripleStringOperatorBracketSpecialFunny PlainTokenTokenContStr PseudoExtras PseudoTokenmapcompile tokenprogrr=rD _strprefixesrrrr ExceptionrPrWrdrrfrlASCIIrrrrrrrRsysr}argvopenrgstdinr rr r%s##0* F ########!!!! 0 0cc%jj 0 0 04,4,4, ,  EE EEE :99///111   cc*z122 2UU7^^ C  & 7 . E+X 6 6 E)Y 9 = = # U57H I IEERZOO [ X %eJ)) U& g(= > > z; 2 2 $ # 2 2 7 zE!:#5 6 6 z;;;; = = 5GWeU%%    %% - - h)) U65&$ / /  % ;;c:&&';;c:&&' ( (uZ&11 55vugtLLL 25#J Wg63838/ :{KM#sC%%M#sC%%&&&&' F##*"*V*<*<{ 9 9FFFFF 9GFFFF 987,777  9 EN//,///0//,///0  #J-- ---.-- ---. !!!!!!!!%%%%%Y%%%??? #-    &   6 6 6 6 6 6 6 6 p BJ@"( K K 2:0"( ; ;   G$G$G$R###*`4`4`4D zJJJ s38}}q((44 #4#4#=>>>>> (39% & & & & &sAA  A PKhP3]Onll(__pycache__/driver.cpython-311.opt-2.pycnu[ fQ dZddgZddlZddlZddlZddlZddlZddlmZm Z m Z m Z m Z Gdde ZdZ dd Zd ZdZdZedkr$ejee dSdS)z#Guido van Rossum Driver load_grammarN)grammarparsetokentokenizepgenc>eZdZd dZd dZd dZd dZd dZd dZdS) rNcZ||_|tj}||_||_dSN)rlogging getLoggerloggerconvert)selfrrrs ;/opt/alt/python311/lib64/python3.11/lib2to3/pgen2/driver.py__init__zDriver.__init__s. >&((F  Fc. tj|j|j}|d}d}dx}x}x}x} } d} |D].} | \}}}} } |||fkr/|\} }|| kr| d| |z zz } | }d}||kr| | ||z } |}|t jt jfvr'| |z } | \}}|dr|dz }d}|tj krtj |}|r-|j dtj||| |||| |fr|r|j dn>d} | \}}|dr|dz }d}0tjd||| |f|jS)Nrr z%s %r (prefix=%r)zStop.zincomplete input)rParserrrsetupr COMMENTNLendswithrOPopmaprdebugtok_nameaddtoken ParseErrorrootnode)rtokensr plinenocolumntypevaluestartend line_textprefix quintuples_linenos_columns r parse_tokenszDriver.parse_tokens&sB Lt| 4 4  1555u5u5sY$ A$ AI1: .D%Y(((%*"(H$$dh&788F%FFH$$ix88F%F((+666%!$>>$''aKFFux}U+ G !!"5"'."6vGGGzz$77 /K%%g...F NFF~~d## ! "#5#'AA Azrcb tj|j}|||Sr )r generate_tokensreadliner2)rstreamr r%s rparse_stream_rawzDriver.parse_stream_rawVs-8)&/::  ///rc0 |||Sr )r7)rr6r s r parse_streamzDriver.parse_stream[s8$$VU333rc tj|d|5}|||cdddS#1swxYwYdS)Nr)encoding)ioopenr9)rfilenamer<r r6s r parse_filezDriver.parse_file_s6 WXsX 6 6 6 4&$$VU33 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4s<AAc tjtj|j}|||Sr )r r4r=StringIOr5r2)rtextr r%s r parse_stringzDriver.parse_stringds88)"+d*;*;*DEE  ///r)NN)F)NF) __name__ __module__ __qualname__rr2r7r9r@rDrrrrs....`0000 44444444 000000rctj|\}}|dkrd}||zdt t t jzdzS)Nz.txtr.z.pickle)ospathsplitextjoinmapstrsys version_info)gtheadtails r_generate_pickle_namerVjsV!!"%%JD$ v~~ $;#c3+;"<"<== = IIr Grammar.txtTFc |tj}|t|n|}|st||s|d|t j|}|rZ|d| ||nV#t$r }|d|Yd}~n1d}~wwxYwn(tj }| ||S)Nz!Generating grammar tables from %szWriting grammar tables to %szWriting failed: %s) rrrV_newerinfor generate_grammardumpOSErrorrGrammarload)rSgpsaveforcerges rrrqs 1 ~"$$&(j r " " "bB F2rNN  7<<<  !" % %  5 KK6 ; ; ; 5r  5 5 5 0!44444444 5  5 O   r Hs?B B?B::B?c tj|sdStj|sdStj|tj|kS)NFT)rKrLexistsgetmtime)abs rrYrYsf: 7>>!  u 7>>!  t 7  A  "'"2"21"5"5 55rc6 tj|rt|St tj|}t j||}tj }| ||Sr ) rKrLisfilerrVbasenamepkgutilget_datarr^loads)packagegrammar_source pickled_namedatarcs rload_packaged_grammarrts}  w~~n%%,N+++()9)9.)I)IJJL  G\ 2 2DAGGDMMM Hrc |stjdd}tjtjtjd|D]}t |dddS)Nrz %(message)s)levelr6formatT)rarb)rQargvr basicConfigINFOstdoutr)argsrSs rmainr}sq x| gl3:,....00Rd$///// 4r__main__)rWNTFN) __author____all__r=rKrrmrQrrrrr r objectrrVrrYrtr}rEexitintrHrrrsA 3 ^ $  43333333333333J0J0J0J0J0VJ0J0J0ZJJJ'+04    *666   (    z CHSSTTVV__rPKhP3]ͣE+E+&__pycache__/conv.cpython-311.opt-1.pycnu[ f%HdZddlZddlmZmZGddejZdS)aConvert graminit.[ch] spit out by pgen to Python code. Pgen is the Python parser generator. It is useful to quickly create a parser from a grammar file in Python's grammar notation. But I don't want my parsers to be written in C (yet), so I'm translating the parsing tables to Python data structures and writing a Python parse engine. Note that the token numbers are constants determined by the standard Python tokenizer. The standard token module defines these numbers and their names (the names are not used much). The token numbers are hardcoded into the Python tokenizer and into pgen. A Python implementation of the Python tokenizer is also available, in the standard tokenize module. On the other hand, symbol numbers (representing the grammar's non-terminals) are assigned by pgen based on the actual grammar input. Note: this module is pretty much obsolete; the pgen module generates equivalent grammar tables directly from the Grammar.txt input file without having to invoke the Python pgen C program. N)grammartokenc*eZdZdZdZdZdZdZdS) Convertera2Grammar subclass that reads classic pgen output files. The run() method reads the tables as produced by the pgen parser generator, typically contained in two C files, graminit.h and graminit.c. The other methods are for internal use only. See the base class for more documentation. c|||||dS)z|r*t|d|d |\|\}}t|}||j|<||j|<d S) zParse the .h file written by pgen. (Internal) This file is a sequence of #define statements defining the nonterminals of the grammar as numbers. We build two tables mapping the numbers to names and back. Can't open : NFrz^#define\s+(\w+)\s+(\d+)$(z): can't parse T) openOSErrorprint symbol2number number2symbolrematchstripgroupsint) r filenameferrlinenolinemosymbolnumbers rrzConverter.parse_graminit_h5s/ XAA    E337 8 8 855555   4 4D aKF6==B 4$**,, 4(((FFF26**,,,@AAAA"$V.4"6*-3"6**ts <7<c  t|}n-#t$r }td|d|Yd}~dSd}~wwxYwd}|dzt|}}|dzt|}}|dzt|}}i}g}|drf|drt jd|}ttt| \} } } g} t| D]y} |dzt|}}t jd |}ttt| \}}| ||fz|dzt|}}| || | f<|dzt|}}|dt jd |}ttt| \}}g}t|D]} |dzt|}}t jd |}ttt| \} } } || | f} | | | ||dzt|}}|dzt|}}|df||_ i}t jd |}t|d}t|D]#}|dzt|}}t jd |}|d}ttt|dddd\}}}}||}|dzt|}}t jd|}i}t|d}t!|D]9\}}t#|}tdD]}|d|zzr d||dz|z<:||f||<%|dzt|}}||_g}|dzt|}}t jd|}t|d}t|D]}|dzt|}}t jd|}| \}}t|}|dkrd}nt|}| ||f|dzt|}}||_|dzt|}}|dzt|}}t jd|}t|d}|dzt|}}|dzt|}}t jd|}t|d}|dzt|}}t jd|}t|d} | |_|dzt|}} |dzt|}}dS#t*$rYdSwxYw)aParse the .c file written by pgen. (Internal) The file looks as follows. The first two lines are always this: #include "pgenheaders.h" #include "grammar.h" After that come four blocks: 1) one or more state definitions 2) a table defining dfas 3) a table defining labels 4) a struct defining the grammar A state definition has the following form: - one or more arc arrays, each of the form: static arc arcs__[] = { {, }, ... }; - followed by a state array, of the form: static state states_[] = { {, arcs__}, ... }; rrNFrrz static arc z)static arc arcs_(\d+)_(\d+)\[(\d+)\] = {$z\s+{(\d+), (\d+)},$z'static state states_(\d+)\[(\d+)\] = {$z\s+{(\d+), arcs_(\d+)_(\d+)},$zstatic dfa dfas\[(\d+)\] = {$z0\s+{(\d+), "(\w+)", (\d+), (\d+), states_(\d+),$z\s+("(?:\\\d\d\d)*")},$z!static label labels\[(\d+)\] = {$z\s+{(\d+), (0|"\w+")},$0z \s+(\d+),$z\s+{(\d+), labels},$z \s+(\d+)$)rrrnext startswithrrlistmaprrrangeappendstatesgroupeval enumerateorddfaslabelsstart StopIteration)!r r r!r"r#r$allarcsr5r%nmkarcs_ijststater:ndfasr&r'xyzfirst rawbitsetcbyter;nlabelsr<s! rr zConverter.parse_graminit_cTs8 XAA    E337 8 8 855555 axaaxaaxaoom,,! -//-00 1XJ"$$s3 44551aq((A#)!8T!WWDF"8$??BC 5 566DAqKKA''''%axa"&A%axa//-00 1 DdKKBC--..DAqE1XX # #%axaX?FFs3 44551aq!t} T"""" MM% !!8T!WWDF!!8T!WWDFCoom,,! -D  X6 = =BHHQKK  u * *A!!8T!WWDFM  BXXa[[F"3sBHHQ1a,@,@#A#ABBOFAq!1IE!!8T!WWDF4d;;BERXXa[[))I!),, + +11vvq++Aq!t}+)*acAg+"5>DLLaxa axa X:D A Abhhqkk""w " "A!!8T!WWDF4d;;B99;;DAqAACxxGG MM1a& ! ! ! !axa axaaxa XmT * *BHHQKK  axaaxa X-t 4 4bhhqkk""axa XlD ) )BHHQKK   axa %!!8T!WWDFFF    DD s" <7<)Z?? [  [ ci|_i|_t|jD]1\}\}}|tjkr | ||j|<%| ||j|<2dS)z1Create additional useful structures. (Internal).N)keywordstokensr8r;rNAME)r ilabeltypevalues rr zConverter.finish_offso  %.t{%;%; + + !FMT5uz!!e&7'- e$$$* D!  + +rN)__name__ __module__ __qualname____doc__rrr r rrrr$s^ >c%c%c%J+++++rr)r\rpgen2rrGrammarrr]rrr`st4 ! ]+]+]+]+]+]+]+]+]+]+rPKhP3] ٩!!&__pycache__/conv.cpython-311.opt-2.pycnu[ f%F ddlZddlmZmZGddejZdS)N)grammartokenc(eZdZ dZdZdZdZdS) Converterc |||||dSN)parse_graminit_hparse_graminit_c finish_off)self graminit_h graminit_cs 9/opt/alt/python311/lib64/python3.11/lib2to3/pgen2/conv.pyrunz Converter.run/sCJ j))) j))) c  t|}n-#t$r }td|d|Yd}~dSd}~wwxYwi|_i|_d}|D]}|dz }t jd|}|s>|r*t|d|d|\|\}}t|}||j|<||j|<d S) N Can't open : Frz^#define\s+(\w+)\s+(\d+)$(z): can't parse T) openOSErrorprint symbol2number number2symbolrematchstripgroupsint) r filenameferrlinenolinemosymbolnumbers rr zConverter.parse_graminit_h5s4  XAA    E337 8 8 855555   4 4D aKF6==B 4$**,, 4(((FFF26**,,,@AAAA"$V.4"6*-3"6**ts =8=c  t|}n-#t$r }td|d|Yd}~dSd}~wwxYwd}|dzt|}}|dzt|}}|dzt|}}i}g}|drf|drt jd|}ttt| \} } } g} t| D]y} |dzt|}}t jd|}ttt| \}}| ||fz|dzt|}}| || | f<|dzt|}}|dt jd |}ttt| \}}g}t|D]} |dzt|}}t jd |}ttt| \} } } || | f} | | | ||dzt|}}|dzt|}}|df||_ i}t jd |}t|d}t|D]#}|dzt|}}t jd |}|d }ttt|dddd\}}}}||}|dzt|}}t jd|}i}t|d}t!|D]9\}}t#|}tdD]}|d|zzr d||dz|z<:||f||<%|dzt|}}||_g}|dzt|}}t jd|}t|d}t|D]}|dzt|}}t jd|}| \}}t|}|dkrd}nt|}| ||f|dzt|}}||_|dzt|}}|dzt|}}t jd|}t|d}|dzt|}}|dzt|}}t jd|}t|d}|dzt|}}t jd|}t|d} | |_|dzt|}} |dzt|}}dS#t*$rYdSwxYw)NrrFrrz static arc z)static arc arcs_(\d+)_(\d+)\[(\d+)\] = {$z\s+{(\d+), (\d+)},$z'static state states_(\d+)\[(\d+)\] = {$z\s+{(\d+), arcs_(\d+)_(\d+)},$zstatic dfa dfas\[(\d+)\] = {$z0\s+{(\d+), "(\w+)", (\d+), (\d+), states_(\d+),$z\s+("(?:\\\d\d\d)*")},$z!static label labels\[(\d+)\] = {$z\s+{(\d+), (0|"\w+")},$0z \s+(\d+),$z\s+{(\d+), labels},$z \s+(\d+)$)rrrnext startswithrrlistmapr rrangeappendstatesgroupeval enumerateorddfaslabelsstart StopIteration)!r r!r"r#r$r%allarcsr6r&nmkarcs_ijststater;ndfasr'r(xyzfirst rawbitsetcbyter<nlabelsr=s! rr zConverter.parse_graminit_cTs 6 XAA    E337 8 8 855555 axaaxaaxaoom,,! -//-00 1XJ"$$s3 44551aq((A#)!8T!WWDF"8$??BC 5 566DAqKKA''''%axa"&A%axa//-00 1 DdKKBC--..DAqE1XX # #%axaX?FFs3 44551aq!t} T"""" MM% !!8T!WWDF!!8T!WWDFCoom,,! -D  X6 = =BHHQKK  u * *A!!8T!WWDFM  BXXa[[F"3sBHHQ1a,@,@#A#ABBOFAq!1IE!!8T!WWDF4d;;BERXXa[[))I!),, + +11vvq++Aq!t}+)*acAg+"5>DLLaxa axa X:D A Abhhqkk""w " "A!!8T!WWDF4d;;B99;;DAqAACxxGG MM1a& ! ! ! !axa axaaxa XmT * *BHHQKK  axaaxa X-t 4 4bhhqkk""axa XlD ) )BHHQKK   axa %!!8T!WWDFFF    DD s" =8=*[ [ [c i|_i|_t|jD]1\}\}}|tjkr | ||j|<%| ||j|<2dSr)keywordstokensr9r<rNAME)r ilabeltypevalues rr zConverter.finish_offsr?  %.t{%;%; + + !FMT5uz!!e&7'- e$$$* D!  + +rN)__name__ __module__ __qualname__rr r r rrrr$sY >c%c%c%J+++++rr)rpgen2rrGrammarrr]rrr`so4 ! ]+]+]+]+]+]+]+]+]+]+rPKhP3]}+$__pycache__/__init__.cpython-311.pycnu[ f dZdS)zThe pgen2 package.N)__doc__=/opt/alt/python311/lib64/python3.11/lib2to3/pgen2/__init__.pyrsrPKhP3]  '__pycache__/token.cpython-311.opt-2.pycnu[ f# dZdZdZdZdZdZdZdZdZd Z d Z d Z d Z d Z dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZd Z d!Z!d"Z"d#Z#d$Z$d%Z%d&Z&d'Z'd(Z(d)Z)d*Z*d+Z+d,Z,d-Z-d.Z.d/Z/d0Z0d1Z1d2Z2d3Z3d4Z4d5Z5d6Z6d7Z7d8Z8d9Z9d:Z:d;Z;de?e@AD] \ZBZCeDeCeDdureBe>eC<!d>ZEd?ZFd@ZGdAS)B  !"#$%&'()*+,-./0123456789:;<c|tkSN NT_OFFSETxs :/opt/alt/python311/lib64/python3.11/lib2to3/pgen2/token.py ISTERMINALrGOs y=c|tkSrArBrDs rF ISNONTERMINALrJR >rHc|tkSrA) ENDMARKERrDs rFISEOFrNUrKrHN)HrMNAMENUMBERSTRINGNEWLINEINDENTDEDENTLPARRPARLSQBRSQBCOLONCOMMASEMIPLUSMINUSSTARSLASHVBARAMPERLESSGREATEREQUALDOTPERCENT BACKQUOTELBRACERBRACEEQEQUALNOTEQUAL LESSEQUAL GREATEREQUALTILDE CIRCUMFLEX LEFTSHIFT RIGHTSHIFT DOUBLESTAR PLUSEQUALMINEQUAL STAREQUAL SLASHEQUAL PERCENTEQUAL AMPEREQUAL VBAREQUALCIRCUMFLEXEQUALLEFTSHIFTEQUALRIGHTSHIFTEQUALDOUBLESTAREQUAL DOUBLESLASHDOUBLESLASHEQUALATATEQUALOPCOMMENTNLRARROWAWAITASYNC ERRORTOKEN COLONEQUALN_TOKENSrCtok_namelistglobalsitems_name_valuetyperGrJrNrHrFrs(                                                      T''))//++,,!!ME6 tF||ttAww rHPKhP3]}+*__pycache__/__init__.cpython-311.opt-1.pycnu[ f dZdS)zThe pgen2 package.N)__doc__=/opt/alt/python311/lib64/python3.11/lib2to3/pgen2/__init__.pyrsrPKhP3]:)__pycache__/grammar.cpython-311.opt-1.pycnu[ fdZddlZddlmZGddeZdZiZeD]*Z e r&e \Z Z e ee ee <+[ [ [ dS)aThis module defines the data structures used to represent a grammar. These are a bit arcane because they are derived from the data structures used by Python's 'pgen' parser generator. There's also a table here mapping operators to their names in the token module; the Python tokenize module reports all operators as the fallback token code OP, but the parser needs the actual token code. N)tokenc6eZdZdZdZdZdZdZdZdZ dS) Grammara Pgen parsing tables conversion class. Once initialized, this class supplies the grammar tables for the parsing engine implemented by parse.py. The parsing engine accesses the instance variables directly. The class here does not provide initialization of the tables; several subclasses exist to do this (see the conv and pgen modules). The load() method reads the tables from a pickle file, which is much faster than the other ways offered by subclasses. The pickle file is written by calling dump() (after loading the grammar tables using a subclass). The report() method prints a readable representation of the tables to stdout, for debugging. The instance variables are as follows: symbol2number -- a dict mapping symbol names to numbers. Symbol numbers are always 256 or higher, to distinguish them from token numbers, which are between 0 and 255 (inclusive). number2symbol -- a dict mapping numbers to symbol names; these two are each other's inverse. states -- a list of DFAs, where each DFA is a list of states, each state is a list of arcs, and each arc is a (i, j) pair where i is a label and j is a state number. The DFA number is the index into this list. (This name is slightly confusing.) Final states are represented by a special arc of the form (0, j) where j is its own state number. dfas -- a dict mapping symbol numbers to (DFA, first) pairs, where DFA is an item from the states list above, and first is a set of tokens that can begin this grammar rule (represented by a dict whose values are always 1). labels -- a list of (x, y) pairs where x is either a token number or a symbol number, and y is either None or a string; the strings are keywords. The label number is the index in this list; label numbers are used to mark state transitions (arcs) in the DFAs. start -- the number of the grammar's start symbol. keywords -- a dict mapping keyword strings to arc labels. tokens -- a dict mapping token numbers to arc labels. ci|_i|_g|_i|_dg|_i|_i|_i|_d|_dS)N)rEMPTY) symbol2number number2symbolstatesdfaslabelskeywordstokens symbol2labelstart)selfs GREATER = EQUAL . DOT % PERCENT ` BACKQUOTE { LBRACE } RBRACE @ AT @= ATEQUAL == EQEQUAL != NOTEQUAL <> NOTEQUAL <= LESSEQUAL >= GREATEREQUAL ~ TILDE ^ CIRCUMFLEX << LEFTSHIFT >> RIGHTSHIFT ** DOUBLESTAR += PLUSEQUAL -= MINEQUAL *= STAREQUAL /= SLASHEQUAL %= PERCENTEQUAL &= AMPEREQUAL |= VBAREQUAL ^= CIRCUMFLEXEQUAL <<= LEFTSHIFTEQUAL >>= RIGHTSHIFTEQUAL **= DOUBLESTAREQUAL // DOUBLESLASH //= DOUBLESLASHEQUAL -> RARROW := COLONEQUAL )r8rrobjectr opmap_rawopmap splitlineslinesplitopnamer+r9rrrCs   j#j#j#j#j#fj#j#j#^1  f   " "))D )::<<DGE4((b "dddrPKhP3]uMU-O-O __pycache__/pgen.cpython-311.pycnu[ f6ddlmZmZmZGddejZGddeZGddeZGdd eZ d d Z d S))grammartokentokenizeceZdZdS) PgenGrammarN)__name__ __module__ __qualname__9/opt/alt/python311/lib64/python3.11/lib2to3/pgen2/pgen.pyrrsDr rc~eZdZddZdZdZdZdZdZdZ d Z d Z d Z d Z d ZdZdZdZddZdZdZdS)ParserGeneratorNcNd}|t|d}|j}||_||_t j|j|_|| \|_ |_ | |i|_ | dS)Nzutf-8)encoding)openclosefilenamestreamrgenerate_tokensreadline generatorgettokenparsedfas startsymbolfirst addfirstsets)selfrr close_streams r __init__zParserGenerator.__init__ s >(W555F!%00HOOQ_U%;T$BCCC,2AN5)!M!t44!&#..5555.//////QX%%8F++HOOVTN333'-AHV$!M8z)))5)))KKEQx!! "AJ&&:e,,HOOUZ$7888(.AJu%!M!u-QX%%8F++HOOVTN333'-AHV$!Mr ct|j}||D] }||jvr||!dSN)r%rr&r'r calcfirst)rr8r9s r rzParserGenerator.addfirstsetsksaTY^^%%&&  % %D4:%%t$$$ % %r c .|j|}d|j|<|d}i}i}|jD]\}}||jvrh||jvr"|j|}|t d|zn"|||j|}|||||<vd||<|di||<i} |D]4\}} | D],} | | vr!t d|d| d|d| | || | <-5||j|<dS)Nr#zrecursion for rule %rrzrule z is ambiguous; z is in the first sets of z as well as )rrr.r/ ValueErrorrWupdate) rr9r;r<totalset overlapcheckr=r>fsetinverseitsfirstsymbols r rWzParserGenerator.calcfirstssio 4A  :++-- 1 1KE4 !!DJ&&:e,D|()@4)GHHH$NN5))):e,D%%%&* U##"#',aj U##+1133 ( (OE8" ( (W$$$*&*ddFFFEEE76??&LMMM#(  ( $ 4r cti}d}|jtjkr|jtjkr)||jtjk)|tj}|tjd|\}}|tj| ||}t|}| |t|}|||<||}|jtjk||fS)N:) typer ENDMARKERNEWLINErexpectrQOP parse_rhsmake_dfar* simplify_dfa) rrrr9azr;oldlennewlens r rzParserGenerator.parses  i5?**)u},, )u},,;;uz**D KK# & & &>>##DAq KK & & &--1%%CXXF   c " " "XXFDJ"" #i5?**$[  r c  t|tsJt|tsJ fd} fd t|||g}|D]}i}|jD]1}|jD]'\}} |  | ||i(2t |D]R\}} |D]} | j| krn&t| |} || | | |S|S)Nc$i}|||SrVr )r<base addclosures r closurez)ParserGenerator.make_dfa..closuresD Jud # # #Kr ct|tsJ||vrdSd||<|jD]\}}| ||dSrA)rKNFAStater.)r<rqr=r>rrs r rrz,ParserGenerator.make_dfa..addclosuresgeX.. . ..}}DK$z + + t=JtT*** + +r ) rKruDFAStatenfasetr. setdefaultr-r/r0addarc) rr6finishrsr4r<r.nfastater=r>rwstrrs @r rizParserGenerator.make_dfas{ %*****&(+++++      + + + + +775>>6223 ( (ED!L E E#+=EEKE4(" 4)C)CDDDE"( !5!5 ( ( v &&ByF**+"&&11BMM"%%% R'''' ( r cltd||g}t|D]\}}td|||urdpd|jD]l\}}||vr||} n$t |} |||td| zXtd|| fzmdS)NzDump of NFA for State(final)z -> %d %s -> %d)print enumerater.r2r*r0) rr9r6rztodor:r<r=r>js r dump_nfazParserGenerator.dump_nfas &&&w!$ 7 7HAu )Q =I C D D D$z 7 7 t4<< 4((AAD AKK%%%=+/****.E1:56666 7 7 7r c *td|t|D]r\}}td||jrdpdt|jD],\}}td|||fz-sdS)NzDump of DFA forr~rrr)rrr3r-r.r/r2)rr9r;r:r<r=r>s r dump_dfazParserGenerator.dump_dfas &&&!# A AHAu )Q ;) Ar B B B%ej&6&6&8&899 A A tnsyy'??@@@@ A A Ar cd}|rnd}t|D]X\}}t|dzt|D]2}||}||kr"||=|D]}|||d}n3Y|ldSdS)NTFr)rranger* unifystate)rr;changesr:state_irstate_jr<s r rjzParserGenerator.simplify_dfas G'nn   7qsCHH--A!!fG'))F%(??E!,,Wg>>>>"& *      r c|\}}|jdkr||fSt}t}|||||jdkr`||\}}|||||jdk`||fS)N|) parse_altrTruryr)rrkrlaazzs r rhzParserGenerator.parse_rhss~~1 :  a4KBB IIaLLL HHRLLL*## ~~''1 !  *## r6Mr c4|\}}|jdvs|jtjtjfvrV|\}}|||}|jdv7|jtjtjfvV||fS)N)([) parse_itemrTrcrrQSTRINGry)rrkbr7ds r rzParserGenerator.parse_alt s  1zZ''yUZ666??$$DAq HHQKKKA zZ''yUZ666!t r c|jdkrd||\}}|tjd||||fS|\}}|j}|dvr||fS||||dkr||fS||fS)Nr])+*r)rTrrhrfrrgry parse_atom)rrkrlrTs r rzParserGenerator.parse_items :   MMOOO>>##DAq KK# & & & HHQKKKa4K??$$DAqJEJ&&!t MMOOO HHQKKK||!t !t r c|jdkrO||\}}|tjd||fS|jtjtjfvrOt}t}| ||j|||fS| d|j|jdS)Nr)z+expected (...) or NAME or STRING, got %s/%s) rTrrhrfrrgrcrQrrury raise_error)rrkrls r rzParserGenerator.parse_atom(s :   MMOOO>>##DAq KK# & & &a4K Y5:u|4 4 4 A A HHQ # # # MMOOOa4K   J!Y  4 4 4 4 4r c|j|ks |.|j|kr#|d|||j|j|j}||S)Nzexpected %s/%s, got %s/%s)rcrTrr)rrcrTs r rfzParserGenerator.expect9sd 9  !2tzU7J7J   8!5$)TZ A A A   r ct|j}|dtjtjfvr4t|j}|dtjtjfv4|\|_|_|_|_|_ dS)Nr#) r>rrCOMMENTNLrcrTbeginendline)rtups r rzParserGenerator.gettokenAsr4>""!f)8;777t~&&C!f)8;777AD> 4:tz48TYYYr c |rG ||z}n@#d|gttt|z}YnxYwt ||j|jd|jd|jf)N r#r)joinr%mapstr SyntaxErrorrrr)rmsgargss r rzParserGenerator.raise_errorHs  = =Dj =hhutCTNN';';;<<# tx{ $ TY 899 9s  ;ArV)rr r r!r?r5r1rrWrrirrrjrhrrrrfrrr r r rr s4    2,",","\%%%$$$<!!!0"""H777 AAA*"(444"EEE99999r rceZdZdZddZdS)rucg|_dSrV)r.)rs r r!zNFAState.__init__Ss  r Nc|t|tsJt|tsJ|j||fdSrV)rKrrur.r0rr>r=s r ryzNFAState.addarcVsP} 5# 6 6}}6$))))) %'''''r rV)rr r r!ryr r r ruruQs7((((((r ruc*eZdZdZdZdZdZdZdS)rvct|tsJttt|tsJt|tsJ||_||v|_i|_dSrV)rKdictr>iterrurwr3r.)rrwfinals r r!zDFAState.__init__]so&$'''''$tF||,,h77777%*****   r ct|tsJ||jvsJt|tsJ||j|<dSrV)rKrr.rvrs r ryzDFAState.addarcesS%%%%%%DI%%%%$))))) %r c`|jD]\}}||ur ||j|<dSrV)r.r/)roldnewr=r>s r rzDFAState.unifystateksA9??,, ' 'KE4s{{#& %  ' 'r c,t|tsJ|j|jkrdSt|jt|jkrdS|jD]$\}}||j|urdS%dS)NFT)rKrvr3r*r.r/get)rotherr=r>s r __eq__zDFAState.__eq__ps%***** <5= ( (5 ty>>S__ , ,59??,,  KE45:>>%0000uu1tr N)rr r r!ryrr__hash__r r r rvrv[sQ   '''   HHHr rv Grammar.txtcHt|}|SrV)rr?)rps r generate_grammarrs!!A >>  r N)r) rrrrGrammarrobjectrrurvrr r r rs '&&&&&&&&&     '/   E9E9E9E9E9fE9E9E9N (((((v(((#####v###Jr PKhP3]X]])__pycache__/grammar.cpython-311.opt-2.pycnu[ f ddlZddlmZGddeZdZiZeD]*Zer&e \Z Z e ee ee <+[[ [ dS)N)tokenc4eZdZ dZdZdZdZdZdZdS)Grammarci|_i|_g|_i|_dg|_i|_i|_i|_d|_dS)N)rEMPTY) symbol2number number2symbolstatesdfaslabelskeywordstokens symbol2labelstart)selfs GREATER = EQUAL . DOT % PERCENT ` BACKQUOTE { LBRACE } RBRACE @ AT @= ATEQUAL == EQEQUAL != NOTEQUAL <> NOTEQUAL <= LESSEQUAL >= GREATEREQUAL ~ TILDE ^ CIRCUMFLEX << LEFTSHIFT >> RIGHTSHIFT ** DOUBLESTAR += PLUSEQUAL -= MINEQUAL *= STAREQUAL /= SLASHEQUAL %= PERCENTEQUAL &= AMPEREQUAL |= VBAREQUAL ^= CIRCUMFLEXEQUAL <<= LEFTSHIFTEQUAL >>= RIGHTSHIFTEQUAL **= DOUBLESTAREQUAL // DOUBLESLASH //= DOUBLESLASHEQUAL -> RARROW := COLONEQUAL ) rrobjectr opmap_rawopmap splitlineslinesplitopnamer+r8rrrBs  j#j#j#j#j#fj#j#j#^1  f   " "))D )::<<DGE4((b "dddrPKw 4]&* literals.pyonu[ {fc@sdZddlZi dd6dd6dd6d d 6d d 6d d6dd6dd6dd6dd6ZdZdZdZedkrendS(s<Safely evaluate Python string literals without using eval().iNstastbs tfs tns trs tts tvt't"s\cCs|jdd\}}tj|}|dk r7|S|jdr|d}t|dkrutd|nyt|d}Wqtk rtd|qXn7yt|d}Wn!tk rtd|nXt|S( Niitxis!invalid hex string escape ('\%s')iis#invalid octal string escape ('\%s')( tgrouptsimple_escapestgettNonet startswithtlent ValueErrortinttchr(tmtallttailtescthexesti((s./usr/lib64/python2.7/lib2to3/pgen2/literals.pytescapes"    cCsX|d}|d |dkr+|d}n|t|t| !}tjdt|S(Niis)\\(\'|\"|\\|[abfnrtv]|x.{0,2}|[0-7]{1,3})(RtretsubR(tstq((s./usr/lib64/python2.7/lib2to3/pgen2/literals.pyt evalString(s   cCs_xXtdD]J}t|}t|}t|}||kr |G|G|G|GHq q WdS(Ni(trangeRtreprR(RtcRte((s./usr/lib64/python2.7/lib2to3/pgen2/literals.pyttest2s     t__main__(t__doc__RR RRR#t__name__(((s./usr/lib64/python2.7/lib2to3/pgen2/literals.pyts      PKw 4]qC//pgen.pycnu[ {fc@sddlmZmZmZdejfdYZdefdYZdefdYZdefd YZ d d Z d S( i(tgrammarttokenttokenizet PgenGrammarcBseZRS((t__name__t __module__(((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyRstParserGeneratorcBseZddZdZdZdZdZdZdZ dZ dZ d Z d Z d Zd Zd ZdZddZdZdZRS(cCsd}|dkr*t|}|j}n||_||_tj|j|_|j |j \|_ |_ |dk r|ni|_ |jdS(N(tNonetopentclosetfilenametstreamRtgenerate_tokenstreadlinet generatortgettokentparsetdfast startsymboltfirstt addfirstsets(tselfR R t close_stream((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyt__init__ s         c Cst}|jj}|j|j|j|jd|jx;|D]3}dt|j}||j|<||j | %ds %s -> %d(t enumerateR R$RR"R( RR+R(RdttodoR,R.R/R0tj((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pytdump_nfas       cCsdG|GHxtt|D]f\}}dG|G|jr9dp<dGHx;t|jjD]$\}}d||j|fGHqTWqWdS(NsDump of DFA fors States(final)Rgs %s -> %d(RhR%RR R!R$(RR+R-R,R.R/R0((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pytdump_dfas  "cCst}x|rt}xt|D]x\}}xit|dt|D]N}||}||krH||=x|D]}|j||qrWt}PqHqHWq"Wq WdS(Ni(tTruetFalseRhtrangeRt unifystate(RR-tchangesR,tstate_iRjtstate_jR.((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyRWs     cCs|j\}}|jdkr+||fSt}t}|j||j|xI|jdkr|j|j\}}|j||j|qZW||fSdS(Nt|(t parse_altRER_RcR(RRXRYtaatzz((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyRUs       cCsr|j\}}xS|jdks?|jtjtjfkrg|j\}}|j||}qW||fS(Nt(t[(RxRy(t parse_itemRERPRRBtSTRINGRc(RRXtbR)td((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyRu s  cCs|jdkrU|j|j\}}|jtjd|j|||fS|j\}}|j}|dkr||fS|j|j||dkr||fS||fSdS(NRyt]t+t*(RR(RERRURSRRTRct parse_atom(RRXRYRE((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyRzs          cCs|jdkrH|j|j\}}|jtjd||fS|jtjtjfkrt }t }|j ||j|j||fS|j d|j|jdS(NRxt)s+expected (...) or NAME or STRING, got %s/%s( RERRURSRRTRPRBR{R_Rct raise_error(RRXRY((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyR(s       cCsc|j|ks*|dk rL|j|krL|jd|||j|jn|j}|j|S(Nsexpected %s/%s, got %s/%s(RPRRERR(RRPRE((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyRS9s *   cCsi|jj}x/|dtjtjfkr@|jj}qW|\|_|_|_|_|_ dS(Ni( RR0RtCOMMENTtNLRPREtbegintendtline(Rttup((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyRAscGss|r@y||}Wq@dj|gtt|}q@Xnt||j|jd|jd|jfdS(Nt ii(tjointmaptstrt SyntaxErrorR RR(Rtmsgtargs((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyRHs&N(RRRRR1R'R#RRFRRVRkRlRWRURuRzRRSRR(((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyR s$   .    $        R_cBseZdZddZRS(cCs g|_dS(N(R (R((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyRSscCsP|dks!t|ts!tt|ts6t|jj||fdS(N(RR:RR=R_R R"(RR0R/((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyRcVs!N(RRRRRc(((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyR_Qs R`cBs2eZdZdZdZdZdZRS(cCspt|tsttt|jts6tt|tsKt||_||k|_i|_dS(N( R:tdictR=titerR0R_RaR%R (RRatfinal((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyR]s ! cCsPt|tst||jks*tt|ts?t||j|s H %PKw 4]Ci-i-pgen.pyonu[ {fc@sddlmZmZmZdejfdYZdefdYZdefdYZdefd YZ d d Z d S( i(tgrammarttokenttokenizet PgenGrammarcBseZRS((t__name__t __module__(((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyRstParserGeneratorcBseZddZdZdZdZdZdZdZ dZ dZ d Z d Z d Zd Zd ZdZddZdZdZRS(cCsd}|dkr*t|}|j}n||_||_tj|j|_|j |j \|_ |_ |dk r|ni|_ |jdS(N(tNonetopentclosetfilenametstreamRtgenerate_tokenstreadlinet generatortgettokentparsetdfast startsymboltfirstt addfirstsets(tselfR R t close_stream((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyt__init__ s         c Cst}|jj}|j|j|j|jd|jx;|D]3}dt|j}||j|<||j | %ds %s -> %d(t enumerateR R$RR"R( RR+R(R\ttodoR,R.R/R0tj((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pytdump_nfas       cCsdG|GHxtt|D]f\}}dG|G|jr9dp<dGHx;t|jjD]$\}}d||j|fGHqTWqWdS(NsDump of DFA fors States(final)R_s %s -> %d(R`R%RR R!R$(RR+R-R,R.R/R0((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pytdump_dfas  "cCst}x|rt}xt|D]x\}}xit|dt|D]N}||}||krH||=x|D]}|j||qrWt}PqHqHWq"Wq WdS(Ni(tTruetFalseR`trangeRt unifystate(RR-tchangesR,tstate_iRbtstate_jR.((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyRPs     cCs|j\}}|jdkr+||fSt}t}|j||j|xI|jdkr|j|j\}}|j||j|qZW||fSdS(Nt|(t parse_altR>tNFAStateR[R(RRQRRtaatzz((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyRNs       cCsr|j\}}xS|jdks?|jtjtjfkrg|j\}}|j||}qW||fS(Nt(t[(RqRr(t parse_itemR>RIRR;tSTRINGR[(RRQtbR)td((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyRm s  cCs|jdkrU|j|j\}}|jtjd|j|||fS|j\}}|j}|dkr||fS|j|j||dkr||fS||fSdS(NRrt]t+t*(RxRy(R>RRNRLRRMR[t parse_atom(RRQRRR>((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyRss          cCs|jdkrH|j|j\}}|jtjd||fS|jtjtjfkrt }t }|j ||j|j||fS|j d|j|jdS(NRqt)s+expected (...) or NAME or STRING, got %s/%s( R>RRNRLRRMRIR;RtRnR[t raise_error(RRQRR((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyRz(s       cCsc|j|ks*|dk rL|j|krL|jd|||j|jn|j}|j|S(Nsexpected %s/%s, got %s/%s(RIRR>R|R(RRIR>((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyRL9s *   cCsi|jj}x/|dtjtjfkr@|jj}qW|\|_|_|_|_|_ dS(Ni( RR0RtCOMMENTtNLRIR>tbegintendtline(Rttup((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyRAscGss|r@y||}Wq@dj|gtt|}q@Xnt||j|jd|jd|jfdS(Nt ii(tjointmaptstrt SyntaxErrorR RR(Rtmsgtargs((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyR|Hs&N(RRRRR1R'R#RR?RRORcRdRPRNRmRsRzRLRR|(((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyR s$   .    $        RncBseZdZddZRS(cCs g|_dS(N(R (R((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyRSscCs|jj||fdS(N(R R"(RR0R/((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyR[VsN(RRRRR[(((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyRnQs RXcBs2eZdZdZdZdZdZRS(cCs%||_||k|_i|_dS(N(RYR%R (RRYtfinal((s*/usr/lib64/python2.7/lib2to3/pgen2/pgen.pyR]s cCs||j|s H %PKw 4]?? driver.pycnu[ {fc@sdZdZddgZddlZddlZddlZddlZddlZddlZddl m Z m Z m Z m Z mZdefdYZd Zd deedd Zd Zd ZdZedkrejee ndS(sZParser driver. This provides a high-level interface to parse a file into a syntax tree. s#Guido van Rossum tDrivert load_grammariNi(tgrammartparsettokenttokenizetpgencBsVeZdddZedZedZedZdedZedZ 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}|jd}d}d }}}} } d} x|D]} | \}}}} } |||fkr ||f|kst||f|f|\} }|| kr| d| |7} | }d}n||kr | | ||!7} |}q n|tjtj fkr`| |7} | \}}|j drQ|d7}d}qQqQn|t j krtj |}n|r|jjdt j||| n|j||| |fr|r|jjdnPnd} | \}}|j drQ|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|jXdS(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||djtttjdS(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|Wqt k r}|jd|qXqnt 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.pyRIs cCsctjj|rt|Sttjj|}tj||}tj }|j ||S(sNormally, 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_grammars    cGsc|stjd}ntjdtjdtjddx$|D]}t|dtdtq?WtS(sMain 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.pytmains t__main__(t__doc__t __author__t__all__R0R=RR\R6RCRRRRRRtobjectRRHRRVR;RRIRcRkR9texittint(((s,/usr/lib64/python2.7/lib2to3/pgen2/driver.pyt s$       (P   PKw 4]( token.pyonu[ {fc@sdZdZdZdZdZdZdZdZdZd Z d Z d Z d Z d Z dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZd Z d!Z!d"Z"d#Z#d$Z$d%Z%d&Z&d'Z'd(Z(d)Z)d*Z*d+Z+d,Z,d-Z-d.Z.d/Z/d0Z0d1Z1d2Z2d3Z3d4Z4d5Z5d6Z6d7Z7d8Z8d9Z9d:Z:d;Z;iZ<xBe=j>D]1\Z?Z@eAe@eAdkr~e?e<e@ZDd?S(@s!Token constants (from "token.h").iiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9icCs |tkS(N(t NT_OFFSET(tx((s+/usr/lib64/python2.7/lib2to3/pgen2/token.pyt ISTERMINALLscCs |tkS(N(R(R((s+/usr/lib64/python2.7/lib2to3/pgen2/token.pyt ISNONTERMINALOscCs |tkS(N(t ENDMARKER(R((s+/usr/lib64/python2.7/lib2to3/pgen2/token.pytISEOFRsN(Et__doc__RtNAMEtNUMBERtSTRINGtNEWLINEtINDENTtDEDENTtLPARtRPARtLSQBtRSQBtCOLONtCOMMAtSEMItPLUStMINUStSTARtSLASHtVBARtAMPERtLESStGREATERtEQUALtDOTtPERCENTt BACKQUOTEtLBRACEtRBRACEtEQEQUALtNOTEQUALt LESSEQUALt GREATEREQUALtTILDEt CIRCUMFLEXt LEFTSHIFTt RIGHTSHIFTt DOUBLESTARt PLUSEQUALtMINEQUALt STAREQUALt SLASHEQUALt PERCENTEQUALt AMPEREQUALt VBAREQUALtCIRCUMFLEXEQUALtLEFTSHIFTEQUALtRIGHTSHIFTEQUALtDOUBLESTAREQUALt DOUBLESLASHtDOUBLESLASHEQUALtATtATEQUALtOPtCOMMENTtNLtRARROWt ERRORTOKENtN_TOKENSRttok_nametglobalstitemst_namet_valuettypeRRR(((s+/usr/lib64/python2.7/lib2to3/pgen2/token.pyts  PKw 4]ʼnconv.pycnu[ {fc@sEdZddlZddlmZmZdejfdYZdS(sConvert graminit.[ch] spit out by pgen to Python code. Pgen is the Python parser generator. It is useful to quickly create a parser from a grammar file in Python's grammar notation. But I don't want my parsers to be written in C (yet), so I'm translating the parsing tables to Python data structures and writing a Python parse engine. Note that the token numbers are constants determined by the standard Python tokenizer. The standard token module defines these numbers and their names (the names are not used much). The token numbers are hardcoded into the Python tokenizer and into pgen. A Python implementation of the Python tokenizer is also available, in the standard tokenize module. On the other hand, symbol numbers (representing the grammar's non-terminals) are assigned by pgen based on the actual grammar input. Note: this module is pretty much obsolete; the pgen module generates equivalent grammar tables directly from the Grammar.txt input file without having to invoke the Python pgen C program. iN(tgrammarttokent ConvertercBs2eZdZdZdZdZdZRS(s2Grammar subclass that reads classic pgen output files. The run() method reads the tables as produced by the pgen parser generator, typically contained in two C files, graminit.h and graminit.c. The other methods are for internal use only. See the base class for more documentation. cCs(|j||j||jdS(s<Load the grammar tables from the text files written by pgen.N(tparse_graminit_htparse_graminit_ct finish_off(tselft graminit_ht graminit_c((s*/usr/lib64/python2.7/lib2to3/pgen2/conv.pytrun/s  c Csyt|}Wn#tk r5}d||fGHtSXi|_i|_d}x|D]}|d7}tjd|}| r|jrd|||jfGHqU|j\}}t |}||jkst ||jkst ||j|<||j|@rd||d|_[] = { {, }, ... }; - followed by a state array, of the form: static state states_[] = { {, arcs__}, ... }; sCan't open %s: %siis#include "pgenheaders.h" s#include "grammar.h" s static arc s)static arc arcs_(\d+)_(\d+)\[(\d+)\] = {$s\s+{(\d+), (\d+)},$s}; s'static state states_(\d+)\[(\d+)\] = {$s\s+{(\d+), arcs_(\d+)_(\d+)},$sstatic dfa dfas\[(\d+)\] = {$s0\s+{(\d+), "(\w+)", (\d+), (\d+), states_(\d+),$iiiis\s+("(?:\\\d\d\d)*")},$is!static label labels\[(\d+)\] = {$s\s+{(\d+), (0|"\w+")},$t0sgrammar _PyParser_Grammar = { s \s+(\d+),$s dfas, s\s+{(\d+), labels},$s \s+(\d+)$N(R R R tnextRt startswithRRtmapRRtrangetappendtlentstatestgroupR Rtevalt enumeratetordtdfastNonetlabelststartt StopIteration(!RRRRRRtallarcsR%Rtntmtktarcst_titjtstttstateR*tndfasRRtxtytztfirstt rawbitsettctbyteR,tnlabelsR-((s*/usr/lib64/python2.7/lib2to3/pgen2/conv.pyRTs  $$    -%% $       '!  cCsi|_i|_xjt|jD]Y\}\}}|tjkr_|dk r_||j|s PKw 4]K% __init__.pycnu[ {fc@s dZdS(sThe pgen2 package.N(t__doc__(((s./usr/lib64/python2.7/lib2to3/pgen2/__init__.pyttPKw 4]U  grammar.pycnu[ {fc@sdZddlZddlZddlmZmZdefdYZdZdZ iZ xBe j D]4Z e rle j \ZZeeee et|d)}t|j}tj||dWdQXdS(sDump the grammar tables to a pickle file. dump() recursively changes all dict to OrderedDict, so the pickled file is not exactly the same as what was passed in to dump(). load() uses the pickled file to create the tables, but only changes OrderedDict to dict at the top level; it does not recursively change OrderedDict to dict. So, the loaded tables are different from the original tables that were passed to load() in that some of the OrderedDict (from the pickled file) are not changed back to dict. For parsing, this has no effect on performance because OrderedDict uses dict's __getitem__ with nothing in between. twbiN(topent_make_deterministict__dict__tpickletdump(R tfilenametftd((s-/usr/lib64/python2.7/lib2to3/pgen2/grammar.pyRXs cCs<t|d}tj|}|j|jj|dS(s+Load the grammar tables from a pickle file.trbN(RRtloadtcloseRtupdate(R RRR((s-/usr/lib64/python2.7/lib2to3/pgen2/grammar.pyRis cCs|jjtj|dS(s3Load the grammar tables from a pickle bytes object.N(RRRtloads(R tpkl((s-/usr/lib64/python2.7/lib2to3/pgen2/grammar.pyRpscCsf|j}x-dD]%}t||t||jqW|j|_|j|_|j|_|S(s# Copy the grammar. RRRR R R (RRRR R R (t __class__tsetattrtgetattrtcopyRRR (R tnewt dict_attr((s-/usr/lib64/python2.7/lib2to3/pgen2/grammar.pyR!ts  #   cCszddlm}dGH||jdGH||jdGH||jdGH||jdGH||jdG|jGHd S( s:Dump the grammar tables to standard output, for debugging.i(tpprintts2ntn2sRRRR N(R$RRRRRR (R R$((s-/usr/lib64/python2.7/lib2to3/pgen2/grammar.pytreports     ( t__name__t __module__t__doc__RRRRR!R'(((s-/usr/lib64/python2.7/lib2to3/pgen2/grammar.pyRs4    cCst|tr2tjtd|jDSt|tr^g|D]}t|^qHSt|trtd|DS|S(Ncss'|]\}}|t|fVqdS(N(R(t.0tktv((s-/usr/lib64/python2.7/lib2to3/pgen2/grammar.pys scss|]}t|VqdS(N(R(R+te((s-/usr/lib64/python2.7/lib2to3/pgen2/grammar.pys s( t isinstancetdictt collectionst OrderedDicttsortedt iteritemstlistRttuple(ttopR.((s-/usr/lib64/python2.7/lib2to3/pgen2/grammar.pyRss ( LPAR ) RPAR [ LSQB ] RSQB : COLON , COMMA ; SEMI + PLUS - MINUS * STAR / SLASH | VBAR & AMPER < LESS > GREATER = EQUAL . DOT % PERCENT ` BACKQUOTE { LBRACE } RBRACE @ AT @= ATEQUAL == EQEQUAL != NOTEQUAL <> NOTEQUAL <= LESSEQUAL >= GREATEREQUAL ~ TILDE ^ CIRCUMFLEX << LEFTSHIFT >> RIGHTSHIFT ** DOUBLESTAR += PLUSEQUAL -= MINEQUAL *= STAREQUAL /= SLASHEQUAL %= PERCENTEQUAL &= AMPEREQUAL |= VBAREQUAL ^= CIRCUMFLEXEQUAL <<= LEFTSHIFTEQUAL >>= RIGHTSHIFTEQUAL **= DOUBLESTAREQUAL // DOUBLESLASH //= DOUBLESLASHEQUAL -> RARROW (R*R1RtRRtobjectRRt opmap_rawtopmapt splitlinestlinetsplittoptnameR (((s-/usr/lib64/python2.7/lib2to3/pgen2/grammar.pyt s  z =PKw 4]A'He parse.pyonu[ {fc@sFdZddlmZdefdYZdefdYZdS(sParser engine for the grammar tables generated by pgen. The grammar table must be loaded first. See Parser/parser.c in the Python distribution for additional info on how this parsing engine works. i(ttokent ParseErrorcBseZdZdZRS(s(Exception to signal the parser is stuck.cCsHtj|d||||f||_||_||_||_dS(Ns!%s: type=%r, value=%r, context=%r(t Exceptiont__init__tmsgttypetvaluetcontext(tselfRRRR((s+/usr/lib64/python2.7/lib2to3/pgen2/parse.pyRs     (t__name__t __module__t__doc__R(((s+/usr/lib64/python2.7/lib2to3/pgen2/parse.pyRstParsercBsSeZdZddZddZdZdZdZdZ dZ RS( s5Parser engine. The proper usage sequence is: p = Parser(grammar, [converter]) # create instance p.setup([start]) # prepare for parsing : if p.addtoken(...): # parse a token; may raise ParseError break root = p.rootnode # root of abstract syntax tree A Parser instance may be reused by calling setup() repeatedly. A Parser instance contains state pertaining to the current token sequence, and should not be used concurrently by different threads to parse separate token sequences. See driver.py for how to get input tokens by tokenizing a file or string. Parsing is complete when addtoken() returns True; the root of the abstract syntax tree can then be retrieved from the rootnode instance variable. When a syntax error occurs, addtoken() raises the ParseError exception. There is no error recovery; the parser cannot be used after a syntax error was reported (but it can be reinitialized by calling setup()). cCs||_|pd|_dS(sConstructor. The grammar argument is a grammar.Grammar instance; see the grammar module for more information. The parser is not ready yet for parsing; you must call the setup() method to get it started. The optional convert argument is a function mapping concrete syntax tree nodes to abstract syntax tree nodes. If not given, no conversion is done and the syntax tree produced is the concrete syntax tree. If given, it must be a function of two arguments, the first being the grammar (a grammar.Grammar instance), and the second being the concrete syntax tree node to be converted. The syntax tree is converted from the bottom up. A concrete syntax tree node is a (type, value, context, nodes) tuple, where type is the node type (a token or symbol number), value is None for symbols and a string for tokens, context is None or an opaque value used for error reporting (typically a (lineno, offset) pair), and nodes is a list of children for symbols, and None for tokens. An abstract syntax tree node may be anything; this is entirely up to the converter function. cSs|S(N((tgrammartnode((s+/usr/lib64/python2.7/lib2to3/pgen2/parse.pytWtN(R tconvert(RR R((s+/usr/lib64/python2.7/lib2to3/pgen2/parse.pyR9s cCsk|dkr|jj}n|ddgf}|jj|d|f}|g|_d|_t|_dS(sPrepare for parsing. This *must* be called before starting to parse. The optional argument is an alternative start symbol; it defaults to the grammar's start symbol. You can use a Parser instance to parse any number of programs; each time you call setup() the parser is reset to an initial state determined by the (implicit or explicit) start symbol. iN(tNoneR tstarttdfaststacktrootnodetsett used_names(RRtnewnodet stackentry((s+/usr/lib64/python2.7/lib2to3/pgen2/parse.pytsetupYs   cCs|j|||}xtr|jd\}}}|\}} ||} x_| D]\} } |jj| \} }|| kr|j||| || }xV||d|fgkr|j|jstS|jd\}}}|\}} qWtS| dkrQ|jj| }|\}}||krS|j | |jj| | |PqSqQqQWd|f| kr|j|jst d|||qqt d|||qWdS(s<Add a token; return True iff this is the end of the program.iiistoo much inputs bad inputN( tclassifytTrueRR tlabelstshifttpoptFalseRtpushR(RRRRtilabeltdfatstateRtstatestfirsttarcstitnewstatetttvtitsdfat itsstatestitsfirst((s+/usr/lib64/python2.7/lib2to3/pgen2/parse.pytaddtokenqs:             cCs|tjkrG|jj||jjj|}|dk rG|Sn|jjj|}|dkrt d|||n|S(s&Turn a token into a label. (Internal)s bad tokenN( RtNAMERtaddR tkeywordstgetRttokensR(RRRRR#((s+/usr/lib64/python2.7/lib2to3/pgen2/parse.pyRs  c Csw|jd\}}}|||df}|j|j|}|dk r]|dj|n|||f|jd s PKw 4]6pDD parse.pycnu[ {fc@sFdZddlmZdefdYZdefdYZdS(sParser engine for the grammar tables generated by pgen. The grammar table must be loaded first. See Parser/parser.c in the Python distribution for additional info on how this parsing engine works. i(ttokent ParseErrorcBseZdZdZRS(s(Exception to signal the parser is stuck.cCsHtj|d||||f||_||_||_||_dS(Ns!%s: type=%r, value=%r, context=%r(t Exceptiont__init__tmsgttypetvaluetcontext(tselfRRRR((s+/usr/lib64/python2.7/lib2to3/pgen2/parse.pyRs     (t__name__t __module__t__doc__R(((s+/usr/lib64/python2.7/lib2to3/pgen2/parse.pyRstParsercBsSeZdZddZddZdZdZdZdZ dZ RS( s5Parser engine. The proper usage sequence is: p = Parser(grammar, [converter]) # create instance p.setup([start]) # prepare for parsing : if p.addtoken(...): # parse a token; may raise ParseError break root = p.rootnode # root of abstract syntax tree A Parser instance may be reused by calling setup() repeatedly. A Parser instance contains state pertaining to the current token sequence, and should not be used concurrently by different threads to parse separate token sequences. See driver.py for how to get input tokens by tokenizing a file or string. Parsing is complete when addtoken() returns True; the root of the abstract syntax tree can then be retrieved from the rootnode instance variable. When a syntax error occurs, addtoken() raises the ParseError exception. There is no error recovery; the parser cannot be used after a syntax error was reported (but it can be reinitialized by calling setup()). cCs||_|pd|_dS(sConstructor. The grammar argument is a grammar.Grammar instance; see the grammar module for more information. The parser is not ready yet for parsing; you must call the setup() method to get it started. The optional convert argument is a function mapping concrete syntax tree nodes to abstract syntax tree nodes. If not given, no conversion is done and the syntax tree produced is the concrete syntax tree. If given, it must be a function of two arguments, the first being the grammar (a grammar.Grammar instance), and the second being the concrete syntax tree node to be converted. The syntax tree is converted from the bottom up. A concrete syntax tree node is a (type, value, context, nodes) tuple, where type is the node type (a token or symbol number), value is None for symbols and a string for tokens, context is None or an opaque value used for error reporting (typically a (lineno, offset) pair), and nodes is a list of children for symbols, and None for tokens. An abstract syntax tree node may be anything; this is entirely up to the converter function. cSs|S(N((tgrammartnode((s+/usr/lib64/python2.7/lib2to3/pgen2/parse.pytWtN(R tconvert(RR R((s+/usr/lib64/python2.7/lib2to3/pgen2/parse.pyR9s cCsk|dkr|jj}n|ddgf}|jj|d|f}|g|_d|_t|_dS(sPrepare for parsing. This *must* be called before starting to parse. The optional argument is an alternative start symbol; it defaults to the grammar's start symbol. You can use a Parser instance to parse any number of programs; each time you call setup() the parser is reset to an initial state determined by the (implicit or explicit) start symbol. iN(tNoneR tstarttdfaststacktrootnodetsett used_names(RRtnewnodet stackentry((s+/usr/lib64/python2.7/lib2to3/pgen2/parse.pytsetupYs   cCs|j|||}xtr|jd\}}}|\}} ||} xq| D]\} } |jj| \} }|| kr | dkst|j||| || }xV||d|fgkr|j|jstS|jd\}}}|\}} qWtS| dkrQ|jj | }|\}}||kre|j | |jj | | |PqeqQqQWd|f| kr|j|jst d|||qqt d|||qWdS(s<Add a token; return True iff this is the end of the program.iiistoo much inputs bad inputN( tclassifytTrueRR tlabelstAssertionErrortshifttpoptFalseRtpushR(RRRRtilabeltdfatstateRtstatestfirsttarcstitnewstatetttvtitsdfat itsstatestitsfirst((s+/usr/lib64/python2.7/lib2to3/pgen2/parse.pytaddtokenqs<             cCs|tjkrG|jj||jjj|}|dk rG|Sn|jjj|}|dkrt d|||n|S(s&Turn a token into a label. (Internal)s bad tokenN( RtNAMERtaddR tkeywordstgetRttokensR(RRRRR$((s+/usr/lib64/python2.7/lib2to3/pgen2/parse.pyRs  c Csw|jd\}}}|||df}|j|j|}|dk r]|dj|n|||f|jd s PKw 4]K% __init__.pyonu[ {fc@s dZdS(sThe pgen2 package.N(t__doc__(((s./usr/lib64/python2.7/lib2to3/pgen2/__init__.pyttPKw 4]( token.pycnu[ {fc@sdZdZdZdZdZdZdZdZdZd Z d Z d Z d Z d Z dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZd Z d!Z!d"Z"d#Z#d$Z$d%Z%d&Z&d'Z'd(Z(d)Z)d*Z*d+Z+d,Z,d-Z-d.Z.d/Z/d0Z0d1Z1d2Z2d3Z3d4Z4d5Z5d6Z6d7Z7d8Z8d9Z9d:Z:d;Z;iZ<xBe=j>D]1\Z?Z@eAe@eAdkr~e?e<e@ZDd?S(@s!Token constants (from "token.h").iiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9icCs |tkS(N(t NT_OFFSET(tx((s+/usr/lib64/python2.7/lib2to3/pgen2/token.pyt ISTERMINALLscCs |tkS(N(R(R((s+/usr/lib64/python2.7/lib2to3/pgen2/token.pyt ISNONTERMINALOscCs |tkS(N(t ENDMARKER(R((s+/usr/lib64/python2.7/lib2to3/pgen2/token.pytISEOFRsN(Et__doc__RtNAMEtNUMBERtSTRINGtNEWLINEtINDENTtDEDENTtLPARtRPARtLSQBtRSQBtCOLONtCOMMAtSEMItPLUStMINUStSTARtSLASHtVBARtAMPERtLESStGREATERtEQUALtDOTtPERCENTt BACKQUOTEtLBRACEtRBRACEtEQEQUALtNOTEQUALt LESSEQUALt GREATEREQUALtTILDEt CIRCUMFLEXt LEFTSHIFTt RIGHTSHIFTt DOUBLESTARt PLUSEQUALtMINEQUALt STAREQUALt SLASHEQUALt PERCENTEQUALt AMPEREQUALt VBAREQUALtCIRCUMFLEXEQUALtLEFTSHIFTEQUALtRIGHTSHIFTEQUALtDOUBLESTAREQUALt DOUBLESLASHtDOUBLESLASHEQUALtATtATEQUALtOPtCOMMENTtNLtRARROWt ERRORTOKENtN_TOKENSRttok_nametglobalstitemst_namet_valuettypeRRR(((s+/usr/lib64/python2.7/lib2to3/pgen2/token.pyts  PKw 4]U  grammar.pyonu[ {fc@sdZddlZddlZddlmZmZdefdYZdZdZ iZ xBe j D]4Z e rle j \ZZeeee et|d)}t|j}tj||dWdQXdS(sDump the grammar tables to a pickle file. dump() recursively changes all dict to OrderedDict, so the pickled file is not exactly the same as what was passed in to dump(). load() uses the pickled file to create the tables, but only changes OrderedDict to dict at the top level; it does not recursively change OrderedDict to dict. So, the loaded tables are different from the original tables that were passed to load() in that some of the OrderedDict (from the pickled file) are not changed back to dict. For parsing, this has no effect on performance because OrderedDict uses dict's __getitem__ with nothing in between. twbiN(topent_make_deterministict__dict__tpickletdump(R tfilenametftd((s-/usr/lib64/python2.7/lib2to3/pgen2/grammar.pyRXs cCs<t|d}tj|}|j|jj|dS(s+Load the grammar tables from a pickle file.trbN(RRtloadtcloseRtupdate(R RRR((s-/usr/lib64/python2.7/lib2to3/pgen2/grammar.pyRis cCs|jjtj|dS(s3Load the grammar tables from a pickle bytes object.N(RRRtloads(R tpkl((s-/usr/lib64/python2.7/lib2to3/pgen2/grammar.pyRpscCsf|j}x-dD]%}t||t||jqW|j|_|j|_|j|_|S(s# Copy the grammar. RRRR R R (RRRR R R (t __class__tsetattrtgetattrtcopyRRR (R tnewt dict_attr((s-/usr/lib64/python2.7/lib2to3/pgen2/grammar.pyR!ts  #   cCszddlm}dGH||jdGH||jdGH||jdGH||jdGH||jdG|jGHd S( s:Dump the grammar tables to standard output, for debugging.i(tpprintts2ntn2sRRRR N(R$RRRRRR (R R$((s-/usr/lib64/python2.7/lib2to3/pgen2/grammar.pytreports     ( t__name__t __module__t__doc__RRRRR!R'(((s-/usr/lib64/python2.7/lib2to3/pgen2/grammar.pyRs4    cCst|tr2tjtd|jDSt|tr^g|D]}t|^qHSt|trtd|DS|S(Ncss'|]\}}|t|fVqdS(N(R(t.0tktv((s-/usr/lib64/python2.7/lib2to3/pgen2/grammar.pys scss|]}t|VqdS(N(R(R+te((s-/usr/lib64/python2.7/lib2to3/pgen2/grammar.pys s( t isinstancetdictt collectionst OrderedDicttsortedt iteritemstlistRttuple(ttopR.((s-/usr/lib64/python2.7/lib2to3/pgen2/grammar.pyRss ( LPAR ) RPAR [ LSQB ] RSQB : COLON , COMMA ; SEMI + PLUS - MINUS * STAR / SLASH | VBAR & AMPER < LESS > GREATER = EQUAL . DOT % PERCENT ` BACKQUOTE { LBRACE } RBRACE @ AT @= ATEQUAL == EQEQUAL != NOTEQUAL <> NOTEQUAL <= LESSEQUAL >= GREATEREQUAL ~ TILDE ^ CIRCUMFLEX << LEFTSHIFT >> RIGHTSHIFT ** DOUBLESTAR += PLUSEQUAL -= MINEQUAL *= STAREQUAL /= SLASHEQUAL %= PERCENTEQUAL &= AMPEREQUAL |= VBAREQUAL ^= CIRCUMFLEXEQUAL <<= LEFTSHIFTEQUAL >>= RIGHTSHIFTEQUAL **= DOUBLESTAREQUAL // DOUBLESLASH //= DOUBLESLASHEQUAL -> RARROW (R*R1RtRRtobjectRRt opmap_rawtopmapt splitlinestlinetsplittoptnameR (((s-/usr/lib64/python2.7/lib2to3/pgen2/grammar.pyt s  z =PKw 4]fwc}}conv.pyonu[ {fc@sEdZddlZddlmZmZdejfdYZdS(sConvert graminit.[ch] spit out by pgen to Python code. Pgen is the Python parser generator. It is useful to quickly create a parser from a grammar file in Python's grammar notation. But I don't want my parsers to be written in C (yet), so I'm translating the parsing tables to Python data structures and writing a Python parse engine. Note that the token numbers are constants determined by the standard Python tokenizer. The standard token module defines these numbers and their names (the names are not used much). The token numbers are hardcoded into the Python tokenizer and into pgen. A Python implementation of the Python tokenizer is also available, in the standard tokenize module. On the other hand, symbol numbers (representing the grammar's non-terminals) are assigned by pgen based on the actual grammar input. Note: this module is pretty much obsolete; the pgen module generates equivalent grammar tables directly from the Grammar.txt input file without having to invoke the Python pgen C program. iN(tgrammarttokent ConvertercBs2eZdZdZdZdZdZRS(s2Grammar subclass that reads classic pgen output files. The run() method reads the tables as produced by the pgen parser generator, typically contained in two C files, graminit.h and graminit.c. The other methods are for internal use only. See the base class for more documentation. cCs(|j||j||jdS(s<Load the grammar tables from the text files written by pgen.N(tparse_graminit_htparse_graminit_ct finish_off(tselft graminit_ht graminit_c((s*/usr/lib64/python2.7/lib2to3/pgen2/conv.pytrun/s  c Csyt|}Wn#tk r5}d||fGHtSXi|_i|_d}x|D]}|d7}tjd|}| r|jrd|||jfGHqU|j\}}t |}||j|<||j|@rd||d|_[] = { {, }, ... }; - followed by a state array, of the form: static state states_[] = { {, arcs__}, ... }; sCan't open %s: %siis static arc s)static arc arcs_(\d+)_(\d+)\[(\d+)\] = {$s\s+{(\d+), (\d+)},$s'static state states_(\d+)\[(\d+)\] = {$s\s+{(\d+), arcs_(\d+)_(\d+)},$sstatic dfa dfas\[(\d+)\] = {$s0\s+{(\d+), "(\w+)", (\d+), (\d+), states_(\d+),$iiiis\s+("(?:\\\d\d\d)*")},$is!static label labels\[(\d+)\] = {$s\s+{(\d+), (0|"\w+")},$t0s \s+(\d+),$s\s+{(\d+), labels},$s \s+(\d+)$N(R R R tnextt startswithRRtmapRRtrangetappendtstatestgrouptevalt enumeratetordtdfastNonetlabelststartt StopIteration(!RRRRRRtallarcsR#Rtntmtktarcst_titjtstttstateR(tndfasRRtxtytztfirstt rawbitsettctbyteR*tnlabelsR+((s*/usr/lib64/python2.7/lib2to3/pgen2/conv.pyRTs      -          cCsi|_i|_xjt|jD]Y\}\}}|tjkr_|dk r_||j|s PKw 4]  literals.pycnu[ {fc@sdZddlZi dd6dd6dd6d d 6d d 6d d6dd6dd6dd6dd6ZdZdZdZedkrendS(s<Safely evaluate Python string literals without using eval().iNstastbs tfs tns trs tts tvt't"s\cCs|jdd\}}|jds-ttj|}|dk rL|S|jdr|d}t|dkrtd|nyt|d}Wqtk rtd|qXn7yt|d}Wn!tk rtd |nXt |S( Niis\txis!invalid hex string escape ('\%s')iis#invalid octal string escape ('\%s')( tgroupt startswithtAssertionErrortsimple_escapestgettNonetlent ValueErrortinttchr(tmtallttailtescthexesti((s./usr/lib64/python2.7/lib2to3/pgen2/literals.pytescapes$    cCs|jds4|jds4tt|d |d}|d |dkr_|d}n|j|stt|t| t|dt|kst|t|t| !}tjdt|S(NRRiiiis)\\(\'|\"|\\|[abfnrtv]|x.{0,2}|[0-7]{1,3})(R R treprtendswithRtretsubR(tstq((s./usr/lib64/python2.7/lib2to3/pgen2/literals.pyt evalString(s4  ,"cCs_xXtdD]J}t|}t|}t|}||kr |G|G|G|GHq q WdS(Ni(trangeRRR!(RtcRte((s./usr/lib64/python2.7/lib2to3/pgen2/literals.pyttest2s     t__main__(t__doc__RR RR!R%t__name__(((s./usr/lib64/python2.7/lib2to3/pgen2/literals.pyts      PKw 4]ф driver.pyonu[ {fc@sdZdZddgZddlZddlZddlZddlZddlZddlZddl m Z m Z m Z m Z mZdefdYZd Zd deedd Zd Zd ZdZedkrejee ndS(sZParser driver. This provides a high-level interface to parse a file into a syntax tree. s#Guido van Rossum tDrivert load_grammariNi(tgrammartparsettokenttokenizetpgencBsVeZdddZedZedZedZdedZedZ 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}|jd}d}d }}}} } d} x|D]} | \}}}} } |||fkr|\} }|| kr| d| |7} | }d}n||kr| | ||!7} |}qn|tjtjfkr6| |7} | \}}|j drQ|d7}d}qQqQn|t j krUtj |}n|r~|j jdt j||| n|j||| |fr|r|j jdnPnd} | \}}|j drQ|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|jXdS(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||djtttjdS(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|Wqt k r}|jd|qXqnt 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.pyRHs cCsctjj|rt|Sttjj|}tj||}tj }|j ||S(sNormally, 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_grammars    cGsc|stjd}ntjdtjdtjddx$|D]}t|dtdtq?WtS(sMain 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.pytmains t__main__(t__doc__t __author__t__all__R/R<RR[R5RBRRRRRRtobjectRRGRRUR:RRHRbRjR8texittint(((s,/usr/lib64/python2.7/lib2to3/pgen2/driver.pyt s$       (P   PKw 4]>FAA tokenize.pyonu[ {fc@sdZdZdZddlZddlZddlmZmZddlTddl m Z ge e D]Z e d d krge ^qgd d d gZ [ yeWnek reZnXdZdZdZdZdZeedeeeZdZdZdZdZdZeeeeeZdZeddeeZdeZeeeZ ede dZ!ee!e eZ"dZ#d Z$d!Z%d"Z&ed#d$Z'ed%d&Z(ed'd(d)d*d+d,d-d.d/ Z)d0Z*ed1d2Z+ee)e*e+Z,ee"e,e(eZ-ee-Z.ed3ed4dd5ed6dZ/edee'Z0eee0e"e,e/eZ1e2ej3e.e1e%e&f\Z4Z5Z6Z7i&ej3e#d46ej3e$d66e6d76e7d86e6d96e7d:6e6d;6e7d<6e6d=6e7d>6e6d?6e7d@6e6dA6e7dB6e6dC6e7dD6e6dE6e7dF6e6dG6e7dH6e6dI6e7dJ6e6dK6e7dL6e6dM6e7dN6e6dO6e7dP6e6dQ6e7dR6e6dS6e7dT6ddU6ddV6ddW6ddX6ddY6ddZ6Z9iZ:xdD]Z;e;e:e;fdyYZ?dze>fd{YZ@d|ZAeAd}ZBd~ZCdddYZDej3dZEej3dZFdZGdZHdZIdZJeKdkrddlLZLeMeLjNdkreBeOeLjNdjPqeBeLjQjPndS(sTokenization help for Python programs. generate_tokens(readline) is a generator that breaks a stream of text into Python tokens. It accepts a readline-like method which is called repeatedly to get the next line of input (or "" for EOF). It generates 5-tuples with these members: the token type (see token.py) the token (a string) the starting (row, column) indices of the token (a 2-tuple of ints) the ending (row, column) indices of the token (a 2-tuple of ints) the original line (string) It is designed to match the working of the Python tokenizer exactly, except that it produces COMMENT tokens for comments and gives type OP for all operators Older entry points tokenize_loop(readline, tokeneater) tokenize(readline, tokeneater=printtoken) are the same, except instead of generating tokens, tokeneater is a callback function to which the 5 fields described above are passed as 5 arguments, each time a new token is found.sKa-Ping Yee s@GvR, ESR, Tim Peters, Thomas Wouters, Fred Drake, Skip MontanaroiN(tBOM_UTF8tlookup(t*i(ttokenit_ttokenizetgenerate_tokenst untokenizecGsddj|dS(Nt(t|t)(tjoin(tchoices((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pytgroup0tcGst|dS(NR(R (R ((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pytany1RcGst|dS(Nt?(R (R ((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pytmaybe2Rs[ \f\t]*s #[^\r\n]*s\\\r?\ns [a-zA-Z_]\w*s 0[bB][01]*s0[xX][\da-fA-F]*[lL]?s0[oO]?[0-7]*[lL]?s [1-9]\d*[lL]?s [eE][-+]?\d+s\d+\.\d*s\.\d+s\d+s\d+[jJ]s[jJ]s[^'\\]*(?:\\.[^'\\]*)*'s[^"\\]*(?:\\.[^"\\]*)*"s%[^'\\]*(?:(?:\\.|'(?!''))[^'\\]*)*'''s%[^"\\]*(?:(?:\\.|"(?!""))[^"\\]*)*"""s[ubUB]?[rR]?'''s[ubUB]?[rR]?"""s&[uU]?[rR]?'[^\n'\\]*(?:\\.[^\n'\\]*)*'s&[uU]?[rR]?"[^\n"\\]*(?:\\.[^\n"\\]*)*"s\*\*=?s>>=?s<<=?s<>s!=s//=?s->s[+\-*/%&@|^=<>]=?t~s[][(){}]s\r?\ns[:;.,`@]s'[uUbB]?[rR]?'[^\n'\\]*(?:\\.[^\n'\\]*)*t's'[uUbB]?[rR]?"[^\n"\\]*(?:\\.[^\n"\\]*)*t"s'''s"""sr'''sr"""su'''su"""sb'''sb"""sur'''sur"""sbr'''sbr"""sR'''sR"""sU'''sU"""sB'''sB"""suR'''suR"""sUr'''sUr"""sUR'''sUR"""sbR'''sbR"""sBr'''sBr"""sBR'''sBR"""trtRtutUtbtBsr'sr"sR'sR"su'su"sU'sU"sb'sb"sB'sB"sur'sur"sUr'sUr"suR'suR"sUR'sUR"sbr'sbr"sBr'sBr"sbR'sbR"sBR'sBR"it TokenErrorcBseZRS((t__name__t __module__(((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyRstStopTokenizingcBseZRS((RR(((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyRsc CsA|\}}|\}}d||||t|t|fGHdS(Ns%d,%d-%d,%d: %s %s(ttok_nametrepr( ttypeRtstarttendtlinetsrowtscolterowtecol((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyt printtokens  cCs)yt||Wntk r$nXdS(s: The tokenize() function accepts two parameters: one representing the input stream, and one providing an output mechanism for tokenize(). The first parameter, readline, must be a callable object which provides the same interface as the readline() method of built-in file objects. Each call to the function should return one line of input as a string. The second parameter, tokeneater, must also be a callable object. It is called once for each token, with five arguments, corresponding to the tuples generated by generate_tokens(). N(t tokenize_loopR(treadlinet tokeneater((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyRs  cCs%xt|D]}||q WdS(N(R(R+R,t token_info((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyR*st UntokenizercBs,eZdZdZdZdZRS(cCsg|_d|_d|_dS(Nii(ttokenstprev_rowtprev_col(tself((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyt__init__s  cCs:|\}}||j}|r6|jjd|ndS(Nt (R1R/tappend(R2R"trowtcolt col_offset((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pytadd_whitespaces  cCsx|D]}t|dkr3|j||Pn|\}}}}}|j||jj||\|_|_|ttfkr|jd7_d|_qqWdj |jS(NiiiR( tlentcompatR9R/R5R0R1tNEWLINEtNLR (R2titerablettttok_typeRR"R#R$((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyRs  c Cs%t}g}|jj}|\}}|ttfkrC|d7}n|ttfkr^t}nx|D]}|d \}}|ttfkr|d7}n|tkr|j|qenZ|t kr|j qen>|ttfkrt}n#|r|r||dt}n||qeWdS(NR4ii( tFalseR/R5tNAMEtNUMBERR<R=tTruetINDENTtDEDENTtpop( R2RR>t startlinetindentst toks_appendttoknumttokvalttok((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyR;s0             (RRR3R9RR;(((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyR.s   s&^[ \t\f]*#.*?coding[:=][ \t]*([-\w.]+)s^[ \t\f]*(?:[#\r\n]|$)cCs^|d jjdd}|dks7|jdr;dS|d ksV|jd rZdS|S(s(Imitates get_normal_name in tokenizer.c.i Rt-sutf-8sutf-8-slatin-1s iso-8859-1s iso-latin-1slatin-1-s iso-8859-1-s iso-latin-1-(slatin-1s iso-8859-1s iso-latin-1(slatin-1-s iso-8859-1-s iso-latin-1-(tlowertreplacet startswith(torig_enctenc((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyt_get_normal_names cstd}d}fd}fd}|}|jtrat|d}d}n|sq|gfS||}|r||gfStj|s||gfS|}|s||gfS||}|r|||gfS|||gfS(s The detect_encoding() function is used to detect the encoding that should be used to decode a Python source file. It requires one argument, readline, in the same way as the tokenize() generator. It will call readline a maximum of twice, and return the encoding used (as a string) and a list of any lines (left as bytes) it has read in. It detects the encoding from the presence of a utf-8 bom or an encoding cookie as specified in pep-0263. If both a bom and a cookie are present, but disagree, a SyntaxError will be raised. If the encoding cookie is an invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, 'utf-8-sig' is returned. If no encoding is specified, then the default of 'utf-8' will be returned. sutf-8cs'y SWntk r"tSXdS(N(t StopIterationtbytes((R+(s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyt read_or_stops  csy|jd}Wntk r'dSXtj|}|sAdSt|jd}yt|}Wn!tk rt d|nXr|j dkrt dn|d7}n|S(Ntasciiisunknown encoding: sutf-8sencoding problem: utf-8s-sig( tdecodetUnicodeDecodeErrortNonet cookie_retmatchRTR Rt LookupErrort SyntaxErrortname(R$t line_stringR]tencodingtcodec(t bom_found(s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyt find_cookies"   is utf-8-sigN(RAR[RQRRDtblank_reR](R+RbtdefaultRWRetfirsttsecond((RdR+s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pytdetect_encodings0          cCst}|j|S(sTransform tokens back into Python source code. Each element returned by the iterable must be a token sequence with at least two elements, a token number and token value. If only two tokens are passed, the resulting output is poor. Round-trip invariant for full input: Untokenized source will match input source exactly Round-trip invariant for limited intput: # Output text will tokenize the back to the input t1 = [tok[:2] for tok in generate_tokens(f.readline)] newcode = untokenize(t1) readline = iter(newcode.splitlines(1)).next t2 = [tok[:2] for tokin generate_tokens(readline)] assert t1 == t2 (R.R(R>tut((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyRFs ccs@d}}}tjdd}}d\}}d}dg} xy |} Wntk rfd} nX|d}dt| } } |r{| std| fn|j| }|r|jd} }t|| | | ||f|| fVd\}}d}q|ra| ddkra| d d krat || | |t| f|fVd}d}q@q|| }|| }q@n`|dkr| r| sPnd}xv| | kr| | d kr|d}n?| | d kr|t dt }n| | d krd}nP| d} qW| | kr'Pn| | dkr| | dkr| | j d}| t|}t ||| f|| t|f| fVt | |||f|t| f| fVq@t t f| | dk| | || f|t| f| fVq@n|| dkrI| j|t| | |df|| f| fVnx|| dkr|| krtdd|| | fn| d } td|| f|| f| fVqLWn$| std|dffnd}x| | krtj| | }|r|jd\}}||f||f|}}} | ||!| |}}||kss|dkr|dkrt|||| fVq|dkrt}|dkrt }n||||| fVq|dkrt |||| fVq|tkrrt|}|j| | }|rR|jd} | || !}t|||| f| fVq||f} | |}| }Pq|tks|d tks|d tkr|ddkr||f} t|pt|dpt|d}| |d}}| }Pqt|||| fVq||kr5t|||| fVq|dkrdt |||| f| fVd}q|dkr}|d}n|dkr|d}nt|||| fVqt | | || f|| df| fV| d} qWq@Wx2| dD]&}td|df|dfdfVqWtd|df|dfdfVdS(sT The generate_tokens() generator requires one argument, readline, which must be a callable object which provides the same interface as the readline() method of built-in file objects. Each call to the function should return one line of input as a string. Alternately, readline can be a callable function terminating with StopIteration: readline = open(myfile).next # Example of alternate readline The generator produces 5-tuples with these members: the token type; the token string; a 2-tuple (srow, scol) of ints specifying the row and column where the token begins in the source; a 2-tuple (erow, ecol) of ints specifying the row and column where the token ends in the source; and the line on which the token was found. The line passed is the logical line; continuation lines are included. iRt 0123456789RisEOF in multi-line stringis\ is\ R4s s s# t#s is3unindent does not match any outer indentation levels sEOF in multi-line statementt.iis s\s([{s)]}N(Ri(Ri(tstringt ascii_lettersR[RUR:RR]R#tSTRINGt ERRORTOKENttabsizetrstriptCOMMENTR=R5REtIndentationErrorRFt pseudoprogtspanRCR<t triple_quotedtendprogst single_quotedRBtOPt ENDMARKER(R+tlnumtparenlevt continuedt namecharstnumcharstcontstrtneedconttcontlineRIR$tpostmaxtstrstarttendprogtendmatchR#tcolumnt comment_tokentnl_post pseudomatchR"tsposteposRtinitialtnewlinetindent((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyR[s        &      $ #  '  '                   $t__main__(s'''s"""sr'''sr"""sR'''sR"""su'''su"""sU'''sU"""sb'''sb"""sB'''sB"""sur'''sur"""sUr'''sUr"""suR'''suR"""sUR'''sUR"""sbr'''sbr"""sBr'''sBr"""sbR'''sbR"""sBR'''sBR"""(RRsr'sr"sR'sR"su'su"sU'sU"sb'sb"sB'sB"sur'sur"sUr'sUr"suR'suR"sUR'sUR"sbr'sbr"sBr'sBr"sbR'sbR"sBR'sBR"((Rt__doc__t __author__t __credits__RotretcodecsRRtlib2to3.pgen2.tokenRRtdirtxt__all__RVt NameErrortstrR RRt WhitespacetCommenttIgnoretNamet Binnumbert Hexnumbert Octnumbert Decnumbert IntnumbertExponentt PointfloattExpfloatt Floatnumbert ImagnumbertNumbertSingletDoubletSingle3tDouble3tTripletStringtOperatortBrackettSpecialtFunnyt PlainTokentTokentContStrt PseudoExtrast PseudoTokentmaptcompilet tokenprogRwt single3progt double3progR[RzRyR?R{Rst ExceptionRRR)RR*R.R\RfRTRjRRRtsysR:targvtopenR+tstdin(((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyts /           '#     8 I   PKw 4]fuKBKB tokenize.pycnu[ {fc@sdZdZdZddlZddlZddlmZmZddlTddl m Z ge e D]Z e d d krge ^qgd d d gZ [ yeWnek reZnXdZdZdZdZdZeedeeeZdZdZdZdZdZeeeeeZdZeddeeZdeZeeeZ ede dZ!ee!e eZ"dZ#d Z$d!Z%d"Z&ed#d$Z'ed%d&Z(ed'd(d)d*d+d,d-d.d/ Z)d0Z*ed1d2Z+ee)e*e+Z,ee"e,e(eZ-ee-Z.ed3ed4dd5ed6dZ/edee'Z0eee0e"e,e/eZ1e2ej3e.e1e%e&f\Z4Z5Z6Z7i&ej3e#d46ej3e$d66e6d76e7d86e6d96e7d:6e6d;6e7d<6e6d=6e7d>6e6d?6e7d@6e6dA6e7dB6e6dC6e7dD6e6dE6e7dF6e6dG6e7dH6e6dI6e7dJ6e6dK6e7dL6e6dM6e7dN6e6dO6e7dP6e6dQ6e7dR6e6dS6e7dT6ddU6ddV6ddW6ddX6ddY6ddZ6Z9iZ:xdD]Z;e;e:e;fdyYZ?dze>fd{YZ@d|ZAeAd}ZBd~ZCdddYZDej3dZEej3dZFdZGdZHdZIdZJeKdkrddlLZLeMeLjNdkreBeOeLjNdjPqeBeLjQjPndS(sTokenization help for Python programs. generate_tokens(readline) is a generator that breaks a stream of text into Python tokens. It accepts a readline-like method which is called repeatedly to get the next line of input (or "" for EOF). It generates 5-tuples with these members: the token type (see token.py) the token (a string) the starting (row, column) indices of the token (a 2-tuple of ints) the ending (row, column) indices of the token (a 2-tuple of ints) the original line (string) It is designed to match the working of the Python tokenizer exactly, except that it produces COMMENT tokens for comments and gives type OP for all operators Older entry points tokenize_loop(readline, tokeneater) tokenize(readline, tokeneater=printtoken) are the same, except instead of generating tokens, tokeneater is a callback function to which the 5 fields described above are passed as 5 arguments, each time a new token is found.sKa-Ping Yee s@GvR, ESR, Tim Peters, Thomas Wouters, Fred Drake, Skip MontanaroiN(tBOM_UTF8tlookup(t*i(ttokenit_ttokenizetgenerate_tokenst untokenizecGsddj|dS(Nt(t|t)(tjoin(tchoices((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pytgroup0tcGst|dS(NR(R (R ((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pytany1RcGst|dS(Nt?(R (R ((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pytmaybe2Rs[ \f\t]*s #[^\r\n]*s\\\r?\ns [a-zA-Z_]\w*s 0[bB][01]*s0[xX][\da-fA-F]*[lL]?s0[oO]?[0-7]*[lL]?s [1-9]\d*[lL]?s [eE][-+]?\d+s\d+\.\d*s\.\d+s\d+s\d+[jJ]s[jJ]s[^'\\]*(?:\\.[^'\\]*)*'s[^"\\]*(?:\\.[^"\\]*)*"s%[^'\\]*(?:(?:\\.|'(?!''))[^'\\]*)*'''s%[^"\\]*(?:(?:\\.|"(?!""))[^"\\]*)*"""s[ubUB]?[rR]?'''s[ubUB]?[rR]?"""s&[uU]?[rR]?'[^\n'\\]*(?:\\.[^\n'\\]*)*'s&[uU]?[rR]?"[^\n"\\]*(?:\\.[^\n"\\]*)*"s\*\*=?s>>=?s<<=?s<>s!=s//=?s->s[+\-*/%&@|^=<>]=?t~s[][(){}]s\r?\ns[:;.,`@]s'[uUbB]?[rR]?'[^\n'\\]*(?:\\.[^\n'\\]*)*t's'[uUbB]?[rR]?"[^\n"\\]*(?:\\.[^\n"\\]*)*t"s'''s"""sr'''sr"""su'''su"""sb'''sb"""sur'''sur"""sbr'''sbr"""sR'''sR"""sU'''sU"""sB'''sB"""suR'''suR"""sUr'''sUr"""sUR'''sUR"""sbR'''sbR"""sBr'''sBr"""sBR'''sBR"""trtRtutUtbtBsr'sr"sR'sR"su'su"sU'sU"sb'sb"sB'sB"sur'sur"sUr'sUr"suR'suR"sUR'sUR"sbr'sbr"sBr'sBr"sbR'sbR"sBR'sBR"it TokenErrorcBseZRS((t__name__t __module__(((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyRstStopTokenizingcBseZRS((RR(((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyRsc CsA|\}}|\}}d||||t|t|fGHdS(Ns%d,%d-%d,%d: %s %s(ttok_nametrepr( ttypeRtstarttendtlinetsrowtscolterowtecol((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyt printtokens  cCs)yt||Wntk r$nXdS(s: The tokenize() function accepts two parameters: one representing the input stream, and one providing an output mechanism for tokenize(). The first parameter, readline, must be a callable object which provides the same interface as the readline() method of built-in file objects. Each call to the function should return one line of input as a string. The second parameter, tokeneater, must also be a callable object. It is called once for each token, with five arguments, corresponding to the tuples generated by generate_tokens(). N(t tokenize_loopR(treadlinet tokeneater((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyRs  cCs%xt|D]}||q WdS(N(R(R+R,t token_info((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyR*st UntokenizercBs,eZdZdZdZdZRS(cCsg|_d|_d|_dS(Nii(ttokenstprev_rowtprev_col(tself((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyt__init__s  cCsO|\}}||jks!t||j}|rK|jjd|ndS(Nt (R0tAssertionErrorR1R/tappend(R2R"trowtcolt col_offset((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pytadd_whitespaces   cCsx|D]}t|dkr3|j||Pn|\}}}}}|j||jj||\|_|_|ttfkr|jd7_d|_qqWdj |jS(NiiiR( tlentcompatR:R/R6R0R1tNEWLINEtNLR (R2titerablettttok_typeRR"R#R$((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyRs  c Cs%t}g}|jj}|\}}|ttfkrC|d7}n|ttfkr^t}nx|D]}|d \}}|ttfkr|d7}n|tkr|j|qenZ|t kr|j qen>|ttfkrt}n#|r|r||dt}n||qeWdS(NR4ii( tFalseR/R6tNAMEtNUMBERR=R>tTruetINDENTtDEDENTtpop( R2RR?t startlinetindentst toks_appendttoknumttokvalttok((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyR<s0             (RRR3R:RR<(((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyR.s   s&^[ \t\f]*#.*?coding[:=][ \t]*([-\w.]+)s^[ \t\f]*(?:[#\r\n]|$)cCs^|d jjdd}|dks7|jdr;dS|d ksV|jd rZdS|S(s(Imitates get_normal_name in tokenizer.c.i Rt-sutf-8sutf-8-slatin-1s iso-8859-1s iso-latin-1slatin-1-s iso-8859-1-s iso-latin-1-(slatin-1s iso-8859-1s iso-latin-1(slatin-1-s iso-8859-1-s iso-latin-1-(tlowertreplacet startswith(torig_enctenc((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyt_get_normal_names cstd}d}fd}fd}|}|jtrat|d}d}n|sq|gfS||}|r||gfStj|s||gfS|}|s||gfS||}|r|||gfS|||gfS(s The detect_encoding() function is used to detect the encoding that should be used to decode a Python source file. It requires one argument, readline, in the same way as the tokenize() generator. It will call readline a maximum of twice, and return the encoding used (as a string) and a list of any lines (left as bytes) it has read in. It detects the encoding from the presence of a utf-8 bom or an encoding cookie as specified in pep-0263. If both a bom and a cookie are present, but disagree, a SyntaxError will be raised. If the encoding cookie is an invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, 'utf-8-sig' is returned. If no encoding is specified, then the default of 'utf-8' will be returned. sutf-8cs'y SWntk r"tSXdS(N(t StopIterationtbytes((R+(s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyt read_or_stops  csy|jd}Wntk r'dSXtj|}|sAdSt|jd}yt|}Wn!tk rt d|nXr|j dkrt dn|d7}n|S(Ntasciiisunknown encoding: sutf-8sencoding problem: utf-8s-sig( tdecodetUnicodeDecodeErrortNonet cookie_retmatchRUR Rt LookupErrort SyntaxErrortname(R$t line_stringR^tencodingtcodec(t bom_found(s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyt find_cookies"   is utf-8-sigN(RBR\RRRREtblank_reR^(R+RctdefaultRXRftfirsttsecond((ReR+s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pytdetect_encodings0          cCst}|j|S(sTransform tokens back into Python source code. Each element returned by the iterable must be a token sequence with at least two elements, a token number and token value. If only two tokens are passed, the resulting output is poor. Round-trip invariant for full input: Untokenized source will match input source exactly Round-trip invariant for limited intput: # Output text will tokenize the back to the input t1 = [tok[:2] for tok in generate_tokens(f.readline)] newcode = untokenize(t1) readline = iter(newcode.splitlines(1)).next t2 = [tok[:2] for tokin generate_tokens(readline)] assert t1 == t2 (R.R(R?tut((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyRFs ccsVd}}}tjdd}}d\}}d}dg} xy |} Wntk rfd} nX|d}dt| } } |r{| std| fn|j| }|r|jd} }t|| | | ||f|| fVd\}}d}q|ra| ddkra| d d krat || | |t| f|fVd}d}q@q|| }|| }q@n`|dkr| r| sPnd}xv| | kr| | d kr|d}n?| | d kr|t dt }n| | d krd}nP| d} qW| | kr'Pn| | dkr| | dkr| | j d}| t|}t ||| f|| t|f| fVt | |||f|t| f| fVq@t t f| | dk| | || f|t| f| fVq@n|| dkrI| j|t| | |df|| f| fVnx|| dkr|| krtdd|| | fn| d } td|| f|| f| fVqLWn$| std|dffnd}x| | krtj| | }|r|jd\}}||f||f|}}} | ||!| |}}||kss|dkr|dkrt|||| fVq|dkrt}|dkrt }n||||| fVq|dkr|jd stt |||| fVq|tkrt|}|j| | }|rh|jd} | || !}t|||| f| fVq||f} | |}| }Pq|tks|d tks|d tkr(|ddkr||f} t|pt|dpt|d}| |d}}| }Pqt|||| fVq||krKt|||| fVq|dkrzt |||| f| fVd}q|dkr|d}n|dkr|d}nt|||| fVqt | | || f|| df| fV| d} qWq@Wx2| dD]&}td|df|dfdfVqWtd|df|dfdfVdS(sT The generate_tokens() generator requires one argument, readline, which must be a callable object which provides the same interface as the readline() method of built-in file objects. Each call to the function should return one line of input as a string. Alternately, readline can be a callable function terminating with StopIteration: readline = open(myfile).next # Example of alternate readline The generator produces 5-tuples with these members: the token type; the token string; a 2-tuple (srow, scol) of ints specifying the row and column where the token begins in the source; a 2-tuple (erow, ecol) of ints specifying the row and column where the token ends in the source; and the line on which the token was found. The line passed is the logical line; continuation lines are included. iRt 0123456789RisEOF in multi-line stringis\ is\ R4s s s# t#s is3unindent does not match any outer indentation levels sEOF in multi-line statementt.s iis\s([{s)]}N(Ri(Ri(tstringt ascii_lettersR\RVR;RR^R#tSTRINGt ERRORTOKENttabsizetrstriptCOMMENTR>R6RFtIndentationErrorRGt pseudoprogtspanRDR=tendswithR5t triple_quotedtendprogst single_quotedRCtOPt ENDMARKER(R+tlnumtparenlevt continuedt namecharstnumcharstcontstrtneedconttcontlineRJR$tpostmaxtstrstarttendprogtendmatchR#tcolumnt comment_tokentnl_post pseudomatchR"tsposteposRtinitialtnewlinetindent((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyR[s        &      $ #  '  '                   $t__main__(s'''s"""sr'''sr"""sR'''sR"""su'''su"""sU'''sU"""sb'''sb"""sB'''sB"""sur'''sur"""sUr'''sUr"""suR'''suR"""sUR'''sUR"""sbr'''sbr"""sBr'''sBr"""sbR'''sbR"""sBR'''sBR"""(RRsr'sr"sR'sR"su'su"sU'sU"sb'sb"sB'sB"sur'sur"sUr'sUr"suR'suR"sUR'sUR"sbr'sbr"sBr'sBr"sbR'sbR"sBR'sBR"((Rt__doc__t __author__t __credits__RptretcodecsRRtlib2to3.pgen2.tokenRRtdirtxt__all__RWt NameErrortstrR RRt WhitespacetCommenttIgnoretNamet Binnumbert Hexnumbert Octnumbert Decnumbert IntnumbertExponentt PointfloattExpfloatt Floatnumbert ImagnumbertNumbertSingletDoubletSingle3tDouble3tTripletStringtOperatortBrackettSpecialtFunnyt PlainTokentTokentContStrt PseudoExtrast PseudoTokentmaptcompilet tokenprogRxt single3progt double3progR\R|R{R@R}Rtt ExceptionRRR)RR*R.R]RgRURkRRRtsysR;targvtopenR+tstdin(((s./usr/lib64/python2.7/lib2to3/pgen2/tokenize.pyts /           '#     8 I   PKb31]LDNN literals.pynu[PKb31]8BB)__pycache__/literals.cpython-36.opt-1.pycnu[PKb31]E $ __pycache__/parse.cpython-36.pycnu[PKb31](-%__pycache__/grammar.cpython-36.opt-1.pycnu[PKb31]!>'A__pycache__/driver.cpython-36.opt-1.pycnu[PKb31]()EU__pycache__/__init__.cpython-36.opt-1.pycnu[PKb31]S<<&=V__pycache__/token.cpython-36.opt-1.pycnu[PKb31]*u$u$%]__pycache__/pgen.cpython-36.opt-1.pycnu[PKb31].9&9&__pycache__/pgen.cpython-36.pycnu[PKb31]mS'!__pycache__/driver.cpython-36.opt-2.pycnu[PKb31]qM (;__pycache__/grammar.cpython-36.opt-2.pycnu[PKb31] PP%>__pycache__/conv.cpython-36.opt-2.pycnu[PKb31]   &__pycache__/parse.cpython-36.opt-2.pycnu[PKb31]&w,w,)?__pycache__/tokenize.cpython-36.opt-2.pycnu[PKb31]v];;)__pycache__/tokenize.cpython-36.opt-1.pycnu[PKb31]_Ϩ  &:J__pycache__/token.cpython-36.opt-2.pycnu[PKb31]S<< Q__pycache__/token.cpython-36.pycnu[PKb31]5f&&Y__pycache__/parse.cpython-36.opt-1.pycnu[PKb31]z)r__pycache__/__init__.cpython-36.opt-2.pycnu[PKb31]1#r__pycache__/literals.cpython-36.pycnu[PKb31]*u$u$%Dy__pycache__/pgen.cpython-36.opt-2.pycnu[PKb31]6!%__pycache__/conv.cpython-36.opt-1.pycnu[PKb31]&{)g__pycache__/literals.cpython-36.opt-2.pycnu[PKb31]Fxx__pycache__/conv.cpython-36.pycnu[PKb31]"|__pycache__/grammar.cpython-36.pycnu[PKb31](#___pycache__/__init__.cpython-36.pycnu[PKb31][-!Q__pycache__/driver.cpython-36.pycnu[PKb31]Սp<<#__pycache__/tokenize.cpython-36.pycnu[PKb31]sWPuuEparse.pynu[PKb31]" dgrammar.pynu[PKb31]%%~conv.pynu[PKb31]token.pynuȯPKhP3]N 3  $C__pycache__/literals.cpython-311.pycnu[PKhP3]ђkJkJ&TP__pycache__/pgen.cpython-311.opt-1.pycnu[PKhP3]\pgen.pyonu[PKw 4]?? kdriver.pycnu[PKw 4]( $token.pyonu[PKw 4]ʼn\conv.pycnu[PKw 4]K% __init__.pycnu[PKw 4]U  {grammar.pycnu[PKw 4]A'He parse.pyonu[PKw 4]6pDD parse.pycnu[PKw 4]K% __init__.pyonu[PKw 4]( wtoken.pycnu[PKw 4]U  grammar.pyonu[PKw 4]fwc}}.conv.pyonu[PKw 4]  Jliterals.pycnu[PKw 4]ф Rdriver.pyonu[PKw 4]>FAA ktokenize.pyonu[PKw 4]fuKBKB )tokenize.pycnu[PKQQ7