
    x
hk                         d dl mZmZmZmZ d dlmZ d dlZd dlm	Z	 ddl
mZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!  ejD                   e#d            Z$ G d d	e%      Z&y)
    )absolute_importdivisionprint_functionunicode_literals)OrderedDictN   )Lexer	NullToken)AstAliasAstAnnotationDefAstAnnotationRefAstAnnotationTypeDefAstAttrField
AstExampleAstExampleFieldAstExampleRefAstFieldAstNamespace	AstImportAstRouteDefAstStructDefAstStructPatchAstSubtypeField	AstTagRef
AstTypeRefAstUnionDefAstUnionPatchAstVoidFieldzstone.frontend.parserc                   X   e Zd ZdZej
                  Z ed      Zd^dZd Z	d_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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'd$ Z(d% Z)d& Z*d' Z+d( Z,d) Z-d* Z.d+ Z/d, Z0d- Z1d. Z2d/ Z3d0 Z4d1 Z5d2 Z6d3 Z7d4 Z8d5 Z9d6 Z:d7 Z;d8 Z<d9 Z=d: Z>d; Z?d< Z@d= ZAd> ZBd? ZCd@ ZDdA ZEdB ZFdC ZGdD ZHdE ZIdF ZJdG ZKdH ZLdI ZMdJ ZNdK ZOdL ZPdM ZQdN ZRdO ZSdP ZTdQ ZUdR ZVdS ZWdT ZXdU ZYdV ZZdW Z[dX Z\dY Z]dZ Z^d[ Z_d\ Z`d] Zay)`ParserFactorya  
    After instantiating a ParserFactory, call get_parser() to get an object
    with a parse() method. It so happens that the object is also a
    ParserFactory. The purpose of get_parser() is to reset the internal state
    of the fatory. The details for why these aren't cleanly separated have to
    do with the inability to separate out the yacc.yacc BNF definition parser
    from the class methods that implement the parser handling logic.

    Due to how ply.yacc works, the docstring of each parser method is a BNF
    rule. Comments that would normally be docstrings for each parser rule
    method are kept before the method definition.
    specc                     || _         t        j                  | | j                   | j                         | _        t               | _        g | _        d | _        g | _        d| _        y )N)moduledebugwrite_tablesT)r$   yaccr	   lexererrorspath
anony_defs	exhausted)selfr$   s     Z/var/www/html/lionshead-backend/venv/lib/python3.12/site-packages/stone/frontend/parser.py__init__zParserFactory.__init__;   sL    
IIT$**U	W
 	    c                 0    d| _         g | _        d| _        | S )z
        Returns a ParserFactory with the state reset so it can be used to
        parse again.

        :return: ParserFactory
        NF)r)   r*   r+   r,   s    r-   
get_parserzParserFactory.get_parserH   s     	r/   Nc                 |   | j                   rJ d       || _        | j                  j                  || j                  | j
                        }| j                  j                  ddd   D ].  \  }}| j                  j                  d||| j                  f       0 |j                  | j                         d| _         |S )z
        Args:
            data (str): Raw specification text.
            path (Optional[str]): Path to specification on filesystem. Only
                used to tag tokens with the file they originated from.
        z&Must call get_parser() to reset state.)r'   r$   Nr   T)
r+   r)   r&   parser'   r$   r(   insertextendr*   )r,   datar)   parsed_dataerr_msglinenos         r-   r5   zParserFactory.parseT   s     >>K#KK!	iiood$**DJJoO  $zz0026OGVKKq7FDII">?  74??+r/   c                 :    | j                   j                  |       y N)r'   test)r,   r8   s     r-   test_lexingzParserFactory.test_lexingg   s    

r/   c                     | j                   S )z'Whether the lexer or parser had errors.r(   r1   s    r-   got_errors_parsingz ParserFactory.got_errors_parsingj   s    {{r/   c                      | j                   dd S )z
        If got_errors_parsing() returns True, call this to get the errors.

        Returns:
            list[tuple[msg: str, lineno: int, path: str]]
        NrA   r1   s    r-   
