
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
Klfx              I   @   s  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 ddlm	Z	 dZ
dddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdOdNdPdQ4ZdRZdSZdTZdUZdVZdWZdXZdYZdZZd[Zd\Zd]Zd^Zd_Zd`ZdaZdbZdcZddZdedf Zdgdh Z didj Z!dkdl Z"dmdn Z#dodp Z$dqdr Z%dsdt Z&dudv Z'da(da)dwa*da+dxa,d	dydzZ-d{d| Z.d}d~ Z/dd Z0dd Z1dd Z2dd Z3dd Z4dd Z5dd Z6dd Z7dd Z8dd Z9dd Z:dd Z;dd Z<dd Z=dd Z>dd Z?dd Z@dd ZAdd ZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQddĄ ZRddƄ ZSddȄ ZTddʄ ZUdd̄ ZVdd΄ ZWddЄ ZXdd҄ ZYddԄ ZZddք Z[dd؄ Z\ddڄ Z]dd܄ Z^ddބ Z_dd Z`dd Zadd Zbdd Zcdd Zddd Zedd Zfdd Zgdd Zhdd Zidd Zjdd Zkdd Zldd Zmdd Zndd Zodapdaqdd  Zrd
ddZsdd ZtdddZudS (      N   )access)defaults)lex)	refpolicy)yaccTICKSQUOTEOBRACECBRACESEMICOLONOPARENCPARENCOMMAMINUSTILDEASTERISKAMPBAREXPLEQUALFILENAME
IDENTIFIERNUMBERPATH	IPV6_ADDRMODULEPOLICY_MODULEREQUIRESIDGENFSCONFS_USE_XATTRFS_USE_TRANSFS_USE_TASKPORTCONNODECONNETIFCONPIRQCONIOMEMCON	IOPORTCONPCIDEVICECONDEVICETREECONCLASSTYPEATTRIBUTEROLEATTRIBUTETYPE	ATTRIBUTEATTRIBUTE_ROLEALIAS	TYPEALIASBOOLTRUEFALSEIFELSEROLETYPESALLOW	DONTAUDIT
AUDITALLOW
NEVERALLOW
PERMISSIVE
TYPEBOUNDSTYPE_TRANSITIONTYPE_CHANGETYPE_MEMBERRANGE_TRANSITIONROLE_TRANSITION
OPT_POLICY	INTERFACETUNABLE_POLICYGEN_REQTEMPLATEGEN_CONTEXTIFELSEIFDEFIFNDEFDEFINE)4moduleZpolicy_moduleZrequireZsidZgenfsconfs_use_xattrfs_use_transfs_use_taskZportconZnodeconZnetifconZpirqconZiomemconZ	ioportconZpcideviceconZdevicetreeconclassZtypeattributeZroleattributetypeZ	attributeZattribute_rolealiasZ	typealiasbooltrueZfalseifelseroletypesZallow	dontaudit
auditallow
neverallowZ
permissiveZ
typeboundsZtype_transitiontype_changetype_memberZrange_transitionZrole_transitionZoptional_policy	interfaceZtunable_policyZgen_requiretemplateZgen_contextZifelseZifndefifdefZdefinez\`z\'z\{z\}z\;+z\:z\(z\)z\,z\-z\~z\*z\&z\|z\!z\=z[0-9\.]+z/[a-zA-Z0-9)_\.\*/\$]*z 	c             C   s   | S )z2[a-fA-F0-9]{0,4}:[a-fA-F0-9]{0,4}:([a-fA-F0-9]|:)* )trf   rf   /usr/lib/python3.6/refparser.pyt_IPV6_ADDR   s    ri   c             C   s   | j  jd7  _dS )zdnl.*\nr   N)lexerlineno)rg   rf   rf   rh   t_m4comment   s    rl   c             C   s   | j d dS )zdefine.*refpolicywarn\(.*\nr   N)skip)rg   rf   rf   rh   t_refpolicywarn1   s    rn   c             C   s   | j  jd7  _dS )zrefpolicywarn\(.*\nr   N)rj   rk   )rg   rf   rf   rh   t_refpolicywarn   s    ro   c             C   s   t j| jd| _| S )z#[a-zA-Z_\$][a-zA-Z0-9_\-\+\.\$\*~]*r   )reservedgetvaluerV   )rg   rf   rf   rh   t_IDENTIFIER   s    rs   c             C   s   t j| jd| _| S )z\"[a-zA-Z0-9_\-\+\.\$\*~ :]+\"r   )rp   rq   rr   rV   )rg   rf   rf   rh   
t_FILENAME  s    rt   c             C   s   | j  jd7  _dS )z\#.*\nr   N)rj   rk   )rg   rf   rf   rh   	t_comment  s    ru   c             C   s    t d| jd   | jd d S )NzIllegal character '%s'r   r   )printrr   rm   )rg   rf   rf   rh   t_error  s    rw   c             C   s   | j  jt| j7  _dS )z\n+N)rj   rk   lenrr   )rg   rf   rf   rh   	t_newline  s    ry    Tc             C   sX   | d krd S xF| D ]>}|d kr q||_ |d k	rB|jjd||f q|jjd| qW d S )Nr   )parentchildreninsert)Zstmtsr{   valsrf   rf   rh   collect-  s    
r   c             C   s8   x2| D ]*}t j|r&|jt j| q|j| qW d S )N)sptZhas_keyupdateZby_nameadd)Zidsr   idrf   rf   rh   expand9  s    

r   c             C   sN   t | dkr&| d r&tjj| d  n$t | dkrJ| d rJtjj| d  dS )z^statements : statement
                  | statements statement
                  | empty
       r   N)rx   mr|   append)prf   rf   rh   p_statementsA  s    r   c             C   s   | d | d< dS )zstatement : interface
                 | template
                 | obj_perm_set
                 | policy
                 | policy_module_stmt
                 | module_stmt
    r   r   Nrf   )r   rf   rf   rh   p_statementK  s    r   c             C   s   dS )zempty :Nrf   )r   rf   rf   rh   p_emptyU  s    r   c             C   s.   t j }| d |_| d |_d|_ || d< dS )zHpolicy_module_stmt : POLICY_MODULE OPAREN IDENTIFIER COMMA NUMBER CPAREN      Tr   N)r   ModuleDeclarationnameversion)r   r   rf   rf   rh   p_policy_module_stmt`  s
    

