
    2h                         d Z ddlmZ ddlmZ ddlZddlZddlZddlZddl	m
Z
 ddlmZ ddlmZ dd	lmZmZmZ ej                            ej                            e                    Z G d
 de          ZdS )z:
The parser for CLAD
Author: Mark Pauley
Date: 12/12/2014
    )absolute_import)print_functionN   )yacc)ast)AnkiBufferLexer)	PLYParserCoord
ParseErrorc                      e Zd ZdZ	 	 	 	 	 	 	 dKdZ ej        d          Zd Zd	 Z	d
 Z
d ZdLdZd Zd Zd Zd Z G d dej                  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.d0 Z/d1 Z0d2 Z1d3 Z2d4 Z3d5 Z4d6 Z5d7 Z6d8 Z7d9 Z8d: Z9d; Z:d< Z;d= Z<d> Z=d? Z>d@ Z?dA Z@dB ZAdC ZBdD ZCdE ZDdF ZEdG ZFdH ZGdI ZHdJS )M
CLADParserz7 A parser for the Anki Buffer definition language.
    .Fclad.lextabclad.yacctabc                    t          || j        | j                  | _        | j                            ||t
                     | j        j        | _        t          j        | d|||t
                    | _        || _	        dS )a<  
        Create a new CLAD parser
        Options:
        - input_directories: a tuple including the directories to search for
          input files and #include files.

        - lex_optimize / lextab: tell PLY to generate a tokenizer table to
          increase performance of the tokenizer.

        - yacc_optimize / yacctab: tell PLY to generate a parser table to
          increase performance of the LALR parser.

        - yacc_debug: tell PLY to spew LALR parser traces to the stderr

        - lex_debug: tell PLY to spew tokenizer traces to the stderr
        )	lex_debug
error_functype_lookup_func)optimizelextab	outputdirstart)moduler   debugr   	tabmoduler   N)
r   _lex_error_func_lex_type_lookup_funclexerbuildTHIS_DIRtokensr   parser_input_directories)selfinput_directorieslex_optimizer   yacc_optimizeyacctab
yacc_debugr   s           I/home/metal/girl-os-victor/victor-clad/tools/message-buffers/clad/clad.py__init__zCLADParser.__init__+   s    0 %+!79 9 9

 	
,vRRRj'i"
 
 
 #4    z ^#include\s+\"(.*)\"(?:\s*/.*)*$c                 r    |                      |j        | j                            |j                            S Nlineno_to_coordlinenor   find_tok_columnlexpos)r%   tokens     r+   token_to_coordzCLADParser.token_to_coordV   s,    ##EL$*2L2LU\2Z2Z[[[r-   c                     |                      |                    |          | j                            |                    |                              S r/   r0   )r%   
productionindexs      r+   production_to_coordzCLADParser.production_to_coordY   sF    ##J$5$5e$<$<dj>X>XYcYjYjkpYqYq>r>rsssr-   c                 X    t          j         | j        |dz
                     }||_        |S Nr   )copy_lines_to_coordscolumn)r%   r2   r?   coords       r+   r1   zCLADParser.lineno_to_coord\   s)    	$/
;<<r-   c           
         |                     d          }|r(|d         r |d         d         dk    r|d         dz   |d<   g }d}|D ]}| j                            t          |||                     t	          j        | j        |          }|r0|                    d          }	| j        D ]E}
t          j
                            |
|	          }t          j
                            |          r|
} nHFt          | j        d         d                    |	d                    | j                                      |                    d|z              	 t          |d          5 }|                                }d d d            n# 1 swxY w Y   nA# t"          $ r4}t          | j        d         d	                    |	|                    d }~ww xY w|                    d
                    |	                     | j                            t          |||                     |                    d          | j        vrD| j                            |	           |                    |                     ||	|                     |                    d           | j                            t          |||                     n|                    |           |dz  }|S )NT
r   z=Could not find file "{0}"
Include directories searched:
	{1}
z
	z// rz+Error reading file "{0}" in directory "{1}"zinclude "{0}" {{
z}
)
splitlinesr>   appendr
   rematch_include_directive_regroupr$   ospathjoinexistsr   formatopenreadIOError_included_filesextend
preprocess)r%   textfilename	directorylinesprocessed_textr2   lineminclude_file_pathinput_directoryreal_include_file_pathchosen_input_directoryfdataes                   r+   rU   zCLADParser.preprocessa   s:   %% 	)U2Y 	)59R=D#8#8b	D(E"I 	 	D!((xF)K)KLLL3T::A ,$%GGAJJ!'+'> b bO-/W\\/K\-]-]*w~~&<== 1@. %T%:2%>%h%o%o(96;;tG^;_;_&a &ab b b %%edl333T4c:: (a vvxx( ( ( ( ( ( ( ( ( ( ( ( ( ( ( T T T$T%:2%>%R%Y%Y(9;Q&S &ST T TT %%&:&A&ABS&T&TUUU%,,U8Y-O-OPPP771::T%999(//0ABBB"))$//$@QSi*j*jkkk%%e,,,%,,U8Y-O-OPPPP%%d+++aKFFs<   F!F6FF	F	F	
F
G/GG r   c                 <   d| _         t                      | _        dg| _        g | _        g | _        g | _        g | _        g | _        g | _	        g | _
        d                    |                     |||                    }d| _         | j                            || j        d|          | _        |                                  |                                  |                                  |                     | j                   |                                  | j        S )a   Parses buffer definitions and returns an AST.

          text:
            A String containing the source code

          filename:
            Name of the file being parsed (for meaningful
            error messages)

          debuglevel:
            Debug level to yacc
        Nrd   T)inputr   trackingr   )_last_yielded_tokendictdeclared_types_namespace_stack_enum_decls_message_types_union_decls_all_members_enum_conceptsrS   r>   rM   rU   r#   parser   _syntax_tree_postprocess_enums_postprocess_unions_postprocess_enum_concepts_postprocess_versioning_hashes_note_ambiguity)r%   rV   rW   rX   
