+
    f7iG c                   s    ^ RI Ht ^ RIHtHtHt ^ RIHt ^ RIH	t	 ^ RI
HtHtHt ^ RIHu Ht ^ RIt^ RIt^ RIt]P(                  ! ]4      t ! R R]4      t ! R	 R
]4      tR# )    )FeatureLibError)LexerIncludingLexerNonIncludingLexer)VariableScalar)getEncoding)bytechrtobytestostrNc                   sB  a ] tR t^t oRt/ t]t]! ^^4       U u0 uF  p RV ,          kK  	  up t]! ^^d4       U u0 uF  p RV ,          kK  	  up t	RhR lt
R tR tR tR	 tR
 tR tR tR tR tR tRiR ltR tR tR tR tR tR tR tR tR tR tR t R t!R t"R t#R t$R  t%R! t&R" t'R# t(R$ t)R% t*R& t+R' t,R( t-R) t.R* t/R+ t0R, t1R- t2R. t3R/ t4]5R0 4       t6]5R1 4       t7R2 t8R3 t9R4 t:R5 t;R6 t<R7 t=R8 t>R9 t?R: t@R; tAR< tBR= tCR> tDR? tER@ tFRA tGRB tHRiRC ltIRD tJRE tKRF tLRG tMRH tNRI tORJ tPRjRK ltQRL tRRM tSRN tTRO tURP tVRQ tWRR tXRS tYRT tZRU t[RV t\RW t]RX t^RiRY lt_RZ t`R[ taR\ tbR] tcR^ tdR_ teR` tfRa tgRb thRiRc lti]5Rd 4       tjRe tkRf tlRgtmVtnR# u up i u up i )kParsera  Initializes a Parser object.

Example:

    .. code:: python

        from fontTools.feaLib.parser import Parser
        parser = Parser(file, font.getReverseGlyphMap())
        parsetree = parser.parse()

Note: the ``glyphNames`` iterable serves a double role to help distinguish
glyph names from ranges in the presence of hyphens and to ensure that glyph
names referenced in a feature file are actually part of a font's glyph set.
If the iterable is left empty, no glyph name in glyph set checking takes
place, and all glyph tokens containing hyphens are treated as literal glyph
names, not as ranges. (Adding a space around the hyphen can, in any case,
help to disambiguate ranges from glyph names containing hyphens.)

By default, the parser will follow ``include()`` statements in the feature
file. To turn this off, pass ``followIncludes=False``. Pass a directory string as
``includeDir`` to explicitly declare a directory to search included feature files
in.
zss%02dzcv%02dNc           	     s   R V9   d4   ^ RI Hp V! R R4       V'       d   \        R4      hVP                  R 4      pV'       d<   \        R\	        V4      ^8X  d   RMR: RRP                  R	 V 4       4      : 24      h\        V4      V n        V P                  P                  4       V n
        \        4       V n        \        4       V n        \        4       V n        \        4       V n        V P                  V P                  0V n        R
R
uV n        V n        . V n        R
V n        V'       d   \*        M\,        pV! WR7      V n        / V n        V P3                  RR7       R
# )ZglyphMap)deprecateArgumentz#use 'glyphNames' (iterable) insteadz?'glyphNames' and (deprecated) 'glyphMap' are mutually exclusivezunsupported keyword argument sz: z, c              3   s8   "   T F  p\        V4      x  K  	  R # 5iN)Zrepr)Z.0k   & >/usr/lib64/python3.14/site-packages/fontTools/feaLib/parser.pyZ	<genexpr>Z"Parser.__init__.<locals>.<genexpr><   s     =Vv!d1ggvs   N)
includeDirTcomments)ZfontTools.misc.loggingToolsr   Z	TypeErrorpoplenjoinsetglyphNames_astZFeatureFiledoc_SymbolTableanchors_glyphclasses_lookups_valuerecords_symbol_tables_next_token_type_next_token_cur_comments_next_token_location_r   r   lexer_missingadvance_lexer_)selfZfeaturefileZ
glyphNamesZfollowIncludesr   Zkwargsr   Z
lexerClasss   &&&&&,  r   __init__ZParser.__init__-   s&    Ej*OPX   J/JV)2s2DII=Vv=V4VX 
 z?HH((*	#(]#(]#}}d.@.@A37/t/$(!'5^;L
 DT*    c           	     sp	   V P                   P                  pV P                  f   V P                  '       Ed   V P	                  RR7       V P
                  \        P                  J dC   VP                  V P                  P                  V P                  V P                  R7      4       K  V P                  R4      '       d"   VP                  V P                  4       4       K  V P
                  \        P                  J d#   VP                  V P!                  4       4       EK  V P                  R4      '       d#   VP                  V P#                  4       4       EKD  V P                  R4      '       d#   VP                  V P%                  4       4       EK}  V P                  R4      '       d#   VP                  V P'                  4       4       EK  V P                  R4      '       d%   VP                  V P)                  R	R
7      4       EK  V P                  R4      '       d#   VP                  V P+                  4       4       EK*  V P                  R4      '       d#   VP                  V P-                  4       4       EKc  V P                  R4      '       d#   VP                  V P/                  4       4       EK  V P                  R4      '       d%   VP                  V P-                  RR7      4       EK  V P                  R4      '       d#   VP                  V P1                  4       4       EK  V P                  R4      '       d%   VP                  V P3                  R	R
7      4       EKK  V P
                  \        P4                  J dQ   V P                  V P6                  9   d6   VP                  V P6                  V P                  ,          ! V 4      4       EK  V P
                  \        P8                  J d   V P                  R8X  d   EK  \;        RP=                  V P
                  V P                  4      V P                  4      hV P>                  '       dY   V P>                  PA                  4        UUu. uF  w  r#RV: RV: R2NK  	  ppp\;        RRPC                  V4      ,           R4      hV P                   # u uppi )zParse the file, and return a :class:`fontTools.feaLib.ast.FeatureFile`
object representing the root of the abstract syntax tree containing the
parsed contents of the file.NTr   locationinclude	anchorDeflanguagesystemlookupFvertical	markClassfeatureconditionset	variation)r7   tablevalueRecordDef;zbExpected feature, languagesystem, lookup, markClass, table, or glyph class definition, got {} "{}"Z z (first found at )zMThe following glyph names are referenced but are missing from the glyph set:
Z
anonZ	anonymous)"r   
statementsr"   r$   r(   cur_token_type_r   COMMENTappendr   Comment
cur_token_cur_token_location_is_cur_keyword_parse_include_
GLYPHCLASSparse_glyphclass_definition_parse_anonymous_parse_anchordef_parse_languagesystem_parse_lookup_parse_markClass_parse_feature_block_parse_conditionset_parse_table_parse_valuerecord_definition_NAME
extensionsSYMBOLr   formatr'   Zitemsr   )r)   r>   nameZlocerror   &    r   parseZParser.parseN   s    YY))
##/43E3E3E.##u}}4!!HH$$T__t?W?W$X %%i00!!$"5"5"78%%)9)99!!$"C"C"EF%%&;<<!!$"7"7"9:%%k22!!$"7"7"9:%%&677!!$"<"<">?%%h//!!$"4"4e"4"DE%%k22!!$"7"7"9:%%i00!!$";";"=>%%n55!!$":":"<=%%k22!!$";";d";"KL%%g..!!$"3"3"56%%&677!!$"D"De"D"TU$$

2OOt6!!$//$//"B4"HI%%5$//S:P%DDJF,,dooE ,,  <<< "&!3!3!5!5ID# .237!5   ""&))E"24 
 yys   +R2c           
     s   V P                  R 4       V P                  R4       V P                  pV P                  R8X  d%   V P                  R4       V P                  R4       R# V P                  \
        P                  8X  d   V P                  4       pV P                  P                  V4      pVf   \        RV,          V P                  4      hV P                  R4       V P                  P                  VP                  VP                  VVP                  RRVR7      # V P!                  RR7      V P!                  RR7      rTRpV P                  R	8X  d"   V P                  R	4       V P!                  4       pV P                  R 8X  d"   V P#                  4       pV P#                  4       pMRRrV P                  R4       V P                  P                  VVRVVVVR7      # )
<anchorNULL>NzUnknown anchor "%s")rV   contourpointxDeviceTableyDeviceTabler-   Tvariabler^   )expect_symbol_expect_keyword_rD   r#   r"   r   rR   expect_name_r   resolver   r   ZAnchorxyr^   expect_number_parse_device_)	r)   r-   rV   	anchordefrg   rh   r^   r_   r`   s	   &        r   parse_anchor_ZParser.parse_anchor_   s    	C X&++v%  ($  EJJ.$$&D--d3I %)D0$2J2J  $88??&33!!! #   ""D"143F3FPT3F3U1~-  0..0Ls"--/L--/L)-t,C xx%%%  
 	
r+   c                s    . pV P                   R 8X  d]   V P                  4       pVf   V P                   R8w  d   K8  V P                  R4       V P                  4       pVP	                  W#34       Km  V# )rZ   mark)r#   rl   rd   expect_markClass_reference_rA   )r)   ZanchorMarksr[   r4      &   r   parse_anchor_marks_ZParser.parse_anchor_marks_   sk    #%'')F~$"2"2f"<  (88:I23r+   c                s   V P                  R 4      '       g   Q hV P                  pV P                  4       V P                  4       r2RpV P                  R8X  d"   V P	                  R4       V P                  4       pV P                  4       pV P                  R4       V P                  P                  WRW4VR7      pV P                  P                  WV4       V# )r/   Nr^   r:   )r^   r-   )rE   rD   ri   r#   rd   re   rc   r   ZAnchorDefinitionr   define)r)   r-   rg   rh   r^   rV   rk      &      r   rJ   ZParser.parse_anchordef_   s    ##K0000++""$d&9&9&;1~-  0..0L  "C HH--QH . 
	 	T-r+   c                sh   V P                  R4      '       g   Q hV P                  4       pV P                  P                  V4      w  r#pV P	                  4        V P                  R4       V P                  4       pW8X  g   Q R4       hV P                  R4       V P                  P                  WVR7      # )r=   }z-bad splitting in Lexer.scan_anonymous_block()r:   r,   r<   )rE   expect_tag_r&   Zscan_anonymous_blockr(   rc   r   ZAnonymousBlock)r)   tagZ_Zcontentr-   end_tag   &     r   rI   ZParser.parse_anonymous_   s    ##$9:::: #{{??DHC ""$~NNN~C xx&&sh&GGr+   c                sR   V P                  R 4      '       g   Q hV P                  pV P                  RR7      pV P                  4       0pV P                  R8w  d"   VP                  V P                  4       4       K2  V P                  R4       V P                  P                  W#VR7      # )AttachTaccept_glyphnamer:   r,   )	rE   rD   parse_glyphclass_ri   r#   addrc   r   ZAttachStatement)r)   r-   glyphsZcontourPointsro   r   parse_attach_ZParser.parse_attach_   s    ##H----++'''>,,./#%d1134C xx'''QQr+   c                sn    V P                   R9   g   Q hV P                  4        V P                  RVR7      # )	enumerateT