r   c             C   s(   t j| d }t| d | || d< dS )zainterface : INTERFACE OPAREN TICK IDENTIFIER SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN
          r   N)r   	Interfacer   )r   xrf   rf   rh   p_interfaceh  s    r   c             C   s(   t j| d }t| d | || d< dS )ztemplate : TEMPLATE OPAREN TICK IDENTIFIER SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN
                | DEFINE OPAREN TICK IDENTIFIER SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN
    r   r   r   N)r   ZTemplater   )r   r   rf   rf   rh   
p_templateo  s    r   c             C   s   d| d< dS )z4define : DEFINE OPAREN TICK IDENTIFIER SQUOTE CPARENNr   rf   )r   rf   rf   rh   p_definew  s    r   c             C   sz   t | dkr"| d r"| d | d< nTt | dkrv| d sL| d rv| d | d< n*| d sb| d | d< n| d | d  | d< dS )zlinterface_stmts : policy
                       | interface_stmts policy
                       | empty
    r   r   r   N)rx   )r   rf   rf   rh   p_interface_stmts~  s    r   c             C   sF   t j }t| d |dd t| dkr8t| d |dd |g| d< dS )	zoptional_policy : OPT_POLICY OPAREN TICK interface_stmts SQUOTE CPAREN
                       | OPT_POLICY OPAREN TICK interface_stmts SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN
    r   T)r~      r   Fr   N)r   ZOptionalPolicyr   rx   )r   orf   rf   rh   p_optional_policy  s
    r   c             C   sP   t j }| d |_t| d |dd t| dkrBt| d |dd |g| d< d	S )
ztunable_policy : TUNABLE_POLICY OPAREN TICK cond_expr SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN
                      | TUNABLE_POLICY OPAREN TICK cond_expr SQUOTE COMMA TICK interface_stmts SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN
    r   r   T)r~         Fr   N)r   ZTunablePolicy	cond_exprr   rx   )r   r   rf   rf   rh   p_tunable_policy  s    