debuglevelrZ   s         r+   rq   zCLADParser.parse   s    $( "ff"&  ! "x!K!KLL#'  K-- *	 .   	!!!  """'')))++D,=>>>  r-   c           
         | j         D ]m}d}d }t                      }|                                D ]B}d}|j        rHd }|j        j        }|j        j        dk    rt          |          }d}t          |t                    r|}d}t          |t                    sn|j	        j
        |cxk    r|j	        j        k    sMn t          |j        d                    |                                |j        |j	        j                            |(|dk    rd                    |          nd}||z   |_        n||_        |r|j        j        n|j        }||v rd|_        |                    |           |dz  }Dod S )	Nr   FhexTz7Enum '{0}' has a value '{1}' outside the range of '{2}'z + {0}rd   r   )rl   setmembersinitializervaluetyperz   
isinstancestrstorage_typeminmaxr   r@   rO   fully_qualified_namenameis_duplicateadd)	r%   enumr~   	str_value
all_valuesmemberisHexaddition
comp_values	            r+   rs   zCLADParser._postprocess_enums   s   $ )	 )	DEIJ,,.. % %% " $I".4E).%77 #E

 $ "%-- "$)	 !!%-- 1t7H7LPU7n7n7n7nY]YjYn7n7n7n7n$QXX1133).0 01 1 1 (9>!xu555H#,x#7FLL#(FL9>PV/55FL
++*.F'z***
K%	)	 )	r-   c                 ,   | j         D ]}|                                rf|j        }|j        t	          j        g |          |_        t                      }| j        D ]}|j        |v rqt          |j        d
                    |                                |j        ||j                                                 |                                                    |||j        <   t                      }|                                D ]}|||j        <   t          | j                  D ]^\  }}|j        |vrPt	          j        |j        |d |          }|j                            |           | j                            |           _|j        r|                                D ]	}d|_        
t'          j        |                                d          D ]8}	|	d         j        |	d         j        k    rd|	d         _        d|	d         _        9| j         D ]}
t                      }t                      }d}|
                                D ]}|j        |v r{t          |j        d
                    |
                                |j        ||j                 j                                        |j                                                            |||j        <   |j        r|j        j        }|
j        j        |cxk    r|
j        j        k    sMn t          |j        d	
                    |
                                |j        |j        j                            ||v rMt          |j        d

                    |
                                |j        ||         j        |                    |||<   ||
j        k    rGt          |j        d
                    |
                                |
j        |j        |                    ||_        |dz  }Ȑd S )NzNAutounion '{0}' would contain two members with the name '{1}': '{2}' and '{3}'F   )rD   r   r   Tz@Union '{0}' has two members with the name '{1}': '{2}' and '{3}'z?Union '{0}' has a tag value that is out of range: '{1}' = '{2}'zPUnion '{0}' would contain two members with the same value '{3}': '{1}' and '{2}'zSUnion '{0}' has a tag that would be equal to invalid tag value '{1}': '{2}' = '{3}')rn   is_explicit_auto_unionr@   member_listr   MessageMemberDeclListri   rm   r   r   rO   r   r|   	enumerateMessageMemberDeclrF   ro   dupes_allowedhas_duplicates	itertoolscombinationsr   initr~   tag_storage_typer   r   invalid_tagtag)r%   union_entryr@   namesmessage_typeinitialized_namesr   
init_valuedeclpairunionname_set	value_setr~   s                 r+   rt   zCLADParser._postprocess_unions   sX   , %	6 %	6K1133 7#)*2.1.GE.R.RK+$($7 	< 	<L#(E11('-lss'<<>>(-!,"34IIKK(==??	A AB B B 0<E,+,, %)FF!)1133 < <F5;%fk2209$:M0N0N 7 7,J#(0AAA"4\5FVZ\abb#/66t<<<)00666( 6)1133 2 2F,1F))%2;3F3F3H3HANNN 6 6DAw|tAw|3315Q.15Q. & /	 /	EvvHIE--// + +;(**$Zaa2244 -2GGII88::	< <= = = )/%; ."K-E.2eYYYYu?U?YYYYY$Y``2244)+ +, , , I%%$jqq2244!%(-	       $*	% E---$mtt2244)	       #

