
    jkeTa                         d dl mc 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e
      Z G d de
      Z G d de      Zy)    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_ANCHOR	GRID_PPEMPRESENTATION_PPEMPPOSITIONING_PPEMCOMPILER_USEEXTENSIONLOOKUPSCOMPILER_USEPAIRPOSFORMAT2CMAP_FORMATDO_NOT_TOUCH_CMAPc                       e 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d Zd Zd Zd Z d Z!d  Z"d! Z#y")#Parserc                 H   t        j                         | _        t               | _        t               | _        i | _        t               | _        t               | _	        t               | _
        d\  | _        | _        d | _        | j                  |       | j                          y )NNN)astVoltFiledoc_OrderedSymbolTableglyphs_SymbolTablegroups_anchors_scripts_langs_lookups_next_token_type_next_token_next_token_location_make_lexer_advance_lexer_)selfpaths     :/usr/lib/python3/dist-packages/fontTools/voltLib/parser.py__init__zParser.__init__   sv    LLN	)+"}#!m#2>/t/$(!    c                     t        |d      rt        |dd       }|j                         }n'|}t        |d      5 }|j                         }d d d        t	        |      | _        y # 1 sw Y   xY w)Nreadnamer)hasattrgetattrr4   r   r   lexer_)r.   file_or_pathfilenamedatafs        r0   r,   zParser.make_lexer_$   sg    <(|VT:H$$&D#HlC(  Avvx D(+   s   A$$A-c           	         | j                   j                  }| j                  | j                          | j                  t
        j                         v r4t        | t
        | j                           }|j                   |              na| j                  d      r	 | j                   S t        ddj                  t        t
        j                                     z   | j                        | j                  | j                   S )NENDz	Expected z, )r    
statementsr)   r-   
cur_token_PARSE_FUNCSkeysr8   appendis_cur_keyword_r   joinsortedcur_token_location_)r.   r@   funcs      r0   parsezParser.parse.   s    YY))
##/!+"2"2"44t[%AB!!$&)%%e, yy	 #$))F;3C3C3E,F"GG,,  ##/ yyr2   c                    | j                  d      sJ | j                  }| j                         }| j                  d       | j	                         }|dk  rt        d| j                        d }| j                  dk(  r@| j                  d       | j	                         g}|d   dk  rFt        d| j                        | j                  dk(  r!| j                  d       | j                         }d }| j                  dk(  r'| j                  d       | j                         }|d	v sJ d }| j                  d
k(  r!| j                  d
       | j	                         }| j                  d       | j                  j                  |      t        d||fz  |      t        j                  ||||||      }| j                  j                  ||       |S )Nr   IDr   zInvalid glyph IDUNICODEzInvalid glyph UNICODEUNICODEVALUESTYPE)BASELIGATUREMARK	COMPONENT
COMPONENTS	END_GLYPHz#Glyph "%s" (gid %i) already definedlocation)rE   rH   expect_string_expect_keyword_expect_number_r   r*   parse_unicode_values_expect_name_r"   resolver   GlyphDefinitiondefine)r.   rW   r5   gidgunicodegtype
components	def_glyphs           r0   r   zParser.parse_def_glyph_>   s   ##K000++""$T"!!#7143K3KLLy(  +++-.H{Q"#:D<T<TUU0  1113Hv%  (%%'EEEEE
|+  .,,.J[)<<%15sCX  ''#x
X
	 	D),r2   c                    | j                  d      sJ | j                  }| j                         }d }| j                  dk(  r| j	                         }| j                  d       | j                  j                  |      t        d|z  |      t        j                  |||      }| j                  j                  ||       |S )Nr   ENUM	END_GROUPzBGlyph group "%s" already defined, group names are case insensitiverV   )rE   rH   rX   r*   parse_enum_rY   r$   r]   r   r   GroupDefinitionr_   )r.   rW   r5   enum	def_groups        r0   r   zParser.parse_def_group_c   s    ##K000++""$v%##%D[)<<%1359: 
 ''dXF	D),r2   c                    | j                  d      sJ | j                  }d }| j                  dk(  r!| j                  d       | j	                         }| j                  d       | j	                         }| j
                  j                  |      t        d|z  |      | j                  j                          g }| j                  dk7  r| j                          | j                         }| j                  d       | j                  j                  |j                        t        d|j                  d|d	|      | j                  j                  |j                  |       |j                  |       | j                  dk7  r| j                  d       | j                  j                          t!        j"                  ||||
      }| j
                  j                  ||       |S )Nr   NAMETAGz=Script "%s" already defined, script tags are case insensitive