get_errorszParserFactory.get_errorsn   s     {{1~r/   c                     g |d<   y)z!spec : NL
                | emptyr   N r,   ps     r-   p_spec_initzParserFactory.p_spec_initz   s     !r/   c                     |d   g|d<   y)zFspec : namespace
                | import
                | definitionr   r   NrF   rG   s     r-   p_spec_init_declzParserFactory.p_spec_init_decl   s     !v!r/   c                 B    |d   |d<   |d   j                  |d          y)zUspec : spec namespace
                | spec import
                | spec definitionr   r      NappendrG   s     r-   p_spec_iterzParserFactory.p_spec_iter   s%     t!	!AaDr/   c                     |d   |d<   y)zspec : spec NLr   r   NrF   rG   s     r-   p_spec_ignore_newlinez#ParserFactory.p_spec_ignore_newline       t!r/   c                     |d   |d<   y)a  definition : alias
                      | annotation
                      | annotation_type
                      | struct
                      | struct_patch
                      | union
                      | union_patch
                      | router   r   NrF   rG   s     r-   p_definitionzParserFactory.p_definition   s     t!r/   c                     |d   dk(  rSd}t        |      dkD  r|d   }t        | j                  |j                  d      |j	                  d      |d   |      |d<   yt        d      )	zWnamespace : KEYWORD ID NL
                     | KEYWORD ID NL INDENT docsection DEDENTr   	namespaceN      rM   r   zExpected namespace keyword)lenr   r)   r;   lexpos
ValueError)r,   rH   docs      r-   p_namespacezParserFactory.p_namespace   si     Q4;C1vzd		188A;QqT3@AaD 9::r/   c                 |    t        | j                  |j                  d      |j                  d      |d         |d<   y)zimport : IMPORT ID NLr   rM   r   N)r   r)   r;   r[   rG   s     r-   p_importzParserFactory.p_import   .    AHHQK!adC!r/   c                 8   |d   dk(  rt        |      dkD  xr |d   du}t        |      dkD  r|d   nd}t        | j                  |j                  d      |j	                  d      |d   |d   |      |d	<   |r|d	   j                  |d          yyt        d
      )z{alias : KEYWORD ID EQ type_ref NL
                 | KEYWORD ID EQ type_ref NL INDENT annotation_ref_list docsection DEDENTr   alias      N   rM   rX   r   zExpected alias keyword)rZ   r   r)   r;   r[   set_annotationsr\   )r,   rH   has_annotationsr]   s       r-   p_aliaszParserFactory.p_alias   s     Q47?!!fqj=QqT-=Oa&1*!A$$C		188A;QqT1Q4FAaD!$$QqT*  566r/   c                     |d   |d<   y)zNL : NEWLINEr   r   NrF   rG   s     r-   p_nlzParserFactory.p_nl   rS   r/   c                     |d   |d<   y)zNL : NL NEWLINEr   r   NrF   rG   s     r-   p_nl_combinezParserFactory.p_nl_combine   rS   r/   c                     |d   |d<   y)zprimitive : BOOLEAN
                     | FLOAT
                     | INTEGER
                     | NULL
                     | STRINGr   r   NrF   rG   s     r-   p_primitivezParserFactory.p_primitive   s     t!r/   c                     |d   |d<   y)z1pos_arg : primitive
                   | type_refr   r   NrF   rG   s     r-   	p_pos_argzParserFactory.p_pos_arg        t!r/   c                     |d   g|d<   y)zpos_args_list : pos_argr   r   NrF   rG   s     r-   p_pos_args_list_createz$ParserFactory.p_pos_args_list_create       !v!r/   c                 B    |d   |d<   |d   j                  |d          y)z+pos_args_list : pos_args_list COMMA pos_argr   r      NrN   rG   s     r-   p_pos_args_list_extendz$ParserFactory.p_pos_args_list_extend   #    t!	!AaDr/   c                     |d   |d   i|d<   y)z;kw_arg : ID EQ primitive
                  | ID EQ type_refr   rw   r   NrF   rG   s     r-   p_kw_argzParserFactory.p_kw_arg   s     !ad|!r/   c                     |d   |d<   y)zkw_args : kw_argr   r   NrF   rG   s     r-   	p_kw_argszParserFactory.p_kw_args   rS   r/   c                     |d   |d<   |d   D ]F  }||d   v sd|z  }| j                   j                  ||j                  d      | j                  f       H |d   j	                  |d          y)zkw_args : kw_args COMMA kw_argr   r   rw   z-Keyword argument '%s' defined more than once.rM   N)r(   rO   r;   r)   update)r,   rH   keymsgs       r-   p_kw_args_updatezParserFactory.p_kw_args_update   sm    t!Q4Cad{EK""C!dii#@A  	
!AaDr/   c                     t        |      dkD  r?|d   dk(  r|d   |d   f|d<   yt        |d   t              rg |d   f|d<   y|d   i f|d<   yg i f|d<   y)zargs : LPAR pos_args_list COMMA kw_args RPAR
                | LPAR pos_args_list RPAR
                | LPAR kw_args RPAR
                | LPAR RPAR
                | emptyrw   ,rM   rX   r   N)rZ   
