
    Je                        d Z ddlZddlZddlmZmZmZ ddlmZ ddl	m
c mc mZ  ej                  e      ZdZ e e ej&                          ej(                                     Z ee      \  ZZZZej2                  ddej2                  ddej2                  ddej2                  ddej2                  ddej2                  ddej2                  dddddej4                  d	d
ej6                  d	d
ej8                  ej:                  d	dej<                  d	ddZdhddhdhddhh dddhdhddhdhd	Z d Z!d Z"y)z-LL(1) parse routine for our snippets grammar.    N)tokenizetoken_regexToken)create_LL1_parsing_tableSTART)starting_ruleT)defaultargsF)SNIPPETr
   )
INTSNIPPET
VARSNIPPETr
   )r   r
   )TEXTTEXT_SNIPPETSTEXT_NO_COLTEXT_COL
TEXT_REGEXTEXT_FORMATEXPRLISTr   r   r   	COLONBODYPIPEBODYdollar
left_curlyright_curlycolon>   pipecommar   slashr   )	r   r   r   r   r   	REGEXBODY
FORMATEXPR
FORMATBODYTEXTSEQc                 2   |}|}|}	| t         v rt         |    }
d}|\  }}||
v r|
|   }n%d|
v r|
d   }nt        dj                  | |            | |f}|
d   r:|j                  d|       |j                  d|       |j                  d|       g }g }	|||	|||fS )z)Decide if a new AST node must be created.Nr	   z)Cannot transition to context {0} from {1}r
   r   )CONTEXT_SWITCHER
ValueErrorformatinsert)current_rulecurrent_ctxcurrent_argscurrent_prefixcontext_stack
args_stackprefix_stacknew_ctxnew_args
new_prefixrule_switchNodecurrent_ctx_name_s                 ;/usr/lib/python3/dist-packages/spyder/utils/snippets/ast.pyswitch_contextr6   ^   s     GHJ''&|4)!{*/0D+%y)D 44:F!-/?5AB B  &va.  K0>2HJXz:|5 5    c           	         t        |       }|t        dd      gz  }t        g}t        df}g }t        g}g }g }g }t        |      dkD  r$|d   }	|j	                  d      }
|
t
        v rt        |
   }g }|	j                  |v r||	j                     }nP|	j                  |v r||	j                     }n2t        dj                  t        |j                               |	            |j	                  d       ||z   }t        |
||||||      }|\  }}}}}}||z   }n|	j                  |
k(  r|j	                  d       nX|	j                  |
k(  r|j	                  d       n7t        dj                  t        |	j                        t        |
                  |\  }}d}|t        v r|	j                  t        |   v}|r;t!        j"                  |	j                  |	j                        }|j%                  |       |j	                  d       t        |      dk(  rN|\  }} || }|j	                  d      }|j	                  d      }|j	                  d      }|j%                  |       t        |      dkD  r$t        |      dk(  sJ |d   S )	z>Given a snippet string, return its abstract syntax tree (AST).eofz<eof>Nr   zDSyntax Error: Expected any of the following characters: {0}, got {1}z#Syntax Error: Expected {0}, got {1}T   )r   r   STARTING_RULElenpopGRAMMARPARSE_TABLEtokenvalueSyntaxErrorr%   listkeysr6   reprIGNORE_TERMINALSnodesLeafNodeappend)snippet_texttokensstackr(   r)   r*   r+   r,   r-   
peek_tokenr'   follow_predictionsnext_productionsr.   current_namer4   add_to_argsleafr2   nodes                       r5   build_snippet_astrT   |   s   l#F
uUG$%%FOE $'KL#_NMJL
e*q.AY
yy|7"!,\!:!#55#5j6F6F#G !!%77#5j6F6F#G ! #>>Df&*+=+B+B+D&E&0?&' '
 q!$u,E$\;%3]J%13G 9@6[,J->N </

1!!\1

1!"G"N"N))*D,>#@ A A *OL!K//)///= > ~~j&6&6
8H8HI##D)q!~!#!GAt&D'++A.K%>>!,L)--a0N%i e*q.l |!!!?r7   )#__doc__loggingcodecsspyder.utils.snippets.lexerr   r   r   spyder.utils.snippets.parserr   spyder.utils.snippets.nodesutilssnippetsrG   	getLogger__name__loggerr;   dictzipvaluesrD   INVERSE_TOKEN_TABLEr>   r4   r?   TextNodeTabstopSnippetNodeVariableSnippetNodePlaceholderNodeVariablePlaceholderNode
ChoiceNoder#   rF   r6   rT    r7   r5   <module>rk      s   4   E D A + + 
		8	$31{1135E[5E5E5GHI 5! A{ >>
 >>
 >>
 >>
 >>
 >>
 >>
 
 ++
 ,,
 ++33 &&]3 l z/ /=)0=)*/y
 5<Fr7   