enumeratedr3   >   enumr   )rC   r(   parse_position_)r)   r3      &&r   parse_enumerate_ZParser.parse_enumerate_   s7    "7777##th#GGr+   c                s@   V P                  R 4      '       g   Q hV P                  pV P                  R8w  d   V P                  RR7      pMRpV P	                  R4       V P                  R8w  d   V P                  RR7      pMRpV P	                  R4       V P                  R8w  d   V P                  RR7      pMRpV P	                  R4       V P                  R8w  d   V P                  RR7      pMRpV P	                  R4       V P
                  P                  W$W5VR7      # )GlyphClassDef,Fry   Nr:   r,   )rE   rD   r#   r{   rc   r   ZGlyphClassDefStatement)r)   r-   Z
baseGlyphsZligatureGlyphsZ
markGlyphsZcomponentGlyphsrw   r   parse_GlyphClassDef_ZParser.parse_GlyphClassDef_   s   ##O4444++s"///GJJC s"!33U3KN!NC s"///GJJC s""44e4LO"OC xx..Nh / 
 	
r+   c                s   V P                   V P                  r!V P                  R 4       V P                  RR7      pV P                  R4       V P                  P                  W#VR7      pV P                  P                  W$4       V# )=Fry   r:   r,   )rD   rC   rc   r{   r   ZGlyphClassDefinitionr   rq   )r)   r-   rV   r}   
glyphclassrX   r   rH   Z#Parser.parse_glyphclass_definition_  su    114??$C '''?C XX224(2S
!!$3r+   c                s*   VP                  R 4      p. p\        \        V4      4       F_  pR P                  V^ V 4      R P                  W5R 4      rvW`P                  9   g   K;  WpP                  9   g   KM  VP                  Wg34       Ka  	  \        V4      ^8X  d   V^ ,          w  rgWg3# \        V4      ^ 8X  d   \        RV,          V4      hRP                  V UU	u. uF  w  rRV: RV	: R2NK  	  up	p4      p
\        RV: RV
: R2V4      hu up	pi )	-NzU"%s" is not a glyph in the font, and it can not be split into a range of known glyphsz or "z - zAmbiguous glyph range "z"; please use z to clarify what you mean)Zsplitranger   r   r   rA   r   )r)   rV   r-   ZpartsZ	solutionsistartlimitr   lrangess   &&&        r   split_glyph_range_ZParser.split_glyph_range_#  s   & 

3	s5z"A88E!AJ/%)1D5(((U6F6F-F  %0 # y>Q$Q<LE<^q !/156  [[9!M941aA"69!MNF!<@&J  "Ns   D
c           	     s`   V'       d   V P                   \        P                  \        P                  39   d   V'       dH   V P                  R 8X  d7   V P                  4        V P                  P                  V P                  R7      # V P                  4       pV P                  V4       V P                  P                  W0P                  R7      # V P                   \        P                  J d   V P                  4        V P                  P                  V P                  4      pVf(   \!        RV P                  ,          V P                  4      h\#        W@P                  P$                  4      '       d'   V P                  P'                  W@P                  R7      # V P                  P)                  W@P                  R7      # V P+                  R4       V P                  pV P                  P-                  VR7      pV P                  R8w  Ed   V P                   \        P                  J Edb   V P                  4       pV P                  pRV9   dk   V P.                  '       dY   W0P.                  9  dI   V P1                  W54      w  rxV P                  Wx4       VP3                  WxV P5                  WWV4      4       K  V P                  R8X  dZ   TpV P+                  R4       V P                  4       pV P                  Wx4       VP3                  WxV P5                  WWV4      4       EK(  RV9   d?   V P.                  '       g-   \6        P9                  \;        \!        RV: 2V4      4      4       V P                  V4       VP=                  V4       EK  V P                   \        P                  J d   V P                  4       pV P                  R8X  dz   V P                  p	V P                  p
V P+                  R4       V P?                  4       pV P                  RV
R 2RVR 24       VPA                  V
VV PC                  WV4      4       EKJ  RV P                  R 2pV P                  V4       VP=                  V4       EK  V P                   \        P                  J d   V P                  4        V P                  P                  V P                  4      pVf(   \!        RV P                  ,          V P                  4      h\#        W@P                  P$                  4      '       d(   V P                  P'                  W@P                  R7      pM&V P                  P)                  W@P                  R7      pVPE                  V4       EK  \!        R	V P                  : 2V PF                  4      hV P+                  R4       V# )
r\   r,   zUnknown glyph class @%sZ[Z]r   z.Ambiguous glyph name that looks like a range: cidZ05dzBExpected glyph name, glyph range, or glyph class reference, found )$r"   r   rR   CIDr#   r(   r   	NullGlyphrD   expect_glyph_check_glyph_name_in_glyph_setZ	GlyphNamerG   r   rf   rC   r   
isinstance	MarkClassZMarkClassNameZGlyphClassNamerc   Z
GlyphClassr   r   Z	add_rangemake_glyph_range_logwarningstrrA   expect_cid_Zadd_cid_rangemake_cid_range_Z	add_classr%   )r)   rz   accept_nullZglyphgcr-   r}   r   r   Zrange_locationZrange_startZ	range_endZ
glyph_names   &&&          r   r{   ZParser.parse_glyphclass_M  s     5 5%**eii9P Pt//69##%xx))43K3K)LL&&(E..u588%%e6N6N%OO  E$4$44!##++DOO<Bz%-?,,  "hh0011xx--b;S;S-TTxx..r<T<T.UUC ++$$h$7#%$$

2**,33%<D$4$4$4FVFV9V#'#:#:5#KLE66uD$$d&<&<Xe&T %%,!E'', ..0E66uD$$d&<&<Xe&T e|D,<,<,< /&TUZT]$^$,!" 66u=MM%(&&%))3**,##s*%)%=%=N"&//K'', $ 0 0 2I66k#./i_- ((#!,,^)T $'ts&;!<J66zBMM*-&&%*:*::##%''//@:)1DOOC00  b(("4"455//=U=U/VB00>V>V0WB  $%77;7G7G6JL-- 
 	C r+   c                s`   . . . . . 3w  r#rEpR pV P                   R9  Ed   V P                  RR7      pR p	V P                   R8X  d   V P                  R4       R;ryV	'       d1   V'       d   \        RV P                  4      hVP                  V4       M+V'       d   VP                  V4       MVP                  V4       V P                  4       '       d"   VP                  V P                  V4      4       MVP                  R4       Rp
V P                   R8X  d   V
f   . p
V P                  R4       V	'       g   \        RV P                  4      hV P                  4       pV P                  P                  V4      pVf   \        RV,          V P                  4      hV
P                  V4       K  V	'       g   EK  VP                  V
4       EK  V'       g+   V'       g#   V. 8X  g   Q h. VR.\        V4      ,          V. V3# \        VR\        V4       4      '       d   \        R	V P                  4      hV\        V4      \        V4      \        V4      ,            p\        V4      '       dG   \        V\        V4      \        V4      ,           R 4      '       d   \        R
V P                  4      hTpM~V'       dP   VR,          '       dA   \        V4      ^8  g   \        VRR 4      '       d   \        R
V P                  4      hVRR pM'\        V4      '       d   \        R
V P                  4      hW#WEWg3# )FTry   Z'z_Unsupported contextual target sequence: at most one run of marked (') glyph/class names allowedNr1   z%Lookups can only follow marked glyphsUnknown lookup "%s"z_Positioning cannot be applied in the bactrack glyph sequence, before the marked glyph sequence.zPositioning values are allowed only in the marked glyph sequence, or after the final glyph node when only one glyph node is marked.>   r   r:   byfrom)r#   r{   rc   r   rD   rA   is_next_value_parse_valuerecord_rd   re   r   rf   r   any)r)   r3   prefixr}   lookupsvaluessuffixhasMarksr   ZmarkedZ
lookuplistZlookup_namer1   Zmarked_valuess   &&            r   parse_glyph_pattern_ZParser.parse_glyph_pattern_  s    46r2r22F/&>>'''>BF3&##C($(( *J00 
 b!b!b!""$$d55h?@d#J""h.%!#J$$X.)?00  #//1..{;>)-;T=U=U  !!&)vz*fb= =V 4fb(KK6-CK())%8,, 
 #3v;Vs6{1JKM=!!vc&kCK79:;;)* 00	  'F2JJv;?c&"+&6&6)* 00	   V%& ,,	  GVFFr+   c                s"   V P                   pV P                  R R7      w  r4rVrx\        V4      '       d   \        RV R2V4      hV'       g@   \        RV R2V4      p	\        P                  \        V	4      4       VR,          VR,          rGW4V3p
V
# )Fr2   z(No lookups can be specified for "ignore r   zAmbiguous "ignore z)", there should be least one marked glyph   NN:r    r   N)rD   r   r   r   r   r   r   )r)   subr-   r   r}   r   r   r   r   rW   chainContext   &&         r   parse_ignore_glyph_pattern_Z"Parser.parse_ignore_glyph_pattern_  s    ++<@<U<U =V =
9 w<<!:3%qA8  #$SE)RSE KKE
##BZF/r+   c                s    V P                   pV P                  V4      .pV P                  R 8X  d4   V P                  R 4       VP	                  V P                  V4      4       KD  V P                  R4       V# )r   r:   )rD   r   r#   rc   rA   )r)   r   r-   r      &&  r   parse_ignore_context_ZParser.parse_ignore_context_!  si    ++88=>#%$ @ @ EFC r+   c                s   V P                  R 4      '       g   Q hV P                  pV P                  4        V P                  R9   d.   V P	                  R4      pV P
                  P                  W!R7      # V P                  R9   d.   V P	                  R4      pV P
                  P                  W!R7      # \        RV P                  4      h)ignorer   r,   posz#Expected "substitute" or "position")
substituter   )positionr   )	rE   rD   r(   rC   r   r   ZIgnoreSubstStatementZIgnorePosStatementr   )r)   r-   r      &  r   parse_ignore_ZParser.parse_ignore_*  s    ##H----++??3355e<L88000QQ??1155e<L88..|.OO143K3K
 	
r+   c                s    V P                   R 8X  g   Q hV P                  pV P                  4       p\        P                  ! W!R7      # )r.   r,   )rC   rD   expect_filename_r   ZIncludeStatement)r)   r-   Zfilenamer   r   rF   ZParser.parse_include_9  s>    )+++++((*##H@@r+   c                s^   V P                  R 4      '       g   Q hV P                  pV P                  4       pRRrCV P                  R9   d   V P	                  4       R8H  pV P                  R8X  d   V P                  R4       RpV P                  R4       V P                  P                  W#WAR7      # )languageTFinclude_dfltrequiredr:   r,   >   Zexclude_dfltr   )	rE   rD   expect_language_tag_r#   re   rd   rc   r   ZLanguageStatement)r)   r-   r   Zinclude_defaultr   rX   r   parse_language_ZParser.parse_language_@  s    ##J////++,,.%)5??"//1^COz)  ,HC xx))x * 
 	
r+   c                sR   V P                  R 4      '       g   Q hV P                  pV P                  RR7      pV P                  4       .pV P                  R8w  d"   VP                  V P                  4       4       K2  V P                  R4       V P                  P                  W#VR7      # )LigatureCaretByIndexTry   r:   r,   )	rE   rD   r{   ri   r#   rA   rc   r   ZLigatureCaretByIndexStatementr)   r-   r}   Zcaretsro   r   parse_ligatureCaretByIndex_Z"Parser.parse_ligatureCaretByIndex_O  s    ##$:;;;;++'''>%%'(#%MM$--/0C xx55fx5XXr+   c                sZ   V P                  R 4      '       g   Q hV P                  pV P                  RR7      pV P                  RR7      .pV P                  R8w  d$   VP                  V P                  RR7      4       K4  V P                  R4       V P                  P                  W#VR7      # )LigatureCaretByPosTry   ra   r:   r,   )	rE   rD   r{   ri   r#   rA   rc   r   ZLigatureCaretByPosStatementr   ro   r   parse_ligatureCaretByPos_Z Parser.parse_ligatureCaretByPos_Y  s    ##$89999++'''>%%t%45#%MM$--t-<=C xx33FX3VVr+   c                s@   V P                  R 4      '       g   Q hV P                  V P                  4       r2V P                  R8X  dj   V P                  P                  V4      pVf   \        RV,          V P                  4      hV P                  R4       V P                  P                  WBR7      # RpV P                  R8X  d   V P                  R4       RpV P                  P                  W5VR7      pV P                  Wa4       V P                  P                  W64       V# )r1   r:   r   r,   FuseExtensionT)rE   rD   re   r#   r   rf   r   rc   r   ZLookupReferenceStatementrd   ZLookupBlockparse_block_rq   )r)   r3   r-   rV   r1   use_extensionblocks   &&     r   rL   ZParser.parse_lookup_c  s    ##H----1143D3D3F$s"]]**40F~%)D0$2J2J  $8844V4OO~-  0 M$$T8$L%*T)r+   c                sB   V P                  R 4      '       g   Q hV P                  pV P                  \        P                  8X  d>   V P                  4       pV P                  R4       V P                  P                  W!R7      # Rp^ RRrTpR^R^R^R^/p\        4       pV P                  R8w  Ed   V P                  V9   d(   \        R	V P                  ,          V P                  4      hVP                  V P                  4       V P                  R
8X  d&   V P                  R
4       V P                  RR7      pK  V P                  R8X  d&   V P                  R4       V P                  RR7      pK  V P                  V9   d#   RpW&V P!                  4       ,          ,          pEK  \        RV P                  ,          V P                  4      hV P                  R4       \#        W4V.4      '       g   \        RV P                  4      hV P                  P                  VVVVR7      # )
lookupflagr:   r,   FNZRightToLeftZIgnoreBaseGlyphsZIgnoreLigaturesZIgnoreMarksz%s can be specified only onceZMarkAttachmentTypery   ZUseMarkFilteringSetTz#"%s" is not a recognized lookupflagzlookupflag must have a value)markAttachmentmarkFilteringSetr-   )rE   rD   r"   r   NUMBERri   rc   r   ZLookupFlagStatementr   r#   r   r%   r|   rd   r{   re   r   )r)   r-   valueZ
value_seenr   r   flagsZseen   &       r   parse_lookupflag_ZParser.parse_lookupflag_|  s    ##L1111++   ELL0'')E$88///II 
23T4/1q1	
 u#%4'%3d6F6FF--  HHT%%&#77$$%9:!%!7!7!7!O!!%::$$%:;#'#9#95#9#Q !!U*!
d&7&7&9 ::%9D<L<LL--  	C J0@ABB!.0I0I  xx++)-	 , 
 	
r+   c                sd   V P                  R 4      '       g   Q hV P                  pV P                  RR7      pVP                  4       '       g   \	        RV4      hV P                  4       pV P                  4       pV P                  R4       V P                  P                  P                  V4      pVfO   V P                  P                  V4      pWPP                  P                  V&   V P                  P                  WE4       V P                  P                  WSW!R7      pVP!                  V4       V# )r4   Try   z*Empty glyph class in mark class definitionr:   r,   )rE   rD   r{   glyphSetr   rl   expect_class_name_rc   r   ZmarkClassesgetr   r   r   rq   ZMarkClassDefinitionZaddDefinition)r)   r-   r}   r[   rV   r4   Zmcdefrr   r   rM   ZParser.parse_markClass_  s   ##K0000++'''>  !<h  ##%&&(C II))--d3	**40I*3II!!$'%%d6,,v - 
 	&r+   c           	     s   V P                   R9   g   Q hV P                  R8X  d   V P                  W4      # V P                  R8X  d   V P                  W4      # V P                  R8X  d   V P	                  W4      # V P                  R8X  d   V P                  W4      # V P                  pV P                  V4      w  rErgrV P                  R4       \        V4      '       d<   \        V4      '       d   \        RV4      hV P                  P                  WEWVR7      # V'       gy   V'       gq   \        V4      ^8X  da   V	'       gY   V^ ,          f   VP                  4        V P                  P                  V^ ,          V^ ,          V^,          V^,          VVR7      # V'       d   \        R	V4      hV P                  P!                  \#        \%        WW4      4      VVV	VR
7      # )r   cursivebaseligaturerm   r:   z3If "lookup" is present, no values must be specifiedr,   )r   r-   z2"enumerate" is only allowed with pair positioningsZ
forceChainr-   >   r   r   )rC   r#   parse_position_cursive_parse_position_base_parse_position_ligature_parse_position_mark_rD   r   rc   r   r   r   ZChainContextPosStatementr   reverseZPairPosStatementZSinglePosStatementlistZzip)
r)   r   r3   r-   r   r}   r   r   r   r   
   &&&       r   r   ZParser.parse_position_  s   "5555y(//
EE',,ZBB+00FF',,ZBB++<@<U<U=
9 	C w<<6{{%I8  8844( 5   fV)9(ay  88,,q	q	q	q	%! -   !Dh  xx**V$% + 
 	
r+   c                s$   V P                   pV P                  R 4       V'       d   \        RV4      hV P                  RR7      pV P	                  4       pV P	                  4       pV P                  R4       V P                  P                  WEWcR7      # )r   z>"enumerate" is not allowed with cursive attachment positioningTry   r:   r,   )rD   rd   r   r{   rl   rc   r   ZCursivePosStatement)r)   r   r3   r-   r   ZentryAnchorZ
exitAnchors   &&&    r   r   ZParser.parse_position_cursive_   s    ++Y'!S  ++T+B
((*'')
C xx++Z , 
 	
r+   c                   V P                   pV P                  R 4       V'       d   \        RV4      hV P                  RR7      pV P	                  4       pV P                  R4       V P                  P                  WEVR7      # )r   zC"enumerate" is not allowed with mark-to-base attachment positioningTry   r:   r,   )rD   rd   r   r{   rp   rc   r   ZMarkBasePosStatement)r)   r   r3   r-   r   marks   &&&   r   r   ZParser.parse_position_base_  s~    ++V$!6 
 %%t%<((*C xx,,T8,LLr+   c                s   V P                   pV P                  R 4       V'       d   \        RV4      hV P                  RR7      pV P	                  4       .pV P
                  R8X  d3   V P                  R4       VP                  V P	                  4       4       KC  V P                  R4       V P                  P                  WEVR7      # )r   zG"enumerate" is not allowed with mark-to-ligature attachment positioningTry   ZligComponentr:   r,   )
rD   rd   r   r{   rp   r#   rA   rc   r   ZMarkLigPosStatement)r)   r   r3   r-   Z	ligaturesr   r   r   r   ZParser.parse_position_ligature_  s    ++Z(!: 
 **D*A	))+,.0  0LL1134C xx++Ix+PPr+   c                r   )rm   zC"enumerate" is not allowed with mark-to-mark attachment positioningTry   r:   r,   )rD   rd   r   r{   rp   rc   r   ZMarkMarkPosStatement)r)   r   r3   r-   Z	baseMarksr   r   r   r   ZParser.parse_position_mark_/  s~    ++V$!6 
 **D*A	((*C xx,,Y,QQr+   c                s    V P                  R 4      '       g   Q hV P                  V P                  4       r!V P                  R4       V P                  P                  W!R7      # )scriptr:   r,   )rE   rD   expect_script_tag_rc   r   ZScriptStatement)r)   r-   r   r   r   parse_script_ZParser.parse_script_=  sU    ##H----33T5L5L5N&C xx'''BBr+   c           
     s   V P                   R9   g   Q hV P                  pV P                   R9   pV P                  RR7      w  pppppp\        V4      '       d   \	        RV4      h. p	V P
                  R8X  dJ   V P                  R4      p
V P
                  R8w  d'   V P                  RRR7      pV	P                  V4       K7  M8V P
                  R8X  d&   V P                  R4      p
V P                  RR	7      .p	MR
p
V P                  R4       \        V	4      ^ 8X  d(   \        V4      '       g   \	        RV P                  4      hV
R8X  d   V'       d   \	        RV4      h\        V4      ^8w  g&   \        V^ ,          P                  4       4      ^8w  d   \	        RV4      h\        V	4      ^8w  d   \	        RV4      hV P                  P                  W4^ ,          Wy^ ,          VR7      # \        V Uu. uF
  qf   K  VNK  	  up4      pRp\        V	4      ^8X  d@   \        V	^ ,          \        P                  4      '       d   V'       d   \	        RV4      h. p	RpV'       g   \        V4      ^8X  d   \        V	4      ^8X  d   V^ 8X  d   \!        V^ ,          P                  4       4      p\!        V	^ ,          P                  4       4      p\        V4      ^8X  d   V\        V4      ,          p\        V4      \        V4      8w  d(   \	        R\        V4      \        V4      3,          V4      hV P                  P#                  WIW7WR7      # V'       d@   \        V4      ^8X  d0   V^ 8X  d)   V P                  P%                  VV^ ,          VRVVR7      # V'       Eg   \        V4      ^8X  d   \        V	4      ^8  d   V^ 8X  d   \        V^ ,          P                  4       4      pV	 F  p\!        VP                  4       4      '       g   \	        RV4      h\        VP                  4       4      ^8w  g   KN  \        VP                  4       4      V8w  g   Kn  \	        RV R\        VP                  4       4       R2V4      h	  V P                  P%                  VV^ ,          VV	VVR7      # V'       g   \        V4      ^8  d   \        V	4      ^8X  ds   \        V	^ ,          P                  4       4      ^8X  dN   V^ 8X  dG   V P                  P'                  VVV\!        V	^ ,          P                  4       4      ^ ,          VVR7      # V'       Ed   \        V4      ^8w  d   \	        RV4      h\        V	4      ^8w  d   \	        RV4      hV^ 8w  d   \	        RV4      h\)        \!        V^ ,          P                  4       4      4      p\)        \!        V	^ ,          P                  4       4      4      p\        V4      ^8X  d   V\        V4      ,          p\        V4      \        V4      8w  d(   \	        R\        V4      \        V4      3,          V4      hV P                  P+                  W7WIVR7      # \        V4      ^8  d   \        V	4      ^8  d   \	        RV4      h\        V	4      ^ 8w  g	   V'       d   \	        RV4      hV P                  P-                  W4WuVR7      pV# u upi )r   Fr2   z-Substitution statements cannot contain valuesr   r:   T)rz   r   r   ry   Nz3Expected "by", "from" or explicit lookup referencesz4Reverse chaining substitutions do not support "from"z%Expected a single glyph before "from"z)Expected a single glyphclass after "from"r,   z<Reverse chaining substitutions do not support glyph deletionz\Expected a glyph class with %d elements after "by", but found a glyph class with %d elementsr   zEmpty class in replacementz!Expected a glyph class with 1 or z3 elements after "by", but found a glyph class with z	 elementsz\In reverse chaining single substitutions, only a single glyph or glyph class can be replacedzlIn reverse chaining single substitutions, the replacement (after "by") must be a single glyph or glyph classz8Reverse chaining substitutions cannot call named lookupszJDirect substitution of multiple glyphs by multiple glyphs is not supportedzInvalid substitution statement   r   rsub
reversesubr   >   r   r    )rC   rD   r   r   r   r#   rd   r{   rA   rc   r   r   r   ZAlternateSubstStatementr   r   r   ZSingleSubstStatementZMultipleSubstStatementZLigatureSubstStatementsortedZ ReverseChainSingleSubstStatementZChainContextSubstStatement)r)   r-   r   Z
old_prefixZoldr   r   Z
old_suffixr   Znewkeywordr   r   Znum_lookupsZis_deletionr}   ZreplacementscountnZrules   &                   r   parse_substitute_ZParser.parse_substitute_C  sR   "MMMM++//%;; %%u%5	
v;;!?  t#**40G""c)++Tt+T

2 * '**62G))5)ABCGC s8q=W!E((  f%JH  3x1}CFOO$5 6! ;%&MxXX3x1}%?  8833FJA 4   g?g11g?@s8q=ZA>>%R  CK 3s8q=SX]{a?O#a&//+,FA 12L< A%+c&k96{c,//%?6{C$567 	  8800*X 1   3s8q=[A-=8822A#! 3    w3s8q=SX\kQ>NA)*EAJJL)))*FQQqzz|$)c!**,.?5.H);E7 C88;AJJL8I7J)U  	  8822A#! 3   C1CACFOO%&!+q 8822SV__&'*#! 3   73x1}%I 
 3x1}%% 	  a%NPX  DQ!234F!$s1v'8"9:L< A%+c&k96{c,//%?6{C$567 	  88<<8 =   s8a<CHqL!#  s8q=K!"BHMM xx22Z8 3 
 U @s   .[8[c                s    V P                  R 4      '       g   Q hV P                  pV P                  R4       V P                  P	                  VR7      # )subtabler:   r,   )rE   rD   rc   r   ZSubtableStatement)r)   r-   r   r   parse_subtable_ZParser.parse_subtable_  sJ    ##J////++C xx))8)<<r+   c                s   V P                  R 4      '       g   Q hV P                  pV P                  4       pV P                  4       pRpRpV P                  \
        P                  \
        P                  39   g   V^ 8w  d!   V P                  4       pV P                  4       pV P                  R4       V P                  P                  W#WEVR7      # )
parametersg        r:   r,   )rE   rD   expect_decipoint_ri   r"   r   r   FLOATrc   r   ZSizeParameters)r)   r-   Z
DesignSizeZSubfamilyIDZ
RangeStartZRangeEndrw   r   parse_size_parameters_ZParser.parse_size_parameters_  s     ##L1111++++-
))+
  U\\5;;$??;RSCS//1J--/HC xx&&ZH ' 
 	
r+   c           	     s    V P                  R 4      '       g   Q hV P                  pV P                  4       w  r#rEV P                  P	                  RW#WEVR7      # )sizemenunamesizer,   )rE   rD   parse_name_r   FeatureNameStatement)r)   r-   
platformID	platEncIDlangIDstringrw   r   parse_size_menuname_ZParser.parse_size_menuname_  s\    ##N3333++040@0@0B-
vxx,,J6H - 
 	
r+   c                s   V P                  R 4      '       g   Q hV P                  V P                  4       r!V P                  P	                  W!R7      pV P                  R4       RV P                  RV P                  RV P                  RV P                  RV P                  RV P                  R	V P                  R
V P                  /P                  V4      pV'       d
   V! V4       M!\        RVP!                  4       ,          V4      hV P                  R4       V P                  4       pWR8w  d,   \        RVP!                  4       ,          V P                  4      hV P                  R4       V# )r8   r,   {ZGDEFZheadZhheaZvhearV   ZBASEzOS/2ZSTATz"table %s" is not supportedrs   Expected "%s"r:   )rE   rD   rt   r   Z
TableBlockrc   parse_table_GDEF_parse_table_head_parse_table_hhea_parse_table_vhea_parse_table_name_parse_table_BASE_parse_table_OS_2_parse_table_STAT_r   r   strip)r)   r-   rV   r8   Zhandlerrv   rw   r   rP   ZParser.parse_table_"  sE   ##G,,,,1143C3C3E$##D#<C D**D**D**D**D**D**D**D**	
 #d) 	 EN!-

<h  	C ""$?!$**,.0H0H  	C r+   c                sd   VP                   pV P                  R 8w  g   V P                  '       Ed   V P                  RR7       V P                  \
        P                  J dC   VP                  V P                  P                  V P                  V P                  R7      4       K  V P                  R4      '       d"   VP                  V P                  4       4       K  V P                  R4      '       d#   VP                  V P                  4       4       EK  V P                  R4      '       d#   VP                  V P                  4       4       EK@  V P                  R4      '       d#   VP                  V P!                  4       4       EKy  V P                  R8X  d   EK  \#        R	V P                  4      hR
# )rs   Tr   r,   rx   r   r   r   r:   z<Expected Attach, LigatureCaretByIndex, or LigatureCaretByPosN)r>   r#   r$   r(   r?   r   r@   rA   r   rB   rC   rD   rE   r~   r   r   r   r   r)   r8   r>      && r   r  ZParser.parse_table_GDEF_@  sI   %%
#%);););.##u}}4!!HH$$T__t?W?W$X %%h//!!$"4"4"67%%o66!!$";";"=>%%&<==!!$"B"B"DE%%&:;;!!$"@"@"BCC'%U,, # *<r+   c                s
   VP                   pV P                  R 8w  g   V P                  '       d   V P                  RR7       V P                  \
        P                  J dC   VP                  V P                  P                  V P                  V P                  R7      4       K  V P                  R4      '       d"   VP                  V P                  4       4       K  V P                  R8X  d   K  \        RV P                  4      hR# )rs   Tr   r,   FontRevisionr:   zExpected FontRevisionN)r>   r#   r$   r(   r?   r   r@   rA   r   rB   rC   rD   rE   parse_FontRevision_r   r  r  r   r  ZParser.parse_table_head_X  s    %%
#%);););.##u}}4!!HH$$T__t?W?W$X %%n55!!$":":"<=C'%&=t?W?WXX *<r+   c                   VP                   pR	pV P                  R8w  g   V P                  '       EdV   V P                  RR7       V P                  \
        P                  J dC   VP                  V P                  P                  V P                  V P                  R7      4       K  V P                  \
        P                  J d   V P                  V9   d   V P                  P                  4       pV P                  4       pVP                  V P                  P                  WEV P                  R7      4       V P                  R8w  d   \!        RV P"                  4      hEKO  V P                  R8X  d   EKc  \!        RV P                  4      hR# )
CaretOffsetrs   Tr   r,   r:   Incomplete statementz4Expected CaretOffset, Ascender, Descender or LineGapN)r  ZAscenderZ	DescenderZLineGap)r>   r#   r$   r(   r?   r   r@   rA   r   rB   rC   rD   rR   lowerri   Z	HheaFieldr   r%   r)   r8   r>   Zfieldskeyr      &&    r   r  ZParser.parse_table_hhea_g  sC   %%
D#%);););.##u}}4!!HH$$T__t?W?W$X %%368Qoo++-++-!!HH&&sD<T<T&U ##s*).0I0I  + C'%M,, ' *<r+   c                r  )
VertTypoAscenderrs   Tr   r,   r:   r  z?Expected VertTypoAscender, VertTypoDescender or VertTypoLineGapN)r  ZVertTypoDescenderZVertTypoLineGap)r>   r#   r$   r(   r?   r   r@   rA   r   rB   rC   rD   rR   r  ri   Z	VheaFieldr   r%   r  r  r   r  ZParser.parse_table_vhea_  sE   %%
M#%);););.##u}}4!!HH$$T__t?W?W$X %%368Qoo++-++-!!HH&&sD<T<T&U ##s*).0I0I  + C'%;,, ' *<r+   c                s"   VP                   pV P                  R 8w  g   V P                  '       d   V P                  RR7       V P                  \
        P                  J dC   VP                  V P                  P                  V P                  V P                  R7      4       K  V P                  R4      '       d.   V P                  4       pV'       d   VP                  V4       K  K  V P                  R8X  d   K  \        RV P                  4      hR# )rs   Tr   r,   nameidr:   zExpected nameidN)r>   r#   r$   r(   r?   r   r@   rA   r   rB   rC   rD   rE   parse_nameid_r   )r)   r8   r>   Z	statementr   r   r  ZParser.parse_table_name_  s    %%
#%);););.##u}}4!!HH$$T__t?W?W$X %%h// ..0	%%i0 C'%&79Q9QRR *<r+   c                sV   RpRpV P                   \        P                  9   dp   V P                  4       pV P                  pVR9  d   \        RV4      hV P                   \        P                  9   d!   V P                  4       pV P                  4       pM^pV P                  pV^8X  d   T;'       g    ^ pT;'       g    ^ pMT;'       g    ^pT;'       g    RpV P                  4       pV P                  R4       \        W1V4      pVf   \        RV4      hV P                  WV4      pW1W'3# )z~Parses a name record. See `section 9.e <https://adobe-type-tools.github.io/afdko/OpenTypeFeatureFileSpecification.html#9.e>`_.NExpected platform id 1 or 3	  r:   Unsupported encodingr   i   )
r"   r   NUMBERSexpect_any_number_rD   r   expect_string_rc   r   unescape_string_r)   r   r   r   r-   r   encodingZ	unescapedr   r   r   ZParser.parse_name_  s   	  EMM1002J//H'%&CXNN$$5 335	002J//H?!QI[[qF!QI%%vF$$&C zf=!"8(CC))&;	f77r+   c                s4   R pR pV P                   \        P                  9   dp   V P                  4       pV P                  pVR9  d   \        RV4      hV P                   \        P                  9   d!   V P                  4       pV P                  4       pM^pV P                  pV^8X  d   T;'       g    ^ pT;'       g    ^ pMT;'       g    ^pT;'       g    RpV P                  4       p\        W1V4      pVf   \        RV4      hV P                  WV4      pW1W'3# )Nr  r  r  r  )	r"   r   r  r  rD   r   r   r   r!  r"  r   r   parse_stat_name_ZParser.parse_stat_name_  s
   	  EMM1002J//H'%&CXNN$$5 335	002J//H?!QI[[qF!QI%%vF$$&zf=!"8(CC))&;	f77r+   c           	     s   V P                   R 8X  g   Q V P                   4       hV P                  V P                  4       r!VR8  d   \        RV P                  4      hV P	                  4       w  r4rVV P
                  P                  W#WEWaR7      # )r  i  z*Name id value cannot be greater than 32767r,   )rC   rD   r  r   r   r   Z