END_SCRIPTEND_LANGSYSz
Language "z" already defined in script "z%", language tags are case insensitiverV   )rE   rH   r*   rY   rX   r&   r]   r   r'   enter_scoper-   parse_langsys_tagr_   rD   
exit_scoper   ScriptDefinition)r.   rW   r5   rs   langslang
def_scripts          r0   r   zParser.parse_def_script_u   s   ##L111++v%  (&&(DU#!!#==  %13589 
 	!,.!&&(D  /{{""488,8"<@HHcK 
 KKtxx.LL ,. 	\* ))$UXN
S*-r2   c                    | j                  d      sJ | j                  }d }| j                  dk(  r!| j                  d       | j	                         }| j                  d       | j	                         }g }| j                  dk7  rR| j                          | j                         }| j                  d       |j                  |       | j                  dk7  rRt        j                  ||||      }|S )NDEF_LANGSYSrm   rn   rp   END_FEATURErV   )
rE   rH   r*   rY   rX   r-   parse_feature_rD   r   LangSysDefinition)r.   rW   r5   rs   featuresfeaturedef_langsyss          r0   rr   zParser.parse_langsys_   s    ##M222++v%  (&&(DU#!!#-/!))+G  /OOG$	 -/
 ++D#x(Sr2   c                    | j                  d      sJ | j                  }| j                  d       | j                         }| j                  d       | j                         }g }| j                  dk7  rB| j                  d       | j                         }|j                  |       | j                  dk7  rBt        j                  ||||      }|S )NDEF_FEATURErm   rn   r{   LOOKUPrV   )rE   rH   rY   rX   r*   rD   r   FeatureDefinition)r.   rW   r5   rs   lookupslookupr   s          r0   r|   zParser.parse_feature_   s    ##M222++V$""$U#!!#-/  *((*FNN6"	 -/
 ''c7XNr2   c                 .   | j                  d      sJ | j                  }| j                         }|d   j                         st	        d|z  |      | j
                  j                  |      t	        d|z  |      d}| j                  dk(  r| j                          n!| j                  dk(  r| j                          d}d}d }| j                  d	k(  r| j                          | j                  d
k(  r!| j                          | j                         }n| j                  dk(  r| j                          n| j                  dk(  r| j                          d}nh| j                  t        j                  k(  r| j                         }n:t	        d| j                  z  |      | j                  dk(  r| j                          d}d }| j                  dk(  r'| j                  d       | j                         }|dv sJ d }| j                  dk(  r| j                  d       d}d }| j                  dk(  r1| j                  d       | j                         j                  dd      }g }	| j                  dv r| j                         }	| j                  dv r| j                         }
d }d }|
dk(  r| j!                  |      }n%|
dk(  r| j#                         }nt	        d|
z  |      t%        j&                  ||||||||	|||      }| j
                  j)                  ||       |S )Nr   r   z)Lookup name "%s" must start with a letterz>Lookup "%s" already defined, lookup names are case insensitiveTPROCESS_BASE	SKIP_BASEFPROCESS_MARKSMARK_GLYPH_SETALLNONEz3Expected ALL, NONE, MARK_GLYPH_SET or an ID. Got %s
