+
    iG                        ^ 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                   B  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           	        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
# )glyphMap)deprecateArgumentz#use 'glyphNames' (iterable) insteadz?'glyphNames' and (deprecated) 'glyphMap' are mutually exclusivezunsupported keyword argument sz: z, c              3   8   "   T F  p\        V4      x  K  	  R # 5iN)repr).0ks   & w/Users/tonyclaw/.openclaw/workspace/skills/math-calculator/venv/lib/python3.14/site-packages/fontTools/feaLib/parser.py	<genexpr>"Parser.__init__.<locals>.<genexpr><   s     =Vv!d1ggvs   N)
includeDirTcomments)fontTools.misc.loggingToolsr   	TypeErrorpoplenjoinsetglyphNames_ast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_)selffeaturefile
glyphNamesfollowIncludesr   kwargsr   
lexerClasss   &&&&&,  r   __init__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           	     p	   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)rJ   tablevalueRecordDef;zbExpected feature, languagesystem, lookup, markClass, table, or glyph class definition, got {} "{}" z (first found at )zMThe following glyph names are referenced but are missing from the glyph set:

anon	anonymous)"r'   
statementsr.   r0   r4   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   formatr3   itemsr"   )r5   rT   namelocerrors   &    r   parse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           
        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")rm   contourpointxDeviceTableyDeviceTabler@   Tvariablerw   )expect_symbol_expect_keyword_rZ   r/   r.   r   rh   expect_name_r)   resolver   r%   Anchorxyrw   expect_number_parse_device_)	r5   r@   rm   	anchordefr   r   rw   rx   ry   s	   &        r   parse_anchor_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                    . 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# )rs   mark)r/   r   r}   expect_markClass_reference_rW   )r5   anchorMarksrt   rG   s   &   r   parse_anchor_marks_Parser.parse_anchor_marks_   sk    #%'')F~$"2"2f"<  (88:I23r=   c                   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# )rB   Nrw   rM   )rw   r@   )r[   rZ   r   r/   r}   r~   r|   r%   AnchorDefinitionr)   define)r5   r@   r   r   rw   rm   r   s   &      r   r`   Parser.parse_anchordef_   s    ##K0000++""$d&9&9&;1~-  0..0L  "C HH--QH . 
	 	T-r=   c                h   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      # )rR   }z-bad splitting in Lexer.scan_anonymous_block()rM   r?   rQ   )r[   expect_tag_r2   scan_anonymous_blockr4   r|   r%   AnonymousBlock)r5   tag_contentr@   end_tags   &     r   r_   Parser.parse_anonymous_   s    ##$9:::: #{{??DHC ""$~NNN~C xx&&sh&GGr=   c                R   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_glyphnamerM   r?   )	r[   rZ   parse_glyphclass_r   r/   addr|   r%   AttachStatement)r5   r@   glyphscontourPointss   &   r   parse_attach_Parser.parse_attach_   s    ##H----++'''>,,./#%d1134C xx'''QQr=   c                n    V P                   R9   g   Q hV P                  4        V P                  RVR7      # )	enumerateT
enumeratedrF   >   enumr   )rY   r4   parse_position_)r5   rF   s   &&r   parse_enumerate_Parser.parse_enumerate_   s7    "7777##th#GGr=   c                @   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,Fr   NrM   r?   )r[   rZ   r/   r   r|   r%   GlyphClassDefStatement)r5   r@   
baseGlyphsligatureGlyphs
markGlyphscomponentGlyphss   &     r   parse_GlyphClassDef_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                   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# )=Fr   rM   r?   )rZ   rY   r|   r   r%   GlyphClassDefinitionr*   r   )r5   r@   rm   r   
glyphclasss   &    r   r^   #Parser.parse_glyphclass_definition_  su    114??$C '''?C XX224(2S
!!$3r=   c                *   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)splitranger!   r"   r$   rW   r   )r5   rm   r@   parts	solutionsistartlimitr   lrangess   &&&        r   split_glyph_range_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           	     `   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# )
ru   r?   zUnknown glyph class @%s[]r   z.Ambiguous glyph name that looks like a range: cid05dzBExpected glyph name, glyph range, or glyph class reference, found )$r.   r   rh   CIDr/   r4   r%   	NullGlyphrZ   expect_glyph_check_glyph_name_in_glyph_set	GlyphNamer]   r*   r   rY   r   
isinstance	MarkClassMarkClassNameGlyphClassNamer|   
GlyphClassr$   r   	add_rangemake_glyph_range_logwarningstrrW   expect_cid_add_cid_rangemake_cid_range_	add_classr1   )r5   r   accept_nullglyphgcr@   r   r   r   range_locationrange_start	range_end
glyph_names   &&&          r   r   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                `   . . . . . 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# )FTr   'z_Unsupported contextual target sequence: at most one run of marked (') glyph/class names allowedNrD   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   rM   byfrom)r/   r   r|   r   rZ   rW   is_next_value_parse_valuerecord_r}   r~   r+   r   r!   any)r5   rF   prefixr   lookupsvaluessuffixhasMarksr   marked
lookuplistlookup_namerD   marked_valuess   &&            r   parse_glyph_pattern_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                "   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
# )FrE   z(No lookups can be specified for "ignore r   zAmbiguous "ignore z)", there should be least one marked glyph   NN:r   r  N)rZ   r   r   r   r   r   r   )r5   subr@   r   r   r   r   r   r   ro   chainContexts   &&         r   parse_ignore_glyph_pattern_"Parser.parse_ignore_glyph_pattern_  s    ++<@<U<U =V =
9 w<<!:3%qA8  #$SE)RSE KKE
##BZF/r=   c                    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   rM   )rZ   r  r/   r|   rW   )r5   r  r@   r  s   &&  r   parse_ignore_context_Parser.parse_ignore_context_!  si    ++88=>#%$ @ @ EFC r=   c                   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  )	r[   rZ   r4   rY   r  r%   IgnoreSubstStatementIgnorePosStatementr   )r5   r@   r  s   &  r   parse_ignore_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                    V P                   R 8X  g   Q hV P                  pV P                  4       p\        P                  ! W!R7      # )rA   r?   )rY   rZ   expect_filename_r%   IncludeStatement)r5   r@   filenames   &  r   r\   Parser.parse_include_9  s>    )+++++((*##H@@r=   c                ^   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requiredrM   r?   >   exclude_dfltr  )	r[   rZ   expect_language_tag_r/   r~   r}   r|   r%   LanguageStatement)r5   r@   r  include_defaultr  s   &    r   parse_language_Parser.parse_language_@  s    ##J////++,,.%)5??"//1^COz)  ,HC xx))x * 
 	
r=   c                R   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      # )LigatureCaretByIndexTr   rM   r?   )	r[   rZ   r   r   r/   rW   r|   r%   LigatureCaretByIndexStatementr5   r@   r   caretss   &   r   parse_ligatureCaretByIndex_"Parser.parse_ligatureCaretByIndex_O  s    ##$:;;;;++'''>%%'(#%MM$--/0C xx55fx5XXr=   c                Z   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      # )LigatureCaretByPosTr   rz   rM   r?   )	r[   rZ   r   r   r/   rW   r|   r%   LigatureCaretByPosStatementr%  s   &   r   parse_ligatureCaretByPos_ Parser.parse_ligatureCaretByPos_Y  s    ##$89999++'''>%%t%45#%MM$--t-<=C xx33FX3VVr=   c                @   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# )rD   rM   r   r?   FuseExtensionT)r[   rZ   r~   r/   r+   r   r   r|   r%   LookupReferenceStatementr}   LookupBlockparse_block_r   )r5   rF   r@   rm   rD   use_extensionblocks   &&     r   rb   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                B   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      # )
lookupflagrM   r?   FNRightToLeftIgnoreBaseGlyphsIgnoreLigaturesIgnoreMarksz%s can be specified only onceMarkAttachmentTyper   UseMarkFilteringSetTz#"%s" is not a recognized lookupflagzlookupflag must have a value)markAttachmentmarkFilteringSetr@   )r[   rZ   r.   r   NUMBERr   r|   r%   LookupFlagStatementr#   r/   r   r1   r   r}   r   r~   r   )r5   r@   value
value_seenr>  r?  flagsseens   &       r   parse_lookupflag_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                d   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# )rG   Tr   z*Empty glyph class in mark class definitionrM   r?   )r[   rZ   r   glyphSetr   r   expect_class_name_r|   r'   markClassesgetr%   r   r*   r   MarkClassDefinitionaddDefinition)r5   r@   r   rt   rm   rG   mcdefs   &      r   rc   Parser.parse_markClass_  s   ##K0000++'''>  !<h  ##%&&(C II))--d3	**40I*3II!!$'%%d6,,v - 
 	&r=   c           	        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ligaturer   rM   z3If "lookup" is present, no values must be specifiedr?   )r   r@   z2"enumerate" is only allowed with pair positionings
forceChainr@   >   r  r  )rY   r/   parse_position_cursive_parse_position_base_parse_position_ligature_parse_position_mark_rZ   r   r|   r   r   r%   ChainContextPosStatementr!   reversePairPosStatementSinglePosStatementlistzip)
r5   r   rF   r@   r   r   r   r   r   r   s
   &&&       r   r   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                $   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      # )rR  z>"enumerate" is not allowed with cursive attachment positioningTr   rM   r?   )rZ   r}   r   r   r   r|   r%   CursivePosStatement)r5   r   rF   r@   r   entryAnchor
exitAnchors   &&&    r   rW  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      # )rS  zC"enumerate" is not allowed with mark-to-base attachment positioningTr   rM   r?   )rZ   r}   r   r   r   r|   r%   MarkBasePosStatement)r5   r   rF   r@   rS  markss   &&&   r   rX  Parser.parse_position_base_  s~    ++V$!6 
 %%t%<((*C xx,,T8,LLr=   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8X  d3   V P                  R4       VP                  V P	                  4       4       KC  V P                  R4       V P                  P                  WEVR7      # )rT  zG"enumerate" is not allowed with mark-to-ligature attachment positioningTr   ligComponentrM   r?   )
rZ   r}   r   r   r   r/   rW   r|   r%   MarkLigPosStatement)r5   r   rF   r@   	ligaturesri  s   &&&   r   rY  Parser.parse_position_ligature_  s    ++Z(!: 
 **D*A	))+,.0  0LL1134C xx++Ix+PPr=   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-mark attachment positioningTr   rM   r?   )rZ   r}   r   r   r   r|   r%   MarkMarkPosStatement)r5   r   rF   r@   	baseMarksri  s   &&&   r   rZ  Parser.parse_position_mark_/  s~    ++V$!6 
 **D*A	((*C xx,,Y,QQr=   c                    V P                  R 4      '       g   Q hV P                  V P                  4       r!V P                  R4       V P                  P                  W!R7      # )scriptrM   r?   )r[   rZ   expect_script_tag_r|   r%   ScriptStatement)r5   r@   ru  s   &  r   parse_script_Parser.parse_script_=  sU    ##H----33T5L5L5N&C xx'''BBr=   c           
        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  FrE   z-Substitution statements cannot contain valuesr   rM   T)r   r   r   r   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 elementsrU  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|   )rY   rZ   r   r   r   r/   r}   r   rW   r|   r!   rI  r%   AlternateSubstStatementr   r   r_  SingleSubstStatementMultipleSubstStatementLigatureSubstStatementsorted ReverseChainSingleSubstStatementChainContextSubstStatement)r5   r@   r\  
old_prefixoldr   r   
old_suffixr   newkeywordr   r   num_lookupsis_deletionr   replacementscountnrules   &                   r   parse_substitute_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                    V P                  R 4      '       g   Q hV P                  pV P                  R4       V P                  P	                  VR7      # )subtablerM   r?   )r[   rZ   r|   r%   SubtableStatement)r5   r@   s   & r   parse_subtable_Parser.parse_subtable_  sJ    ##J////++C xx))8)<<r=   c                   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        rM   r?   )r[   rZ   expect_decipoint_r   r.   r   r@  FLOATr|   r%   SizeParameters)r5   r@   
DesignSizeSubfamilyID
RangeStartRangeEnds   &     r   parse_size_parameters_Parser.parse_size_parameters_  s     ##L1111++++-
))+
  U\\5;;$??;RSCS//1J--/HC xx&&ZH ' 
 	
r=   c           	         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?   )r[   rZ   parse_name_r%   FeatureNameStatement)r5   r@   
platformID	platEncIDlangIDstrings   &     r   parse_size_menuname_Parser.parse_size_menuname_  s\    ##N3333++040@0@0B-
vxx,,J6H - 
 	
r=   c                   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# )rK   r?   {GDEFheadhheavhearm   BASEzOS/2STATz"table %s" is not supportedr   Expected "%s"rM   )r[   rZ   r   r%   
TableBlockr|   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_rL  r   strip)r5   r@   rm   rK   handlerr   s   &     r   rf   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                d   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
# )r   Tr   r?   r   r   r#  r*  rM   z<Expected Attach, LigatureCaretByIndex, or LigatureCaretByPosN)rT   r/   r0   r4   rU   r   rV   rW   r%   rX   rY   rZ   r[   r   r   r'  r,  r   r5   rK   rT   s   && r   r  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                
   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# )r   Tr   r?   FontRevisionrM   zExpected FontRevisionN)rT   r/   r0   r4   rU   r   rV   rW   r%   rX   rY   rZ   r[   parse_FontRevision_r   r  s   && r   r  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# )
CaretOffsetr   Tr   r?   rM   Incomplete statementz4Expected CaretOffset, Ascender, Descender or LineGapN)r  Ascender	DescenderLineGap)rT   r/   r0   r4   rU   r   rV   rW   r%   rX   rY   rZ   rh   lowerr   	HheaFieldr   r1   r5   rK   rT   fieldskeyrB  s   &&    r   r  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                   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# )
VertTypoAscenderr   Tr   r?   rM   r  z?Expected VertTypoAscender, VertTypoDescender or VertTypoLineGapN)r  VertTypoDescenderVertTypoLineGap)rT   r/   r0   r4   rU   r   rV   rW   r%   rX   rY   rZ   rh   r  r   	VheaFieldr   r1   r  s   &&    r   r  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                "   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# )r   Tr   r?   nameidrM   zExpected nameidN)rT   r/   r0   r4   rU   r   rV   rW   r%   rX   rY   rZ   r[   parse_nameid_r   )r5   rK   rT   	statements   &&  r   r  Parser.parse_table_name_  s    %%
#%);););.##u}}4!!HH$$T__t?W?W$X %%h// ..0	%%i0 C'%&79Q9QRR *<r=   c                V   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	  rM   Unsupported encodingr     )
r.   r   NUMBERSexpect_any_number_rZ   r   expect_string_r|   r   unescape_string_r5   r  r  r  r@   r  encoding	unescapeds   &       r   r  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                4   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  rZ   r   r  r   r  r  s   &       r   parse_stat_name_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           	        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?   )rY   rZ   r  r   r  r%   
NameRecord)r5   r@   nameIDr  r  r  r  s   &      r   r  Parser.parse_nameid_  s    (*;DOO;*33T5L5L5N&E>!<d>V>V  150@0@0B-
vxx""	6 # 
 	
r=   c                   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      # )	utf_16_bez\\[0-9a-fA-F]{4}c                 (   < SP                  V S4      # r   )unescape_byte_)mr  r5   s   &r   <lambda>)Parser.unescape_string_.<locals>.<lambda>  s    !4!4Q!Ar=   z\\[0-9a-fA-F]{2}surrogatepass)rer  unescape_unichr_r
   r   )r5   r  r  r   unescapeutf16s   f&f   r   r  Parser.unescape_string_  sW    {"*D,A,A6JAAH*H=A ;8UK((r=   c                \    V P                  ^ 4      R,          p\        \        V^4      4      # r   r  )groupchrint)matchr  s   & r   r  Parser.unescape_unichr_  s$    KKN23q":r=   c                z    V P                  ^ 4      R,          p\        \        V^4      4      P                  V4      # r  )r  r	   r  decode)r  r  r  s   && r   r  Parser.unescape_byte_	  s0    KKN2s1bz"))(33r=   c                    \        V4       F@  p\        W0P                  P                  4      '       d   K*  \        W24      '       d   Vu #  R # 	  R # r   )reversedr   r%   rX   )r5   rT   class_previouss   &&& r   find_previousParser.find_previous  sC     ,H(HH$4$455H--  - r=   c           	     b   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# )r   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 statementsrM   )rT   r/   r0   r4   rU   r   rV   rW   r%   rX   rY   rZ   r[   parse_base_tag_list_parse_base_script_list_r!   BaseAxisr  r   rF   minmaxparse_base_minmax_)r5   rK   rT   horiz_baseshoriz_scriptsbase_script_list
vert_basesvert_scriptss   &&      r   r  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                   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# )FSTyper   Tr   r?   NPanoserM   Vendor)r#  TypoAscenderTypoDescenderTypoLineGap	winAscent
winDescentXHeight	CapHeightWeightClass
WidthClassLowerOpSizeUpperOpSize)UnicodeRangeCodePageRange)rT   r/   r0   r4   rU   r   rV   rW   r%   rX   rY   rZ   rh   r  r   r[   r   r  OS2Field)r5   rK   rT   numbersr   r  rB  r   s   &&      r   r  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           	     `   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  r   rm   statr?   rM   Unexpected token z in ElidedFallbackNameExpected "name")r[   r|   r/   r0   r4   r  r%   STATNameStatementrZ   rW   rY   r   )r5   namesr  r  r  r  
nameRecords   &      r   parse_STAT_ElidedFallbackName$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           	     V   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  r   rm   r8  r?   rM   zExpected "name", got )italopszslntwdthwght)r[   r   isupperr   r   r   r|   r/   r0   r4   rU   r   rV   rZ   r  r%   r;  rW   rY   r   STATDesignAxisStatement)
r5   r<  axisTag	axisOrderr@   r  r  r  r  rm   s
   &         r   parse_STAT_design_axis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           	     L   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  r   Tr   rm   r8  r?   r@   flagrM   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.)r[   r|   r/   r0   r4   rU   r   rV   rZ   r  r%   r;  rW   parse_STAT_locationexpect_stat_flagsrY   r   r!   r   r   STATAxisValueStatement)r5   	locationsr<  rD  r@   r  r  r  r  rm   format4_tagsr   s   &           r   parse_STAT_axis_value_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           	        . 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      # )
   rP  z must be 4 charactersrM   zUnexpected value "z". Expected integer or float.zDefault value z is outside of specified range r   .)r   r!   r  r   rY   rZ   r/   r.   r   r  expect_float_rW   r@  r   r1   r%   AxisValueLocationStatement)r5   r   r   rB  nominalmin_valmax_vals   &      r   rQ  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                h   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# )r   Tr   r?   r7  ElidedFallbackNameIDrM   rA  rN  zDesignAxis not defined for rZ  r9  N)rT   r/   r0   r4   rU   r   rV   rW   r%   rX   rY   rZ   rh   r[   r>  r7  r   rb  r|   rK  r   rV  rT  r   )	r5   rK   rT   design_axesr<  rB  