isinstancedictrG   s     r-   p_argszParserFactory.p_args  sl     q6A:ts{!ad|!AaD$'AaDz!!bz!8AaDr/   c                     |d   dk(  |d<   y)z(nullable : Q
                    | emptyr   ?r   NrF   rG   s     r-   p_field_nullablezParserFactory.p_field_nullable  s     ts{!r/   c           	          t        | j                  |j                  d      |j                  d      |d   |d   |d   d      |d<   y)ztype_ref : ID args nullabler   rM   rw   Nr)   r;   r[   nameargsnullablensr   r   r)   r;   r[   rG   s     r-   
p_type_refzParserFactory.p_type_ref  sE    88A;88A;11qT
!r/   c           
          t        | j                  |j                  d      |j                  d      |d   |d   |d   |d         |d<   y)z"type_ref : ID DOT ID args nullabler   rw   rX   rY   r   r   Nr   rG   s     r-   p_foreign_type_refz ParserFactory.p_foreign_type_ref$  sI    88A;88A;11qTt
!r/   c           	          t        | j                  |j                  d      |j                  d      |d   |d   |d         |d<   y)ziannotation_type : ANNOTATION_TYPE ID NL                               INDENT docsection field_list DEDENTr   rM   rY   rd   )r)   r;   r[   r   r]   paramsr   N)r   r)   r;   r[   rG   s     r-   p_annotation_typezParserFactory.p_annotation_type>  sD     $88A;88A;1!Q4!r/   c                 H    t        |      dkD  r|d   |d   d   dk(  f|d<   yy)zbenumerated_subtypes : uniont NL INDENT subtypes_list DEDENT
                               | emptyrM   rX   r   r   unionNrZ   rG   s     r-   p_enumerated_subtypesz#ParserFactory.p_enumerated_subtypesc  s3     q6A:aD!A$q'W,-AaD r/   c                 &    | j                  |       y)zwstruct : STRUCT ID inheritance NL                      INDENT docsection enumerated_subtypes field_list examples DEDENTNmake_structrG   s     r-   p_structzParserFactory.p_structi       	r/   c                 &    | j                  |       y)zxanony_def : STRUCT empty inheritance NL                 INDENT docsection enumerated_subtypes field_list examples DEDENTNr   rG   s     r-   p_anony_structzParserFactory.p_anony_structn  r   r/   c                     t        | j                  |j                  d      |j                  d      |d   |d   |d   |d   |d   |d   	      |d	<   y )
Nr   rM   rw   rd   re   rf   	   )	r)   r;   r[   r   extendsr]   subtypesfieldsexamplesr   )r   r)   r;   r[   rG   s     r-   r   zParserFactory.make_structs  sW    88A;88A;1aD!qTQ4qT	!r/   c           	          t        | j                  |j                  d      |j                  d      |d   |d   |d         |d<   y)zCstruct_patch : PATCH STRUCT ID NL INDENT field_list examples DEDENTr   rw   rd   re   )r)   r;   r[   r   r   r   r   N)r   r)   r;   r[   rG   s     r-   p_struct_patchzParserFactory.p_struct_patch  sB    88A;88A;1Q4qT!r/   c                     |d   rR|d   j                   r:d}| j                  j                  ||j                  d      | j                  f       y|d   |d<   yy)z=inheritance : EXTENDS type_ref
                       | emptyr   rM   zReference cannot be nullable.r   N)r   r(   rO   r;   r)   r,   rH   r   s      r-   p_inheritancezParserFactory.p_inheritance  sR     Q4t}}5""C!dii#@At! r/   c                 "    |d   