NameRecord)r)   r-   ZnameIDr   r   r   r   rr   r   r  ZParser.parse_nameid_  s    (*;DOO;*33T5L5L5N&E>!<d>V>V  150@0@0B-
vxx""	6 # 
 	
r+   c                s   a a SR 8X  d$   \         P                  ! RS P                  V4      pMVV 3R lp\         P                  ! RWA4      p\        VR R4      p\	        VR 4      # )Z	utf_16_bez\\[0-9a-fA-F]{4}c                 s(   < SP                  V S4      # r   )unescape_byte_)Zmr#  r)   s   &r   Z<lambda>Z)Parser.unescape_string_.<locals>.<lambda>  s    !4!4Q!Ar+   z\\[0-9a-fA-F]{2}Zsurrogatepass)rer   unescape_unichr_r   r	   )r)   r   r#  r   ZunescapeZutf16s   f&f   r   r!  ZParser.unescape_string_  sW    {"*D,A,A6JAAH*H=A ;8UK((r+   c                s\    V P                  ^ 4      R,          p\        \        V^4      4      # r    r   )groupZchrint)matchr   r   r   r'  ZParser.unescape_unichr_  s$    KKN23q":r+   c                sz    V P                  ^ 4      R,          p\        \        V^4      4      P                  V4      # r(  )r)  r   r*  Zdecode)r+  r#  r   r  r   r%  ZParser.unescape_byte_	  s0    KKN2s1bz"))(33r+   c                s    \        V4       F@  p\        W0P                  P                  4      '       d   K*  \        W24      '       d   Vu #  R # 	  R # r   )reversedr   r   rB   )r)   r>   Zclass_Zpreviouss   &&& r   find_previousZParser.find_previous  sC     ,H(HH$4$455H--  - r+   c           	     sb   VP                   pV P                  R 8w  g   V P                  '       Ed   V P                  RR7       V P                  \
        P                  J dC   VP                  V P                  P                  V P                  V P                  R7      4       K  V P                  R4      '       d   V P                  4       pK  V P                  R4      '       dV   V P                  \        X4      4      pVP                  V P                  P!                  VVRV P                  R7      4       EK+  V P                  R4      '       d   V P#                  V\        P                   4      pVf   \%        R	V P                  4      hVP&                  '       d   \%        R
V P                  4      hVP(                  P                  V P+                  4       4       EK  V P                  R4      '       d   V P                  4       pEK  V P                  R4      '       dV   V P                  \        X4      4      pVP                  V P                  P!                  VVRV P                  R7      4       EKf  V P                  R4      '       d   V P#                  V\        P                   4      pVf   \%        R	V P                  4      hVP&                  '       g   \%        RV P                  4      hVP(                  P                  V P+                  4       4       EK  V P                  R8X  g   EK  EK"  R# )rs   Tr   r,   HorizAxis.BaseTagListHorizAxis.BaseScriptListFzHorizAxis.MinMaxNz)MinMax must be preceded by BaseScriptListz9HorizAxis.MinMax must be preceded by HorizAxis statementsVertAxis.BaseTagListVertAxis.BaseScriptListzVertAxis.MinMaxz7VertAxis.MinMax must be preceded by VertAxis statementsr:   )r>   r#   r$   r(   r?   r   r@   rA   r   rB   rC   rD   rE   parse_base_tag_list_parse_base_script_list_r   ZBaseAxisr-  r   r3   Zminmaxparse_base_minmax_)r)   r8   r>   Zhoriz_basesZhoriz_scriptsZbase_script_listZ
vert_basesZvert_scripts   &&      r   r  ZParser.parse_table_BASE_  s   %%
#%);););.##u}}4!!HH$$T__t?W?W$X %%&=>>"779%%&@AA $ < <S=M N!!HH%%#%!%!9!9	 &  %%&899#'#5#5j#,,#O #+)C00  $,,,)S00  !''..t/F/F/HI%%&<==!668
%%&?@@#;;C
OL!!HH%%"$!%!9!9	 &  %%&788#'#5#5j#,,#O #+)C00  (000)Q00  !''..t/F/F/HIC's *<r+   c                s   VP                   pR	pR
pV P                  R8w  g   V P                  '       Ed   V P                  RR7       V P                  \
        P                  J dC   VP                  V P                  P                  V P                  V P                  R7      4       K  V P                  \
        P                  J Ed0   V P                  P                  4       pRpV P                  V9   d   V P                  4       pMV P                  R4      '       d5   . p\!        ^
4       F"  pVP                  V P                  4       4       K$  	  MmV P                  V9   d6   . pV P                  R8w  d"   VP                  V P                  4       4       K2  M'V P                  R4      '       d   V P#                  4       pVP                  V P                  P%                  WVV P                  R7      4       EK  V P                  R8X  g   EK  EK  R# )FSTypers   Tr   r,   NZPanoser:   ZVendor)r6  ZTypoAscenderZTypoDescenderZTypoLineGapZ	winAscentZ
winDescentZXHeightZ	CapHeightZWeightClassZ
WidthClassZLowerOpSizeZUpperOpSize)ZUnicodeRangeZCodePageRange)r>   r#   r$   r(   r?   r   r@   rA   r   rB   rC   rD   rR   r  ri   rE   r   r   ZOS2Field)r)   r8   r>   Znumbersr   r  r   r   r5  r   r	  ZParser.parse_table_OS_2_X  s   %%

 3#%);););.##u}}4!!HH$$T__t?W?W$X %%3oo++-??g- //1E))(33E"2YT%8%8%:; '__.E**c1T%8%8%:; 2))(33 //1E!!HH%%c4;S;S%T C'3 *<r+   c           	     s`   V P                  R 4      '       g   Q hV P                  R4       . pV P                  R8w  g   V P                  '       d   V P	                  4        V P                  R4      '       dR   V P                  4       w  r#rEV P                  P                  RVVVVV P                  R7      pVP                  V4       K  V P                  R8w  g   K  \        RV P                   R2V P                  4      hV P                  R4       V'       g   \        R	V P                  4      hV# )
ElidedFallbackNamer  rs   rV   statr,   r:   Unexpected token z in ElidedFallbackNameExpected "name")rE   rc   r#   r$   r(   r$  r   STATNameStatementrD   rA   rC   r   )r)   namesr   r   r   r   Z
nameRecordrr   r   parse_STAT_ElidedFallbackNameZ$Parser.parse_STAT_ElidedFallbackName  s   ##$89999C #%);););!##F++8<8M8M8O5
v!XX77!55 8 
 Z(??c))+DOO+<<VW00  	C !"3T5M5MNNr+   c           	     sV   V P                  R 4      '       g   Q h. pV P                  4       pVR