r   c             C   s   dS )a  ifelse : IFELSE OPAREN TICK IDENTIFIER SQUOTE COMMA COMMA TICK IDENTIFIER SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN optional_semi
              | IFELSE OPAREN TICK IDENTIFIER SQUOTE COMMA TICK IDENTIFIER SQUOTE COMMA TICK interface_stmts SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN optional_semi
              | IFELSE OPAREN TICK IDENTIFIER SQUOTE COMMA TICK SQUOTE COMMA TICK interface_stmts SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN optional_semi
    Nrf   )r   rf   rf   rh   p_ifelse  s    r   c             C   sb   t j| d }| d dkr d}nd}t| d ||d t| dkrTt| d |dd |g| d	< d
S )aJ  ifdef : IFDEF OPAREN TICK IDENTIFIER SQUOTE COMMA TICK statements SQUOTE CPAREN optional_semi
             | IFNDEF OPAREN TICK IDENTIFIER SQUOTE COMMA TICK statements SQUOTE CPAREN optional_semi
             | IFDEF OPAREN TICK IDENTIFIER SQUOTE COMMA TICK statements SQUOTE COMMA TICK statements SQUOTE CPAREN optional_semi
    r   r   re   TFr   )r~   r   r   N)r   ZIfDefr   rx   )r   r   vrf   rf   rh   p_ifdef  s    r   c             C   s8   t j| d d}t| dkr,|jj| d  || d< dS )zinterface_call : IDENTIFIER OPAREN interface_call_param_list CPAREN
                      | IDENTIFIER OPAREN CPAREN
                      | IDENTIFIER OPAREN interface_call_param_list CPAREN SEMIr   )Zifnamer   r   r   N)r   ZInterfaceCallrx   argsextend)r   irf   rf   rh   p_interface_call  s    r   c             C   s6   t | dkr| d | d< n| d d| d  g| d< dS )zinterface_call_param : IDENTIFIER
                            | IDENTIFIER MINUS IDENTIFIER
                            | nested_id_set
                            | TRUE
                            | FALSE
                            | FILENAME
    r   r   r   -r   N)rx   )r   rf   rf   rh   p_interface_call_param  s    
r   c             C   s6   t | dkr| d g| d< n| d | d g | d< dS )zinterface_call_param_list : interface_call_param
                                 | interface_call_param_list COMMA interface_call_param
    r   r   r   r   N)rx   )r   rf   rf   rh   p_interface_call_param_list  s    r   c             C   s$   t j| d }| d |_|| d< dS )zRobj_perm_set : DEFINE OPAREN TICK IDENTIFIER SQUOTE COMMA TICK names SQUOTE CPARENr   r   r   N)r   Z
ObjPermSetperms)r   r   rf   rf   rh   p_obj_perm_set  s    
r   c             C   s   | d | d< dS )zpolicy : policy_stmt
              | optional_policy
              | tunable_policy
              | ifdef
              | ifelse
              | conditional
    r   r   Nrf   )r   rf   rf   rh   p_policy  s    r   c             C   s   | d r| d g| d< dS )a  policy_stmt : gen_require
                   | avrule_def
                   | typerule_def
                   | typebound_def
                   | typeattribute_def
                   | roleattribute_def
                   | interface_call
                   | role_def
                   | role_allow
                   | permissive
                   | type_def
                   | typealias_def
                   | attribute_def
                   | attribute_role_def
                   | range_transition_def
                   | role_transition_def
                   | bool
                   | define
                   | initial_sid
                   | genfscon
                   | fs_use
                   | portcon
                   | nodecon
                   | netifcon
                   | pirqcon
                   | iomemcon
                   | ioportcon
                   | pcidevicecon
                   | devicetreecon
    r   r   Nrf   )r   rf   rf   rh   p_policy_stmt  s    r   c             C   s.   t j }| d |_| d |_d|_ || d< dS )z+module_stmt : MODULE IDENTIFIER NUMBER SEMIr   r   Fr   N)r   r   r   r   )r   r   rf   rf   rh   p_module_stmt  s
    

r   c             C   s   dS )zlgen_require : GEN_REQ OPAREN TICK requires SQUOTE CPAREN
                   | REQUIRE OBRACE requires CBRACENrf   )r   rf   rf   rh   p_gen_require!  s    r   c             C   s   dS )zsrequires : require
                | requires require
                | ifdef
                | requires ifdef
    Nrf   )r   rf   rf   rh   