W+	/	 /	r-   c           
         | j         D ]7}d }| j        D ]}|j        |j        k    r|} n|3t	          |j        d                    |j        |j                            t          d |                                D                       }t          d |                                D                       }t          ||z
            }t          ||z
            }t          |          dk    r4t	          |j        d                    ||j        |j                            t          |          dk    r4t	          |j        d                    |j        ||j                            t          |j        j        t          j                  r|                                D ]}t          |j        t          j                  r"|j        j        |j        j        j        k     s|j        j        |j        j        j        k    r>t	          |j        d                    |j        |j        |j        j                            9d S )Nz.Enum '{0}' in EnumConcept '{1}' does not existc              3   $   K   | ]}|j         V  d S r/   r   .0xs     r+   	<genexpr>z8CLADParser._postprocess_enum_concepts.<locals>.<genexpr>N  s$      &N&N!qv&N&N&N&N&N&Nr-   c              3   $   K   | ]}|j         V  d S r/   r   r   s     r+   r   z8CLADParser._postprocess_enum_concepts.<locals>.<genexpr>O  s$      #Q#QqAF#Q#Q#Q#Q#Q#Qr-   r   z=Entries '{0}' in EnumConcept '{1}' do not exist in Enum '{2}'zDEnumConcept '{0}' missing entries for EnumValues '{1}' in Enum '{2}'z=Entry '{0}' in EnumConcept '{1}' contains invalid value '{2}')rp   rl   r   r   r   r@   rO   r{   r|   listlenr   return_typer   r   BuiltinTyper~   StringConstr   r   )	r%   enum_conceptmatching_enum_decl	enum_declconcept_member_namesenum_member_namesextra_concept_namesextra_enum_namesr   s	            r+   ru   z%CLADParser._postprocess_enum_concepts:  s    !/ 3	5 3	5L "&!-  	>\%666)2&E 7 ")  &DKK$)$)+ +, , , $'&N&N|7K7K7M7M&N&N&N#N#N  ##Q#Q4F4N4N4P4P#Q#Q#Q Q Q"&';>O'O"P"P#$58L$LMM &''!++  &SZZ+$)*/1 12 2 2 #$$q((  &Zaa$)(*/1 12 2 2 ,27II 
5*2244 	5 	5F!&,@@ ! *\-E-J-NNNTZT`Tfiu  jB  jG  jK  UK  UK((.[bb & , 1 & 24 45 5 5 UK[3	5 3	5r-   c                 `    | j         D ]%}|                     |j                  }|rd|_        &d S )NT)ro   _get_type_or_namespacer   possibly_ambiguous)r%   r   r   s      r+   rw   zCLADParser._note_ambiguityv  sD    ' 	/ 	/F..v{;;D /*.'	/ 	/r-   c                   &    e Zd Zd Zd Zd Zd ZdS )CLADParser.HashVisitorc                     d| _         d S )NInvalid)hash_strr%   s    r+   r,   zCLADParser.HashVisitor.__init__}  s    %DMMMr-   c                 `    t          j                    }|                    |           |j        S r/   )r   ASTHashvisitr   )r%   nodehashers      r+   get_hash_from_nodez)CLADParser.HashVisitor.get_hash_from_node  s'    []]FLL?"r-   c                     d S r/    r%   r   argskwargss       r+   visit_IncludeDeclz(CLADParser.HashVisitor.visit_IncludeDecl  s    Dr-   c                 \     | j         |g|R i | |                     |          |_        d S r/   )generic_visitr   r   r   s       r+   visit_Decl_subclassz*CLADParser.HashVisitor.visit_Decl_subclass  s>    Dt5d555f555 33D99DMMMr-   N)__name__
__module____qualname__r,   r   r   r   r   r-   r+   HashVisitorr   |  sP        	& 	& 	&	# 	# 	#
	 	 		: 	: 	: 	: 	:r-   r   c                 T    |                                                      |           d S r/   )r   r   )r%   r   s     r+   rv   z)CLADParser._postprocess_versioning_hashes  s'      &&&r-   c                     | j         d         S )NrB   )rk   r   s    r+   _get_current_namespacez!CLADParser._get_current_namespace  s    $R((r-   c                 x    || j         S |                    d          }| j         }|D ]}||vr d S ||         }|S )N::)rj   split)r%   typenamenamespace_listt	namespaces        r+   0_get_type_or_namespace_from_fully_qualified_namez;CLADParser._get_type_or_namespace_from_fully_qualified_name  sY    &&!--' 	 	I>>tt)AAr-   c                     |                                  }	 |}||                                dz   |z   }|                     |          }||S |n|j        }Bd S )NTr   )r   r   r   r   )r%   
m_typenamer   r   r   s        r+   r   z!CLADParser._get_type_or_namespace  sx    //11			,!H$$99;;dBXMEEhOOA} !+I		, tr-   c                 .   |                                 }|                    d          }| j        }|d d         D ]6}||vr(t          |j        d                    |                    ||         }7|d         }||vrt                      ||<   ||         S )Nr   rB   zUnknown namespace {0})r   r   rj   r   r@   rO   ri   )r%   new_namespacenamespace_namer   current_typesr   final_namespaces          r+   _add_namespacezCLADParser._add_namespace  s    &;;=='--d33+', 	5 	5I-- !4!8!?!?!O!OQ Q Q))4MM(,-//-1VVM/*_--r-   c                 @   d}|                                  }||                                }|                     |          }|j        |v rIt	          |                     ||          d                    |                                                    |||j        <   dS )z! Adds a new message type
        NzName '{0}' already exists)r   r   r   r   r   r:   rO   )r%   r8   r9   m_typer   current_namespacenamespace_typess          r+   	_add_typezCLADParser._add_type  s      $ 7799(#4#I#I#K#K OOPdee;/))T55j%HH8??@[@[@]@]^^` ` `'-$$$r-   c                     dS )z0 Is <name> a type in the current-scope?
        Nr   )r%   r   s     r+   _is_type_in_scopezCLADParser._is_type_in_scope  s      r-   c                 X    |                      ||                     |                     d S r/   )_parse_errorr6   )r%   msgr5   s      r+   r   zCLADParser._lex_error_func  s,    #t22599:::::r-   c                 0    |                      |          }dS )z6 Looks up types that were previously defined.
        N)r   )r%   r   is_types      r+   r   z CLADParser._lex_type_lookup_func  s     ((..r-   c                     | j         j        S )zS The last token yacc requested from the lexer.
        Saved in the lexer.
        )r   