9  d0   VP                  4       '       g   \        P	                  RV R24       V P                  4       pV P                  R4       V P                  R8w  g   V P                  '       d   V P                  4        V P                  \        P                  J d   KS  V P                  R4      '       dR   V P                  pV P                  4       w  rVrxV P                  P!                  RWVWxVR7      p	VP#                  V	4       K  V P$                  R8X  d   K  \'        R	V P$                   2V P                  4      hV P                  R4       V P                  P)                  W#WP                  4      # )
DesignAxiszUnregistered axis tag z should be uppercase.r  rs   rV   r8  r,   r:   zExpected "name", got )ZitalZopszZslntZwdthZwght)rE   rt   Zisupperr   r   ri   rc   r#   r$   r(   r?   r   r@   rD   r$  r   r;  rA   rC   r   ZSTATDesignAxisStatement)
r)   r<  ZaxisTagZ	axisOrderr-   r   r   r   r   rV   s
   &         r   parse_STAT_design_axisZParser.parse_STAT_design_axis  ss   ##L1111""$CCOO%%KK0	9NOP'')	C #%);););!##u}}4%%f--338<8M8M8O5
vxx11J6H 2  T"C'%+DOO+<=t?W?W  	C xx//'?'?
 	
r+   c           	     sL   V P                  R 4      '       g   Q hV P                  R4       . p. p^ pV P                  R8w  g   V P                  '       Ed7   V P	                  RR7       V P
                  \        P                  J d   KV  V P                  R4      '       dR   V P                  pV P                  4       w  rVrxV P                  P                  RWVWxVR7      p	VP                  V	4       K  V P                  R4      '       d$   V P                  4       pVP                  V4       K  V P                  R	4      '       d   V P                  4       pEK"  V P                  R