SKIP_MARKS	DIRECTION)LTRRTLREVERSALCOMMENTSz\n
EXCEPT_CONTEXT
IN_CONTEXTAS_SUBSTITUTIONAS_POSITIONz/Expected AS_SUBSTITUTION or AS_POSITION. Got %srV   )rE   rH   rX   isalphar   r(   r]   r*   r-   r)   r   STRINGrY   r\   replaceparse_context_parse_substitution_parse_position_r   LookupDefinitionr_   )r.   rW   r5   process_baseprocess_marksmark_glyph_set	directionreversalcommentscontextas_pos_or_subsubpos
def_lookups                 r0   r	   zParser.parse_def_lookup_   s2   ##L111++""$Aw ;dBH  ==  &246:; 
 ~-!,! L.!#33##%!%!4!4!6!!U*##%!!V+##% %&&%,,6 $ 3 3 5" $ 5 57 
 -!!M	{*  -))+I...z)  ,Hz)  ,**,44UDAH"BB))+G "BB))+--**84Cm+&&(CDV  ))

 	T:.r2   c                    | j                   }g }| j                  dv rd }d }| j                         }| j                  dk7  rg }g }| j                  dv rW| j                         }| j                         }|dk(  r|j	                  |       n|j	                  |       | j                  dv rW| j                  d       t        j                  ||||      }|j	                  |       n| j                  d       | j                  dv r|S )Nr   END_CONTEXT)LEFTRIGHTr   rV   )rH   r*   r\   parse_coverage_rD   rY   r   ContextDefinition)	r.   rW   contextssidecoverageex_or_inleftrightr   s	            r0   r   zParser.parse_context_  s	   ++"BBDH((*H=0&&*;;,,.D#335Hv~H-X. &&*;; $$]3//dEH ($$]3+ "BB, r2   c                    | j                  d      sJ | j                  }g }g }| j                  dk7  rt        d|      | j                  dk(  r| j	                  d       |j                  | j                                | j	                  d       |j                  | j                                | j	                  d       | j                  dk(  r| j	                  d       t        |D cg c]  }t        |       c}      }t        |D cg c]  }t        |       c}      }|dkD  r|dkD  s|r|dkD  s|dkD  rt        d|      t        t        t        |      t        |                  }|dk(  r9|dk(  r4|rt        j                  ||	      }	|	S t        j                  ||	      }	|	S |dk(  r|dkD  rt        j                  ||	      }	|	S |dkD  r|dk(  rt        j                   ||	      }		S c c}w c c}w )
Nr   SUBzExpected SUBWITHEND_SUBEND_SUBSTITUTION   zInvalid substitution typerV   )rE   rH   r*   r   rY   rD   r   maxlendictziptupler   +SubstitutionReverseChainingSingleDefinitionSubstitutionSingleDefinitionSubstitutionMultipleDefinitionSubstitutionLigatureDefinition)
r.   r   rW   srcdestcovmax_srcmax_destmappingr   s
             r0   r   zParser.parse_substitution_,  s   ##$5666++u$~x88%'  'JJt++-.  (KK,,./  + %' 	/03/Cs3x/0D1SC12aKHqL'A+A:HEEs5:uT{34a<HMEEh 
 66wR
 
	 \hl44WxPC 
 q[X]44WxPC