last_tokenr   s    r+   _get_yacc_lookahead_tokenz$CLADParser._get_yacc_lookahead_token  s     z$$r-   c           	          t                      }|                                D ]V}|j        |v rAt          |j        d                    ||                                |j                            |||j        <   Wd S )Nz#{0} '{1}' has duplicate member {2}.)ri   r|   r   r   r@   rO   r   )r%   r   	decl_typeall_membersr   s        r+   _check_duplicateszCLADParser._check_duplicates  s    ffllnn 	. 	.F{k)) 9@@--//K! !" " "
 (.K$$	. 	.r-   c                    |j         dk    r3|                     d                    |j                   |j                   |j        dk     r9|                     d                    |j         |j                   |j                   d|j        j        cxk    r|j        k    s=n |                     d                    |j         |j                   |j                   d S d S )NboolzI{0} is a variable-length array with a bool length, which isn't supported.r   zU{0} uses a signed datatype for the length field ({1}). You must use an unsigned type.zR{0} specifies a max length that is not within the range of the length field ({1}).)r   r   rO   r@   r   r   
max_lengthr   )r%   r   	data_typelength_types       r+   _check_variable_length_arrayz'CLADParser._check_variable_length_array  s%   v%%ippqwq|}}$l, , ,?Q u||  ~D  ~I  KV  K[  \  \$l, , ,V[+>>>>{>>>>ryy  {A  {F  HS  HX  Y  Y$l, , , , , ?>r-   c                    |j         dk    rd S |j         j        t          j        vr3|                     d                    |j         j                  |           |j         j        t          j        v r@|j        s9|                     d                    |j         j        |j                  |           |j         j        t          j	        v r@|j
        s9|                     d                    |j         j        |j                  |           |j         j        Y|j         j        |j        k    rD|                     d                    |j        |j         j        |j         j                  |           |j         j        Y|j         j        |j        k     rD|                     d                    |j        |j         j        |j         j                  |           |j         j        dk    rw|j         j        m|j        |j         j        k    rZ|j         j        P|j        |j         j        k    r=|                     d                    |j         j                  |           d S d S d S d S d S d S )	Nr   z{0} is not a built in data typez"{0} is an int type, but {1} is notz#{0} is a float type, but {1} is notz8{0} is smaller than the minimum value ({1}) for type {2}z7{0} is larger than the maximum value ({1}) for type {2}r   z%bool initializer value must be 0 or 1)r   r   r   builtin_typesr   rO   builtin_int_typesisIntr~   builtin_float_typesisFloatr   r   )r%   member_type_refr}   member_coords       r+   !_check_message_member_initializerz,CLADParser._check_message_member_initializer  s   u$$F#(C,===?FFG[G`aa*, , ,$(===$ 0!!"F"M"MoNbNgitiz"{"{".0 0 0$(???& 0!!"G"N"NOcOhjuj{"|"|".0 0 0 $07K7OR]Rc7c7cX__`k`q  tC  tH  tL  N]  Nb  Ng  h  h*, , , $07K7OR]Rc7c7cW^^_j_p  sB  sG  sK  M\  Ma  Mf  g  g*, , , %//!&*6[=NRaRfRj=j=j!&*6[=NRaRfRj=j=j!!"I"P"PQ`QeQj"k"k".0 0 0 0 0 0/66=j=j66=j=jr-   c                     |d         |d<   dS )z start : decl_list
        r   r   Nr   r%   ps     r+   p_startzCLADParser.p_start  s     t!r-   c                     t          |          dk    r,t          j        |d         g|d         j                  |d<   dS |d                             |d                   |d<   dS )zA decl_list : decl
                      | decl_list decl
        r   r   r   N)r   r   DeclListr@   rF   r  s     r+   p_decl_listzCLADParser.p_decl_list   sY     q66Q;;<1!
33AaDDDQ4;;qt$$AaDDDr-   c                     |d         |d<   dS )z decl : namespace_decl
                 | message_decl
                 | enum_decl
                 | union_decl
                 | include_decl
                 | enum_concept_decl
        r   r   Nr   r  s     r+   p_declzCLADParser.p_decl)  s     t!r-   c                 `    |d         }t          |          dk    r|d         |_        ||d<   dS )zg include_decl : include_begin decl_list RBRACE
                         | include_begin RBRACE
        r      r   r   N)r   	decl_list)r%   r  includes      r+   p_include_declzCLADParser.p_include_decl3  s5     A$q66Q;; !!G!r-   c                     t          j        |d         dd         d|                     |d                    }||d<   dS )z4 include_begin : INCLUDE QUOTED_PATH LBRACE
        r   r   rB   Nr   )r   IncludeDeclr:   )r%   r  new_includes      r+   p_include_beginzCLADParser.p_include_begin<  sB     oad1R4j$8P8PQRTU8V8VWW!r-   c                 l    |d         }|d         |_         | j                                         ||d<   dS )z; namespace_decl : namespace_begin decl_list RBRACE
        r   r   r   N)r  rk   pop)r%   r  r   s      r+   p_namespace_declzCLADParser.p_namespace_declB  s;     aD	d	!!###!r-   c                     t          j        |d         d|                     |d          |                                           }|                     |          }| j                            |           ||d<   dS )z/ namespace_begin : NAMESPACE ID LBRACE
        r   Nr   )r   NamespaceDeclr:   r   r   rk   rF   )r%   r  r   r   s       r+   p_namespace_beginzCLADParser.p_namespace_beginJ  s{     )!A$*.*B*B1a*H*H*.*E*E*G*GI I --m<<$$]333!r-   c                    |d         dk    }|s|                     d           t          |          dk    r	|d         }n)t          j        g |                     |d                    }|d         dk    }t          j        |d         ||                     |d          |                                 ||          |d<   |                     |d         |d                    t          j        |d         j	        |d         |d         j
                  }|s| j                            |           |                     |d|           d	S )