8X  d   EK6  \!        RV P                   R2V P                  4      hV P                  R4       V'       g   \!        RV P                  4      hV'       g   \!        RV P                  4      h\#        V4      ^8  d   V FJ  p\#        VP$                  4      ^8  g   K  \!        R\#        VP$                  4       R2V P                  4      h	  . p
V F@  pVP&                  pW9   d   \!        RV R2V P                  4      hV
P                  V4       KB  	  V P                  P)                  W!W0P                  4      # )	AxisValuer  rs   Tr   rV   r8  r,   r-   Zflagr:   r9  z in AxisValuezExpected "Axis Name"zExpected "Axis location"z?Only one value is allowed in a Format 4 Axis Value Record, but z were found.	Axis tag z already defined.)rE   rc   r#   r$   r(   r?   r   r@   rD   r$  r   r;  rA   parse_STAT_locationexpect_stat_flagsrC   r   r   r   ru   ZSTATAxisValueStatement)r)   	locationsr<  r   r-   r   r   r   r   rV   Zformat4_tagsru   s   &           r   parse_STAT_axis_value_ZParser.parse_STAT_axis_value_  se   ##K0000C 	#%);););.##u}}4%%f--338<8M8M8O5
vxx11J6H 2  T"%%j11335  *%%f--..0C'%''88IJ,,  	C !"8$:R:RSS!"<d>V>VWWy>A%x'!+);x/0> 00	  & L%ll&)#C5(==t?W?W  ##C( & xx..e%=%=
 	
