U
    DvfTa  ã                   @   sˆ   d dl m  mZ d dlmZ d dlmZ d dlmZ ddddd	d
d
d
dddddœZ	G dd„ de
ƒZG dd„ de
ƒZG dd„ deƒZdS )é    N)ÚLexer)ÚVoltLibError)ÚopenÚparse_def_glyph_Úparse_def_group_Úparse_def_script_Úparse_def_lookup_Úparse_def_anchor_Úparse_ppem_Úparse_noarg_option_Úparse_cmap_format)Ú	DEF_GLYPHÚ	DEF_GROUPÚ
DEF_SCRIPTÚ
DEF_LOOKUPÚ
DEF_ANCHORZ	GRID_PPEMZPRESENTATION_PPEMZPPOSITIONING_PPEMZCOMPILER_USEEXTENSIONLOOKUPSZCOMPILER_USEPAIRPOSFORMAT2ZCMAP_FORMATZDO_NOT_TOUCH_CMAPc                   @   s  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Z d=d>„ Z!d?d@„ Z"dAdB„ Z#dCS )DÚParserc                 C   s`   t  ¡ | _tƒ | _tƒ | _i | _tƒ | _tƒ | _	tƒ | _
d\| _| _d | _|  |¡ |  ¡  d S )N©NN)ÚastZVoltFileÚdoc_ÚOrderedSymbolTableÚglyphs_ÚSymbolTableÚgroups_Úanchors_Úscripts_Úlangs_Úlookups_Únext_token_type_Únext_token_Únext_token_location_Úmake_lexer_Úadvance_lexer_)ÚselfÚpath© r%   ú</tmp/pip-unpacked-wheel-qlge9rch/fontTools/voltLib/parser.pyÚ__init__   s    

zParser.__init__c              	   C   sR   t |dƒr t|dd ƒ}| ¡ }n"|}t|dƒ}| ¡ }W 5 Q R X t||ƒ| _d S )NÚreadÚnameÚr)ÚhasattrÚgetattrr(   r   r   Úlexer_)r#   Zfile_or_pathÚfilenameÚdataÚfr%   r%   r&   r!   $   s    

zParser.make_lexer_c                 C   sz   | j j}| jd k	rt|  ¡  | jt ¡ krFt| t| j ƒ}| |ƒ ¡ q|  	d¡rTqtqt
dd tt ¡ ƒ¡ | jƒ‚q| j S )NÚENDz	Expected z, )r   Ú
statementsr   r"   Ú
cur_token_ÚPARSE_FUNCSÚkeysr,   ÚappendÚis_cur_keyword_r   ÚjoinÚsortedÚcur_token_location_)r#   r2   Úfuncr%   r%   r&   Úparse.   s    

þzParser.parsec                 C   s<  |   d¡st‚| j}|  ¡ }|  d¡ |  ¡ }|dk rBtd| jƒ‚d }| jdkr~|  d¡ |  ¡ g}|d dk rštd| jƒ‚n| jdkrš|  d¡ |  ¡ }d }| jdkrÆ|  d¡ |  	¡ }|d	ksÆt‚d }| jd
kræ|  d
¡ |  ¡ }|  d¡ | j
 |¡d k	rtd||f |ƒ‚tj||||||d}| j
 ||¡ |S )Nr   ZIDr   zInvalid glyph IDÚUNICODEzInvalid glyph UNICODEZUNICODEVALUESZTYPE)ZBASEZLIGATUREÚMARKÚ	COMPONENTZ
COMPONENTSZ	END_GLYPHz#Glyph "%s" (gid %i) already defined©Úlocation)r7   ÚAssertionErrorr:   Úexpect_string_Úexpect_keyword_Úexpect_number_r   r   Úparse_unicode_values_Úexpect_name_r   Úresolver   ZGlyphDefinitionÚdefine)r#   rA   r)   ÚgidZgunicodeÚgtypeÚ
componentsZ	def_glyphr%   r%   r&   r   >   sR    











 ÿ     ÿzParser.parse_def_glyph_c                 C   s|   |   d¡st‚| j}|  ¡ }d }| jdkr2|  ¡ }|  d¡ | j |¡d k	rZt	d| |ƒ‚t
