
    Je&                     6    d Z dZd ZedfdZd Zd Zd Zd Zy	)
z
LL(1) predictive parser for snippets CFG grammar.

Aho, Sethi, Ullman
Compilers: Principles, Techniques, and Tools, Addison-Wesley, 1986
a(  
START -> EXPRLIST
EXPRLIST -> EXPR MOREEXPR
MOREEXPR -> EXPR MOREEXPR | EPSILON

EXPR -> SNIPPET | ANY
TEXT_SNIPPETS -> MOREEXPR

TEXT -> ANY MOREANY
MOREANY -> ANY MOREANY | EPSILON

TEXT_NO_COL -> ANY_NO_COL MORE_ANY_NO_COL
MORE_ANY_NO_COL -> ANY_NO_COL MORE_ANY_NO_COL | EPSILON

TEXT_COL -> ANY_COL MORE_COL
MORE_COL -> ANY_COL MORE_COL | EPSILON

TEXT_REGEX -> ANY_REGEX MORE_REGEX
MORE_REGEX -> ANY_REGEX MORE_REGEX | EPSILON

TEXT_FORMAT -> ANY FOLLOW_ANY
FOLLOW_ANY -> ANY FOLLOW_ANY | EPSILON

ANY_REGEX -> ANY | dollar

ANY -> ANY_COL | ,
ANY_COL -> ANY_NO_COL | COLONS
ANY_NO_COL -> name | int | case | SYMBOLS | whitespace | left_curly_name
COLONS -> : | :+ | :- | :?
SYMBOLS ->  \: | \$ | text_pipe | { | \} | \ | \/ | \, | symbol

SNIPPET -> dollar SNIPPETBODY
SNIPPETBODY -> SNIPPETID | INTSNIPPET | VARSNIPPET

INTSNIPPET -> int | { int INTSNIPPETBODY }
INTSNIPPETBODY -> COLONBODY | PIPEBODY | EPSILON
COLONBODY -> : TEXT_SNIPPETS
PIPEBODY -> pipe TEXTSEQ pipe

TEXTSEQ -> TEXT_COL MORETEXT
MORETEXT -> , TEXT_COL MORETEXT | EPSILON

VARSNIPPET -> left_curly_name VARSNIPPETBODY } | name
VARSNIPPETBODY -> COLONBODY | REGEXBODY | EPSILON
REGEXBODY -> / REGEX / FORMATTEXT / OPTIONS

REGEX -> TEXT_REGEX | EPSILON
OPTIONS -> TEXT_REGEX | EPSILON

FORMATTEXT -> FORMAT MOREFORMAT
MOREFORMAT -> FORMAT MOREFORMAT | EPSILON
FORMAT -> FORMATEXPR | TEXT_FORMAT

FORMATTEXT_NO_COL -> FORMAT_NO_COL MOREFORMAT_NO_COL
MOREFORMAT_NO_COL -> FORMAT_NO_COL MOREFORMAT_NO_COL | EPSILON
FORMAT_NO_COL -> FORMATEXPR | TEXT_NO_COL

FORMATEXPR -> dollar FORMATBODY

FORMATBODY -> int | { int FORMATOPTIONS }
FORMATOPTIONS -> CASEOPTS | IFOPTS | IFELSEOPTS | ELSEOPTS | EPSILON

CASEOPTS -> : FORMATTEXT
IFOPTS -> :+ FORMATTEXT
IFELSEOPTS -> :? FORMATTEXT_NO_COL : FORMATTEXT
ELSEOPTS -> PROLOGFUNCT FORMATTEXT
PROLOGFUNCT -> : | :-
c                 h   | j                         j                         }|D cg c]  }|dk7  s	|j                          }}i } |D ]d  }|j                  d      \  }}|j                  d      }g }|D ]1  }|j                         j                         }|j                  |       3 || |<   f | S c c}w )N z -> z | )strip
splitlinessplitappend)grammargrammar_lineslineproduction_namerulesproductionsrule
rule_partss           >/usr/lib/python3/dist-packages/spyder/utils/snippets/parser.py_preprocess_grammarr   W   s    MMO..0M.;JdtrzTZZ\JMJG /!%F!3E" 	+D++-Jz*	+ $/ / N Ks
   