r+   c           	     s   . pV P                  4       p\        VP                  4       4      ^8w  d%   \        RV P                   R2V P
                  4      hV P                  R8w  d   V P                  \        P                  J d$   V P                  4       pVP                  V4       KR  V P                  \        P                  J d$   V P                  4       pVP                  V4       K  \        RV P                   R2V P                  4      h\        V4      ^8X  d2   Vw  rEpWE8  g   WF8  d!   \        RV RV RV R	2V P                  4      hV P                  P!                  W!4      # )
   rA  z must be 4 charactersr:   zUnexpected value "z". Expected integer or float.zDefault value z is outside of specified range r   .)rt   r   r  r   rC   rD   r#   r"   r   r   expect_float_rA   r   ri   r%   r   ZAxisValueLocationStatement)r)   r   ru   r   ZnominalZmin_valZmax_valrr   r   rB  ZParser.parse_STAT_location  sV    syy{q !DOO,,EE(( 
 #%$$3**,e$&&%,,6++-e$%()9)9(: ;1 1-- 
 v;!(.%Gg G$5%$WI .*iq	, --	  xx223??r+   c                sh   VP                   p. pV P                  R 8w  g   V P                  '       Ed   V P                  RR7       V P                  \
        P                  J dC   VP                  V P                  P                  V P                  V P                  R7      4       K  V P                  \
        P                  J Ed   V P                  R4      '       d>   V P                  4       pVP                  V P                  P                  V4      4       EK	  V P                  R4      '       dO   V P!                  4       pVP                  V P                  P#                  V4      4       V P%                  R4       EKn  V P                  R4      '       dQ   V P'                  4       pVP                  VP(                  4       VP                  V4       V P%                  R4       EK  V P                  R4      '       d~   V P+                  4       pVP,                   F8  pVP(                  V9  g   K  \/        R	VP(                   R
2V P                  4      h	  VP                  V4       V P%                  R4       EKi  \/        RV P                   2V P                  4      hV P                  R8X  g   EK  EK  R# )rs   Tr   r,   r7  ElidedFallbackNameIDr:   r>  r@  zDesignAxis not defined for rG  r9  N)r>   r#   r$   r(   r?   r   r@   rA   r   rB   rC   rD   rR   rE   r=  r7  ri   rI  rc   r?  ru   rE  rD  r   )	r)   r8   r>   Zdesign_axesr<  r   Z
designAxisZaxisValueRecordr-   	   &&       r   r
  ZParser.parse_table_STAT_  s"   %%
#%);););.##u}}4!!HH$$T__t?W?W$X %%3''(<== >>@E%%dhh&A&A%&HI))*@AA //1E%%dhh&C&CE&JK'',)),77!%!<!<!>J&&z~~6%%j1'',))+66&*&A&A&CO$3$=$=#<<{: #2 =a P $ 8 8# 	 %> %%o6'',)+DOO+<=t?W?W  C'I *<r+   c                s    V P                   R9   g   Q V P                   4       h. pV P                  R8w  d"   VP                  V P                  4       4       K2  V P	                  R4       V# )r.  r:   )r.  r0  )rC   r#   rA   r   rc   )r)   Zbasesr   r   r2  ZParser.parse_base_tag_list_D  sh     #
 
 	 ??	 
 #%LL0023C r+   c                s   V P                   R9   g   Q V P                   4       hV P                  V4      .pV P                  R8X  d4   V P                  R4       VP	                  V P                  V4      4       KD  V P                  R4       V# )r/  r   r:   )r/  r1  )rC   parse_base_script_record_r#   rc   rA   )r)   r   Zscriptsr  r   r3  ZParser.parse_base_script_list_P  s     #
 
 	 ??	 
 11%89#%$NN499%@AC r+   c                s    V P                  4       pV P                  4       p\        V4       Uu. uF  q@P                  4       NK  	  ppW#V3# u upi r   )r   r   ri   )r)   r   
script_tagZbase_tagr   Zcoordsr  r   rK  Z Parser.parse_base_script_record_\  sM    ,,.
**,16u>A%%'>V++ ?s   Ac                s   V P                  4       pV P                  4       pV P                  4       pV P                  4        V P                  \
        P                  J d   V P                  R 8X  g   \        RV P                  4      hV P                  4       pV P                  R 8X  d   \        RV P                  4      hWW43# )r   z0Expected a comma between min and max coordinatesz0Feature tags are not yet supported in BASE table)r   r   ri   r(   r?   r   rT   rC   r   rD   r#   )r)   rL  r   Z	min_coordZ	max_coordrX   r   r4  ZParser.parse_base_minmax_b  s    ,,.
,,.'')	$$4C9O!B((  '')	s"!B(( 
 Y99r+   c                s   R pV P                  R4       V P                  R4       V P                  R8X  d   V P                  R4       MV P                  4       V P                  4       3.pV P                  R8X  dC   V P                  R4       VP	                  V P                  4       V P                  4       34       KS  \        V4      pV P                  R4       V# )NrZ   Zdevicer\   r   r]   )rc   rd   r#   ri   rA   Ztuple)r)   resultr   r   rj   ZParser.parse_device_u  s    C X&v%  (**,d.A.A.CDEF""c)##C(t224d6I6I6KLM6]FC r+   c                s    V P                   \        P                  J ;'       g'    V P                  R 8H  ;'       g    V P                  R8H  # )rZ   ()r"   r   r   r#   r)      &r   r   ZParser.is_next_value_  sI    !!U\\1 ' '3&' '3&	
r+   c                s"   V P                   \        P                  J d   V P                  R 8X  g   V P                   \        P                  J dd   V P                  RR7      V P                  r2V'       d    V P                  P                  W!VR7      pV# V P                  P                  W!VR7      pV# V P                  R4       V P                  pV P                   \        P                  J d   V P                  4       pVR8X  d,   V P                  R4       V P                  P                  4       # V P                  P                  V4      pVf   \        RV,          V P                  4      hVP                  pVP                   VP"                  rVP$                  VP&                  rMIV P                  RR7      V P                  RR7      V P                  RR7      V P                  RR7      3w  rrV P                  R8X  d   V P)                  4       V P)                  4       V P)                  4       V P)                  4       3w  rr\+        V'       d   TMRV'       d   TMR,           V'       d   TMR,           V'       d   TMR,            UUu. uF  w  ppVNK
  	  upp4      pV^ ,          R8  g   VR,          ^8  d   \        R	V P                  4      hMRw  rrV P                  R4       V P                  P                  VV	V
VVVVVVVR
7
      # u uppi )rN  Tra   )yAdvancer3   r-   )xAdvancer3   r-   rZ   r\   r]   zUnknown valueRecordDef "%s"z+Device value out of valid range (-128..127))r3   r-   r   ir   )NNNN)r"   r   rT   r#   r   ri   rD   r   ZValueRecordrc   rR   re   r    rf   r   r   
xPlacement
yPlacementrR  rQ  rj   r   )r)   r3   numberr-   ZvalrV   vrdr   rS  rT  rR  rQ  Z
xPlaDeviceZ
yPlaDeviceZ
xAdvDeviceZ
yAdvDevicer   ZdeltaZ	allDeltass   &&                 r   r   ZParser.parse_valuerecord_  s   !!U\\1d6F6F#6M""ell2##T#2((  hh**# +  J hh**# +  JC ++  EJJ.$$&Dv~##C(xx++--$$,,T2C{%1D8$:R:R  IIE&+&6&68H8H
"'..%..h ##T#2##T#2##T#2##T#2	:6JH s"""$""$""$""$	>:JJ  7A
b%/zR(9%/zR(9 &0zR(9(9e (9I |d"imc&9%A,,  ': >V:JJC xx## $ 
 	
#s   L
c                s$   V P                  R 4      '       g   Q hV P                  pV P                  V4      pV P                  4       pV P	                  R4       V P
                  P                  WCVR7      pV P                  P                  WE4       V# )r9   r:   r,   )	rE   rD   r   re   rc   r   ZValueRecordDefinitionr    rq   )r)   r3   r-   r   rV   rV  r  r   rQ   Z$Parser.parse_valuerecord_definition_  s    ##$45555++''1  "C hh,,T8,L!!$,
r+   c                s    V P                   R 8X  g   Q hV P                  pV P                  4       pV P                  4       pV P	                  R4       V P
                  P                  W#VR7      # )r0   r:   r,   )rC   rD   r   r   rc   r   ZLanguageSystemStatement)r)   r-   r   r   ro   r   rK   ZParser.parse_languagesystem_  sd    "2222++((*,,.C xx//8/TTr+   c                s:   V'       d   V P                   R 8X  g   Q hMV P                   R8X  g   Q hV P                  pV P                  4       pVR9   pRpRpRpW0P                  9   d   TpMW0P                  9   d   TpM	VR8X  d   RpV'       d   V P                  4       pRp	V P                  R8X  d   V P                  R4       Rp	V'       d    V P                  P                  VXWR7      p
MV P                  P                  W9VR7      p
V P                  WWWV4       V
# )	r7   r5   NFr   Tr   )r   r-   >   ZvaltZvhalZvkrnZvpal)rC   rD   rt   SS_FEATURE_TAGSCV_FEATURE_TAGSre   r#   rd   r   ZVariationBlockZFeatureBlockr   )r)   r7   r-   ru   r3   stylisticset
cv_featuresize_featurer6   r   r   r   r   rN   ZParser.parse_feature_block_  s   ??k111??i///++ ::
&&&L(((JF]L,,.L~-  0 MHH++\ , E HH))8 * E 	%<zRr+   c                s    V P                   R 8X  g   Q V P                   4       hV P                  pV P                  4       pV P                  R4       V P                  P                  W!R7      # )r5   r:   r,   )rC   rD   rt   rc   r   ZFeatureReferenceStatement)r)   r-   ZfeatureNamer   r   parse_feature_reference_ZParser.parse_feature_reference_  s\    )+<T__<+++&&(C xx11+1QQr+   c                s   V P                   R8X  g   Q V P                   4       hV P                  P                  WP                   V P                  R7      pV P	                  R4       V P
                   F  pVP                  4        K  	  V P                  R8w  g   V P                  '       Ed   V P                  RR7       V P                  \        P                  J dM   VP                  P                  V P                  P                  V P                   V P                  R7      4       K  V P!                  R4      '       dZ   V P                  pV P#                  4       w  rVrxVP                  P                  V P                  P%                  WWgWR7      4       EK  V P                   R8X  d   EK$  \'        R	V P                  4      hV P	                  R4       V P
                   F  pVP)                  4        K  	  V P	                  R4       V# )
zParses a ``featureNames`` statement found in stylistic set features.
See section `8.c <https://adobe-type-tools.github.io/afdko/OpenTypeFeatureFileSpecification.html#8.c>`_.
featureNamesr,   r  rs   Tr   rV   r:   r:  )rC   r   NestedBlockrD   rc   r!   enter_scoper#   r$   r(   r?   r   r@   r>   rA   rB   rE   r   r   r   
exit_scope)	r)   ru   r   symtabr-   r   r   r   r   rJ  r   parse_featureNames_ZParser.parse_featureNames_  s    .0A$//A0$$4+C+C % 
 	C ))F  *#%);););.##u}}4  ''HH$$T__t?W?W$X %%f--338<8H8H8J5
v  ''HH11F 2 
 C'%&79Q9QRRC ))F *C r+   c                s|   V P                   R 8X  g   Q V P                   4       hV P                  P                  WP                   V P                  R7      pV P	                  R4       V P
                   F  pVP                  4        K  	  VP                  pV P                  R8w  g   V P                  '       Ed@   V P                  RR7       V P                  \        P                  J dC   VP                  V P                  P                  V P                   V P                  R7      4       K  V P!                  0 R	m4      '       d-   VP                  V P#                  WP                   4      4       K  V P!                  R4      '       d$   VP                  V P%                  V4      4       EK  V P                   R8X  d   EK)  \'        RP)                  V P                  V P                   4      V P                  4      hV P	                  R4       V P
                   F  pVP+                  4        K  	  V P	                  R4       V# )