|d   g|d<   yy)z>subtypes_list : subtype_field
                         | emptyr   Nr   rF   rG   s     r-   !p_enumerated_subtypes_list_createz/ParserFactory.p_enumerated_subtypes_list_create  s"     Q4aD6AaD r/   c                 B    |d   |d<   |d   j                  |d          y)z+subtypes_list : subtypes_list subtype_fieldr   r   rM   NrN   rG   s     r-   !p_enumerated_subtypes_list_extendz/ParserFactory.p_enumerated_subtypes_list_extend  ry   r/   c                     t        | j                  |j                  d      |j                  d      |d   |d         |d<   y)zsubtype_field : ID type_ref NLr   rM   r   N)r   r)   r;   r[   rG   s     r-   p_enumerated_subtype_fieldz(ParserFactory.p_enumerated_subtype_field  7    IIqxx{AHHQK1qt=!r/   c                 ,    |d   g |d<   y|d   g|d<   y)z0field_list : field
                      | emptyr   Nr   rF   rG   s     r-   p_field_list_createz!ParserFactory.p_field_list_create  s%     Q4<AaDaD6AaDr/   c                 B    |d   |d<   |d   j                  |d          y)zfield_list : field_list fieldr   r   rM   NrN   rG   s     r-   p_field_list_extendz!ParserFactory.p_field_list_extend  ry   r/   c                 X    |d   r%t        |d   t              r	|d   |d<   y|d   |d<   yy)zfdefault_option : EQ primitive
                          | EQ tag_ref
                          | emptyr   rM   r   N)r   r   rG   s     r-   p_default_optionzParserFactory.p_default_option  s8     Q4!A$	*t!t!	 r/   c                 Z   t        |      dkD  xr |d   du}t        |      dkD  xr |d   du}t        |      dkD  xr |d   du}t        | j                  |j                  d      |j	                  d      |d   |d         |d<   |d	   7|d	   t
        u r|d   j                  d       n|d   j                  |d	          |r|d   j                  |d          |r|d   j                  |d          |r6|d   j                  |d   _	        | j                  j                  |d          yy)
zfield : ID type_ref default_option NL                     INDENT annotation_ref_list docsection anony_def_option DEDENT
                 | ID type_ref default_option NLrY   rd   Nre   rf   r   rM   r   rw   )rZ   r   r)   r;   r[   r
   set_defaultrg   set_docr   r*   rO   )r,   rH   rh   has_docstringhas_anony_defs        r-   p_fieldzParserFactory.p_field  s)    a&1*91T)9A
7qt4'7A
7qt4'7IIqxx{AHHQK1qt=!Q4ty !  &!  1&aD  1&aDLL1!		AaDIOO""1Q4( r/   c                     |d   |d<   y)z@anony_def_option : anony_def
                            | emptyr   r   NrF   rG   s     r-   p_anony_def_optionz ParserFactory.p_anony_def_option  rr   r/   c                 |    t        | j                  |j                  d      |j                  d      |d         |d<   y)ztag_ref : IDr   r   N)r   r)   r;   r[   rG   s     r-   	p_tag_refzParserFactory.p_tag_ref  ra   r/   c           
      T   t        |      dk  rL|d   \  }}t        | j                  |j                  d      |j	                  d      |d   |d   d||      |d<   y|d   \  }}t        | j                  |j                  d      |j	                  d      |d   |d	   |d   ||      |d<   y)
zcannotation : ANNOTATION ID EQ ID args NL
                      | ANNOTATION ID EQ ID DOT ID args NLrf   rY   r   rM   rX   Nr   re   rd   )rZ   r   r)   r;   r[   )r,   rH   r   kwargss       r-   p_annotationzParserFactory.p_annotation  s     q6A:Q4LD&#		188A;QqT1Q4tVUAaD Q4LD&#		188A;QqT1Q41tVUAaDr/   c                 ,    |d   