' 01s   )G1G6c                 T   | j                  d      sJ | j                  }| j                         }|dvrt        d|      |dk(  r| j	                         }nA|dk(  r| j                         }n+|dk(  r| j                         }n|dk(  r| j                         }| j                  d       S )	Nr   )ATTACHATTACH_CURSIVEADJUST_PAIRADJUST_SINGLEz;Expected ATTACH, ATTACH_CURSIVE, ADJUST_PAIR, ADJUST_SINGLEr   r   r   r   END_POSITION)	rE   rH   r\   r   parse_attach_parse_attach_cursive_parse_adjust_pair_parse_adjust_single_rY   )r.   rW   pos_typepositions       r0   r   zParser.parse_position_O  s    ##M222++$$&WWMx  x))+H))113H&..0H(002H^,r2   c                    | j                  d      sJ | j                  }| j                         }g }| j                  d       | j                  dk7  re| j                         }| j                  d       | j                  d       | j                         }|j                  ||f       | j                  dk7  re| j                  d       t        j                  |||      }|S )Nr   TO
END_ATTACHATANCHORrV   )	rE   rH   r   rY   r*   rX   rD   r   PositionAttachDefinition)r.   rW   r   coverage_tor   anchor_namer   s          r0   r   zParser.parse_attach_b  s    ##H---++'')T",.&&(C  &  *--/K[12 ,. 	\*//kH
 r2   c                    | j                  d      sJ | j                  }g }g }| j                  dk7  r@| j                  d       |j	                  | j                                | j                  dk7  r@| j                  dk7  r@| j                  d       |j	                  | j                                | j                  dk7  r@| j                  d       t        j                  |||      }|S )Nr   ENTEREXITr   rV   )rE   rH   r*   rY   rD   r   r   PositionAttachCursiveDefinition)r.   rW   coverages_exitcoverages_enterr   s        r0   r   zParser.parse_attach_cursive_t  s    ##$4555++')  (!!$"6"6"89 ') ,.  )""4#7#7#9: ,. 	\*66Oh
 r2   c                    | j                  d      sJ | j                  }g }g }i }| j                  dk(  rA| j                          | j	                         }|j                  |       | j                  dk(  rA| j                  dk(  rA| j                          | j	                         }|j                  |       | j                  dk(  rA| j                  dk7  rj| j                         }| j                         }| j                  d       | j                         }	| j                         }
|	|
f|||f<   | j                  dk7  rj| j                  d       t        j                  ||||      }|S )Nr   FIRSTSECOND
END_ADJUSTBYrV   )rE   rH   r*   r-   r   rD   rZ   rY   
parse_pos_r   PositionAdjustPairDefinition)r.   rW   coverages_1coverages_2adjust_pair
coverage_1
coverage_2id_1id_2pos_1pos_2r   s               r0   r   zParser.parse_adjust_pair_  sb   ##M222++')!--/Jz* ') (*!--/Jz* (* ,.&&(D&&(D  &OO%EOO%E).Kt% ,. 	\*33kH
 r2   c                 ^   | j                  d      sJ | j                  }g }| j                  dk7  rT| j                         }| j	                  d       | j                         }|j                  ||f       | j                  dk7  rT| j	                  d       t        j                  ||      }|S )Nr   r   r   rV   )	rE   rH   r*   r   rY   r   rD   r   PositionAdjustSingleDefinition)r.   rW   adjust_single	coveragesr   r   s         r0   r   zParser.parse_adjust_single_  s    ##O444++,.,,.I  &//#C  )S!12	 ,.
 	\*55mhWr2   c           	      .   | j                  d      sJ | j                  }| j                         }| j                  d       | j	                         }| j                  d       | j                         }| j                  d       | j	                         }|| j                  v r>| j                  |   j                  |      }||j                  |k(  rt        d|z  |      | j                  dk(  rd}| j                          nd}| j                  d	       | j                         }| j                  d
       t        j                  |||||||      }|| j                  vrt               | j                  |<   | j                  |   j!                  ||       |S )Nr   ONGLYPHrS   z>Anchor "%s" already defined, anchor names are case insensitiveLOCKEDTFr   
END_ANCHORrV   )rE   rH   rX   rY   rZ   r\   r%   r]   	componentr   r*   r-   r   r   AnchorDefinitionr#   r_   )	r.   rW   r5   r`   
glyph_namer   anchorlockedr   s	            r0   r
   zParser.parse_def_anchor_  s   ##L111++""$T"!!#W%&&(
[)'')	&]]:.66t<F!f&6&6)&C"8:>? 
 x'F!FT"oo\*%%#z9fcH
 T]]*(3DMM*%j!((v6r2   c                     | j                          | j                  d      sJ | j                         }| j                  d       | j                         }||fS )N	ADJUST_BYr   )r-   rE   rZ   rY   )r.   
