????
Your IP : 3.142.201.19
a
z
fez�6@s�ddlZddlZddlZddlZddlmZddlmZddlmZddlmZddlm Z dZ
d d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>�5Zd?Zd@Z
dAZdBZdCZdDZdEZdFZdGZdHZdIZdJZdKZdLZdMZdNZdOZdPZdQZdRdS�ZdTdU�Z dVdW�Z!dXdY�Z"dZd[�Z#d\d]�Z$d^d_�Z%d`da�Z&dbdc�Z'da(da)dda*da+dea,d�dfdg�Z-dhdi�Z.djdk�Z/dldm�Z0dndo�Z1dpdq�Z2drds�Z3dtdu�Z4dvdw�Z5dxdy�Z6dzd{�Z7d|d}�Z8d~d�Z9d�d��Z:d�d��Z;d�d��Z<d�d��Z=d�d��Z>d�d��Z?d�d��Z@d�d��ZAd�d��ZBd�d��ZCd�d��ZDd�d��ZEd�d��ZFd�d��ZGd�d��ZHd�d��ZId�d��ZJd�d��ZKd�d��ZLd�d��ZMd�d��ZNd�d��ZOd�d��ZPd�d��ZQd�d��ZRd�d��ZSd�d��ZTd�d��ZUd�d��ZVd�d��ZWd�d��ZXd�d��ZYd�d��ZZd�dÄZ[d�dńZ\d�dDŽZ]d�dɄZ^d�d˄Z_d�d̈́Z`d�dτZad�dфZbd�dӄZcd�dՄZdd�dׄZed�dلZfd�dۄZgd�d݄Zhd�d߄Zid�d�Zjd�d�Zkd�d�Zld�d�Zmd�d�Znd�d�Zod�d�Zpdaqdard�d�Zsd�d�d�Ztd�d�Zud�d�d��ZvdS)��N�)�access)�defaults)�lex)� refpolicy)�yacc)JZTICKZSQUOTEZOBRACEZCBRACE�SEMI�COLONZOPARENZCPAREN�COMMA�MINUS�TILDEZASTERISKZAMPZBARZEXPL�EQUAL�FILENAME�
IDENTIFIER�NUMBER�PATHZ 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�GEN_TUNABLE�IFELSE�IFDEF�IFNDEF�DEFINErrrrrrrrrrrrrrr r!r"r#r$r%r&r'r(r)r*r+r,r-r.r/r0r1r2r3r4r5r6r7r8r9r:r;r<r=r>r?r@rArBrCrErDrF)5�moduleZ
policy_moduleZrequireZsidZgenfscon�fs_use_xattr�fs_use_trans�fs_use_taskZportconZnodeconZnetifconZpirqconZiomemconZ ioportconZpcideviceconZ
devicetreecon�classZ
typeattributeZ
roleattribute�typeZ attributeZattribute_role�aliasZ typealias�bool�trueZfalse�if�else�role�typesZallow� dontaudit�
auditallow�
neverallowZ
permissiveZ
typeboundsZtype_transition�type_change�type_memberZrange_transitionZrole_transitionZoptional_policy� interfaceZtunable_policyZgen_require�templateZgen_contextZgen_tunableZifelseZifndef�ifdefZdefinez\`z\'z\{z\}z\;+z\:z\(z\)z\,z\-z\~z\*z\&z\|z\!z\=z[0-9\.]+z/[a-zA-Z0-9)_\.\*/\$]*z cCs|S)z2[a-fA-F0-9]{0,4}:[a-fA-F0-9]{0,4}:([a-fA-F0-9]|:)*���tr\r\�6/usr/lib/python3.9/site-packages/sepolgen/refparser.py�t_IPV6_ADDR�sr`cCs|jjd7_dS)zdnl.*\nrN��lexer�linenor]r\r\r_�t_m4comment�srdcCs|�d�dS)zdefine.*refpolicywarn\(.*\nrN)�skipr]r\r\r_�t_refpolicywarn1�srfcCs|jjd7_dS)zrefpolicywarn\(.*\nrNrar]r\r\r_�t_refpolicywarn�srgcCst�|jd�|_|S)z#[a-zA-Z_\$][a-zA-Z0-9_\-\+\.\$\*~]*r��reserved�get�valuerLr]r\r\r_�t_IDENTIFIERsrlcCst�|jd�|_|S)z"\"[a-zA-Z0-9_\-\+\.\$\*~ :\[\]]+\"rrhr]r\r\r_�
t_FILENAMEsrmcCs|jjd7_dS)z\#.*\nrNrar]r\r\r_� t_comment
srncCs td|jd�|�d�dS)NzIllegal character '%s'rr)�printrkrer]r\r\r_�t_errorsrpcCs|jjt|j�7_dS)z\n+N)rbrc�lenrkr]r\r\r_� t_newlinesrr�TcCsT|durdS|D]>}|durq||_|dur@|j�d||f�q|j�d|�qdS)Nr)�parent�children�insert)Zstmtsrt�val�sr\r\r_�collect/srycCs4|D]*}t�|�r$|�t�|��q|�|�qdS�N)�sptZhas_key�updateZby_name�add)Zidsrx�idr\r\r_�expand;s
rcCsNt|�dkr&|dr&tj�|d�n$t|�dkrJ|drJtj�|d�dS)z^statements : statement
| statements statement
| empty
�rN)rq�mru�append��pr\r\r_�p_statementsCsr�cCs|d|d<dS)z�statement : interface
| template
| obj_perm_set
| policy
| policy_module_stmt
| module_stmt
rrNr\r�r\r\r_�p_statementMsr�cCsdS)zempty :Nr\r�r\r\r_�p_emptyWsr�cCs.t��}|d|_|d|_d|_||d<dS)zHpolicy_module_stmt : POLICY_MODULE OPAREN IDENTIFIER COMMA NUMBER CPAREN��TrN�rZModuleDeclaration�name�version�r�r�r\r\r_�p_policy_module_stmtbs
r�cCs(t�|d�}t|d|�||d<dS)zainterface : INTERFACE OPAREN TICK IDENTIFIER SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN
��rN)r� Interfacery�r��xr\r\r_�p_interfacejsr�cCs(t�|d�}t|d|�||d<dS)z�template : TEMPLATE OPAREN TICK IDENTIFIER SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN
| DEFINE OPAREN TICK IDENTIFIER SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN
r�r�rN)rZTemplateryr�r\r\r_�
p_templateqsr�cCsd|d<dS)z4define : DEFINE OPAREN TICK IDENTIFIER SQUOTE CPARENNrr\r�r\r\r_�p_defineysr�cCszt|�dkr"|dr"|d|d<nTt|�dkrv|dsL|drv|d|d<n*|dsb|d|d<n|d|d|d<dS)zlinterface_stmts : policy
| interface_stmts policy
| empty
r�rrN�rqr�r\r\r_�p_interface_stmts�sr�cCsFt��}t|d|dd�t|�dkr8t|d|dd�|g|d<dS) z�optional_policy : OPT_POLICY OPAREN TICK interface_stmts SQUOTE CPAREN
| OPT_POLICY OPAREN TICK interface_stmts SQUOTE COMMA TICK interface_stmts SQUOTE CPAREN
r�T�rw�r�FrN)rZOptionalPolicyryrq)r��or\r\r_�p_optional_policy�s
r�cCsPt��}|d|_t|d|dd�t|�dkrBt|d|dd�|g|d<d S)
z�tunable_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�Tr���FrN)rZ
TunablePolicy� cond_exprryrqr�r\r\r_�p_tunable_policy�s
r�cCsdS)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
Nr\r�r\r\r_�p_ifelse�sr�cCsbt�|d�}|ddkr d}nd}t|d||d�t|�dkrTt|d|dd�|g|d <d
S)aJifdef : 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�rr[TFr�r�r�rN)rZIfDefryrq)r�r��vr\r\r_�p_ifdef�sr�cCs8tj|dd�}t|�dkr,|j�|d�||d<dS)z�interface_call : IDENTIFIER OPAREN interface_call_param_list CPAREN
| IDENTIFIER OPAREN CPAREN
| IDENTIFIER OPAREN interface_call_param_list CPAREN SEMIr)Zifnamer�r�rN)rZ
InterfaceCallrq�args�extend)r��ir\r\r_�p_interface_call�sr�cCs6t|�dkr|d|d<n|dd|dg|d<dS)z�interface_call_param : IDENTIFIER
| IDENTIFIER MINUS IDENTIFIER
| nested_id_set
| TRUE
| FALSE
| FILENAME
r�rr�-r�Nr�r�r\r\r_�p_interface_call_param�s
r�cCs6t|�dkr|dg|d<n|d|dg|d<dS)z�interface_call_param_list : interface_call_param
| interface_call_param_list COMMA interface_call_param
r�rrr�Nr�r�r\r\r_�p_interface_call_param_list�sr�cCs$t�|d�}|d|_||d<dS)zRobj_perm_set : DEFINE OPAREN TICK IDENTIFIER SQUOTE COMMA TICK names SQUOTE CPARENr�r�rN)rZ
ObjPermSet�perms�r�rxr\r\r_�p_obj_perm_set�s
r�cCs|d|d<dS)z�policy : policy_stmt
| optional_policy
| tunable_policy
| ifdef
| ifelse
| conditional
rrNr\r�r\r\r_�p_policy�sr�cCs|dr|dg|d<dS)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
| gen_tunable
| define
| initial_sid
| genfscon
| fs_use
| portcon
| nodecon
| netifcon
| pirqcon
| iomemcon
| ioportcon
| pcidevicecon
| devicetreecon
rrNr\r�r\r\r_�
p_policy_stmt�s r�cCs.t��}|d|_|d|_d|_||d<dS)z+module_stmt : MODULE IDENTIFIER NUMBER SEMIr�r�FrNr�r�r\r\r_�
p_module_stmts
r�cCsdS)zlgen_require : GEN_REQ OPAREN TICK requires SQUOTE CPAREN
| REQUIRE OBRACE requires CBRACENr\r�r\r\r_�
p_gen_require$sr�cCsdS)zsrequires : require
| requires require
| ifdef
| requires ifdef
Nr\r�r\r\r_�
p_requires,sr�cCsdS)z�require : 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
Nr\r�r\r\r_� p_require4sr�cCsHt��}|d|_|d|_|d|_t|�dkr<|d|_||d<dS)z�security_context : IDENTIFIER COLON IDENTIFIER COLON IDENTIFIER
| IDENTIFIER COLON IDENTIFIER COLON IDENTIFIER COLON mls_range_defrr�r��r�rN)rZSecurityContext�userrRrLrq�levelr�r\r\r_�p_security_context>s
r�cCs|d}|d|_||d<dS)zQgen_context : GEN_CONTEXT OPAREN security_context COMMA mls_range_def CPAREN
r�r�rN)r�r�r\r\r_�
p_gen_contextKs
r�cCs|d|d<dS)z<context : security_context
| gen_context
rrNr\r�r\r\r_� p_contextVsr�cCs(t��}|d|_|d|_||d<dS)z$initial_sid : SID IDENTIFIER contextr�r�rN)rZ
InitialSidr��contextr�r\r\r_�
p_initial_sid\s
r�cCs2t��}|d|_|d|_|d|_||d<dS)z+genfscon : GENFSCON IDENTIFIER PATH contextr�r�r�rN)rZGenfsCon�
filesystem�pathr�)r��gr\r\r_�
p_genfsconcs
r�cCsnt��}|ddkr tjj|_n.|ddkr8tjj|_n|ddkrNtjj|_|d|_|d|_||d<dS) z�fs_use : FS_USE_XATTR IDENTIFIER context SEMI
| FS_USE_TASK IDENTIFIER context SEMI
| FS_USE_TRANS IDENTIFIER context SEMI
rrHrJrIr�r�rN)rZ
FilesystemUseZXATTRrLZTASKZTRANSr�r�)r��fr\r\r_�p_fs_usems
r�cCs`t��}|d|_t|�dkr4|d|_|d|_n |dd|d|_|d|_||d<dS)zkportcon : PORTCON IDENTIFIER NUMBER context
| PORTCON IDENTIFIER NUMBER MINUS NUMBER contextr�r�r�r�r�rN)rZPortConZ port_typerqZport_numberr��r��cr\r\r_� p_portcons
r�cCs2t��}|d|_|d|_|d|_||d<dS)zanodecon : NODECON NUMBER NUMBER context
| NODECON IPV6_ADDR IPV6_ADDR context
r�r�r�rN)rZNodeCon�start�endr��r��nr\r\r_� p_nodecon�s
r�cCs2t��}|d|_|d|_|d|_||d<dS)z.netifcon : NETIFCON IDENTIFIER context contextr�r�r�rN)rZNetifConrYZinterface_contextZpacket_contextr�r\r\r_�
p_netifcon�s
r�cCs(t��}|d|_|d|_||d<dS)z pirqcon : PIRQCON NUMBER contextr�r�rN)rZPirqConZpirq_numberr�r�r\r\r_� p_pirqcon�s
r�cCsVt��}t|�dkr*|d|_|d|_n |dd|d|_|d|_||d<dS)zYiomemcon : IOMEMCON NUMBER context
| IOMEMCON NUMBER MINUS NUMBER contextr�r�r�r�rN)rZIomemConrqZ
device_memr�r�r\r\r_�
p_iomemcon�s
r�cCsVt��}t|�dkr*|d|_|d|_n |dd|d|_|d|_||d<dS)z\ioportcon : IOPORTCON NUMBER context
| IOPORTCON NUMBER MINUS NUMBER contextr�r�r�r�rN)rZ IoportConrqZioportr�r�r\r\r_�p_ioportcon�s
r�cCs(t��}|d|_|d|_||d<dS)z*pcidevicecon : PCIDEVICECON NUMBER contextr�r�rN)rZPciDeviceConZdevicer�r�r\r\r_�p_pcidevicecon�s
r�cCs(t��}|d|_|d|_||d<dS)z,devicetreecon : DEVICETREECON NUMBER contextr�r�rN)rZ
DevicetTeeConr�r�r�r\r\r_�p_devicetreecon�s
r�cCs4|d|d<t|�dkr0|dd|d|d<dS)z[mls_range_def : mls_level_def MINUS mls_level_def
| mls_level_def
rrr�r�r�Nr�r�r\r\r_�p_mls_range_def�sr�cCs:|d|d<t|�dkr6|ddd�|d�|d<dS)zRmls_level_def : IDENTIFIER COLON comma_list
| IDENTIFIER
rrr��:�,r�N)rq�joinr�r\r\r_�p_mls_level_def�sr�cCs�t�|d�}t|�dkrD|ddkr8|j�|d�qv|d|_n2t|�dkrv|d|_t|�dkrv|j�|d�||d<dS) z�type_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�rN)r�Typerq�
attributesr|�aliases�r�r^r\r\r_�
p_type_def�s
r�cCst�|d�}||d<dS)z)attribute_def : ATTRIBUTE IDENTIFIER SEMIr�rN)rZ Attribute�r��ar\r\r_�p_attribute_def�sr�cCst�|d�}||d<dS)z3attribute_role_def : ATTRIBUTE_ROLE IDENTIFIER SEMIr�rN)rZAttribute_Roler�r\r\r_�p_attribute_role_def�sr�cCs(t��}|d|_|d|_||d<dS)z5typealias_def : TYPEALIAS IDENTIFIER ALIAS names SEMIr�r�rN)rZ TypeAliasrLr�r�r\r\r_�p_typealias_def�s
r�cCs:t��}|d|_t|�dkr.|j�|d�||d<dS)zWrole_def : ROLE IDENTIFIER TYPES comma_list SEMI
| ROLE IDENTIFIER SEMIr�r�rN)rZRolerRrqrSr|�r��rr\r\r_�
p_role_defs
r�cCs(t��}|d|_|d|_||d<dS)z#role_allow : ALLOW names names SEMIr�r�rN)rZ RoleAllowZ src_rolesZ tgt_rolesr�r\r\r_�p_role_allows
r�cCsdS)z"permissive : PERMISSIVE names SEMINr\r�r\r\r_�p_permissivesr�cCs�t��}|ddkr tjj|_n.|ddkr8tjj|_n|ddkrNtjj|_|d|_|d|_|d|_|d|_ ||d <d
S)z�avrule_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
rrTrUrVr�r�r�r�rN)
r�AVRuler2� rule_typer3r4� src_types� tgt_types�obj_classesr�r�r\r\r_�p_avrule_defs
r�cCstt��}|ddkr tjj|_n|ddkr6tjj|_|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
rrWrXr�r�r�r�r�rN)
rZTypeRuler8r�r9r�r�r�Z dest_type� file_namer�r\r\r_�p_typerule_def-s
r�cCs.t��}|d|_|j�|d�||d<dS)z5typebound_def : TYPEBOUNDS IDENTIFIER comma_list SEMIr�r�rN)rZ TypeBoundrLr�r|r�r\r\r_�p_typebound_def@s
r�cCs8t��}|d|_|ddkr&d|_nd|_||d<dS)zIbool : BOOL IDENTIFIER TRUE SEMI
| BOOL IDENTIFIER FALSE SEMIr�r�rOTFrN�rZBoolr��state�r��br\r\r_�p_boolGs
r�cCs8t��}|d|_|ddkr&d|_nd|_||d<dS)z�gen_tunable : GEN_TUNABLE OPAREN TICK IDENTIFIER SQUOTE COMMA TRUE CPAREN
| GEN_TUNABLE OPAREN TICK IDENTIFIER SQUOTE COMMA FALSE CPARENr�r�rOTFrNr�r�r\r\r_�
p_gen_tunableRs
r�cCsPt��}|d|_t|d|dd�t|�dkrBt|d|dd�|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�Tr�r��
FrN)rZConditionalr�ryrqr�r\r\r_�
p_conditional]s
r�cCs.t��}|d|_|j�|d�||d<dS)z<typeattribute_def : TYPEATTRIBUTE IDENTIFIER comma_list SEMIr�r�rN)rZ
TypeAttributerLr�r|r�r\r\r_�p_typeattribute_defhs
r�cCs.t��}|d|_|j�|d�||d<dS)z<roleattribute_def : ROLEATTRIBUTE IDENTIFIER comma_list SEMIr�r�rN)rZ
RoleAttributerRZroleattributesr|r�r\r\r_�p_roleattribute_defos
r�cCsdS)z�range_transition_def : RANGE_TRANSITION names names COLON names mls_range_def SEMI
| RANGE_TRANSITION names names names SEMINr\r�r\r\r_�p_range_transition_defvsr�cCsdS)z<role_transition_def : ROLE_TRANSITION names names names SEMINr\r�r\r\r_�p_role_transition_def{sr�cCsjt|�}|dkr |dg|d<nF|dkr@|dg|d|d<n&|d|d|dg|d|d<dS)acond_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�rrr�r�Nr�)r��lr\r\r_�p_cond_exprsr�cCsrt��}t|�dkr$t|d|�nBt|�dkrFt|d|�d|_n t|dg�|�d|d�||d<dS)z�names : identifier
| nested_id_set
| asterisk
| TILDE identifier
| TILDE nested_id_set
| IDENTIFIER MINUS IDENTIFIER
r�rr�Tr�rN)rZIdSetrqrZ
complimentr}r�r\r\r_�p_names�sr�cCs|dg|d<dS)zidentifier : IDENTIFIERrrNr\r�r\r\r_�p_identifier�sr�cCs|dg|d<dS)zasterisk : ASTERISKrrNr\r�r\r\r_�
p_asterisk�sr�cCs|d|d<dS)z1nested_id_set : OBRACE nested_id_list CBRACE
r�rNr\r�r\r\r_�p_nested_id_set�sr�cCs2t|�dkr|d|d<n|d|d|d<dS)z`nested_id_list : nested_id_element
| nested_id_list nested_id_element
r�rrNr�r�r\r\r_�p_nested_id_list�sr�cCs4t|�dkr|d|d<nd|d}|g|d<dS)zxnested_id_element : identifier
| MINUS IDENTIFIER
| nested_id_set
r�rrr�Nr�)r��strr\r\r_�p_nested_id_element�srcCs0t|�dkr |d|d|d<|d|d<dS)zTcomma_list : nested_id_list
| comma_list COMMA nested_id_list
r�rr�rNr�r�r\r\r_�p_comma_list�srcCsdS)z/optional_semi : SEMI
| emptyNr\r�r\r\r_�p_optional_semi�srcCs&dt|j|j|jfatt�dadS)Nz(%s: Syntax error on line %d %s [type=%s]F)�
parse_filercrkrL�errorro�success)�tokr\r\r_�p_error�srcCs$|siSi}|D]}|||j<qdSrz)r�)r{�mapr�r\r\r_�prep_spt�s
r
cCsHtst��atjd|dd�a|dur*|ant��a|s@t��an|adS)NZLALRr)�method�debugZwrite_tables) �parserrrbrr�r�Module�
SupportMacrosr{)rG�supportrr\r\r_�create_globals�s
rFc
Cs�t|||�dt_daztj||td�WnDtyn}z,dadadt|�dt� �a
WYd}~n
d}~00ts�dadt
}t|��tS)NrT)rrbzinternal parser error: %s�
zcould not parse text: "%s")
rrbrcrr
�parse� Exceptionr� traceback�
format_excr�
ValueErrorr�)�textrGrr�e�msgr\r\r_rs.rc Cs�g}d}t�|�D]�\}}}|D]~}tj�|�}tj�||�}|ddkr�|dkrX|}q�tt�d|d��r�|�|d|f�q |ddkr |�|d|f�q q||fS)Nrz.sptzobj_perm_sets.spt�patternsrz.if) �os�walkr��splitextr�rq�re�findallr�) �root�modules�support_macros�dirpath�dirnames� filenamesr��modname�filenamer\r\r_�list_headerssr)cs0ddlm}t��}g}d}tj�|�r|tj�|�d}|dkrLtd|��tj� |�} |�
| d|f�tt�
��\}
}nt|�\}}|r�|s�td���fdd��d��fd d
� }d}|�r&�d|�t��}|||�|j�
|�t�d�}
t�gd
��}|
j�
t�|��|j�
|
��d���rP��sP|jtjt|�d�}|�d�g}|D]�}t��}|d|_z*|�r�||d||�n||d|�WnRt�y�}z8�t|�d�|�
|d�WYd}~�qXWYd}~n
d}~00|j�
|���rX��sX|���qXt|��r,�dd�|��|S)Nr)�utilrszInvalid file name %srz1could not find support macros (obj_perm_sets.spt)cs�r��|�dSrz)�write)r)�outputr\r_r�Aszparse_headers.<locals>.oc
s��r�d|�z.t|�}|��}|��|at|||��Wn\tyd}zWYd}~dSd}~0ty�}z td|t|�f��WYd}~n
d}~00dS)Nzparsing file %s
zerror parsing file %s: %s)�open�read�closerr�IOErrorrr)r�rGr{�fdZtxtr)rr�r\r_rEsz!parse_headers.<locals>.parse_filezParsing support macros (%s): �can_exec)
z$1z$2�fileZexecute_no_transr-r.�getattr�lockZexecuteZioctlzdone.
)ZstepszParsing interface filesrz!failed to parse some headers: %s
z, )N)rsr*rZHeadersrr��isfile�splitrrr�r)r�headersrrur�rZAccessVectorr�ZConsoleProgressBar�sys�stdoutrqr�rr�r�stepr�)r!r,rrr*r8r"r#r�r'Zall_modulesrr{r2�av�statusZfailuresr�r�rr\)rr�r,r_�
parse_headers,s`
$
r>)N)NNF)NTF)wr9rrrrsrrrrr�tokensriZt_TICKZt_SQUOTEZt_OBRACEZt_CBRACEZt_SEMIZt_COLONZt_OPARENZt_CPARENZt_COMMAZt_MINUSZt_TILDEZ
t_ASTERISKZt_AMPZt_BARZt_EXPLZt_EQUALZt_NUMBERZt_PATHZt_ignorer`rdrfrgrlrmrnrprrr�rrr{rryrr�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�rrrrr
r
rbrrr)r>r\r\r\r_�<module> sT\�E
#