|d   g|d<   yd|d<   y)zKannotation_ref_list : annotation_ref
                               | emptyr   Nr   rF   rG   s     r-   p_annotation_ref_list_createz*ParserFactory.p_annotation_ref_list_create  s&     Q4aD6AaDAaDr/   c                 B    |d   |d<   |d   j                  |d          y)z8annotation_ref_list : annotation_ref_list annotation_refr   r   rM   NrN   rG   s     r-   p_annotation_ref_list_extendz*ParserFactory.p_annotation_ref_list_extend  ry   r/   c                    t        |      dk  r>t        | j                  |j                  d      |j	                  d      |d   d      |d<   yt        | j                  |j                  d      |j	                  d      |d   |d         |d<   y)zEannotation_ref : AT ID NL
                          | AT ID DOT ID NLrY   r   rM   Nr   rX   )rZ   r   r)   r;   r[   rG   s     r-   p_annotation_refzParserFactory.p_annotation_ref  sp     q6A:#DIIqxx{AHHQK1tTAaD#DIIqxx{AHHQK1qQRtTAaDr/   c                 &    | j                  |       y)zeunion : uniont ID inheritance NL                         INDENT docsection field_list examples DEDENTN
make_unionrG   s     r-   p_unionzParserFactory.p_union       	r/   c                 &    | j                  |       y)zlanony_def : uniont empty inheritance NL                         INDENT docsection field_list examples DEDENTNr   rG   s     r-   p_anony_unionzParserFactory.p_anony_union  r   r/   c                     t        | j                  |d   d   |d   d   |d   |d   |d   |d   |d   |d   d   dk(  		      |d<   y )
Nr   rM   rw   rd   re   rf   r   union_closed)	r)   r;   r[   r   r   r]   r   r   closed)r   r)   rG   s     r-   r   zParserFactory.make_union  s`    Q47Q471aD!Q4qTQ47n,	.!r/   c           
      ~    t        | j                  |d   d   |d   d   |d   |d   |d   |d   d   dk(        |d<   y	)
zBunion_patch : PATCH uniont ID NL INDENT field_list examples DEDENTrM   r   rw   rd   re   r   r   )r)   r;   r[   r   r   r   r   N)r   r)   rG   s     r-   p_union_patchzParserFactory.p_union_patch'  sR    Q47Q471Q4qTQ47n,.!r/   c                 V    |d   |j                  d      |j                  d      f|d<   y)z/uniont : UNION
                  | UNION_CLOSEDr   r   N)r;   r[   rG   s     r-   p_uniontzParserFactory.p_uniont2  s(     !ahhqk188A;/!r/   c                    t        | j                  |j                  d      |j                  d      |d         |d<   t	        |      dkD  r:|d   |d   j                  |d          |d   |d   j                  |d          yyy)zSfield : ID NL
                 | ID NL INDENT annotation_ref_list docsection DEDENTr   r   rw   rX   NrY   )r   r)   r;   r[   rZ   rg   r   rG   s     r-   p_field_voidzParserFactory.p_field_void7  s     DIIqxx{AHHQK1F!q6A:t!$$QqT*t!QqT"  	 r/   c           	         t        | j                  |j                  d      |j                  d      |d   |d   |d   g|d    |d<   t	        |      dkD  r|d   j                  |d          |d	   rt               }|d	   D ]l  }|j                  |v rAd
|j                  z  }| j                  j                  ||j                  |j                  f       |j                  |j                         n |d   j                  |d	          yyy)zroute : ROUTE route_name route_version route_io route_deprecation NL                         INDENT docsection attrssection DEDENT
                 | ROUTE route_name route_version route_io route_deprecation NLr   rM   rw   rY   rX   r   re   rf   r   z&Attribute '%s' defined more than once.N)r   r)   r;   r[   rZ   r   setr   r(   rO   add	set_attrs)r,   rH   keysattrr   s        r-   p_routezParserFactory.p_routeO  s     499ahhqk188A;!adAaDXSTUVSWX!q6A:aDLL1tuaDDyyD(FR**Cdii+HIHHTYY'	 !
 !qt$  r/   c                 <    |d   r|d   |d   z   |d<   y|d   |d<   y)zroute_name : ID route_pathrM   r   r   NrF   rG   s     r-   p_route_namezParserFactory.p_route_name_  s+    Q4Q4!A$;AaDQ4AaDr/   c                     |d   |d<   y)z/route_path : PATH
                      | emptyr   r   NrF   rG   s     r-   p_route_path_suffixz!ParserFactory.p_route_path_suffixf  rr   r/   c                     t        |      dkD  rJ|d   dk  r9d}| j                  j                  ||j                  d      | j                  f       |d   |d<   yd|d<   y)z>route_version : COLON INTEGER
                         | emptyrM   r   z,Version number should be a positive integer.r   N)rZ   r(   rO   r;   r)   r   s      r-   p_route_versionzParserFactory.p_route_versionk  sZ     q6A:tqyD""C!dii#@AQ4AaDAaDr/   c                 `    t        |      dkD  r|d   |d   |d   f|d<   y|d   |d   df|d<   y)zsroute_io : LPAR type_ref COMMA type_ref RPAR
                    | LPAR type_ref COMMA type_ref COMMA type_ref RPARrd   rM   rX   r   Nr   rG   s     r-   