adjustmentsizes      r0   parse_adjust_by_zParser.parse_adjust_by_  sW    ##K000((*
T"""$4r2   c                 <   | j                          | j                  }| j                  d      sJ |       d }d }d }i }i }i }| j                  dk(  rW| j                          | j	                         }| j                  dk(  r(| j                         \  }}	|||	<   | j                  dk(  r(| j                  dk(  rW| j                          | j	                         }| j                  dk(  r(| j                         \  }}	|||	<   | j                  dk(  r(| j                  dk(  rW| j                          | j	                         }| j                  dk(  r(| j                         \  }}	|||	<   | j                  dk(  r(| j                  d       t        j                  ||||||      S )NPOSADVr  DXDYEND_POS)	r-   rH   rE   r*   rZ   r	  rY   r   Pos)
r.   rW   advdxdyadv_adjust_bydx_adjust_bydy_adjust_byr  r  s
             r0   r   zParser.parse_pos_  s   ++##E*4H4*u$!%%'C""k1#'#8#8#: 
D&0d# ""k1 t#!$$&B""k1#'#8#8#: 
D%/T" ""k1 t#!$$&B""k1#'#8#8#: 
D%/T" ""k1 	Y'wwsBM<NNr2   c                    | j                   }	 | j                         j                  d      }|D cg c]  }|dk7  s	t        |dd  d       }}|g k7  r|S d S c c}w # t        $ r}t        t        |      |      d }~ww xY w)N,       )rH   rX   splitint
ValueErrorr   str)r.   rW   unicode_valuesunierrs        r0   r[   zParser.parse_unicode_values_  s    ++	3!00288=N:HV3CSUIc#ab'2.VNV "02!5~?4? W 	3s3x22	3s-   #A 
AAA A 	B &A;;B c                     | j                  d       | j                  }t        j                  | j	                         |      }| j                  d       |S )Nrf   rV   END_ENUM)rY   rH   r   Enumr   )r.   rW   rj   s      r0   rh   zParser.parse_enum_  sG    V$++xx,,.BZ(r2   c                 &   g }| j                   }| j                  dv rj| j                  dk(  r#| j                         }|j                  |       n(| j                  dk(  rH| j	                  d       | j                         }|j                  t        j                  ||             n| j                  dk(  rI| j	                  d       | j                         }|j                  t        j                  || |             ny| j                  dk(  rj| j	                  d       | j                         }| j	                  d       | j                         }|j                  t        j                  ||| |             | j                  dv rjt        |      S )N)r   GROUPRANGErf   rf   r   rV   r'  r(  r   )rH   r*   rh   rD   rY   rX   r   	GlyphName	GroupNameRanger   )r.   r   rW   rj   r5   startends          r0   r   zParser.parse_coverage_  sK   ++"EE6)'')%!!W,$$W-**,dX FG!!W,$$W-**,dD8 LM!!W,$$W-++-$$T*))+		%dX NO# "EE$ Xr2   c                 8    | j                   j                  |      S N)r$   r]   )r.   
group_names     r0   resolve_groupzParser.resolve_group  s    ||##J//r2   c                 :    | j                   j                  ||      S r/  )r"   range)r.   r,  r-  s      r0   glyph_rangezParser.glyph_range"  s    ||!!%--r2   c                     | j                   }| j                  }| j                         }t        j                  |||      }|S NrV   rH   rA   rZ   r   SettingDefinition)r.   rW   	ppem_namevaluesettings        r0   r   zParser.parse_ppem_%  s=    ++OO	##%''	58Lr2   c                 j    | j                   }| j                  }d}t        j                  |||      }|S )NTrV   )rH   rA   r   r8  r.   rW   r5   r:  r;  s        r0   r   zParser.parse_noarg_option_,  s4    ++''ehGr2   c                     | j                   }| j                  }| j                         | j                         | j                         f}t        j                  |||      }|S r6  r7  r=  s        r0   r   zParser.parse_cmap_format3  sV    ++$$&(;(;(=t?R?R?TU''ehGr2   c                 \    | j                   t        j                  u xr | j                  |k(  S r/  )cur_token_type_r   rm   rA   )r.   ks     r0   rE   zParser.is_cur_keyword_:  s%    $$

2NA9MNr2   c                     | j                          | j                  t        j                  urt	        d| j
                        | j                  S )NzExpected a string)r-   r@  r   r   r   rH   rA   r.   s    r0   rX   zParser.expect_string_=  >    u||32D4L4LMMr2   c                     | j                          | j                  t        j                  u r| j                  |k(  r| j                  S t        d|z  | j                        )NzExpected "%s"r-   r@  r   rm   rA   r   rH   )r.   keywords     r0   rY   zParser.expect_keyword_C  sM    5::-$//W2L??"?W4d6N6NOOr2   c                     | j                          | j                  t        j                  u r| j                  S t        d| j                        )NzExpected a namerF  rC  s    r0   r\   zParser.expect_name_I  s>    5::-??",d.F.FGGr2   c                     | j                          | j                  t        j                  urt	        d| j
                        | j                  S )NzExpected a number)r-   r@  r   NUMBERr   rH   rA   rC  s    r0   rZ   zParser.expect_number_O  rD  r2   c                 2   | j                   | j                  | j                  c| _        | _        | _        	 | j                  d      rt        | j                  j                         \  | _         | _        | _        y # t        $ r d\  | _         | _        Y y w xY w)Nr?   r   )
r)   r*   r+   r@  rA   rH   rE   StopIterationr9   nextrC  s    r0   r-   zParser.advance_lexer_U  s    !!%% 	Hdot/G
		C##E*##
   "	% ) 	C6B3D!4#3	Cs   AA; ;BBN)$__name__
__module____qualname__r1   r,   rJ   r   r   r   rr   r|   r	   r   r   r   r   r   r   r   r
   r	  r   r[   rh   r   r1  r4  r   r   r   rE   rX   rY   r\   rZ   r-    r2   r0   r   r      s    , #J$!F$ Un6!F&$"6!F O@@.0.OPHCr2   r   c                   ,    e Zd Zd Zd Zd Zd ZddZy)r#   c                     i g| _         y r/  scopes_rC  s    r0   r1   zSymbolTable.__init__h      tr2   c                 :    | j                   j                  i        y r/  rU  rD   rC  s    r0   rq   zSymbolTable.enter_scopek      Br2   c                 8    | j                   j                          y r/  )rU  poprC  s    r0   rt   zSymbolTable.exit_scopen  s    r2   c                 (    || j                   d   |<   y )NrT  )r.   r5   items      r0   r_   zSymbolTable.defineq  s    !%Rr2   c                     t        | j                        D ]  }|j                  |      }|s|c S  |r/D ]*  }|j                         |j                         k(  s%||   c S  y r/  )reversedrU  getlower)r.   r5   case_insensitivescoper^  keys         r0   r]   zSymbolTable.resolvet  sf    dll+ 	E99T?D	  &99;$**,. :%& r2   N)T)rN  rO  rP  r1   rq   rt   r_   r]   rQ  r2   r0   r#   r#   g  s     &	r2   r#   c                   &    e Zd Zd Zd ZddZd Zy)r!   c                     i g| _         y r/  rT  rC  s    r0   r1   zOrderedSymbolTable.__init__  rV  r2   c                 :    | j                   j                  i        y r/  rX  rC  s    r0   rq   zOrderedSymbolTable.enter_scope  rY  r2   c                 4    t         j                  | ||       y )N)rc  )r#   r]   )r.   r5   rc  s      r0   r]   zOrderedSymbolTable.resolve  s    D$9IJr2   c                 ,   t        | j                        D ]|  }||v s||v st        |j                               j	                  |      }t        |j                               j	                  |      }t        |j                               ||dz    c S  y )Nr   )r`  rU  listrC   index)r.   r,  r-  rd  	start_idxend_idxs         r0   r3  zOrderedSymbolTable.range  s    dll+ 	CE~#, .44U;	uzz|,2237EJJL))gkBB		C
 r2   N)F)rN  rO  rP  r1   rq   r]   r3  rQ  r2   r0   r!   r!     s     Kr2   r!   )fontTools.voltLib.astvoltLibr   fontTools.voltLib.lexerr   fontTools.voltLib.errorr   ior   rB   objectr   r#   r!   rQ  r2   r0   <module>ru     sj    # # ) 0  $#%%%&&$9"7&. N	CV N	Cb& 2 r2   