a,   message_decl : message_decl_begin ID LBRACE message_member_decl_list RBRACE
                         | message_decl_begin ID LBRACE message_member_decl_list COMMA RBRACE
                         | message_decl_begin ID LBRACE RBRACE
                         | NO_DEFAULT_CONSTRUCTOR message_decl_begin ID LBRACE message_member_decl_list RBRACE
                         | NO_DEFAULT_CONSTRUCTOR message_decl_begin ID LBRACE message_member_decl_list COMMA RBRACE
                         | NO_DEFAULT_CONSTRUCTOR message_decl_begin ID LBRACE RBRACE
        r   no_default_constructor   r     	structurer   r   N)r!  r   r   r   r:   MessageDeclr   r   CompoundTyper   r@   rm   rF   r   )r%   r  default_constructorr|   is_structurer   s         r+   p_message_declzCLADParser.p_message_declU  s<     d&>> # 	EE!HHHq66Q;;dGG/D4L4LQPQ4R4RSSGt{*qtW#771==#::<<+2	4 4! 	qtQqT***!	1Q41<< 	-&&t,,,q!T"""""r-   c                     |d         |d<   dS )zQ message_decl_begin : MESSAGE
                               | STRUCTURE
        r   r   Nr   r  s     r+   p_message_decl_beginzCLADParser.p_message_decl_beginw       t!r-   c                     t          |          dk    r,t          j        |d         g|d         j                  |d<   dS |d                             |d                   |d<   dS )z message_member_decl_list : message_member_decl
                                     | message_member_decl_list COMMA message_member_decl
        r   r   r   r)  Nr   r   r   r@   rF   r  s     r+   p_message_member_decl_listz%CLADParser.p_message_member_decl_list}  Z     q66Q;;,adVQqTZ@@AaDDDQ4;;qt$$AaDDDr-   c                 \    | j                             |d                    |d         |d<   dS )z message_member_decl : message_member
                                | message_variable_array_member
                                | message_fixed_array_member
        r   r   N)ro   rF   r  s     r+   p_message_member_declz CLADParser.p_message_member_decl  s0    
 	  1&&&t!r-   c                 Z   |                      |d          }t          |          dk    rV|                     |d         |d         |           t          j        |d         |d         j        |d         |          |d<   dS t          j        |d         |d         j        d|          |d<   dS )zS message_member : type ID
                           | type ID EQ constant
        r   r  r   r   N)r:   r   r  r   r   r   )r%   r  r@   s      r+   p_message_memberzCLADParser.p_message_member  s     ((A..q66A::221Q41uEEE(!!	!	 AaDDD (!!		 AaDDDr-   c           	         |d         dk    r|d         j         }nd}t          j        |d         j        |d         j        ||                     |d                    }t          j        |d         |d|                     |d                    |d<   |                     |d         |d         j        |d         j                   dS )	z message_variable_array_member : type ID LSQ builtin_int_type RSQ
                                          | type ID LSQ builtin_int_type COLON int_constant RSQ
           :r(  Nr   r  r   r   )r~   r   VariableArrayTyper   r:   r   r  )r%   r  r  r   s       r+   p_message_variable_array_memberz*CLADParser.p_message_variable_array_member  s     Q43;;1JJJ$QqTY!	:tG_G_`acdGeGeff$QqT4t7O7OPQST7U7UVV!))!A$!	1Q49EEEEEr-   c           	         t          |d         j        t                    sY|d         j        dk     rH|                     d                    |d         j                  |                     |d                     t          j        |d         j        |d         j        |                     |d                    }t          j	        |d         |d|                     |d                    |d<   dS )z message_fixed_array_member : type ID LSQ int_constant RSQ
                                       | type ID LSQ string_constant RSQ
        r  r   %Array index must be positive, got {0}r   r   N)
r   r~   r   r   rO   r:   r   FixedArrayTyper   r   r%   r  r   s      r+   p_message_fixed_array_memberz'CLADParser.p_message_fixed_array_member  s     !A$*c** 	>qtzA~~ELLQqTZXX"66q!<<> > >!!A$)QqTZ9Q9QRSUV9W9WXX$QqT4t7O7OPQST7U7UVV!r-   c           
         |d         dk    }|rdnd}t          j        |d|z            |d|z            j        |d|z            ||                     |d          |                                           }t          j        |j        ||                     |d                    }|                     |d|           ||d<   | j        	                    |           dS )aS   enum_decl : ENUM builtin_type ID LBRACE enum_member_list RBRACE
                      | ENUM builtin_type ID LBRACE enum_member_list COMMA RBRACE
                      | ENUM NO_CPP_CLASS builtin_type ID LBRACE enum_member_list RBRACE
                      | ENUM NO_CPP_CLASS builtin_type ID LBRACE enum_member_list COMMA RBRACE
        r   no_cpp_classr   r   r)  r<  N)
r   EnumDeclr   r:   r   DefinedTyper   r   rl   rF   )r%   r  	cpp_classindex_offsetr   r   s         r+   p_enum_declzCLADParser.p_enum_decl  s     qT^+	%,qq1|Aan-q</@/Eq<GX% 44Q:: 7799; ; ODItT5M5MaQR5S5STT	q!Y'''!%%%%%r-   c                     t          |          dk    r,t          j        |d         g|d         j                  |d<   dS |d                             |d                   |d<   dS )zj enum_member_list : enum_member
                             | enum_member_list COMMA enum_member
        r   r   r   r)  N)r   r   EnumMemberListr@   rF   r  s     r+   p_enum_member_listzCLADParser.p_enum_member_list  sZ     q66Q;;%qtfadj99AaDDDQ4;;qt$$AaDDDr-   c                     t          |          dk    r|d         nd}t          j        |d         ||                     |d                    |d<   dS )zw enum_member : ID
                        | ID EQ int_constant
                        | ID EQ string_constant
        r  r)  Nr   r   )r   r   
EnumMemberr:   )r%   r  r~   s      r+   p_enum_memberzCLADParser.p_enum_member  sN    
 A!!~adE4+C+CAq+I+IJJ!r-   c                     |d         |d<   dS )zK union_decl_begin : UNION
                             | AUTOUNION
        r   r   Nr   r  s     r+   p_union_decl_beginzCLADParser.p_union_decl_begin  r2  r-   c                 F   |d         dk    }|d         dk    }|rdnd}t          |          d|z   k    r|d|z            nd}t          j        |d|z            ||                     |d          |                                 ||          }||d<   t          |          dk    r|                     |d         d	           | j                            |           t          j        |d         j	        |d         |d         j
                  }|                     |d|           dS )
a   union_decl : union_decl_begin ID LBRACE union_member_decl_list RBRACE
                       | union_decl_begin ID LBRACE union_member_decl_list COMMA RBRACE
                       | union_decl_begin ID LBRACE RBRACE
                       | union_decl_begin DUPES_ALLOWED ID LBRACE union_member_decl_list RBRACE
                       | union_decl_begin DUPES_ALLOWED ID LBRACE union_member_decl_list COMMA RBRACE
                       | union_decl_begin DUPES_ALLOWED ID LBRACE RBRACE
        r   r   r   	autounionr   r<  r  Nr   )r   r   	UnionDeclr:   r   r   rn   rF   r,  r   r@   r   )r%   r  r   r   indexOffsetr   r   r   s           r+   p_union_declzCLADParser.p_union_decl  s'    10!"1!4(/aaa*-a&&AkM*B*Ba+&&}Qq}-{!55a;;!88::3*	, , !q66A::""1Q4111  &&&!	1Q41<<q!T"""""r-   c                     t          |          dk    r,t          j        |d         g|d         j                  |d<   dS |d                             |d                   |d<   dS )z union_member_decl_list : union_member_decl
                                   | union_member_decl_list COMMA union_member_decl
        r   r   r   r)  Nr4  r  s     r+   p_union_member_decl_listz#CLADParser.p_union_member_decl_list  r6  r-   c                     |d         |d<   dS )z union_member_decl : union_member
                              | union_variable_array_member
                              | union_fixed_array_member
        r   r   Nr   r  s     r+   p_union_member_declzCLADParser.p_union_member_decl      
 t!r-   c                 B    t          |          |k    r||dz            S d S r<   )r   )r%   r  normal_lengths      r+   get_union_initializerz CLADParser.get_union_initializer  s(    q66M!!]Q&''4r-   c           	          t          j        |d         |d         j        |                     |d          |                     |d                    |d<   | j                            |d                    dS )zS union_member : type ID
                         | type ID EQ int_constant
        r   r   r)  r   N)r   r   r   r`  r:   ro   rF   r  s     r+   p_union_memberzCLADParser.p_union_member  st     $QqT%&qTY%)%?%?1%E%E%)%=%=a%C%CE E! 	  1&&&&&r-   c           	      &   |d         dk    r$|d         j         }|                     |d          }nd}|                     |d          }t          j        |d         j        |d         j        ||                     |d                    }t          j        |d         |||                     |d                    |d	<   |                     |d	         |d         j        |d         j                   | j        	                    |d	                    dS )