designAxisaxisValueRecordr@   s	   &&       r   r  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                    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  rM   )r  r  )rY   r/   rW   rv  r|   )r5   basess   & r   r  Parser.parse_base_tag_list_D  sh     #
 
 	 ??	 
 #%LL0023C r=   c                   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   rM   )r  r  )rY   parse_base_script_record_r/   r|   rW   )r5   r  scriptss   && r   r  Parser.parse_base_script_list_P  s     #
 
 	 ??	 
 11%89#%$NN499%@AC r=   c                    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   )rv  r   r   )r5   r  
script_tagbase_tagr   coordss   &&    r   rk   Parser.parse_base_script_record_\  sM    ,,.
**,16u>A%%'>V++ ?s   Ac                   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)rv  r  r   r4   rU   r   rj   rY   r   rZ   r/   )r5   ro  r  	min_coord	max_coords   &    r   r  Parser.parse_base_minmax_b  s    ,,.
,,.'')	$$4C9O!B((  '')	s"!B(( 
 Y99r=   c                   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# )Nrs   deviceru   r   rv   )r|   r}   r/   r   rW   tuple)r5   results   & r   r   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                    V P                   \        P                  J ;'       g'    V P                  R 8H  ;'       g    V P                  R8H  # )rs   ()r.   r   r@  r/   r5   s   &r   r   Parser.is_next_value_  sI    !!U\\1 ' '3&' '3&	
r=   c                "   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 )r}  Trz   )yAdvancerF   r@   )xAdvancerF   r@   rs   ru   rv   zUnknown valueRecordDef "%s"z+Device value out of valid range (-128..127))rF   r@   r}  ir   )NNNN)r.   r   rj   r/   r@  r   rZ   r%   ValueRecordr|   rh   r~   r,   r   r   rB  
xPlacement
yPlacementr  r  r   r  )r5   rF   numberr@   valrm   vrdrB  r  r  r  r  
xPlaDevice
yPlaDevice
xAdvDevice
yAdvDevicer  delta	allDeltass   &&                 r   r   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                $   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# )rL   rM   r?   )	r[   rZ   r   r~   r|   r%   ValueRecordDefinitionr,   r   )r5   rF   r@   rB  rm   r  s   &&    r   rg   $Parser.parse_valuerecord_definition_  s    ##$45555++''1  "C hh,,T8,L!!$,
r=   c                    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      # )rC   rM   r?   )rY   rZ   rv  r  r|   r%   LanguageSystemStatement)r5   r@   ru  r  s   &   r   ra   Parser.parse_languagesystem_  sd    "2222++((*,,.C xx//8/TTr=   c                :   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
# )	rJ   rH   NFr  Tr/  )r3  r@   >   valtvhalvkrnvpal)rY   rZ   r   SS_FEATURE_TAGSCV_FEATURE_TAGSr~   r/   r}   r%   VariationBlockFeatureBlockr2  )r5   rJ   r@   r   rF   stylisticset
cv_featuresize_featurerI   r3  r4  s   &&         r   rd   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                    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      # )rH   rM   r?   )rY   rZ   r   r|   r%   FeatureReferenceStatement)r5   r@   featureNames   &  r   parse_feature_reference_Parser.parse_feature_reference_  s\    )+<T__<+++&&(C xx11+1QQr=   c                   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  r   Tr   rm   rM   r:  )rY   r%   NestedBlockrZ   r|   r-   enter_scoper/   r0   r4   rU   r   rV   rT   rW   rX   r[   r  r  r   
exit_scope)	r5   r   r4  symtabr@   r  r  r  r  s	   &&       r   parse_featureNames_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                |   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  r   Tr   	CharacterrM   zExpected statement: got {} {}>   SampleTextNameIDFeatUILabelNameIDParamUILabelNameIDFeatUITooltipTextNameID)rY   r%   r  rZ   r|   r-   r  rT   r/   r0   r4   rU   r   rV   rW   rX   r[   parse_cvNameIDs_parse_cvCharacter_r   rk   r  )r5   r   r4  r  rT   s   &&   r   parse_cvParameters_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                   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  r   Tr   rm   rM   r:  )rY   r%   r  rZ   r|   r-   r  r/   r0   r4   rU   r   rV   rT   rW   rX   r[   r  CVParametersNameStatementr   r  )
r5   r   
block_namer4  r  r@   r  r  r  r  s
   &&&       r   r  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                2   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      # )r  rM   i z/Character value must be between {:#x} and {:#x}r?   )rY   rZ   r  r|   r   rk   r%   CharacterStatement)r5   r   r@   	characters   &&  r   r  Parser.parse_cvCharacter_  s    +->t>-"668O8O8Q)C I**!""(&H"5 
 xx**9H*MMr=   c                    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  rM   z&Font revision numbers must be positiver?   )rY   rZ   r[  r|   r   r%   FontRevisionStatement)r5   r@   versions   &  r   r  Parser.parse_FontRevision_  sp     .0A$//A0 44d6H6H6J'C a<!"JHUUxx--g-IIr=   c                   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  r   Expected an axis namezRepeated condition for axis Frz   rM   r  )r~   r|   r/   r4   rU   r   rh   r   rZ   rY   r.   r  r[  r@  r   r%   ConditionsetStatement)r5   rm   