p_requires)  s    r   c             C   s   dS )zrequire : TYPE comma_list SEMI
               | ROLE comma_list SEMI
               | ATTRIBUTE comma_list SEMI
               | ATTRIBUTE_ROLE comma_list SEMI
               | CLASS comma_list SEMI
               | BOOL comma_list SEMI
    Nrf   )r   rf   rf   rh   	p_require1  s    r   c             C   sH   t j }| d |_| d |_| d |_t| dkr<| d |_|| d< dS )zsecurity_context : IDENTIFIER COLON IDENTIFIER COLON IDENTIFIER
                        | IDENTIFIER COLON IDENTIFIER COLON IDENTIFIER COLON mls_range_defr   r   r      r   r   N)r   ZSecurityContextuserr\   rV   rx   level)r   r   rf   rf   rh   p_security_context;  s    



r   c             C   s   | d }| d |_ || d< dS )zQgen_context : GEN_CONTEXT OPAREN security_context COMMA mls_range_def CPAREN
    r   r   r   N)r   )r   r   rf   rf   rh   p_gen_contextH  s    
r   c             C   s   | d | d< dS )z<context : security_context
               | gen_context
    r   r   Nrf   )r   rf   rf   rh   	p_contextS  s    r   c             C   s(   t j }| d |_| d |_|| d< dS )z$initial_sid : SID IDENTIFIER contextr   r   r   N)r   Z
InitialSidr   context)r   r   rf   rf   rh   p_initial_sidY  s    

r   c             C   s2   t j }| d |_| d |_| d |_|| d< dS )z+genfscon : GENFSCON IDENTIFIER PATH contextr   r   r   r   N)r   ZGenfsCon
filesystempathr   )r   grf   rf   rh   
p_genfscon`  s
    


r   c             C   sn   t j }| d dkr t jj|_n.| d dkr8t jj|_n| d dkrNt jj|_| d |_| d |_|| d< dS )	zfs_use : FS_USE_XATTR IDENTIFIER context SEMI
              | FS_USE_TASK IDENTIFIER context SEMI
              | FS_USE_TRANS IDENTIFIER context SEMI
    r   rR   rT   rS   r   r   r   N)r   ZFilesystemUseZXATTRrV   ZTASKZTRANSr   r   )r   frf   rf   rh   p_fs_usej  s    


r   c             C   s`   t j }| d |_t| dkr4| d |_| d |_n | d d | d  |_| d |_|| d< dS )zkportcon : PORTCON IDENTIFIER NUMBER context
               | PORTCON IDENTIFIER NUMBER MINUS NUMBER contextr   r   r   r   r   r   N)r   ZPortConZ	port_typerx   Zport_numberr   )r   crf   rf   rh   	p_portcon|  s    


r   c             C   s2   t j }| d |_| d |_| d |_|| d< dS )zanodecon : NODECON NUMBER NUMBER context
               | NODECON IPV6_ADDR IPV6_ADDR context
    r   r   r   r   N)r   ZNodeConstartendr   )r   nrf   rf   rh   	p_nodecon  s
    


r   c             C   s2   t j }| d |_| d |_| d |_|| d< dS )z.netifcon : NETIFCON IDENTIFIER context contextr   r   r   r   N)r   ZNetifConrc   Zinterface_contextZpacket_context)r   r   rf   rf   rh   
p_netifcon  s
    


r   c             C   s(   t j }| d |_| d |_|| d< dS )z pirqcon : PIRQCON NUMBER contextr   r   r   N)r   ZPirqConZpirq_numberr   )r   r   rf   rf   rh   	p_pirqcon  s    

r   c             C   sV   t j }t| dkr*| d |_| d |_n | d d | d  |_| d |_|| d< dS )zYiomemcon : IOMEMCON NUMBER context
                | IOMEMCON NUMBER MINUS NUMBER contextr   r   r   r   r   N)r   ZIomemConrx   Z
device_memr   )r   r   rf   rf   rh   
p_iomemcon  s    

r   c             C   sV   t j }t| dkr*| d |_| d |_n | d d | d  |_| d |_|| d< dS )z\ioportcon : IOPORTCON NUMBER context
                | IOPORTCON NUMBER MINUS NUMBER contextr   r   r   r   r   N)r   Z	IoportConrx   Zioportr   )r   r   rf   rf   rh   p_ioportcon  s    

r   c             C   s(   t j }| d |_| d |_|| d< dS )z*pcidevicecon : PCIDEVICECON NUMBER contextr   r   r   N)r   ZPciDeviceConZdevicer   )r   r   rf   rf   rh   p_pcidevicecon  s    