ao   union_variable_array_member : type ID LSQ builtin_int_type RSQ
                                        | type ID LSQ builtin_int_type COLON int_constant RSQ
                                        | type ID LSQ builtin_int_type RSQ EQ int_constant
                                        | type ID LSQ builtin_int_type COLON int_constant RSQ EQ int_constant
        r<  r=  r(     Nr   r  r   r   )
r~   r`  r   r>  r   r:   r   r  ro   rF   )r%   r  r  r}   r   s        r+   p_union_variable_array_memberz(CLADParser.p_union_variable_array_member#  s     Q43;;1J44Q::KKJ44Q::K$QqTY!	:tG_G_`acdGeGeff$QqT4d>V>VWXZ[>\>\]]!))!A$!	1Q49EEE  1&&&&&r-   c           	         |d         j         dk     rH|                     d                    |d         j                   |                     |d                     t	          j        |d         j        |d         j         |                     |d                    }t	          j        |d         ||                     |d          |                     |d                    |d<   | j	        
                    |d                    dS )z union_fixed_array_member : type ID LSQ int_constant RSQ
                                     | type ID LSQ int_constant RSQ EQ int_constant
        r  r   rA  r   r   r(  N)r~   r   rO   r:   r   rB  r   r   r`  ro   rF   rC  s      r+   p_union_fixed_array_memberz%CLADParser.p_union_fixed_array_member5  s     Q4:>>ELLQqTZXX"66q!<<> > >!!A$)QqTZ9Q9QRSUV9W9WXX$QqT41K1KAq1Q1QSWSkSklmopSqSqrr!  1&&&&&r-   c           
      *   t          j        |d         |d         |d         |d         |                     |d          |                                           }||d<   |                     |d         d           | j                            |           dS )	zb enum_concept_decl : ENUM_CONCEPT type ID LSQ ID RSQ LBRACE enum_concept_decl_list RBRACE
        r)  r   r<  rd  r   r   r   N)r   EnumConceptDeclr:   r   r   rp   rF   )r%   r  r   s      r+   p_enum_concept_declzCLADParser.p_enum_concept_decl@  s     "1Q41qtQqT$($<$<Q$B$B$($?$?$A$AC C !qt^444""4(((((r-   c                     t          |          dk    r,t          j        |d         g|d         j                  |d<   dS |d                             |d                   |d<   dS )z enum_concept_decl_list : enum_concept_member
                                   | enum_concept_decl_list COMMA enum_concept_member
        r   r   r   r)  N)r   r   EnumConceptMemberListr@   rF   r  s     r+   p_enum_concept_decl_listz#CLADParser.p_enum_concept_decl_listM  r6  r-   c                 x    t          j        |d         |d         |                     |d                    |d<   dS )z. enum_concept_member : ID EQ constant
        r   r)  r   N)r   EnumConceptMemberr:   r  s     r+   p_enum_concept_memberz CLADParser.p_enum_concept_memberV  s8     $QqT1Q41I1I!Q1O1OPP!r-   c                     |d         |d<   dS )z> type : string_type
                 | non_array_type
        r   r   Nr   r  s     r+   p_typezCLADParser.p_type[  r2  r-   c                    t          |          dk    r|d         j        }nd}t          |          dk    rd}n|d         j        j        }|t          j        vr=|                     d                    |          |                     |d                     t	          j	        t          j        |         j
        ||                     |d                    }t	          j        ||j                  |d<   dS )	z string_type : STRING
                        | STRING LSQ type RSQ
                        | STRING LSQ type COLON int_constant RSQ
        r<  Nr   uint_8r)  z%{0} is not a valid string length typer   r   )r   r~   r   r   r   string_typesr   rO   r:   PascalStringTyper  TypeReferencer@   )r%   r  r  r  string_types        r+   p_string_typezCLADParser.p_string_typea  s    
 q66A::1JJJq66Q;;"KKA$).Kc...ELL[YY"66q!<<> > >*[)5$$Q**, ,  k.?@@!r-   c                     |d         |d<   dS )zR non_array_type : builtin_type
                           | declared_type
        r   r   Nr   r  s     r+   p_non_array_typezCLADParser.p_non_array_typex  r2  r-   c                     |d         |d<   dS )zW builtin_type : builtin_float_type
                         | builtin_int_type
        r   r   Nr   r  s     r+   p_builtin_typezCLADParser.p_builtin_type~  r2  r-   c                     t          j        t           j        |d                  |                     |d                    |d<   dS )zQ builtin_float_type : FLOAT_32
                               | FLOAT_64
        r   r   Nr   rw  r  r:   r  s     r+   p_builtin_float_typezCLADParser.p_builtin_float_type  s<      !21Q4!8$:R:RSTVW:X:XYY!r-   c                     t          j        t           j        |d                  |                     |d                    |d<   dS )aS   builtin_int_type : INT_8
                             | INT_16
                             | INT_32
                             | INT_64
                             | UINT_8
                             | UINT_16
                             | UINT_32
                             | UINT_64
                             | BOOL
        r   r   Nr  r  s     r+   p_builtin_int_typezCLADParser.p_builtin_int_type  s<      !21Q4!8$:R:RSTVW:X:XYY!r-   c                    |                      |d                   }|t          |t          j                  sb|                     d                    t          |          j        |                                          | 	                    |d                     t          j
        || 	                    |d                    |d<   dS |                     d|d         z  | 	                    |d                     dS )z declared_type : ID
        r   Nz{1} {0} is not a type.r   zUnknown type: %s)r   r   r   Typer   rO   typeofr   r   r:   rw  )r%   r  r   s      r+   p_declared_typezCLADParser.p_declared_type  s    ''!--=a** Q!!":"A"A&))BTVWVlVlVnVn"o"oqu  rJ  rJ  KL  NO  rP  rP  Q  Q  Q$Q(@(@A(F(FGGAaDDD01Q479Q9QRSUV9W9WXXXXXr-   c                     |d         |d<   dS )zn constant : int_constant
                     | float_constant
                     | string_constant
        r   r   Nr   r  s     r+   
p_constantzCLADParser.p_constant  r]  r-   c                     t          j        |d         j        |d         j        |                     |d                    |d<   dS )zO int_constant : INT_CONST_DEC
                         | INT_CONST_HEX
        r   r   N)r   IntConstr~   r   r:   r  s     r+   p_int_constantzCLADParser.p_int_constant  s;     |AaDJ!	43K3KAq3Q3QRR!r-   c                     t          j        |d         j        |d         j        |                     |d                    |d<   dS )z* float_constant : FLOAT_CONST_DEC
        r   r   N)r   
FloatConstr~   r   r:   r  s     r+   p_float_constantzCLADParser.p_float_constant  s<     ~adj!A$)T5M5MaQR5S5STT!r-   c                 t    t          j        |d         j        |                     |d                    |d<   dS )z* string_constant : STRING_LITERAL
        r   r   N)r   r   r~   r:   r  s     r+   p_string_constantzCLADParser.p_string_constant  s3     qtz4+C+CAq+I+IJJ!r-   c           	         |rf|                      d                    |j                  |                     |j        | j                            |j                                       d S |                      d| j        d                    d S )Nzbefore '{0}'zAt end of input.rB   )	r   rO   r~   r1   r2   r   r3   r4   r>   r  s     r+   p_errorzCLADParser.p_error  s     	Mn33AG<<"2218TZ=W=WXYX`=a=abbd d d d d 0$2G2KLLLLLr-   N)r   Fr   Fr   FF)rd   rd   r   )Ir   r   r   __doc__r,   rG   compilerI   r6   r:   r1   rU   rq   rs   rt   ru   rw   r   NodeVisitorr   rv   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r"  r%  r/  r1  r5  r8  r:  r?  rD  rK  rN  rQ  rS  rX  rZ  r\  r`  rb  re  rg  rj  rm  rp  rr  ry  r{  r}  r  r  r  r  r  r  r  r  r   r-   r+   r   r   '   sh         $*#%$'! '4 '4 '4 '4R 'BJ'JKK\ \ \t t t  
& & &P(! (! (! (!T* * *XY Y Yv75 75 75x/ / /: : : : :co : : :"  ) ) )
 
 
  . . .. . .  ; ; ;/ / /
% % %	. 	. 	., , ,0 0 0H  
% % %        	 	 	 #  #  #D  % % %    *F F FW W W& & &(% % %K K K  # # #:% % %    ' ' '' ' '$	' 	' 	') ) )% % %Q Q Q
  A A A.    Z Z ZZ Z Z	Y 	Y 	Y  S S SU U U
K K K
M M M M Mr-   r   )r  
__future__r   r   r=   os.pathrK   rG   r   plyr   rd   r   r   r   	plyparserr	   r
   r   rL   dirnamerealpath__file__r!   r   r   r-   r+   <module>r     s  "  ' & & & & & % % % % % %   				                 " " " " " " 3 3 3 3 3 3 3 3 3 37??27++H5566WM WM WM WM WM WM WM WM WM WMr-   