p_route_iozParserFactory.p_route_iov  sC     q6A:aD!A$!%AaDaD!A$%AaDr/   c                 T    t        |      dk(  rd|d   |d   f|d<   y|d   rd|d<   yy)	zroute_deprecation : DEPRECATED
                             | DEPRECATED BY route_name route_version
                             | emptyrY   Trw   rX   r   r   )TNNNr   rG   s     r-   p_route_deprecationz!ParserFactory.p_route_deprecation~  s<     q6Q;!A$!%AaDqT%AaD r/   c                      |d   r	|d   |d<   yy)zQattrssection : ATTRS NL INDENT attr_fields DEDENT
                        | emptyr   rX   r   NrF   rG   s     r-   p_attrs_sectionzParserFactory.p_attrs_section  s     Q4Q4AaD r/   c                     |d   g|d<   y)zattr_fields : attr_fieldr   r   NrF   rG   s     r-   p_attr_fields_createz"ParserFactory.p_attr_fields_create  ru   r/   c                 B    |d   |d<   |d   j                  |d          y)z$attr_fields : attr_fields attr_fieldr   r   rM   NrN   rG   s     r-   p_attr_fields_addzParserFactory.p_attr_fields_add  ry   r/   c                    |d   t         u r>t        | j                  |j                  d      |j	                  d      |d   d      |d<   yt        | j                  |j                  d      |j	                  d      |d   |d         |d<   y)zHattr_field : ID EQ primitive NL
                      | ID EQ tag_ref NLrw   r   Nr   )r
   r   r)   r;   r[   rG   s     r-   p_attr_fieldzParserFactory.p_attr_field  sz     Q49		188A;QqT4AAaD  		188A;QqT1Q4AAaDr/   c                      |d   	|d   |d<   yy)z7docsection : docstring NL
                      | emptyr   Nr   rF   rG   s     r-   p_docsectionzParserFactory.p_docsection  s      Q4Q4AaD r/   c                     dj                  |d   j                  d      D cg c]  }|j                          c}      |d<   yc c}w )zdocstring : STRING
r   r   N)joinsplitrstrip)r,   rH   lines      r-   p_docstring_stringz ParserFactory.p_docstring_string  s=     yyAaDJJt4DE4DD$++-4DEF!Es   Ac                 Z    t               |d<   |d   |d   |d   |d   j                  <   yy)z.examples : example
                    | emptyr   r   N)r   labelrG   s     r-   p_examples_createzParserFactory.p_examples_create  s8     }!Q4 tAaD1 r/   c                 8   |d   |d<   |d   j                   |d   v rf|d   |d   j                      }| j                  j                  d|j                   |j                  fz  |d   j                  |d   j                  f       |d   |d   |d   j                   <   y)zexamples : examples exampler   r   rM   z3Example with label '%s' already defined on line %d.N)r  r(   rO   r;   r)   )r,   rH   existing_exs      r-   p_examples_addzParserFactory.p_examples_add  s    t!Q4::1A$qtzz*KKKF##[%7%7891adii)* Q4!QqTZZr/   c                 f   t        |      dkD  rt               }|d   D ]v  }|j                  |v rK| j                  j	                  d|d   d|j                  d|j                  d      | j                  f       |j                  |j                         x t        | j                  |j                  d      |j                  d      |d   |d   t        d	 |d   D                    |d