r   c             C   s(   t j }| d |_| d |_|| d< dS )z,devicetreecon : DEVICETREECON NUMBER contextr   r   r   N)r   ZDevicetTeeConr   r   )r   r   rf   rf   rh   p_devicetreecon  s    

r   c             C   s4   | d | d< t | dkr0| d d | d  | d< dS )z[mls_range_def : mls_level_def MINUS mls_level_def
                     | mls_level_def
    r   r   r   r   r   N)rx   )r   rf   rf   rh   p_mls_range_def  s    r   c             C   s:   | d | d< t | dkr6| d d dj| d  | d< dS )zRmls_level_def : IDENTIFIER COLON comma_list
                     | IDENTIFIER
    r   r   r   :,r   N)rx   join)r   rf   rf   rh   p_mls_level_def  s    r   c             C   s   t j| d }t| dkrD| d dkr8|jj| d  qv| d |_n2t| dkrv| d |_t| dkrv|jj| d  || d< dS )	ztype_def : TYPE IDENTIFIER COMMA comma_list SEMI
                | TYPE IDENTIFIER SEMI
                | TYPE IDENTIFIER ALIAS names SEMI
                | TYPE IDENTIFIER ALIAS names COMMA comma_list SEMI
    r   r   r   r   r   r   r   N)r   ZTyperx   
attributesr   aliases)r   rg   rf   rf   rh   
p_type_def  s    
r   c             C   s   t j| d }|| d< dS )z)attribute_def : ATTRIBUTE IDENTIFIER SEMIr   r   N)r   Z	Attribute)r   arf   rf   rh   p_attribute_def  s    r   c             C   s   t j| d }|| d< dS )z3attribute_role_def : ATTRIBUTE_ROLE IDENTIFIER SEMIr   r   N)r   ZAttribute_Role)r   r   rf   rf   rh   p_attribute_role_def  s    r   c             C   s(   t j }| d |_| d |_|| d< dS )z5typealias_def : TYPEALIAS IDENTIFIER ALIAS names SEMIr   r   r   N)r   Z	TypeAliasrV   r   )r   rg   rf   rf   rh   p_typealias_def  s    

r   c             C   s:   t j }| d |_t| dkr.|jj| d  || d< dS )zWrole_def : ROLE IDENTIFIER TYPES comma_list SEMI
                | ROLE IDENTIFIER SEMIr   r   r   N)r   ZRoler\   rx   r]   r   )r   rrf   rf   rh   
p_role_def  s
    
r   c             C   s(   t j }| d |_| d |_|| d< dS )z#role_allow : ALLOW names names SEMIr   r   r   N)r   Z	RoleAllowZ	src_rolesZ	tgt_roles)r   r   rf   rf   rh   p_role_allow  s    

