
                             S r SSKJr  SSKJr  SSKJr  SSKrSSKJr   " S S\R                  5      r	 " S	 S
5      r
 " S S5      rS rg)z/Provides ddl preprocessing for the Spanner ddl.    )absolute_import)division)unicode_literalsN)
exceptionsc                       \ rS rSrSrg)DDLSyntaxError    N)__name__
__module____qualname____firstlineno____static_attributes__r
       4lib/googlecloudsdk/command_lib/spanner/ddl_parser.pyr   r      s    r   r   c                   `    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rSrg)	DDLParser   aF  Parser for splitting ddl statements preserving GoogleSQL strings literals.

DDLParse has a list of modes. If any mode is selected, control is given to the
mode. If no mode is selected, the parser trys to enter the first mode that
could it could enter. The parser handles splitting statements upon ';'.

During parsing, a DDL has the following parts:
  * parts that has been processed: emitted or skipped.
  * followed by a buffer that has been matched by the current mode, which
    could be emitted or skipped by a mode. The start index of which is
    mode_start_index_.
  * followed by the next character indexed by next_index_, which could direct
    the parser to enter or exit a mode.
  * followed by the unprocessed character.

DDLParser:
  * acts as a default mode.
  * provides utilities uesd by ParserMode to drive the parsing.
c                    Xl         SU l        S U l        SU l        U R	                  SSS/5      U R                  SS/SS/5      U R                  SS/S	S/5      U R                  S
S
/SS/5      U R                  SS/S	S/5      U R                  SS/SS/5      /U l        / U l        U R                  5         [        R                  " S5      U l        g )Nr   z--
z"""z\"z\\z'''z\'"'`z\`SpannerDDLParser)ddl_next_index_mode_mode_start_index_SkippingModePreservingModemodes_statements_StartNewStatementlogging	getLoggerlogger_)selfddls     r   __init__DDLParser.__init__3   s    IDDJD 	$t-
 	EE7UFO< 	EE7UFO<C#8C#8C#8DK$ D$$%78DLr   c                     [        XUS S5      $ )NTDDLParserMode)r(   	enter_seq	exit_seqss      r   r    DDLParser.SkippingModeS   s    )T4@@r   c                     [        XX#S5      $ )NFr-   )r(   r/   r0   escape_sequencess       r   r!   DDLParser.PreservingModeV   s    )uMMr   c                 F    U R                   [        U R                  5      :H  $ N)r   lenr   r(   s    r   IsEofDDLParser.IsEofY   s    s499~--r   c                 .    U =R                   U-  sl         g r6   )r   )r(   ls     r   AdvanceDDLParser.Advance\   s    r   c                 \    / U l         U R                  R                  U R                   5        g r6   )
ddl_parts_r#   appendr8   s    r   r$   DDLParser.StartNewStatement_   s!    DODOO,r   c                 $   U R                   U R                  :  a  g U R                  R                  U R                  U R                   U R                   5        U R                  5         U R                  R                  SU R                  S   5        g )Nzemitted: %s)r   r   r@   rA   r   
SkipBufferr'   debugr8   s    r   
EmitBufferDDLParser.EmitBufferc   sl    !1!11OO		$(()9)9:<OOLL}doob&9:r   c                 &    U R                   U l        g r6   )r   r   r8   s    r   rE   DDLParser.SkipBufferl   s    !--Dr   c                 r    U R                   R                  SUR                  U R                  5        Xl        g )Nzenter mode: %s at index: %d)r'   rF   
enter_seq_r   r   )r(   modes     r   	EnterModeDDLParser.EnterModeo   s+    LL4(8(8:Jr   c                     U R                   R                  SU R                  R                  U R                  5        S U l        g )Nzexit mode: %s at index: %d)r'   rF   r   rL   r   r8   s    r   ExitModeDDLParser.ExitModet   s4    LL3zz,,d.>.>@DJr   c                 R    U R                   U R                  S  R                  U5      $ r6   )r   r   
startswithr(   ss     r   
StartsWithDDLParser.StartsWithy   s%    99T%%&'22155r   c                 L   U R                  5       (       Gd  U R                  (       a  U R                  R                  5         MC  U R                  U R                     S:X  aH  U R                  5         U R                  5         U =R                  S-  sl        U R                  S5        M  U R                   H+  nUR                  5       (       d  M  U R                  U5          O   U R                  (       d  U R                  S5        U R                  5       (       d  GM  U R                  bg  U R                  nUR                  (       d/  [        SUR                  U R                  U R                  4-  5      eU R                  R                  5         OU R                  5         U R                   R#                  SU R$                  5        U R$                   Vs/ s H  o"(       d  M  SR'                  U5      PM     nnU(       a  US   R)                  5       (       a  USS $ U$ s  snf )zProcess the DDL.;   Nz"Unclosed %s start at index: %d, %szddls: %s rD   )r9   r   Processr   r   rG   r$   r   r=   r"   TryEnterrN   is_to_skip_r   rL   Exitr'   rF   r#   joinisspace)r(   mfragsress       r   r]   DDLParser.Process|   s   jjll	

	4##	$	+ !#Q{{!::<<
..

 
 ZZQ' jjll, zz
**a]]0\\411499=>? 	? jjoo
ooLLz4#3#34'+'7'7
A'7e5>2775>'7C
A
s2w  "XoJ	 Bs   
H!$H!)r   r@   r'   r   r   r"   r   r#   N)r   r   r   r   __doc__r*   r    r!   r9   r=   r$   rG   rE   rN   rQ   rW   r]   r   r
   r   r   r   r      sF    (9@AN.-;.

6&r   r   c                   6    \ rS rSrSrS rS rS rS rS r	Sr
g	)
r.      zA mode in DDLParser.

A mode has one entering sequence, a list of exit sequences and one escape
sequence. A mode could be:
  * skipping (e.x. comments), which skips the matched text.
  * non-skpping, (e.x. strings), which emits the matched text.
c                 @    Xl         X l        X0l        X@l        XPl        g r6   )parser_rL   
exit_seqs_escape_sequences_r_   )r(   parserr/   r0   r3   
is_to_skips         r   r*   DDLParserMode.__init__   s    LOO-!r   c                     U R                   R                  U R                  5      nU(       aH  U R                   R                  5         U R                   R	                  [        U R                  5      5        U$ )zTrys to enter into the mode.)rk   rW   rL   rG   r=   r7   )r(   re   s     r   r^   DDLParserMode.TryEnter   sM    
,,
!
!$//
2C

ll
ll3t/0Jr   c                     U R                   (       a  U R                  R                  5         OU R                  R                  5         U R                  R	                  5         g r6   )r_   rk   rE   rG   rQ   r8   s    r   r`   DDLParserMode.Exit   s;    
ll
llLLr   c                 r    U R                    H'  nU R                  R                  U5      (       d  M%  Us  $    g)zFinds a matching exit sequence.N)rl   rk   rW   rU   s     r   FindExitSeqenceDDLParserMode.FindExitSeqence   s/    __		 	 	#	#  r   c                    U R                   (       ac  U R                    HS  nU R                  R                  U5      (       d  M%  U R                  R                  [	        U R                   5      5          g   U R                  5       nU(       d  U R                  R                  S5        gU R                  (       d$  U R                  R                  [	        U5      5        U R                  5         g)z,Process the ddl at the current parser index.Nr[   )rm   rk   rW   r=   r7   rv   r_   r`   )r(   seqexit_seqs      r   r]   DDLParserMode.Process   s     ''#<<""3''
,,

s4#9#9:
;
 (
 ##%H
ll1 
ll3x=)IIKr   )rL   rm   rl   r_   rk   N)r   r   r   r   rg   r*   r^   r`   rv   r]   r   r
   r   r   r.   r.      s     "r   r.   c                 4    [        U 5      R                  5       $ r6   )r   r]   )ddl_texts    r   PreprocessDDLWithParserr~      s    	8		$	$	&&r   )rg   
__future__r   r   r   r%   googlecloudsdk.corer   Errorr   r   r.   r~   r
   r   r   <module>r      sH    6 &  '  *Z%% D DN8 8v'r   