<   yt        | j                  |j                  d      |j                  d      |d   dt                     |d
<   y)zbexample : KEYWORD ID NL INDENT docsection example_fields DEDENT
                   | KEYWORD ID NLrX   rd   zExample with label 'rM   z' defines field 'z' more than once.r   rY   c              3   8   K   | ]  }|j                   |f  y wr=   )r   ).0fs     r-   	<genexpr>z*ParserFactory.p_example.<locals>.<genexpr>  s     6AQVVQKs   r   N)rZ   r   r   r(   rO   r;   r)   r   r   r[   r   )r,   rH   seen_fieldsexample_fields       r-   	p_examplezParserFactory.p_example  s    q6A:%K!"1 %%4KK&&()!m.@.@BTYY01  2 23 "& 		188A;QqT1Q461668AaD 		188A;QqT4PAaDr/   c                     |d   g|d<   y)zexample_fields : example_fieldr   r   NrF   rG   s     r-   p_example_fields_createz%ParserFactory.p_example_fields_create  ru   r/   c                 B    |d   |d<   |d   j                  |d          y)z-example_fields : example_fields example_fieldr   r   rM   NrN   rG   s     r-   p_example_fields_addz"ParserFactory.p_example_fields_add  ry   r/   c                    |d   t         u r>t        | j                  |j                  d      |j	                  d      |d   d      |d<   yt        | j                  |j                  d      |j	                  d      |d   |d         |d<   y)zyexample_field : ID EQ primitive NL
                         | ID EQ ex_list NL
                         | ID EQ ex_map NLrw   r   Nr   )r
   r   r)   r;   r[   rG   s     r-   p_example_fieldzParserFactory.p_example_field  sz     Q49"		188A;QqT4AAaD #		188A;QqT1Q4AAaDr/   c                     t        | j                  |j                  d      |j                  d      |d   |d         |d<   y)z0example_field : ID EQ NL INDENT ex_map NL DEDENTr   rY   r   N)r   r)   r;   r[   rG   s     r-   p_example_multilinez!ParserFactory.p_example_multiline  r   r/   c                     t        | j                  |j                  d      |j                  d      |d   t	        | j                  |j                  d      |j                  d      |d               |d<   y)zexample_field : ID EQ ID NLr   rw   r   N)r   r)   r;   r[   r   rG   s     r-   p_example_field_refz!ParserFactory.p_example_field_ref  sW    tyy!((1+qxx{aD-		188A;QqTJL!r/   c                 *    |d   g |d<   y|d   |d<   y)zVex_list : LBRACKET ex_list_items RBRACKET
                   | LBRACKET empty RBRACKETrM   Nr   rF   rG   s     r-   	p_ex_listzParserFactory.p_ex_list  s#     Q4<AaDQ4AaDr/   c                 6    |d   t         u rd|d<   y|d   |d<   y)zex_list_item : primitiver   Nr   r
   rG   s     r-   p_ex_list_item_primitivez&ParserFactory.p_ex_list_item_primitive  s$    Q49AaDQ4AaDr/   c                 |    t        | j                  |j                  d      |j                  d      |d         |d<   y)zex_list_item : IDr   r   Nr   r)   r;   r[   rG   s     r-   p_ex_list_item_idzParserFactory.p_ex_list_item_id  .    TYYQXXa[!A$G!r/   c                     |d   |d<   y)zex_list_item : ex_listr   r   NrF   rG   s     r-   p_ex_list_item_listz!ParserFactory.p_ex_list_item_list!  rS   r/   c                     |d   g|d<   y)zex_list_items : ex_list_itemr   r   NrF   rG   s     r-   p_ex_list_items_createz$ParserFactory.p_ex_list_items_create%  ru   r/   c                 B    |d   |d<   |d   j                  |d          y)z0ex_list_items : ex_list_items COMMA ex_list_itemr   r   rw   NrN   rG   s     r-   p_ex_list_items_extendz$ParserFactory.p_ex_list_items_extend)  ry   r/   c                     |d   xs i |d<   y)zKex_map : LBRACE ex_map_pairs RBRACE
                  | LBRACE empty RBRACErM   r   NrF   rG   s     r-   p_ex_mapzParserFactory.p_ex_map2  s     tzr!r/   c                     |d   xs i |d<   y)z7ex_map : LBRACE NL INDENT ex_map_pairs NL DEDENT RBRACErX   r   NrF   rG   s     r-   p_ex_map_multilinez ParserFactory.p_ex_map_multiline7  s    tzr!r/   c                 8    |d   t         k(  rd|d<   y|d   |d<   y)zex_map_elem : primitiver   Nr   r  rG   s     r-   p_ex_map_elem_primitivez%ParserFactory.p_ex_map_elem_primitive;  s"    ty(t!ad!r/   c                     |d   |d<   y)z5ex_map_elem : ex_map
                       | ex_listr   r   NrF   rG   s     r-   p_ex_map_elem_compositz$ParserFactory.p_ex_map_elem_composit?  rr   r/   c                 |    t        | j                  |j                  d      |j                  d      |d         |d<   y)zex_map_elem : IDr   r   Nr  rG   s     r-   p_ex_map_elem_idzParserFactory.p_ex_map_elem_idD  r   r/   c                     	 |d   |d   i|d<   y# t         $ rP dt        |d         z  }| j                  j                  ||j	                  d      | j
                  f       i |d<   Y yw xY w)z+ex_map_pair : ex_map_elem COLON ex_map_elemr   rw   r   z6%s is an invalid hash key because it cannot be hashed.rM   N)	TypeErrorreprr(   rO   r;   r)   r   s      r-   p_ex_map_pairzParserFactory.p_ex_map_pairH  sn    	aD!A$<AaD 	JTRSTURVZWCKKQXXa[$))<=AaD	s    AA)(A)c                     |d   |d<   y)zex_map_pairs : ex_map_pair r   r   NrF   rG   s     r-   p_ex_map_pairs_createz#ParserFactory.p_ex_map_pairs_createQ  rS   r/   c                 B    |d   |d<   |d   j                  |d          y)z-ex_map_pairs : ex_map_pairs COMMA ex_map_pairr   r   rw   Nr   rG   s     r-   p_ex_map_pairs_extendz#ParserFactory.p_ex_map_pairs_extendU  ry   r/   c                 B    |d   |d<   |d   j                  |d          y)z0ex_map_pairs : ex_map_pairs COMMA NL ex_map_pairr   r   rX   Nr8  rG   s     r-   p_ex_map_pairs_multilinez&ParserFactory.p_ex_map_pairs_multilineZ  ry   r/   c                      y)zempty :NrF   rG   s     r-   p_emptyzParserFactory.p_emptyc  s    r/   c                 L   |J d       t         j                  d|j                  |j                  |j                         | j
                  j                  d|j                  dt        |j                        j                  d      d|j                  | j                  f       y )Nz"Unknown error, please report this.zUnexpected %s(%r) at line %dzUnexpected z with value u.)
loggerr$   typevaluer;   r(   rO   r3  lstripr)   )r,   tokens     r-   p_errorzParserFactory.p_errorg  s     F"FF 3ZZ[[\\	# 	jj$u{{+22379\\499&	'r/   )Fr=   )b__name__
__module____qualname____doc__r	   tokensstrstartr.   r2   r5   r?   rB   rD   rI   rK   rP   rR   rU   r^   r`   ri   rk   rm   ro   rq   rt   rx   r{   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r  r"  r$  r&  r(  r*  r,  r.  r0  r4  r6  r9  r;  r=  rF  rF   r/   r-   r    r    '   s    \\F KE
&
	
;D76


 




4	J.



=
),
D
U
U,


.	.0
	#0% 
	&&
A4G"$	 P&
	A=
LH
3
H
	'r/   r    )'
__future__r   r   r   r   collectionsr   loggingply.yaccr&   r'   r	   r
   astr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   	getLoggerrL  rA  objectr    rF   r/   r-   <module>rU     s_    R R #  
     . 
		367	8I'F I'r/   