r   c             C   s   dS )z"permissive : PERMISSIVE names SEMINrf   )r   rf   rf   rh   p_permissive  s    r   c             C   s   t j }| d dkr t jj|_n.| d dkr8t jj|_n| d dkrNt jj|_| d |_| d |_| d |_| d |_	|| d	< d
S )zavrule_def : ALLOW names names COLON names names SEMI
                  | DONTAUDIT names names COLON names names SEMI
                  | AUDITALLOW names names COLON names names SEMI
                  | NEVERALLOW names names COLON names names SEMI
    r   r^   r_   r`   r   r   r   r   r   N)
r   AVRuler=   	rule_typer>   r?   	src_types	tgt_typesobj_classesr   )r   r   rf   rf   rh   p_avrule_def  s    




r   c             C   st   t j }| d dkr t jj|_n| d dkr6t jj|_| d |_| d |_| d |_| d |_| d |_	|| d	< d
S )a  typerule_def : TYPE_TRANSITION names names COLON names IDENTIFIER SEMI
                    | TYPE_TRANSITION names names COLON names IDENTIFIER FILENAME SEMI
                    | TYPE_TRANSITION names names COLON names IDENTIFIER IDENTIFIER SEMI
                    | TYPE_CHANGE names names COLON names IDENTIFIER SEMI
                    | TYPE_MEMBER names names COLON names IDENTIFIER SEMI
    r   ra   rb   r   r   r   r   r   r   N)
r   ZTypeRulerC   r   rD   r   r   r   Z	dest_type	file_name)r   rg   rf   rf   rh   p_typerule_def*  s    





r   c             C   s.   t j }| d |_|jj| d  || d< dS )z5typebound_def : TYPEBOUNDS IDENTIFIER comma_list SEMIr   r   r   N)r   Z	TypeBoundrV   r   r   )r   rg   rf   rf   rh   p_typebound_def=  s    
r   c             C   s8   t j }| d |_| d dkr&d|_nd|_|| d< dS )zIbool : BOOL IDENTIFIER TRUE SEMI
            | BOOL IDENTIFIER FALSE SEMIr   r   rY   TFr   N)r   ZBoolr   state)r   brf   rf   rh   p_boolD  s    
r   c             C   sP   t j }| d |_t| d |dd t| dkrBt| d |dd |g| d< d	S )
z conditional : IF OPAREN cond_expr CPAREN OBRACE interface_stmts CBRACE
                    | IF OPAREN cond_expr CPAREN OBRACE interface_stmts CBRACE ELSE OBRACE interface_stmts CBRACE
    r   r   T)r~   r   
   Fr   N)r   ZConditionalr   r   rx   )r   r   rf   rf   rh   p_conditionalO  s    
r   c             C   s.   t j }| d |_|jj| d  || d< dS )z<typeattribute_def : TYPEATTRIBUTE IDENTIFIER comma_list SEMIr   r   r   N)r   ZTypeAttributerV   r   r   )r   rg   rf   rf   rh   p_typeattribute_defZ  s    
r   c             C   s.   t j }| d |_|jj| d  || d< dS )z<roleattribute_def : ROLEATTRIBUTE IDENTIFIER comma_list SEMIr   r   r   N)r   ZRoleAttributer\   Zroleattributesr   )r   rg   rf   rf   rh   p_roleattribute_defa  s    
r   c             C   s   dS )zrange_transition_def : RANGE_TRANSITION names names COLON names mls_range_def SEMI
                            | RANGE_TRANSITION names names names SEMINrf   )r   rf   rf   rh   p_range_transition_defh  s    r   c             C   s   dS )z<role_transition_def : ROLE_TRANSITION names names names SEMINrf   )r   rf   rf   rh   p_role_transition_defm  s    r   c             C   sj   t | }|dkr | d g| d< nF|dkr@| d g| d  | d< n&| d | d | d  g | d  | d< dS )a   cond_expr : IDENTIFIER
                 | EXPL cond_expr
                 | cond_expr AMP AMP cond_expr
                 | cond_expr BAR BAR cond_expr
                 | cond_expr EQUAL EQUAL cond_expr
                 | cond_expr EXPL EQUAL cond_expr
    r   r   r   r   r   N)rx   )r   lrf   rf   rh   p_cond_exprq  s    r   c             C   sr   t j }t| dk r$t| d | nBt| dkrFt| d | d|_n t| d g |jd| d   || d< dS )znames : identifier
             | nested_id_set
             | asterisk
             | TILDE identifier
             | TILDE nested_id_set
             | IDENTIFIER MINUS IDENTIFIER
    r   r   r   Tr   r   N)r   ZIdSetrx   r   Z
complimentr   )r   r   rf   rf   rh   p_names  s    r   c             C   s   | d g| d< dS )zidentifier : IDENTIFIERr   r   Nrf   )r   rf   rf   rh   p_identifier  s    r   c             C   s   | d g| d< dS )zasterisk : ASTERISKr   r   Nrf   )r   rf   rf   rh   
p_asterisk  s    r   c             C   s   | d | d< dS )z1nested_id_set : OBRACE nested_id_list CBRACE
    r   r   Nrf   )r   rf   rf   rh   p_nested_id_set  s    r   c             C   s2   t | dkr| d | d< n| d | d  | d< dS )z`nested_id_list : nested_id_element
                      | nested_id_list nested_id_element
    r   r   r   N)rx   )r   rf   rf   rh   p_nested_id_list  s    r   c             C   s4   t | dkr| d | d< nd| d  }|g| d< dS )zxnested_id_element : identifier
                         | MINUS IDENTIFIER
                         | nested_id_set
    r   r   r   r   N)rx   )r   strrf   rf   rh   p_nested_id_element  s    r   c             C   s0   t | dkr | d | d  | d< | d | d< dS )zTcomma_list : nested_id_list
                  | comma_list COMMA nested_id_list
    r   r   r   r   N)rx   )r   rf   rf   rh   p_comma_list  s    r   c             C   s   dS )z/optional_semi : SEMI
                   | emptyNrf   )r   rf   rf   rh   p_optional_semi  s    r   c             C   s&   dt | j| j| jf att dad S )Nz(%s: Syntax error on line %d %s [type=%s]F)