j|||d}| j ||¡ |S )Nr   ÚENUMZ	END_GROUPzBGlyph group "%s" already defined, group names are case insensitiver@   )r7   rB   r:   rC   r   Úparse_enum_rD   r   rH   r   r   ZGroupDefinitionrI   )r#   rA   r)   ÚenumZ	def_groupr%   r%   r&   r   c   s"    

ÿýzParser.parse_def_group_c                 C   s  |   d¡st‚| j}d }| jdkr4|  d¡ |  ¡ }|  d¡ |  ¡ }| j |¡d k	rdtd| |ƒ‚| j	 
¡  g }| jdkrØ|  ¡  |  ¡ }|  d¡ | j	 |j¡d k	r¼td|j|f |ƒ‚| j	 |j|¡ | |¡ qr|  d¡ | j	 ¡  tj||||d}| j ||¡ |S )	Nr   ÚNAMEÚTAGz=Script "%s" already defined, script tags are case insensitiveZ
END_SCRIPTÚEND_LANGSYSzPLanguage "%s" already defined in script "%s", language tags are case insensitiver@   )r7   rB   r:   r   rD   rC   r   rH   r   r   Úenter_scoper"   Úparse_langsys_ÚtagrI   r6   Ú
exit_scoper   ZScriptDefinition)r#   rA   r)   rU   ZlangsÚlangZ
def_scriptr%   r%   r&   r   u   sF    


ÿý


ÿý

zParser.parse_def_script_c                 C   s   |   d¡st‚| j}d }| jdkr4|  d¡ |  ¡ }|  d¡ |  ¡ }g }| jdkrz|  ¡  |  ¡ }|  d¡ | |¡ qJt	j
||||d}|S )NZDEF_LANGSYSrP   rQ   rR   ÚEND_FEATUREr@   )r7   rB   r:   r   rD   rC   r"   Úparse_feature_r6   r   ZLangSysDefinition)r#   rA   r)   rU   ÚfeaturesÚfeatureZdef_langsysr%   r%   r&   rT   ˜   s     




zParser.parse_langsys_c                 C   sz   |   d¡st‚| j}|  d¡ |  ¡ }|  d¡ |  ¡ }g }| jdkrd|  d¡ |  ¡ }| |¡ q<tj||||d}|S )NZDEF_FEATURErP   rQ   rX   ZLOOKUPr@   )	r7   rB   r:   rD   rC   r   r6   r   ZFeatureDefinition)r#   rA   r)   rU   ZlookupsÚlookupr[   r%   r%   r&   rY   ª   s    



zParser.parse_feature_c                 C   s4  |   d¡st‚| j}|  ¡ }|d  ¡ s6td| |ƒ‚| j |¡d k	rTtd| |ƒ‚d}| jdkrl|  	¡  n| jdkr‚|  	¡  d}d}d }| jd	kr|  	¡  | jd
krº|  	¡  |  ¡ }nR| jdkrÎ|  	¡  n>| jdkræ|  	¡  d}n&| j
tjkrü|  ¡ }ntd| j
 |ƒ‚n| jdkr&|  	¡  d}d }| jdkrV|  d¡ |  ¡ }|dksVt‚d }| jdkrt|  d¡ d}d }| jdkrž|  d¡ |  ¡  dd¡}g }	| jdkrº|  ¡ }	q¢|  ¡ }
d }d }|
dkrà|  |¡}n"|
dkrô|  ¡ }ntd|
 |ƒ‚tj||||||||	|||d}| j ||¡ |S )Nr   r   z)Lookup name "%s" must start with a letterz>Lookup "%s" already defined, lookup names are case insensitiveTZPROCESS_BASEZ	SKIP_BASEFZPROCESS_MARKSZMARK_GLYPH_SETÚALLÚNONEz3Expected ALL, NONE, MARK_GLYPH_SET or an ID. Got %sZ
