§
    ]ö6iø™  ã                   óú   — 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           úN/home/metal/girl-os/anki/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,   € Ø×#Ò# E¤L°$´*×2LÒ2LÈUÌ\Ñ2ZÔ2ZÑ[Ô[Ð[r-   c                 óª   — |                       |                     |¦  «        | j                             |                     |¦  «        ¦  «        ¦  «        S r/   r0   )r%   Ú
productionÚindexs      r+   Úproduction_to_coordzCLADParser.production_to_coordY   sF   € Ø×#Ò# J×$5Ò$5°eÑ$<Ô$<¸d¼j×>XÒ>XÐYc×YjÒYjÐkpÑYqÔYqÑ>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|
} nHŒFt          | 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:  € Ø—’ Ñ%Ô%ˆØð 	)�U˜2”Yð 	) 5¨¤9¨R¤=°DÒ#8Ð#8Ø˜bœ	 DÑ(ˆE�"‰IØˆØˆØð 	ñ 	ˆDØÔ!×(Ò(­¨x¸ÀFÑ)KÔ)KÑLÔLÐLÝ”˜Ô3°TÑ:Ô:ˆAØñ ,Ø$%§G¢G¨A¡J¤JÐ!Ø'+Ô'>ð bð b�OÝ-/¬W¯\ª\¸/ÐK\Ñ-]Ô-]Ð*Ý”w—~’~Ð&<Ñ=Ô=ð Ø1@Ð.Ø˜ðõ % TÔ%:¸2Ô%>Ø%h×%oÒ%oØ(9¸6¿;º;ÀtÔG^Ñ;_Ô;_ñ&aô &añbô bð bð ×%Ò% e¨d¡lÑ3Ô3Ð3ðTÝÐ4°cÑ:Ô:ð (¸aØ Ÿvšv™xœx˜ð(ð (ð (ñ (ô (ð (ð (ð (ð (ð (ð (øøøð (ð (ð (ð (øøåð Tð Tð TÝ$ TÔ%:¸2Ô%>Ø%R×%YÒ%YØ(9Ð;Qñ&Sô &SñTô Tð TøøøøðTøøøð ×%Ò%Ð&:×&AÒ&AÐBSÑ&TÔ&TÑUÔUÐUØÔ%×,Ò,­U°8¸YÈÑ-OÔ-OÑPÔPÐPØ—7’7˜1‘:”: TÔ%9Ð9Ð9ØÔ(×/Ò/Ð0AÑBÔBÐBØ"×)Ò)¨$¯/ª/¸$Ð@QÐSiÑ*jÔ*jÑkÔkÐkØ×%Ò% eÑ,Ô,Ð,ØÔ%×,Ò,­U°8¸YÈÑ-OÔ-OÑPÔPÐPÐPà×%Ò% dÑ+Ô+Ð+Ø�a‰KˆF‰FØÐ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  € ð $(ˆÔ Ý"™fœfˆÔØ"& ˆÔàˆÔØ ˆÔØˆÔØˆÔØ ˆÔà!ˆÔØ "ˆÔØŸš §¢°°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Ø"Ô.Ô4�EàÔ)Ô.°%Ò7Ð7Ý # E¡
¤
˜Ø $˜õ " %­Ñ-Ô-ð "Ø$)˜	Ø !˜å! %­Ñ-Ô-ð 1°tÔ7HÔ7LÐPUÐ7nÐ7nÒ7nÐ7nÐY]ÔYjÔYnÒ7nÐ7nÐ7nÐ7nÝ$ØœØQ×XÒXØ×1Ò1Ñ3Ô3ØœØÔ)Ô.ñ0ô 0ñ1ô 1ð 1ð Ð(Ø9>À!º¸˜xŸš¨uÑ5Ô5Ð5È�HØ#,¨xÑ#7�F”L�Là#(�F”Là9>ÐP˜VÔ/Ô5Ð5ÀFÄL�
Ø Ð+Ð+Ø*.�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ñ %	6ˆKà×1Ò1Ñ3Ô3ñ 7Ø#Ô)�àÔ*Ð2Ý.1Ô.GÈÈEÑ.RÔ.R�KÔ+å™œ�Ø$(Ô$7ð 	<ð 	<�LØ#Ô(¨EÐ1Ð1Ý(Ø'Ô-Øl×sÒsØ'×<Ò<Ñ>Ô>Ø(Ô-Ø! ,Ô"3Ô4×IÒIÑKÔKØ(×=Ò=Ñ?Ô?ñ	Aô AñBô Bð Bð 0<�E˜,Ô+Ñ,Ð,õ %)¡F¤FÐ!Ø)×1Ò1Ñ3Ô3ð <ð <�FØ5;Ð% f¤kÑ2Ð2å09¸$Ô:MÑ0NÔ0Nð 7ð 7Ñ,�J Ø#Ô(Ð0AÐAÐAÝ"Ô4°\Ô5FÈÐVZÐ\aÑbÔb˜Ø#Ô/×6Ò6°tÑ<Ô<Ð<ØÔ)×0Ò0°Ñ6Ô6Ð6øàÔ(ð 6Ø)×1Ò1Ñ3Ô3ð 2ð 2�FØ,1�FÔ)Ð)Ý%Ô2°;×3FÒ3FÑ3HÔ3HÈAÐNÑNÔNð 6ð 6�DØ˜A”w”| t¨A¤w¤|Ò3Ð3Ø15˜˜QœÔ.Ø15˜˜QœÔ.øùð Ô&ð /	ñ /	ˆEÝ‘v”vˆHÝ™œˆIØˆEØŸ-š-™/œ/ð +ñ +�à”; (Ð*Ð*Ý$ØœØZ×aÒaØ×2Ò2Ñ4Ô4ØœØ  ¤Ô-Ô2×GÒGÑIÔIØœ×8Ò8Ñ:Ô:ñ	<ô <ñ=ô =ð =ð )/�˜œÑ%à”;ð .Ø"œKÔ-�EàÔ.Ô2°eÐYÐYÒYÐY¸uÔ?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°! q¤vÐ&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Ð#Q¨q A¤FÐ#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	5ˆLð "&ÐØ!Ô-ð ð �	Ø”> \Ô%6Ò6Ð6Ø)2Ð&Ø�Eð 7ð "Ð)Ý Ø Ô&ØD×KÒKØ$Ô)Ø$Ô)ñ+ô +ñ,ô ,ð ,õ $'Ð&NÐ&N°|×7KÒ7KÑ7MÔ7MÐ&NÑ&NÔ&NÑ#NÔ#NÐ Ý #Ð#QÐ#QÐ4F×4NÒ4NÑ4PÔ4PÐ#QÑ#QÔ#QÑ QÔ QÐå"&Ð';Ð>OÑ'OÑ"PÔ"PÐÝ#Ð$5Ð8LÑ$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ð 	5�FÝ! &¤,µ´Ñ@Ô@ð !Ø ØœÔ*¨\Ô-EÔ-JÔ-NÒNÐNÐTZÔT`ÔTfÐiuô  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   € Ø%ˆDŒMˆMˆMr-   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Ø�LŠL˜ÑÔÐØ”?Ð"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Ð5 dÐ5Ð5Ð5¨fÐ5Ð5Ð5Ø ×3Ò3°DÑ9Ô9ˆDŒMˆMˆMr-   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à �>�>Ø�t�tØ�)”ˆAˆAØˆ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ÑBÀXÑM�Ø×EÒEÀhÑOÔOˆAØˆ}Ø�ØÐ ØØ!Ô+ˆ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ð 	5ˆIØ Ð-Ð-å  Ô!4Ø!8×!?Ò!?ÀÑ!OÔ!OñQô Qð Qà)¨)Ô4ˆMˆMØ(¨Ô,ˆØ -Ð/Ð/Ý-1©V¬VˆM˜/Ñ*Ø˜_Ô-Ð-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ÒOÐPdÑeÔeˆØŒ;˜/Ð)Ð)Ý˜T×5Ò5°jÀ%Ñ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Ò2°5Ñ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Š   € Ý‘f”fˆØ—l’l‘n”nð 	.ð 	.ˆ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ÒpÐqwÔq|Ñ}Ô}Ø$œ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Ò"MÈoÔNbÔNgÐitÔizÑ"{Ô"{Ø".ñ0ô 0ð 0àÔÔ$­Ô(?Ð?Ð?ØÔ&ð 0Ø×!Ò!Ð"G×"NÒ"NÈÔOcÔOhÐjuÔj{Ñ"|Ô"|Ø".ñ0ô 0ð 0àÔ Ô$Ð0°Ô7KÔ7OÐR]ÔRcÒ7cÐ7cØ×ÒÐX×_Ò_Ð`kÔ`qð  tCô  tHô  tLð  N]ô  Nbô  Ngñ  hô  hØ*ñ,ô ,ð ,àÔ Ô$Ð0°Ô7KÔ7OÐR]ÔRcÒ7cÐ7cØ×ÒÐW×^Ò^Ð_jÔ_pð  sBô  sGô  sKð  M\ô  Maô  Mfñ  gô  gØ*ñ,ô ,ð ,àÔ Ô%¨Ò/Ð/Ø!Ô&Ô*Ð6¸[Ô=NÐRaÔRfÔRjÒ=jÐ=jØ!Ô&Ô*Ð6¸[Ô=NÐRaÔRfÔRjÒ=jÐ=jØ×!Ò!Ð"I×"PÒ"PÐQ`ÔQeÔQjÑ"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   € õ ˆq‰6Œ6�QŠ;ˆ;Ý”<  1¤ ¨¨!¬¬
Ñ3Ô3ˆAˆa‰DˆDˆDà�Q”4—;’;˜q œtÑ$Ô$ˆAˆa‰DˆDˆDr-   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”$ˆÝˆq‰6Œ6�QŠ;ˆ;Ø ! !¤ˆ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   € õ ”o a¨¤d¨1¨R¨4¤j°$¸×8PÒ8PÐQRÐTUÑ8VÔ8VÑ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;   € ð �a”Dˆ	Ø œ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Ò*BÀ1ÀaÑ*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Ð&>Ò>Ðð #ð 	Ø�EŠE�!‰HŒHˆHåˆq‰6Œ6�QŠ;ˆ;Ø˜”dˆGˆGåÔ/°°D×4LÒ4LÈQÐPQÑ4RÔ4RÑSÔSˆGà˜”t˜{Ò*ˆÝŒ˜q œt WØ#×7Ò7¸¸1Ñ=Ô=Ø#×:Ò:Ñ<Ô<Ø+Ø2ñ	4ô 4ˆˆ!‰ð 	×Ò˜q œt Q q¤TÑ*Ô*Ð*åÔ  !¤¤	¨1¨Q¬4°°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   € õ ˆq‰6Œ6�QŠ;ˆ;ÝÔ,¨a°¬d¨V°Q°q´T´ZÑ@Ô@ˆAˆa‰DˆDˆDà�Q”4—;’;˜q œtÑ$Ô$ˆAˆa‰DˆDˆDr-   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Ñ.Ô.ˆÝˆq‰6Œ6�AŠ:ˆ:Ø×2Ò2°1°Q´4¸¸1¼¸uÑEÔEÐEÝÔ(Ø�!”Ø�!””	Ø�!”Øñ	ô ˆAˆa‰DˆDˆDõ Ô(Ø�!”Ø�!””	ØØñ	ô ˆAˆa‰DˆDˆDr-   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µ   € ð ˆQŒ4�3Š;ˆ;Ø˜1œœˆJˆJàˆJåÔ$ Q q¤T¤Y°°!´´	¸:Àt×G_ÒG_Ð`aÐcdÑGeÔGeÑfÔfˆÝÔ$ Q q¤T¨4°°t×7OÒ7OÐPQÐSTÑ7UÔ7UÑVÔVˆˆ!‰Ø×)Ò)¨!¨A¬$°°!´´	¸1¸Q¼4¼9Ñ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°¬t¬z¸Aª~¨~Ø×ÒÐE×LÒLÈQÈqÌTÌZÑXÔXØ"×6Ò6°q¸!Ñ<Ô<ñ>ô >ð >åÔ! ! A¤$¤)¨Q¨q¬T¬Z¸×9QÒ9QÐRSÐUVÑ9WÔ9WÑXÔXˆÝÔ$ Q q¤T¨4°°t×7OÒ7OÐPQÐSTÑ7UÔ7UÑ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Þ   € ð �q”T˜^Ò+ˆ	Ø%Ð,�q�q¨1ˆåŒ|˜A˜a ™nÔ-¨q°°<±Ô/@Ô/EÀqÈÈ<ÉÔGXØ%Ø ×4Ò4°Q¸Ñ:Ô:Ø ×7Ò7Ñ9Ô9ñ;ô ;ˆõ ”O D¤I¨t°T×5MÒ5MÈaÐQRÑ5SÔ5SÑ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   € õ ˆq‰6Œ6�QŠ;ˆ;ÝÔ% q¨¤t f¨a°¬d¬jÑ9Ô9ˆAˆa‰DˆDˆDà�Q”4—;’;˜q œtÑ$Ô$ˆAˆa‰DˆDˆDr-   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 œd E¨4×+CÒ+CÀAÀqÑ+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ÐØ(Ð/�a�a¨aˆå*-¨a©&¬&°A°k±MÒ*BÐ*B�a˜˜+™Ô&Ð&ÈˆÝŒ}˜Q˜q ™}Ô-¨{Ø!×5Ò5°a¸Ñ;Ô;Ø!×8Ò8Ñ:Ô:Ø3Ø*ñ	,ô ,ˆð ˆˆ!‰åˆq‰6Œ6�AŠ:ˆ:Ø×"Ò" 1 Q¤4¨Ñ1Ô1Ð1àÔ× Ò  Ñ&Ô&Ð&ÝÔ  !¤¤	¨1¨Q¬4°°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(   € Ýˆq‰6Œ6�MÒ!Ð!Ø�] 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   € õ Ô$ Q q¤TØ%& q¤T¤YØ%)×%?Ò%?ÀÀ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ú   € ð ˆQŒ4�3Š;ˆ;Ø˜1œœˆJØ×4Ò4°Q¸Ñ:Ô:ˆKˆKàˆJØ×4Ò4°Q¸Ñ:Ô:ˆKåÔ$ Q q¤T¤Y°°!´´	¸:Àt×G_ÒG_Ð`aÐcdÑGeÔGeÑfÔfˆÝÔ$ Q q¤T¨4°¸d×>VÒ>VÐWXÐZ[Ñ>\Ô>\Ñ]Ô]ˆˆ!‰Ø×)Ò)¨!¨A¬$°°!´´	¸1¸Q¼4¼9Ñ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é   € ð ˆQŒ4Œ:˜Š>ˆ>Ø×ÒÐE×LÒLÈQÈqÌTÌZÑXÔXØ"×6Ò6°q¸!Ñ<Ô<ñ>ô >ð >åÔ! ! A¤$¤)¨Q¨q¬T¬Z¸×9QÒ9QÐRSÐUVÑ9WÔ9WÑXÔXˆÝÔ$ Q q¤T¨4°×1KÒ1KÈAÈqÑ1QÔ1QÐSW×SkÒSkÐlmÐopÑSqÔSqÑ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”   € õ Ô" 1 Q¤4¨¨1¬¨q°¬t°Q°q´TØ$(×$<Ò$<¸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   € õ Ô$ Q q¤T¨1¨Q¬4°×1IÒ1IÈ!ÈQÑ1OÔ1OÑ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ç   € õ
 ˆq‰6Œ6�AŠ:ˆ:Ø˜1œœˆJˆJàˆJåˆq‰6Œ6�QŠ;ˆ;Ø"ˆKˆKà˜Aœ$œ)œ.ˆKØ�cÔ.Ð.Ð.Ø×ÒÐE×LÒLÈ[ÑYÔYØ"×6Ò6°q¸!Ñ<Ô<ñ>ô >ð >åÔ*ÝÔ˜[Ô)Ô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<   € õ Ô ¥Ô!2°1°Q´4Ô!8¸$×:RÒ:RÐSTÐVWÑ: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<   € õ Ô ¥Ô!2°1°Q´4Ô!8¸$×:RÒ:RÐSTÐVWÑ: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Å&ÈÁ)Ä)ÔBTÐVW×VlÒVlÑVnÔVnÑ"oÔ"oÐqu÷  rJò  rJð  KLð  NOñ  rPô  rPñ  Qô  Qð  QÝÔ$ Q¨×(@Ò(@ÀÀAÑ(FÔ(FÑGÔGˆAˆa‰DˆDˆDà×ÒÐ0°1°Q´4Ñ7¸×9QÒ9QÐRSÐUVÑ9WÔ9WÑ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;   € õ Œ|˜A˜aœDœJ¨¨!¬¬	°4×3KÒ3KÈAÈqÑ3QÔ3QÑ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 œdœj¨!¨A¬$¬)°T×5MÒ5MÈaÐQRÑ5SÔ5SÑ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 œtœz¨4×+CÒ+CÀAÀqÑ+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Ò3°A´GÑ<Ô<Ø"×2Ò2°1´8¸T¼Z×=WÒ=WÐXYÔX`Ñ=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ð '4ðR '˜BœJÐ'JÑKÔKÐð\ð \ð \ðtð tð tðð ð ð
&ð &ð &ðP(!ð (!ð (!ð (!ðT*ð *ð *ðXYð Yð Yðv75ð 75ð 75ðx/ð /ð /ð:ð :ð :ð :ð :�c”oñ :ô :ð :ð"ð ð ð)ð )ð )ð
ð 
ð 
ðð ð ð.ð .ð .ð.ð .ð .ðð ð ð;ð ;ð ;ð/ð /ð /ð
%ð %ð %ð	.ð 	.ð 	.ð,ð ,ð ,ð0ð 0ð 0ðHð ð ð
%ð %ð %ðð ð ðð ð ðð ð ðð ð ð	ð 	ð 	ð #ð  #ð  #ð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�?Š?˜2œ7×+Ò+¨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-   