cvParametersr,   r  rs   Tr   	Characterr:   zExpected statement: got {} {}>   ZSampleTextNameIDZFeatUILabelNameIDZParamUILabelNameIDZFeatUITooltipTextNameID)rC   r   r^  rD   rc   r!   r_  r>   r#   r$   r(   r?   r   r@   rA   rB   rE   parse_cvNameIDs_parse_cvCharacter_r   rU   r`  )r)   ru   r   ra  r>   s   &&   r   parse_cvParameters_ZParser.parse_cvParameters_<  s    .0A$//A0$$4+C+C % 
 	C ))F  * %%
#%);););.##u}}4!!HH$$T__t?W?W$X %%  !!$"7"7__"MN%%k22!!$"9"9#">?C'%3::,,doo ,,	  	C ))F *C r+   c                s   V P                   V8X  g   Q V P                   4       hV P                  P                  WV P                  R 7      pV P	                  R4       V P
                   F  pVP                  4        K  	  V P                  R8w  g   V P                  '       Ed   V P                  RR7       V P                  \        P                  J dM   VP                  P                  V P                  P                  V P                   V P                  R 7      4       K  V P!                  R4      '       d^   V P                  pV P#                  4       w  rgrVP                  P                  V P                  P%                  VVVVV	VVR 7      4       EK  V P                   R8X  d   EK(  \'        RV P                  4      hV P	                  R4       V P
                   F  pVP)                  4        K  	  V P	                  R4       V# )r,   r  rs   Tr   rV   r:   r:  )rC   r   r^  rD   rc   r!   r_  r#   r$   r(   r?   r   r@   r>   rA   rB   rE   r   ZCVParametersNameStatementr   r`  )
r)   ru   Z
block_namer   ra  r-   r   r   r   r   r   r   re  ZParser.parse_cvNameIDs_i  s   *,=doo=,$$St?W?W$XC ))F  *#%);););.##u}}4  ''HH$$T__t?W?W$X %%f--338<8H8H8J5
v  ''HH66"!"!) 7 
 C'%&79Q9QRRC ))F *C r+   c                s2   V P                   R 8X  g   Q V P                   4       hV P                  V P                  4       r2V P                  R4       RTu;8  d   ^ 8  g   M \	        RP                  ^ R4      V4      hV P                  P                  W1VR7      # )rd  r:   i z/Character value must be between {:#x} and {:#x}r,   )rC   rD   r  rc   r   rU   r   ZCharacterStatement)r)   ru   r-   Z	characterr   r   rf  ZParser.parse_cvCharacter_  s    +->t>-"668O8O8Q)C I**!""(&H"5 
 xx**9H*MMr+   c                s    V P                   R 8X  g   Q V P                   4       hV P                  V P                  4       r!V P                  R4       V^ 8:  d   \	        RV4      hV P
                  P                  W!R7      # )r  r:   z&Font revision numbers must be positiver,   )rC   rD   rH  rc   r   r   ZFontRevisionStatement)r)   r-   Zversionr   r   r  ZParser.parse_FontRevision_  sp     .0A$//A0 44d6H6H6J'C a<!"JHUUxx--g-IIr+   c                s   V P                  4       p/ pV P                  R 4       V P                  R8w  EdH   V P                  4        V P                  \
        P                  Jd   \        RV P                  4      hV P                  pW29   d   \        RV 2V P                  4      hV P                  \
        P                  J d   V P                  4       pM0V P                  \
        P                  J d   V P                  RR7      pV P                  \
        P                  J d   V P                  4       pM0V P                  \
        P                  J d   V P                  RR7      pV P                  R4       XX3W#&   EKY  V P                  R4       V P                  4       pWa8w  d   \        RV,          V P                  4      hV P                  P!                  W4      # )r  rs   Expected an axis namezRepeated condition for axis Fra   r:   r  )re   rc   r#   r(   r?   r   rR   r   rD   rC   r"   r   rH  r   ri   r   ZConditionsetStatement)r)   rV   Z
conditionsaxisZ	min_valueZ	max_valueZ	finalnamerr   r   rO   ZParser.parse_conditionset_  s     "
C #%!##5::5%&=t?W?WXX??D!%24&94;S;S  $$3 ..0	&&%,,6 ///?	$$3 ..0	&&%,,6 ///?	$ )95JC %%'	!/D"8$:R:RSSxx--d??r+   c                s   V P                  R 4       V P                   F  pVP                  4        K  	  VP                  pV P                  R8w  g   V P
                  '       Edf   V P                  RR7       V P                  \        P                  J dC   VP                  V P                  P                  V P                  V P                  R7      4       K  V P                  \        P                  J d"   VP                  V P!                  4       4       K  V P#                  R4      '       d#   VP                  V P%                  4       4       EK  V P#                  RR04      '       d%   VP                  V P'                  VR7      4       EKK  V P#                  R	4      '       d#   VP                  V P)                  4       4       EK  V P#                  R
4      '       d#   VP                  V P+                  4       4       EK  V P#                  R4      '       d#   VP                  V P-                  4       4       EK  V P#                  R4      '       d$   VP                  V P/                  V4      4       EK0  V P#                  R4      '       d#   VP                  V P1                  4       4       EKi  V P#                  R4      '       d#   VP                  V P3                  4       4       EK  V P#                  RR04      '       d&   VP                  V P5                  RVR7      4       EK  V P#                  R4      '       d#   VP                  V P7                  4       4       EK  V P#                  0 Rm4      '       d#   VP                  V P9                  4       4       EKT  V P#                  R4      '       d#   VP                  V P;                  4       4       EK  V P#                  R4      '       d$   VP                  V P=                  V4      4       EK  V'       d;   V P#                  R4      '       d$   VP                  V P?                  V4      4       EK	  V'       d;   V P#                  R4      '       d$   VP                  V PA                  V4      4       EKK  V'       d:   V P#                  R4      '       d#   VP                  V PC                  4       4       EK  V'       d:   V P#                  R4      '       d#   VP                  V PE                  4       4       EK  V P                  \        PF                  J dQ   V P                  V PH                  9   d6   VP                  V PH                  V P                  ,          ! V 4      4       EK;  V P                  R8X  d   EKO  \K        RPM                  V P                  V P                  4      V P                  4      hV P                  R4       V P                   F  pVPO                  4        K  	  V PQ                  4       pWPR                  PU                  4       8w  d6   \K        RVPR                  PU                  4       ,          V P                  4      hV P                  R4       R# )r  rs   Tr   r,   r/   r   r   r2   r5   r   r   r1   r   r4   r   r   Fr   r   r   r9   r]  rc  r   r   r:   z7Expected glyph class definition or statement: got {} {}r  Nr   )+rc   r!   r_  r>   r#   r$   r(   r?   r   r@   rA   r   rB   rC   rD   rG   rH   rE   rJ   r   r\  r   r   rL   r   rM   r   r   r   r   rQ   rb  rg  r   r   rR   rS   r   rU   r`  re   rV   r  )	r)   r   r3   rY  r[  rZ  ra  r>   rV   s	   &&&&&&   r   r   ZParser.parse_block_  s    	C ))F  * %%
#%);););.##u}}4!!HH$$T__t?W?W$X %%)9)99!!$"C"C"EF%%k22!!$"7"7"9:%%v{&;<<!!$"7"7"7"JK%%i00!!$"?"?"AB%%h//!!$"4"4"67%%j11!!$"6"6"89%%h//!!$"4"4X">?%%l33!!$"8"8":;%%k22!!$"7"7"9:%%uj&9::!!((EH(M %%h//!!$"4"4"67%%&QRR!!$"8"8":;%%j11!!$"6"6"89%%&677!!$"D"DX"NO$"6"6~"F"F!!$":":<"HI 4 4^ D D!!$":"::"FG$"6"6|"D"D!!$"="="?@$"6"6~"F"F!!$";";"=>$$

2OOt6!!$//$//"B4"HIC'%MTT,,doo ,,	  	C ))F *   "::##%%!%**"2"2"44d6N6N  	C r+   c                s    V P                   \        P                  J d:   \        V\	        R 4      4      '       d   V P
                  V8H  # V P
                  V9   # R# )r   F)r?   r   rR   r   ZtyperC   )r)   r   r   r   rE   ZParser.is_cur_keyword_  sF    5::-!T"X&&!++!++r+   c                    V P                  4        V P                  \        P                  Jd   \	        R V P
                  4      hV P                  # )zExpected @NAME)r(   r?   r   rG   r   rD   rC   rO  rP  r   r   ZParser.expect_class_name_  s@    u'7'77!"2D4L4LMMr+   c                    V P                  4        V P                  \        P                  J d   V P                  # \        R V P                  4      h)zExpected a CID)r(   r?   r   r   rC   r   rD   rO  rP  r   r   ZParser.expect_cid_$  s>    599,??".0H0HIIr+   c                rj  )zExpected file name)r(   r?   r   ZFILENAMEr   rD   rC   rO  rP  r   r   ZParser.expect_filename_*  s>    u~~5!"68P8PQQr+   c                s"   V P                  4        V P                  \        P                  J d   V P                  P                  R 4      # V P                  \        P                  J d   RV P                  ,          # \        RV P                  4      h)Z\cid%05dzExpected a glyph name or CID)	r(   r?   r   rR   rC   Zlstripr   r   rD   rO  rP  r   r   ZParser.expect_glyph_0  sj    5::-??))$//!!UYY.t..<d>V>VWWr+   c                s    V P                   '       dI   V F@  pW P                   9   d   K  W P                  9  g   K'  V P                  V P                  V&   KB  	  R# R# )zAdds a glyph name (just `start`) or glyph names of a
range (`start` and `end`) which are not in the glyph set
to the "missing list" for future error reporting.

If no glyph set is present, does nothing.
N)r   r'   rD   )r)   r<  rV   s   &* r   r   Z$Parser.check_glyph_name_in_glyph_set8  sL     +++||+)-)A)ADLL&	  r+   c                s"   V P                  4       pV P                  P                  V4      pVf   \        RV,          V P                  4      h\        W P                  P                  4      '       g   \        RV,          V P                  4      hV# )NzUnknown markClass @%sz@%s is not a markClass)r   r   rf   r   rD   r   r   r   )r)   rV   Zmcr   r   rn   Z"Parser.expect_markClass_reference_F  s    &&(''-:!'$.0H0H  "hh0011!(4/1I1I  	r+   c                s   V P                  4        V P                  \        P                  Jd   \	        R V P
                  4      h\        V P                  4      ^8  d   \	        RV P
                  4      hV P                  R,           R,          # )zExpected a tagz'Tags cannot be longer than 4 charactersz    :NrF  N)r(   r?   r   rR   r   rD   r   rC   rO  rP  r   rt   ZParser.expect_tag_S  ss    uzz1!"2D4L4LMMt!#!94;S;S  &("--r+   c                `    V P                  4       pVR 8X  d   \        RV P                  4      hV# )Zdfltz4"dflt" is not a valid script tag; use "DFLT" insteadrt   r   rD   r)   ru   r   r   r   ZParser.expect_script_tag_]  s7     &=!F((  