SKIP_MARKSZ	DIRECTION)ZLTRZRTLZREVERSALZCOMMENTSz\nÚ
©ZEXCEPT_CONTEXTZ
IN_CONTEXTÚAS_SUBSTITUTIONÚAS_POSITIONz/Expected AS_SUBSTITUTION or AS_POSITION. Got %sr@   )r7   rB   r:   rC   Úisalphar   r   rH   r   r"   r   r   ÚSTRINGrD   rG   ÚreplaceÚparse_context_Úparse_substitution_Úparse_position_r   ZLookupDefinitionrI   )r#   rA   r)   Zprocess_baseZprocess_marksZmark_glyph_setÚ	directionÚreversalÚcommentsÚcontextZas_pos_or_subÚsubÚposZ
def_lookupr%   r%   r&   r   º   s¬     ÿÿý








ÿý





þõzParser.parse_def_lookup_c           	      C   s¨   | j }g }| jdkr¤d }d }|  ¡ }| jdkr˜g }g }| jdkrp|  ¡ }|  ¡ }|dkrd| |¡ q6| |¡ q6|  d¡ tj||||d}| |¡ q
|  d¡ q
|S )Nr`   ZEND_CONTEXT)ÚLEFTÚRIGHTro   r@   )r:   r   rG   Úparse_coverage_r6   rD   r   ZContextDefinition)	r#   rA   ZcontextsZsideÚcoverageZex_or_inÚleftÚrightrl   r%   r%   r&   rf     s2    



   ÿzParser.parse_context_c           	      C   sl  |   d¡st‚| j}g }g }| jdkr0td|ƒ‚| jdkrv|  d¡ | |  ¡ ¡ |  d¡ | |  ¡ ¡ |  d¡ q0|  d¡ tdd„ |D ƒƒ}td	d„ |D ƒƒ}|d
kr´|d
ksÈ|rÒ|d
ksÈ|d
krÒtd|ƒ‚t	t
t|ƒt|ƒƒƒ}|d
kr"|d
kr"|rtj||d}ntj||d}nF|d
krF|d
krFtj||d}n"|d
krh|d
krhtj||d}|S )Nra   ZSUBzExpected SUBZWITHZEND_SUBZEND_SUBSTITUTIONc                 S   s   g | ]}t |ƒ‘qS r%   ©Úlen©Ú.0Úcovr%   r%   r&   Ú
<listcomp>:  s     z.Parser.parse_substitution_.<locals>.<listcomp>c                 S   s   g | ]}t |ƒ‘qS r%   ru   rw   r%   r%   r&   rz   ;  s     é   zInvalid substitution typer@   )r7   rB   r:   r   r   rD   r6   rq   ÚmaxÚdictÚzipÚtupler   Z+SubstitutionReverseChainingSingleDefinitionZSubstitutionSingleDefinitionZSubstitutionMultipleDefinitionZSubstitutionLigatureDefinition)	r#   rj   rA   ÚsrcÚdestZmax_srcZmax_destÚmappingrm   r%   r%   r&   rg   ,  sH    





ÿÿÿ
 ÿzParser.parse_substitution_c                 C   s‚   |   d¡st‚| j}|  ¡ }|dkr.td|ƒ‚|dkr@|  ¡ }n4|dkrR|  ¡ }n"|dkrd|  ¡ }n|dkrt|  ¡ }|  	d¡ |S )	Nrb   )ÚATTACHÚATTACH_CURSIVEÚADJUST_PAIRÚADJUST_SINGLEz;Expected ATTACH, ATTACH_CURSIVE, ADJUST_PAIR, ADJUST_SINGLErƒ   r„   r…   r†   ZEND_POSITION)
r7   rB   r:   rG   r   Úparse_attach_Úparse_attach_cursive_Úparse_adjust_pair_Úparse_adjust_single_rD   )r#   rA   Zpos_typeÚpositionr%   r%   r&   rh   O  s$     ÿ



zParser.parse_position_c                 C   s†   |   d¡st‚| j}|  ¡ }g }|  d¡ | jdkrh|  ¡ }|  d¡ |  d¡ |  ¡ }| ||f¡ q*|  d¡ tj	|||d}|S )Nrƒ   ÚTOÚ
END_ATTACHÚATZANCHORr@   )
r7   rB   r:   rq   rD   r   rC   r6   r   ZPositionAttachDefinition)r#   rA   rr   Zcoverage_tory   Zanchor_namer‹   r%   r%   r&   r‡   b  s$    




  ÿzParser.parse_attach_c                 C   s‚   |   d¡st‚| j}g }g }| jdkr@|  d¡ | |  ¡ ¡ q| jdkrd|  d¡ | |  ¡ ¡ q@|  d¡ tj|||d}|S )Nr„   ZENTERZEXITr   r@   )	r7   rB   r:   r   rD   r6   rq   r   ZPositionAttachCursiveDefinition)r#   rA   Zcoverages_exitZcoverages_enterr‹   r%   r%   r&   rˆ   t  s"    




  ÿzParser.parse_attach_cursive_c                 C   sÒ   |   d¡st‚| j}g }g }i }| jdkrF|  ¡  |  ¡ }| |¡ q | jdkrl|  ¡  |  ¡ }| |¡ qF| jdkr²|  ¡ }|  ¡ }|  d¡ |  	¡ }	|  	¡ }
|	|
f|||f< ql|  d¡ t
j||||d}|S )Nr…   ZFIRSTZSECONDÚ
END_ADJUSTÚBYr@   )r7   rB   r:   r   r"   rq   r6   rE   rD   Ú
parse_pos_r   ZPositionAdjustPairDefinition)r#   rA   Zcoverages_1Zcoverages_2Zadjust_pairZ
coverage_1Z
coverage_2Zid_1Zid_2Zpos_1Zpos_2r‹   r%   r%   r&   r‰   …  s8    




   ÿzParser.parse_adjust_pair_c                 C   sh   |   d¡st‚| j}g }| jdkrL|  ¡ }|  d¡ |  ¡ }| ||f¡ q|  d¡ tj	||d}|S )Nr†   r   r   r@   )
r7   rB   r:   r   rq   rD   r‘   r6   r   ZPositionAdjustSingleDefinition)r#   rA   Zadjust_singleZ	coveragesrn   r‹   r%   r%   r&   rŠ      s    


zParser.parse_adjust_single_c           	   	   C   s  |   d¡st‚| j}|  ¡ }|  d¡ |  ¡ }|  d¡ |  ¡ }|  d¡ |  ¡ }|| jkrŒ| j|  |¡}|d k	rŒ|j	|krŒt
d| |ƒ‚| jdkr¤d}|  ¡  nd}|  d	¡ |  ¡ }|  d
¡ tj|||||||d}|| jkròtƒ | j|< | j|  ||¡ |S )Nr   ÚONÚGLYPHr?   z>Anchor "%s" already defined, anchor names are case insensitiveÚLOCKEDTFrŽ   Z
END_ANCHORr@   )r7   rB   r:   rC   rD   rE   rG   r   rH   Ú	componentr   r   r"   r‘   r   ZAnchorDefinitionr   rI   )	r#   rA   r)   rJ   Z
glyph_namer•   ÚanchorÚlockedrn   r%   r%   r&   r	   ­  sL    



ÿý



      ÿ
zParser.parse_def_anchor_c                 C   s8   |   ¡  |  d¡st‚|  ¡ }|  d¡ |  ¡ }||fS )NÚ	ADJUST_BYrŽ   )r"   r7   rB   rE   rD   )r#   Ú
adjustmentÚsizer%   r%   r&   Úparse_adjust_by_Ð  s    
zParser.parse_adjust_by_c           
      C   s  |   ¡  | j}|  d¡s t|ƒ‚d }d }d }i }i }i }| jdkrr|   ¡  |  ¡ }| jdkrr|  ¡ \}}	|||	< qR| jdkr¬|   ¡  |  ¡ }| jdkr¬|  ¡ \}}	|||	< qŒ| jdkræ|   ¡  |  ¡ }| jdkræ|  ¡ \}}	|||	< qÆ|  d¡ t 	||||||¡S )NÚPOSZADVr˜   ZDXZDYZEND_POS)
r"   r:   r7   rB   r   rE   r›   rD   r   ZPos)
r#   rA   ZadvZdxZdyZadv_adjust_byZdx_adjust_byZdy_adjust_byr™   rš   r%   r%   r&   r‘   Ø  s:    









zParser.parse_pos_c              
   C   sh   | j }z |  ¡  d¡}dd„ |D ƒ}W n0 tk
rV } ztt|ƒ|ƒ‚W 5 d }~X Y nX |g krd|S d S )Nú,c                 S   s&   g | ]}|d krt |dd… dƒ‘qS )Ú é   Né   )Úint)rx   Úunir%   r%   r&   rz   ü  s      z0Parser.parse_unicode_values_.<locals>.<listcomp>)r:   rC   ÚsplitÚ
ValueErrorr   Ústr)r#   rA   Zunicode_valuesÚerrr%   r%   r&   rF   ø  s     zParser.parse_unicode_values_c                 C   s0   |   d¡ | j}tj|  ¡ |d}|   d¡ |S )NrM   r@   ZEND_ENUM)rD   r:   r   ÚEnumrq   )r#   rA   rO   r%   r%   r&   rN     s
    

zParser.parse_enum_c                 C   sè   g }| j }| jdkrà| jdkr2|  ¡ }| |¡ q
| jdkrd|  d¡ |  ¡ }| tj||d¡ q
| jdkr˜|  d¡ |  ¡ }| tj|| |d¡ q
| jdkr
|  d¡ |  ¡ }|  d¡ |  ¡ }| tj	||| |d¡ q
t
|ƒS )N)r“   ÚGROUPÚRANGErM   rM   r“   r@   r¨   r©   rŒ   )r:   r   rN   r6   rD   rC   r   Z	GlyphNameZ	GroupNameZRanger   )r#   rr   rA   rO   r)   ÚstartÚendr%   r%   r&   rq     s*    








zParser.parse_coverage_c                 C   s   | j  |¡S ©N)r   rH   )r#   Z
group_namer%   r%   r&   Úresolve_group  s    zParser.resolve_groupc                 C   s   | j  ||¡S r¬   )r   Úrange)r#   rª   r«   r%   r%   r&   Úglyph_range"  s    zParser.glyph_rangec                 C   s(   | j }| j}|  ¡ }tj|||d}|S ©Nr@   ©r:   r3   rE   r   ÚSettingDefinition)r#   rA   Z	ppem_nameÚvalueÚsettingr%   r%   r&   r
   %  s
    zParser.parse_ppem_c                 C   s$   | j }| j}d}tj|||d}|S )NTr@   )r:   r3   r   r²   ©r#   rA   r)   r³   r´   r%   r%   r&   r   ,  s
    zParser.parse_noarg_option_c                 C   s6   | j }| j}|  ¡ |  ¡ |  ¡ f}tj|||d}|S r°   r±   rµ   r%   r%   r&   r   3  s
    zParser.parse_cmap_formatc                 C   s   | j tjko| j|kS r¬   )Úcur_token_type_r   rP   r3   )r#   Úkr%   r%   r&   r7   :  s    zParser.is_cur_keyword_c                 C   s&   |   ¡  | jtjk	r td| jƒ‚| jS )NzExpected a string)r"   r¶   r   rd   r   r:   r3   ©r#   r%   r%   r&   rC   =  s    zParser.expect_string_c                 C   s8   |   ¡  | jtjkr$| j|kr$| jS td| | jƒ‚d S )NzExpected "%s"©r"   r¶   r   rP   r3   r   r:   )r#   Úkeywordr%   r%   r&   rD   C  s    zParser.expect_keyword_c                 C   s*   |   ¡  | jtjkr| jS td| jƒ‚d S )NzExpected a namer¹   r¸   r%   r%   r&   rG   I  s    zParser.expect_name_c                 C   s&   |   ¡  | jtjk	r td| jƒ‚| jS )NzExpected a number)r"   r¶   r   ÚNUMBERr   r:   r3   r¸   r%   r%   r&   rE   O  s    zParser.expect_number_c                 C   sj   | j | j| j  | _| _| _z(|  d¡r,t‚| j 	¡ \| _ | _| _W n  tk
rd   d\| _ | _Y nX d S )Nr1   r   )
r   r   r    r¶   r3   r:   r7   ÚStopIterationr-   Únextr¸   r%   r%   r&   r"   U  s    ý
üýzParser.advance_lexer_N)$Ú__name__Ú
__module__Ú__qualname__r'   r!   r<   r   r   r   rT   rY   r   rf   rg   rh   r‡   rˆ   r‰   rŠ   r	   r›   r‘   rF   rN   rq   r­   r¯   r
   r   r   r7   rC   rD   rG   rE   r"   r%   r%   r%   r&   r      sB   
%#W## 	r   c                   @   s6   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zdd
d„ZdS )r   c                 C   s   i g| _ d S r¬   ©Úscopes_r¸   r%   r%   r&   r'   h  s    zSymbolTable.__init__c                 C   s   | j  i ¡ d S r¬   ©rÂ   r6   r¸   r%   r%   r&   rS   k  s    zSymbolTable.enter_scopec                 C   s   | j  ¡  d S r¬   )rÂ   Úpopr¸   r%   r%   r&   rV   n  s    zSymbolTable.exit_scopec                 C   s   || j d |< d S )NéÿÿÿÿrÁ   )r#   r)   Úitemr%   r%   r&   rI   q  s    zSymbolTable.defineTc                 C   sT   t | jƒD ]}| |¡}|r
|  S q
|rP|D ] }| ¡ | ¡ kr.||   S q.d S r¬   )ÚreversedrÂ   ÚgetÚlower)r#   r)   Úcase_insensitiveÚscoperÆ   Úkeyr%   r%   r&   rH   t  s    

zSymbolTable.resolveN)T)r¾   r¿   rÀ   r'   rS   rV   rI   rH   r%   r%   r%   r&   r   g  s
   r   c                   @   s.   e Zd Zdd„ Zdd„ Zddd„Zdd	„ Zd
S )r   c                 C   s   i g| _ d S r¬   rÁ   r¸   r%   r%   r&   r'     s    zOrderedSymbolTable.__init__c                 C   s   | j  i ¡ d S r¬   rÃ   r¸   r%   r%   r&   rS   „  s    zOrderedSymbolTable.enter_scopeFc                 C   s   t j| ||d d S )N)rÊ   )r   rH   )r#   r)   rÊ   r%   r%   r&   rH   ‡  s    zOrderedSymbolTable.resolvec                 C   sd   t | jƒD ]T}||kr
||kr
t| ¡ ƒ |¡}t| ¡ ƒ |¡}t| ¡ ƒ||d …   S q
d S )Nr{   )rÇ   rÂ   Úlistr5   Úindex)r#   rª   r«   rË   Z	start_idxZend_idxr%   r%   r&   r®   Š  s    zOrderedSymbolTable.rangeN)F)r¾   r¿   rÀ   r'   rS   rH   r®   r%   r%   r%   r&   r   €  s   
r   )ZfontTools.voltLib.astZvoltLibr   ZfontTools.voltLib.lexerr   ZfontTools.voltLib.errorr   Úior   r4   Úobjectr   r   r   r%   r%   r%   r&   Ú<module>   s.   ô    U