parse_filerk   rr   rV   errorrv   success)tokrf   rf   rh   p_error  s    r   c             C   s(   | si S i }x| D ]}|||j < qW d S )N)r   )r   mapr   rf   rf   rh   prep_spt  s
    
r  c             C   sH   t stj atjd|dda | d k	r*| antj a|s@tj an|ad S )NZLALRr   )methoddebugZwrite_tables)	parserr   rj   r   r   r   ModuleSupportMacrosr   )rQ   supportr  rf   rf   rh   create_globals  s    
r  Fc             C   s   t ||| dt_daytj| |td W nB tk
rl } z&d ad adt| d tj	  a
W Y d d }~X nX tsd adt
 }t|tS )Nr   T)r  rj   zinternal parser error: %s
zcould not parse text: "%s")r  rj   rk   r   r  parse	Exceptionr   	traceback
format_excr   
ValueErrorr   )textrQ   r  r  emsgrf   rf   rh   r
    s    *r
  c       	      C   s   g }d }xt j| D ]\}}}x|D ]~}t jj|}t jj||}|d dkr|dkr\|}qttjd|d r|j|d |f q$|d dkr$|j|d |f q$W qW ||fS )Nr   z.sptzobj_perm_sets.sptZpatternsr   z.if)	oswalkr   splitextr   rx   refindallr   )	rootmodulessupport_macrosdirpathZdirnames	filenamesr   modnamefilenamerf   rf   rh   list_headers
  s    
r  c                s>  ddl m} tj }g }d }tjj| r|tjj| d }|dkrLtd|  tjj	|}	|j
|	d | f ttj \}
}nt| \}}|r| rtdfddd fd	d
	}d }|r8d|  tj }||| |jj
| tjd}tjddddddddddg
}|jj
tj| |jj
| d rd  rd|jtjt|d}|jd g }x|D ]}tj }|d |_y*|r||d || n||d | W nF tk
r } z(t|d  |j
|d  wnW Y d d }~X nX |jj
| rn  rn|j  qnW t|r:ddj|  |S )Nr   )utilrz   zInvalid file name %sr   z1could not find support macros (obj_perm_sets.spt)c                s    r j |  d S )N)write)r  )outputrf   rh   r   3  s    zparse_headers.<locals>.oc                s    rd|   y.t | }|j }|j  | at|||  W nT tk
r^ } zd S d }~X n6 tk
r } ztd| t|f W Y d d }~X nX d S )Nzparsing file %s
zerror parsing file %s: %s)openreadcloser   r
  IOErrorr  r   )r   rQ   r   fdZtxtr  )r  r   rf   rh   r   7  s    z!parse_headers.<locals>.parse_filezParsing support macros (%s): can_execz$1z$2fileZexecute_no_transr"  r#  getattrlockZexecuteZioctlzdone.
)ZstepszParsing interface filesr	  z failed to parse some headers: %sz, )N)rz   r  r   ZHeadersr  r   isfilesplitr  r  r   r  r   headersr  r|   r   r   ZAccessVectorr   ZConsoleProgressBarsysstdoutrx   r   r  r   r   stepr   )r  r!  r   r  r  r-  r  r  r   r  Zall_modulesr   r   r'  avZstatusZfailuresr   r   r  rf   )r  r   r!  rh   parse_headers  sb    






r2  )Ir   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   )N)NNF)NTF)vr.  r  r  r  rz   r   r   r   r   r   tokensrp   Zt_TICKZt_SQUOTEZt_OBRACEZt_CBRACEZt_SEMIZt_COLONZt_OPARENZt_CPARENZt_COMMAZt_MINUSZt_TILDEZ
t_ASTERISKZt_AMPZt_BARZt_EXPLZt_EQUALZt_NUMBERZt_PATHZt_ignoreri   rl   rn   ro   rs   rt   ru   rw   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  rj   r  r
  r  r2  rf   rf   rf   rh   <module>    s  
                                                                        






"

			