r+   c                rm  )ZDFLTz6"DFLT" is not a valid language tag; use "dflt" insteadrn  ro  r   r   r   ZParser.expect_language_tag_f  s7     &=!H((  
r+   c                s    V P                  4        V P                  \        P                  J d   V P                  V8X  d   V# \        R V,          V P                  4      h)zExpected '%s')r(   r?   r   rT   rC   r   rD   )r)   Zsymbolr   r   rc   ZParser.expect_symbol_o  sH    5<</DOOv4MMo68P8PQQr+   c                s    V P                  4        V P                  \        P                  J d   V P                  V8X  d   V P                  # \        R V,          V P                  4      h)r  r(   r?   r   rR   rC   r   rD   )r)   r   r   r   rd   ZParser.expect_keyword_u  sM    5::-$//W2L??"o79Q9QRRr+   c                rk  )zExpected a namerp  rO  rP  r   re   ZParser.expect_name_{  s>    5::-??"/1I1IJJr+   c                s0   V P                  4        V P                  \        P                  J d   V P                  # V'       d@   V P                  \        P
                  J d"   V P                  R 8X  d   V P                  4       # \        RV P                  4      h)rN  zExpected a number)	r(   r?   r   r   rC   rT   expect_variable_scalar_r   rD   )r)   rb   r   r   ri   ZParser.expect_number_  sm    5<</??",,<TWAW//11143K3KLLr+   c                s    V P                  4        \        4       p V P                  \        P                  8X  d   V P
                  R8X  d    V# V P                  4       w  r#VP                  W#4       KY  )Tr;   )r(   r   r?   r   rT   rC   expect_master_Z	add_value)r)   Zscalarr-   r   ro   r   rq  ZParser.expect_variable_scalar_  s`    !##u||338N  #113OHX-r+   c                s   / p V P                   \        P                  Jd   \        RV P                  4      hV P
                  pV P                  4        V P                   \        P                  J d   V P
                  R8X  g   \        RV P                  4      hV P                  4       pW1V&   V P                  \        P                  J d   V P                  ^ ,          R8X  d   MhV P                  4        V P                   \        P                  J d   V P
                  R8X  g   \        RV P                  4      hV P                  4        EKI  V P                  4        \        V P
                  R,          4      pV P                  4        W3# )Trh  r   zExpected an equals signZ:r   z#Expected an comma or an equals signr   )r?   r   rR   r   rD   rC   r(   rT   expect_integer_or_float_r"   r#   r*  )r)   r-   ri  r   ro   r   rr  ZParser.expect_master_  s<   ##5::5%&=t?W?WXX??D!((ELL8T__PS=S%-t/G/G  113E"TN$$

2t7G7G7Jc7Q!((ELL8T__PS=S%94;S;S  !DOOB'(r+   c                s    V P                  4        V P                  \        P                  9   d   V P                  # \        R V P                  4      h)z/Expected a decimal, hexadecimal or octal number)r(   r?   r   r  rC   r   rD   rO  rP  r   r  ZParser.expect_any_number_  sB    5==0??"=t?W?W
 	
r+   c                rk  )z Expected a floating-point number)r(   r?   r   r   rC   r   rD   rO  rP  r   rH  ZParser.expect_float_  sB    5;;.??".0H0H
 	
r+   c                    V P                   \        P                  8X  d   V P                  4       # V P                   \        P                  J d   V P                  4       # \        R V P                  4      h,Expected an integer or floating-point numberr"   r   r   rH  r   ri   r   rD   rO  rP  r   rs  ZParser.expect_integer_or_float_  \      EKK/%%''""ell2&&((!>@X@X r+   c                s    V P                   \        P                  8X  d   V P                  4       # V P                   \        P                  J d   V P                  4       ^
,          # \        RV P                  4      h)i
   rv  rw  rO  rP  r   r   ZParser.expect_decipoint_  sa      EKK/%%''""ell2&&(2--!>@X@X r+   c                s    ^ pR^R^/pV P                   R8w  dV   V P                   V9   d"   V P                  4       pWV,          ,          pKC  \        RV P                   2V P                  4      hV# )r    ZOlderSiblingFontAttributeZElidableAxisValueNamer:   zUnexpected STAT flag )r#   re   r   rC   rD   )r)   r   r   rV   ro   r   rC  ZParser.expect_stat_flags  s{    '#Q
 #%5(((*d+%+DOO+<=t?W?W  r+   c                rt  ru  rw  rO  rP  r   expect_stat_values_ZParser.expect_stat_values_  rx  r+   c                rk  )zExpected a string)r(   r?   r   ZSTRINGrC   r   rD   rO  rP  r   r   ZParser.expect_string_  s>    5<</??"143K3KLLr+   c                sX   V'       dR   V P                   '       d@   \        P                  V n        V P                   P	                  ^ 4      w  V n        V n        R# V P                  V P                  V P                  uV n        V n        V n          \        V P                  4      w  V n        V n        V n	        V P                  \        P                  8w  d   R# V P                   P                  V P                  V P                  34       K~    \         d    RRuT n        T n         Lpi ; i)r    N)r$   r   r@   r?   r   rC   rD   r"   r#   r%   Znextr&   ZStopIterationrA   )r)   r   r   r   r(   ZParser.advance_lexer_  s   ***#(==D 8<8J8J8N8Nq8Q5DOT5 %%  )) LD $/43K
 G
 %	)$- $$5%%t'7'79R9R&ST	 ! G;?7%t'7Gs   (D D)(D)c                sH    RP                  \        \        V 4      4      4      # )z'abc' --> 'cba'r   )r   r,  r   )r   rP  r   reverse_string_ZParser.reverse_string_
	  s     wwxQ())r+   c                s    \        4       pW#8  d   \        RV4      h\        W#^,           4       F  pVP                  RV,          4       K  	  V# )z>(location, 999, 1001) --> ["cid00999", "cid01000", "cid01001"]z*Bad range: start should be less than limitrl  )r   r   r   rA   )r)   r-   r   r   rM  r   s   &&&&  r   r   ZParser.make_cid_range_	  sJ    =!<h  	*CMM)c/* +r+   c                s   \        4       p\        V4      \        V4      8w  d   \        RV: RV: R2V4      hV P                  p\        P
                  P                  W#.4      pV! \        P
                  P                  V! V4      V! V4      .4      4      p\        V4      ^ 8  d2   V\        V4      \        V4      )  pV\        V4      \        V4      )  p	MV\        V4      R pV\        V4      R p	W8  d   \        RV4      h\        P                  ! R4      p
V
P                  V4      '       d`   V
P                  V	4      '       dI   \        \        V4      \        V	4      ^,           4       F  pVP                  RWkV3,          4       K  	  V# \        P                  ! R4      pVP                  V4      '       d`   VP                  V	4      '       dI   \        \        V4      \        V	4      ^,           4       F  pVP                  RWkV3,          4       K  	  V# \        P                  ! R	4      pVP                  V4      '       d   VP                  V	4      '       dj   \        \        V^
4      \        V	^
4      ^,           4       F<  pR
\        V4      ,           \        V4      ) R pVP                  V: V: V: 24       K>  	  V# \        RV: RV: R2V4      h)z?(location, "a.sc", "d.sc") --> ["a.sc", "b.sc", "c.sc", "d.sc"]zBad range: "z" and "z" should have the same lengthNz+Start of range must be smaller than its endz^[A-Z]$z%s%c%sz^[a-z]$z^[0-9]{1,3}$Z000r   r   )r   r   r   rz  osZpathZcommonprefixr&  Zcompiler+  r   ZordrA   r*  r   )r)   r-   r   r   rM  Zrevr   r   Zstart_rangeZlimit_rangeZ	uppercaseZcZ	lowercaseZdigitsr   rU  s   &&&&            r   r   ZParser.make_glyph_range_	  sS   u:U#!JOQVW 
 ""%%un5RWW))3u:s5z*BCDv;?Fs6{l;KFs6{l;KF.KF.K%!=x  JJz*	??;''IOOK,H,H3{+S-=-ABh&V)<<= CMJJz*	??;''IOOK,H,H3{+S-=-ABh&V)<<= CMO,<<$$k)B)B3{B/["1E1IJ#a&.3{+;*;*=>&&&AB K MeUCXNNr+   )r   r$   rC   rD   r?   r   r   r   r&   r   r'   r#   r%   r"   r!   r    )r   TN)F)NFN)o__name__
__module____qualname____firstlineno__Z__doc__rS   r   r   rW  rX  r*   rY   rl   rp   rJ   rI   r~   r   r   rH   r   r{   r   r   r   r   rF   r   r   r   rL   r   rM   r   r   r   r   r   r   r   r   r   r   rP   r  r  r  r  r  r   r$  r  r!  Zstaticmethodr'  r%  r-  r  r	  r=  r?  rE  rB  r
  r2  r3  rK  r4  rj   r   r   rQ   rK   rN   r\  rb  rg  re  rf  r  rO   r   rE   r   r   r   r   r   rn   rt   r   r   rc   rd   re   ri   rq  rr  r  rH  rs  r   rC  ry  r   r(   rz  r   r   __static_attributes____classdictcell__)r   __classdict__s   0@r   r
   r
      s    0 J
C-21f-=>-=x!||-=>O-21f-=>-=x!||-=>O+B=~4
l
"
H	RH
8(TbH[Gz&
A
YW27
r,3
j
 MQ"RC}~=
$
<0Y68S"8@8:


)   4 4;z*X8 
D6
p@B'R

,:&
L
\	U$LR!F+Z"H
NJ#@JL!\JXB.RSKM6

 MU0 * *	+O +OaG ?>s
   FFr
   c                   s>   a  ] tR tRt o R tR tR tR tR tRt	V t
R# )	r   iH	  c                s    / .V n         R # r   scopes_rO  rP  r   r*   ZSymbolTable.__init__I	  s    tr+   c                s<    V P                   P                  / 4       R # r   )r  rA   rO  rP  r   r_  ZSymbolTable.enter_scopeL	  s    Br+   c                s:    V P                   P                  4        R # r   )r  r   rO  rP  r   r`  ZSymbolTable.exit_scopeO	  s    r+   c                s0    W P                   R,          V&   R# )r   Nr   r  )r)   rV   items   &&&r   rq   ZSymbolTable.defineR	  s    !%Rr+   c                sx    \        V P                  4       F   pVP                  V4      pV'       g   K  Vu # 	  R # r   )r,  r  r   )r)   rV   Zscoper  r   r   rf   ZSymbolTable.resolveU	  s1    dll+E99T?Dt , r+   r  N)r|  r}  r~  r  r*   r_  r`  rq   rf   r  r  )r  s   @r   r   r   H	  s#      & r+   r   )ZfontTools.feaLib.errorr   ZfontTools.feaLib.lexerr   r   r   ZfontTools.feaLib.variableScalarr   ZfontTools.misc.encodingToolsr   ZfontTools.misc.textToolsr   r   r	   ZfontTools.feaLib.astZfeaLibr   Zloggingr{  r&  Z	getLoggerr|  r   Zobjectr
   r   r   r+   r   <module>r     sY    2 K K : 4 < < " "  	 	 !v$OV v$OrI& r+   