conditionsaxis	min_value	max_value	finalnames   &      r   re   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                   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  r   Tr   r?   rB   r   r   rE   rH   r  r  rD   r7  rG   r  r  Fr   ru  r  rL   r  r  r  r  rM   z7Expected glyph class definition or statement: got {} {}r  N>   r  r{  r|  r  )+r|   r-   r  rT   r/   r0   r4   rU   r   rV   rW   r%   rX   rY   rZ   r]   r^   r[   r`   r   r  r  r   rb   rF  rc   r   rx  r  r  rg   r  r  r  r  rh   ri   r   rk   r  r~   rm   r  )	r5   r4  rF   r  r  r  r  rT   rm   s	   &&&&&&   r   r2  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                    V P                   \        P                  J d:   \        V\	        R 4      4      '       d   V P
                  V8H  # V P
                  V9   # R# )r   F)rU   r   rh   r   typerY   )r5   r   s   &&r   r[   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)r4   rU   r   r]   r   rZ   rY   r~  s   &r   rJ  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)r4   rU   r   r   rY   r   rZ   r~  s   &r   r   Parser.expect_cid_$  s>    599,??".0H0HIIr=   c                    V P                  4        V P                  \        P                  Jd   \	        R V P
                  4      hV P                  # )zExpected file name)r4   rU   r   FILENAMEr   rZ   rY   r~  s   &r   r  Parser.expect_filename_*  s>    u~~5!"68P8PQQr=   c                "   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)\cid%05dzExpected a glyph name or CID)	r4   rU   r   rh   rY   lstripr   r   rZ   r~  s   &r   r   Parser.expect_glyph_0  sj    5::-??))$//!!UYY.t..<d>V>VWWr=   c                    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$   r3   rZ   )r5   r<  rm   s   &* r   r   $Parser.check_glyph_name_in_glyph_set8  sL     +++||+)-)A)ADLL&	  r=   c                "   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)rJ  r*   r   r   rZ   r   r%   r   )r5   rm   mcs   &  r   r   "Parser.expect_markClass_reference_F  s    &&(''-:!'$.0H0H  "hh0011!(4/1I1I  	r=   c                   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    :NrY  N)r4   rU   r   rh   r   rZ   r!   rY   r~  s   &r   r   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# )dfltz4"dflt" is not a valid script tag; use "DFLT" insteadr   r   rZ   r5   r   s   & r   rv  Parser.expect_script_tag_]  s7     &=!F((  
r=   c                `    V P                  4       pVR 8X  d   \        RV P                  4      hV# )DFLTz6"DFLT" is not a valid language tag; use "dflt" insteadr  r  s   & r   r  Parser.expect_language_tag_f  s7     &=!H((  
r=   c                    V P                  4        V P                  \        P                  J d   V P                  V8X  d   V# \        R V,          V P                  4      h)zExpected '%s')r4   rU   r   rj   rY   r   rZ   )r5   symbols   &&r   r|   Parser.expect_symbol_o  sH    5<</DOOv4MMo68P8PQQr=   c                    V P                  4        V P                  \        P                  J d   V P                  V8X  d   V P                  # \        R V,          V P                  4      h)r  r4   rU   r   rh   rY   r   rZ   )r5   r  s   &&r   r}   Parser.expect_keyword_u  sM    5::-$//W2L??"o79Q9QRRr=   c                    V P                  4        V P                  \        P                  J d   V P                  # \        R V P                  4      h)zExpected a namer  r~  s   &r   r~   Parser.expect_name_{  s>    5::-??"/1I1IJJr=   c                0   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)r}  zExpected a number)	r4   rU   r   r@  rY   rj   expect_variable_scalar_r   rZ   )r5   r{   s   &&r   r   Parser.expect_number_  sm    5<</??",,<TWAW//11143K3KLLr=   c                    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  )TrO   )r4   r   rU   r   rj   rY   expect_master_	add_value)r5   scalarr@   rB  s   &   r   r  Parser.expect_variable_scalar_  s`    !##u||338N  #113OHX-r=   c                   / 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# )Tr  r   zExpected an equals sign:r   z#Expected an comma or an equals signr  )rU   r   rh   r   rZ   rY   r4   rj   expect_integer_or_float_r.   r/   r  )r5   r@   r  rB  s   &   r   r  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                    V P                  4        V P                  \        P                  9   d   V P                  # \        R V P                  4      h)z/Expected a decimal, hexadecimal or octal number)r4   rU   r   r  rY   r   rZ   r~  s   &r   r  Parser.expect_any_number_  sB    5==0??"=t?W?W
 	
r=   c                    V P                  4        V P                  \        P                  J d   V P                  # \        R V P                  4      h)z Expected a floating-point number)r4   rU   r   r  rY   r   rZ   r~  s   &r   r[  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  r[  r@  r   r   rZ   r~  s   &r   r  Parser.expect_integer_or_float_  \      EKK/%%''""ell2&&((!>@X@X r=   c                    V P                   \        P                  8X  d   V P                  4       # V P                   \        P                  J d   V P                  4       ^
,          # \        RV P                  4      h)
   r
  r  r~  s   &r   r  Parser.expect_decipoint_  sa      EKK/%%''""ell2&&(2--!>@X@X r=   c                    ^ 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   OlderSiblingFontAttributeElidableAxisValueNamerM   zUnexpected STAT flag )r/   r~   r   rY   rZ   )r5   rB  rD  rm   s   &   r   rR  Parser.expect_stat_flags  s{    '#Q
 #%5(((*d+%+DOO+<=t?W?W  r=   c                    V P                   \        P                  8X  d   V P                  4       # V P                   \        P                  J d   V P                  4       # \        R V P                  4      hr	  r  r~  s   &r   expect_stat_values_Parser.expect_stat_values_  r  r=   c                    V P                  4        V P                  \        P                  J d   V P                  # \        R V P                  4      h)zExpected a string)r4   rU   r   STRINGrY   r   rZ   r~  s   &r   r  Parser.expect_string_  s>    5<</??"143K3KLLr=   c                X   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)r0   r   rV   rU   r    rY   rZ   r.   r/   r1   nextr2   StopIterationrW   )r5   r   s   &&r   r4   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                H    RP                  \        \        V 4      4      4      # )z'abc' --> 'cba'r   )r"   r  r_  )r   s   &r   reverse_string_Parser.reverse_string_
	  s     wwxQ())r=   c                    \        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 limitr  )r_  r   r   rW   )r5   r@   r   r   rz  r   s   &&&&  r   r   Parser.make_cid_range_	  sJ    =!<h  	*CMM)c/* +r=   c                   \        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}$000r   r   )r_  r!   r   r   ospathcommonprefixr  compiler  r   ordrW   r  r   )r5   r@   r   r   rz  revr   r   start_rangelimit_range	uppercasec	lowercasedigitsr   r  s   &&&&            r   r   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)   r0   rY   rZ   rU   r'   r$   r*   r2   r+   r3   r/   r1   r.   r-   r,   )r}  TN)F)NFN)o__name__
__module____qualname____firstlineno____doc__ri   r%   r   r  r  r;   rp   r   r   r`   r_   r   r   r   r^   r   r   r   r  r  r  r\   r   r'  r,  rb   rF  rc   r   rW  rX  rY  rZ  rx  r  r  r  r  rf   r  r  r  r  r  r  r  r  r  staticmethodr  r  r  r  r  r>  rK  rV  rQ  r  r  r  rk  r  r   r   r   rg   ra   rd   r  r  r  r  r  r  re   r2  r[   rJ  r   r  r   r   r   r   rv  r  r|   r}   r~   r   r  r  r  r[  r  r  rR  r  r  r4   r   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                   >   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                    / .V n         R # r   scopes_r~  s   &r   r;   SymbolTable.__init__I	  s    tr=   c                <    V P                   P                  / 4       R # r   )r?  rW   r~  s   &r   r  SymbolTable.enter_scopeL	  s    Br=   c                :    V P                   P                  4        R # r   )r?  r    r~  s   &r   r  SymbolTable.exit_scopeO	  s    r=   c                0    W P                   R,          V&   R# )r  Nr   r>  )r5   rm   items   &&&r   r   SymbolTable.defineR	  s    !%Rr=   c                x    \        V P                  4       F   pVP                  V4      pV'       g   K  Vu # 	  R # r   )r  r?  rL  )r5   rm   scoperF  s   &&  r   r   SymbolTable.resolveU	  s1    dll+E99T?Dt , r=   r>  N)r3  r4  r5  r6  r;   r  r  r   r   r9  r:  )r;  s   @r   r(   r(   H	  s#      & r=   r(   )fontTools.feaLib.errorr   fontTools.feaLib.lexerr   r   r   fontTools.feaLib.variableScalarr   fontTools.misc.encodingToolsr   fontTools.misc.textToolsr	   r
   r   fontTools.feaLib.astfeaLibr%   loggingr&  r  	getLoggerr3  r   objectr   r(   r}  r=   r   <module>rU     sY    2 K K : 4 < < " "  	 	 !v$OV v$OrI& r=   