B/B/STARTc           
      >   t        |       } t        |       }i }|D ]-  }t        t        ||   D cg c]  }|d   	 c}            ||<   / t	        | ||      }i }|D ]5  }i ||<   ||   D ]&  \  }}	}
|	dk7  r	|
||   |	<   ||   D ]
  }g ||   |<    ( 7 | |||fS c c}w )z/Create LL(1) parsing table for a given grammar.   EPSILON)r   first_no_epsilonlistsetfollow)r   starting_rulefnefirstr   ifollow_rulesparse_table_sym
production
follow_syms               r   create_LL1_parsing_tabler$   f   s    !'*G
7
#CE ;3c$i8!89:d;'5-8LK 7D"%d) 	7AsJi)3D!#&".t"4 7J46K%j17		77 C{22  9s   Bc                 2    i }| D ]  }t        | ||      } |S )z)Compute FIRST sets for all grammar rules.)r   )r   r   r   s      r   r   r   z   s)    
C (GT3'(J    c                 <   g }||vr| |   D ]  }d}|D ]h  }|| vr|j                  |||f       d} nL|d   }t        | ||      }d}||   D ]%  \  }	}
}	|
dk7  r|j                  ||
|f       !|dz  }' |dk(  sfd} n |su|j                  |d|f        |||<   |S )a  
    Compute FIRST set for a given rule.

    The first set of a sequence of symbols u, written as First(u) is the set
    of terminals which start the sequences of symbols derivable from u.
    A bit more formally, consider all strings derivable from u. If u =>* v,
    where v begins with some terminal, that terminal is in First(u).
    If u =>* epsilon, then epsilon is in First(u).
    TF    r   r   )r   r   )r   r   r   	first_setr   epsilon_foundr"   first_productionnum_epsilonr    r!   s              r   r   r      s     I3"4= 	AK M) 
W,$$dJ%DE$)M (31~$S9C"#K%()9%: -	3)+%,,dC-EF'1,K	-
 #a'(-%&   $	;!?@-	A. D	Jr&   c           	         i }i }dg||<   | D ]Y  }g }| D ]K  }||k(  r	t        | |         D ]2  \  }}	t        |	      D ]  \  }
}||k(  s|j                  |||
f       ! 4 M |||<   [ | D ]  }t        | |||||      } |S )z*Compute FOLLOW sets for all grammar rules.z<eof>)	enumerater   _follow)r   r   r   r   positionrule1rule1_positionrule2r   r   jr"   r   s                r   r   r      s    FH$IF= 	) 	=E~"+GEN"; =;%.{%; =MAz!U*&--uam<==	= )	)  N#tVX}MNMr&   c           	         g }||vs||k(  r||k(  r||   }||   D ]  \  }}}	| |   |   }
|	t        |
      dz
  k  r[|
|	dz      }|| v r=||   D cg c]	  }|dk7  r| }}||z  }d||   v sPt        | |||||      }|||   z  }i|j                  |       {t        | |||||      }|||   z  } t        t	        |            ||<   |S c c}w )aD  
    Compute FOLLOW set for a grammar rule.

    The follow set of a nonterminal A is the set of terminal symbols that can
    appear immediately to the right of A in a valid sentence.
    A bit more formally, for every valid sentence S =>* uAv, where v begins
    with some terminal, and that terminal is in Follow(A).
    r   r   )lenr/   r   r   r   )r   r   r   r   r0   r   rule_followderived_ruler   r4   r"   	next_rulexnext_rule_firsts                 r   r/   r/      s1    K6T]2=  ,K"*4. 	4L!Q .q1J3z?Q&&&q1u-	'25i. ':Q*+y. () ':O ':?2K C	N2!(#|)/="J#vl';;&&y1 #|!'=Bvl33#	4$ C,-tM':s   C	N)__doc__GRAMMARr   r$   r   r   r   r/    r&   r   <module>r?      s9   CL &-G 3($N*!r&   