
    h݊                        S SK Jr  S SKJrJrJr  S SKJr  S SKJ	r	  S SK
JrJrJr  S SKJs  Jr  S SKrS SKrS SKr\R(                  " \5      r " S S\5      r " S	 S
\5      rg)    )FeatureLibError)LexerIncludingLexerNonIncludingLexer)VariableScalar)getEncoding)bytechrtobytestostrNc                   4   \ rS rSrSr0 r\r\" SS5       V Vs1 s H  nSU-  iM
     snn r\" SS5       V Vs1 s H  nSU-  iM
     snn r	 SkS	 jr
S
 rS rS rS rS rS rS rS rS rS rSlS jrS rS rS rS rS rS rS rS rS rS rS r S  r!S! r"S" r#S# r$S$ r%S% r&S& r'S' r(S( r)S) r*S* r+S+ r,S, r-S- r.S. r/S/ r0S0 r1S1 r2S2 r3S3 r4\5S4 5       r6\5S5 5       r7S6 r8S7 r9S8 r:S9 r;S: r<S; r=S< r>S= r?S> r@S? rAS@ rBSA rCSB rDSC rESD rFSE rGSF rHSlSG jrISH rJSI rKSJ rLSK rMSL rNSM rOSN rP SmSO jrQSP rRSQ rSSR rTSS rUST rVSU rWSV rXSW rYSX rZSY r[SZ r\S[ r]S\ r^SlS] jr_S^ r`S_ raS` rbSa rcSb rdSc reSd rfSe rgSlSf jrh\5Sg 5       riSh rjSi rkSjrlgs  snn f s  snn f )nParser   a  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%02dd   zcv%02dNc           	         SU;   a2  SSK Jn  U" SS5        U(       a  [        S5      eUR                  S5      nU(       a:  [        S[	        U5      S:X  a  SOS	< S
SR                  S U 5       5      < 35      e[        U5      U l        U R                  R                  5       U l
        [        5       U l        [        5       U l        [        5       U l        [        5       U l        U R                  U R                  1U l        Su  U l        U l        / U l        S U l        U(       a  [*        O[,        nU" XS9U l        0 U l        U R3                  SS9  g )NglyphMapr   )deprecateArgumentz#use 'glyphNames' (iterable) insteadz?'glyphNames' and (deprecated) 'glyphMap' are mutually exclusivezunsupported keyword argumentr    sz: z, c              3   8   #    U  H  n[        U5      v   M     g 7fN)repr).0ks     I/var/www/html/env/lib/python3.13/site-packages/fontTools/feaLib/parser.py	<genexpr>"Parser.__init__.<locals>.<genexpr><   s     =Vv!d1ggvs   NN)
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2>/t/$(!'5^;L
 DT*    c           	      H	   U R                   R                  nU R                  c  U R                  (       Ga  U R	                  SS9  U R
                  [        R                  L a?  UR                  U R                  R                  U R                  U R                  S95        GOgU R                  S5      (       a!  UR                  U R                  5       5        GO0U R
                  [        R                  L a!  UR                  U R!                  5       5        GOU R                  S5      (       a!  UR                  U R#                  5       5        GOU R                  S5      (       a!  UR                  U R%                  5       5        GOU R                  S5      (       a!  UR                  U R'                  5       5        GOMU R                  S	5      (       a   UR                  U R)                  S
S95        GOU R                  S5      (       a!  UR                  U R+                  5       5        GOU R                  S5      (       a!  UR                  U R-                  5       5        GOU R                  S5      (       a!  UR                  U R/                  5       5        GOrU R                  S5      (       a   UR                  U R-                  SS95        GO<U R                  S5      (       a!  UR                  U R1                  5       5        GOU R                  S5      (       a  UR                  U R3                  S
S95        OU R
                  [        R4                  L aI  U R                  U R6                  ;   a/  UR                  U R6                  U R                     " U 5      5        OjU R
                  [        R8                  L a  U R                  S:X  a  GM  [;        SR=                  U R
                  U R                  5      U R                  5      eU R                  b  GM  U R                  (       a  GM  U R>                  (       aU  U R>                  RA                  5        VVs/ s H  u  p#SU< SU< S3PM     nnn[;        SSRC                  U5      -   S5      eU R                   $ s  snnf )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anon	anonymous	anchorDeflanguagesystemlookupFvertical	markClassfeatureconditionset	variation)rR   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:

)"r,   
statementsr3   r5   r9   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   formatr8   itemsr'   )r:   rY   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 ,, M ##/43E3E3E\ << "&!3!3!5!5ID# .237!5   ""&))E"24 
 yys   Rc           
         U R                  S5        U R                  S5        U R                  nU R                  S:X  a#  U R                  S5        U R                  S5        g U R                  [
        R                  :X  a  U R                  5       nU R                  R                  U5      nUc  [        SU-  U R                  5      eU R                  S5        U R                  R                  UR                  UR                  UUR                  S S US9$ U R!                  SS9U R!                  SS9pTS nU R                  S	:X  a!  U R                  S	5        U R!                  5       nU R                  S:X  a!  U R#                  5       nU R#                  5       nOS
u  pxU R                  S5        U R                  R                  UUS UUUUS9$ )N<anchorNULL>zUnknown anchor "%s")rr   contourpointxDeviceTableyDeviceTablerE   Tvariabler|   r   )expect_symbol_expect_keyword_r_   r4   r3   r   rm   expect_name_r.   resolver   r*   Anchorxyr|   expect_number_parse_device_)	r:   rE   rr   	anchordefr   r   r|   r}   r~   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)3&LC xx%%%  
 	
rB   c                     / nU R                   S:X  aj  U R                  5       nUc  U R                   S:w  a  M5  U R                  S5        U R                  5       nUR	                  X#45        U R                   S:X  a  Mj  U$ )Nrx   mark)r4   r   r   expect_markClass_reference_r\   )r:   anchorMarksry   rO   s       r   parse_anchor_marks_Parser.parse_anchor_marks_   s}    #%'')F~$"2"2f"<  (88:I23 #% rB   c                    U R                  S5      (       d   eU R                  nU R                  5       U R                  5       p2S nU R                  S:X  a!  U R	                  S5        U R                  5       nU R                  5       nU R                  S5        U R                  R                  XRX4US9nU R                  R                  XV5        U$ )NrJ   r|   rU   )r|   rE   )r`   r_   r   r4   r   r   r   r*   AnchorDefinitionr.   define)r:   rE   r   r   r|   rr   r   s          r   re   Parser.parse_anchordef_   s    ##K0000++""$d&9&9&;1~-  0..0L  "C HH--QH . 
	 	T-rB   c                 ^   U R                  S5      (       d   eU R                  5       nU R                  R                  U5      u  p#nU R	                  5         U R                  S5        U R                  5       nX:X  d   S5       eU R                  S5        U R                  R                  XUS9$ )NrG   }z-bad splitting in Lexer.scan_anonymous_block()rU   rD   )r`   expect_tag_r7   scan_anonymous_blockr9   r   r*   AnonymousBlock)r:   tag_contentrE   end_tags         r   rd   Parser.parse_anonymous_   s    ##$9:::: #{{??DHC ""$~NNN~C xx&&sh&GGrB   c                 b   U R                  S5      (       d   eU R                  nU R                  SS9nU R                  5       1nU R                  S:w  a1  UR                  U R                  5       5        U R                  S:w  a  M1  U R                  S5        U R                  R                  X#US9$ )NAttachTaccept_glyphnamerU   rD   )	r`   r_   parse_glyphclass_r   r4   addr   r*   AttachStatement)r:   rE   glyphscontourPointss       r   parse_attach_Parser.parse_attach_   s    ##H----++'''>,,./#%d1134 #%C xx'''QQrB   c                 f    U R                   S;   d   eU R                  5         U R                  SUS9$ )N>   enum	enumerateT
enumeratedrN   )r^   r9   parse_position_)r:   rN   s     r   parse_enumerate_Parser.parse_enumerate_   s7    "7777##th#GGrB   c                    U R                  S5      (       d   eU R                  nU R                  S:w  a  U R                  SS9nOS nU R	                  S5        U R                  S:w  a  U R                  SS9nOS nU R	                  S5        U R                  S:w  a  U R                  SS9nOS nU R	                  S5        U R                  S:w  a  U R                  SS9nOS nU R	                  S5        U R
                  R                  X$X5US9$ )NGlyphClassDef,Fr   rU   rD   )r`   r_   r4   r   r   r*   GlyphClassDefStatement)r:   rE   
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 / 
 	
rB   c                     U R                   U R                  p!U R                  S5        U R                  SS9nU R                  S5        U R                  R                  X#US9nU R                  R                  X$5        U$ )N=Fr   rU   rD   )r_   r^   r   r   r*   GlyphClassDefinitionr/   r   )r:   rE   rr   r   
glyphclasss        r   rc   #Parser.parse_glyphclass_definition_  su    114??$C '''?C XX224(2S
!!$3rB   c                    UR                  S5      n/ n[        [        U5      5       H]  nSR                  USU 5      SR                  X5S  5      pvX`R                  ;   d  M:  XpR                  ;   d  MK  UR                  Xg45        M_     [        U5      S:X  a
  US   u  pgXg4$ [        U5      S:X  a  [        SU-  U5      eSR                  U VV	s/ s H  u  pSU< SU	< S3PM     sn	n5      n
[        SU< S	U
< S
3U5      es  sn	nf )N-r   r   zU"%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)   r\   r   )r:   rr   rE   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           	         U(       a  U R                   [        R                  [        R                  4;   a  U(       aC  U R                  S:X  a3  U R                  5         U R                  R                  U R                  S9$ U R                  5       nU R                  U5        U R                  R                  X0R                  S9$ U R                   [        R                  L a  U R                  5         U R                  R                  U R                  5      nUc#  [!        SU R                  -  U R                  5      e[#        X@R                  R$                  5      (       a#  U R                  R'                  X@R                  S9$ U R                  R)                  X@R                  S9$ U R+                  S5        U R                  nU R                  R-                  US9nU R                  S:w  Ga  U R                   [        R                  L GaY  U R                  5       nU R                  nSU;   ah  U R.                  (       aW  X0R.                  ;  aH  U R1                  X55      u  pxU R                  Xx5        UR3                  XxU R5                  XWU5      5        GOU R                  S:X  aX  UnU R+                  S5        U R                  5       nU R                  Xx5        UR3                  XxU R5                  XWU5      5        GOiSU;   a=  U R.                  (       d,  [6        R9                  [;        [!        SU< 3U5      5      5        U R                  U5        UR=                  U5        GOU R                   [        R                  L a  U R                  5       nU R                  S:X  ax  U R                  n	U R                  n
U R+                  S5        U R?                  5       nU R                  SU
S	 3SUS	 35        URA                  U
UU RC                  XU5      5        GOMSU R                  S	 3nU R                  U5        UR=                  U5        GOU R                   [        R                  L a  U R                  5         U R                  R                  U R                  5      nUc#  [!        SU R                  -  U R                  5      e[#        X@R                  R$                  5      (       a$  U R                  R'                  X@R                  S9nO#U R                  R)                  X@R                  S9nURE                  U5        O$[!        S
U R                  < 3U RF                  5      eU R                  S:w  a  GM  U R+                  S5        U$ )Nrz   rD   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 )$r3   r   rm   CIDr4   r9   r*   	NullGlyphr_   expect_glyph_check_glyph_name_in_glyph_set	GlyphNamerb   r/   r   r^   r   
isinstance	MarkClassMarkClassNameGlyphClassNamer   
GlyphClassr)   r   	add_rangemake_glyph_range_logwarningstrr\   expect_cid_add_cid_rangemake_cid_range_	add_classr6   )r:   r   accept_nullglyphgcrE   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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-- A #%J 	C rB   c                 @   / / / / / 4u  p#pEnSnU R                   S;  Ga  U R                  SS9nSn	U R                   S:X  a  U R                  S5        S=pyU	(       a/  U(       a  [        SU R                  5      eUR                  U5        O*U(       a  UR                  U5        OUR                  U5        U R                  5       (       a!  UR                  U R                  U5      5        OUR                  S 5        S n
U R                   S:X  a  U
c  / n
U R                  S5        U	(       d  [        SU R                  5      eU R                  5       nU R                  R                  U5      nUc  [        S	U-  U R                  5      eU
R                  U5        U R                   S:X  a  M  U	(       a  UR                  U
5        U R                   S;  a  GM  U(       d$  U(       d  U/ :X  d   e/ US /[        U5      -  U/ U4$ [        US [        U5       5      (       a  [        S
U R                  5      eU[        U5      [        U5      [        U5      -    n[        U5      (       aA  [        U[        U5      [        U5      -   S  5      (       a  [        SU R                  5      eUnOuU(       aH  US   (       a>  [        U5      S:  d  [        US S 5      (       a  [        SU R                  5      eUSS  nO&[        U5      (       a  [        SU R                  5      eX#XEXg4$ )NF>   r   rU   byfromTr   'z_Unsupported contextual target sequence: at most one run of marked (') glyph/class names allowedrL   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   )r4   r   r   r   r_   r\   is_next_value_parse_valuerecord_r   r   r0   r   r&   any)r:   rN   prefixr   lookupsvaluessuffixhasMarksr   marked
lookuplistlookup_namerL   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  !!&) ""h.  z*[ &>>^ fb= =V 4fb(KK6-CK())%8,, 
 #3v;Vs6{1JKM=!!vc&kCK79:;;)* 00	  'F2Jv;?c&"+&6&6)* 00	   V%& ,,	  GVFFrB   c                    U R                   nU R                  SS9u  p4pVpx[        U5      (       a  [        SU S3U5      eU(       d7  [        SU S3U5      n	[        R                  [        U	5      5        USS  USS pGX4U4n
U
$ )	NFrM   z(No lookups can be specified for "ignore r   zAmbiguous "ignore z)", there should be least one marked glyphr   r   )r_   r  r   r   r   r   r   )r:   subrE   r   r   r   r   r   r   rt   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
##ABZ!F/rB   c                 
   U R                   nU R                  U5      /nU R                  S:X  aC  U R                  S5        UR	                  U R                  U5      5        U R                  S:X  a  MC  U R                  S5        U$ )Nr   rU   )r_   r  r4   r   r\   )r:   r  rE   r  s       r   parse_ignore_context_Parser.parse_ignore_context_!  s{    ++88=>#%$ @ @ EF #% 	C rB   c                 ~   U R                  S5      (       d   eU R                  nU R                  5         U R                  S;   a*  U R	                  S5      nU R
                  R                  X!S9$ U R                  S;   a*  U R	                  S5      nU R
                  R                  X!S9$ [        SU R                  5      e)Nignore)
substituter  r  rD   )positionposr  z#Expected "substitute" or "position")	r`   r_   r9   r^   r  r*   IgnoreSubstStatementIgnorePosStatementr   )r:   rE   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
 	
rB   c                     U R                   S:X  d   eU R                  nU R                  5       n[        R                  " X!S9$ )NrF   rD   )r^   r_   expect_filename_r*   IncludeStatement)r:   rE   filenames      r   ra   Parser.parse_include_9  s>    )+++++((*##H@@rB   c                 T   U R                  S5      (       d   eU R                  nU R                  5       nSu  p4U R                  S;   a  U R	                  5       S:H  nU R                  S:X  a  U R                  S5        SnU R                  S5        U R                  R                  X#XAS9$ )	Nlanguage)TF>   exclude_dfltinclude_dfltr  requiredTrU   rD   )	r`   r_   expect_language_tag_r4   r   r   r   r*   LanguageStatement)r:   rE   r  include_defaultr  s        r   parse_language_Parser.parse_language_@  s    ##J////++,,.$1!??"//1^COz)  ,HC xx))x * 
 	
rB   c                 b   U R                  S5      (       d   eU R                  nU R                  SS9nU R                  5       /nU R                  S:w  a1  UR                  U R                  5       5        U R                  S:w  a  M1  U R                  S5        U R                  R                  X#US9$ )NLigatureCaretByIndexTr   rU   rD   )	r`   r_   r   r   r4   r\   r   r*   LigatureCaretByIndexStatementr:   rE   r   caretss       r   parse_ligatureCaretByIndex_"Parser.parse_ligatureCaretByIndex_O  s    ##$:;;;;++'''>%%'(#%MM$--/0 #%C xx55fx5XXrB   c                 ^   U R                  S5      (       d   eU R                  nU R                  SS9nU R                  SS9/nU R                  S:w  a0  UR                  U R                  SS95        U R                  S:w  a  M0  U R                  S5        U R                  R                  X#US9$ )NLigatureCaretByPosTr   r   rU   rD   )	r`   r_   r   r   r4   r\   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VrB   c                 $   U R                  S5      (       d   eU R                  U R                  5       p2U R                  S:X  aa  U R                  R                  U5      nUc  [        SU-  U R                  5      eU R                  S5        U R                  R                  XBS9$ SnU R                  S:X  a  U R                  S5        SnU R                  R                  X5US9nU R                  Xa5        U R                  R                  X65        U$ )NrL   rU   r   rD   FuseExtensionT)r`   r_   r   r4   r0   r   r   r   r*   LookupReferenceStatementr   LookupBlockparse_block_r   )r:   rN   rE   rr   rL   use_extensionblocks          r   rg   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)rB   c                    U R                  S5      (       d   eU R                  nU R                  [        R                  :X  a:  U R                  5       nU R                  S5        U R                  R                  X!S9$ SnSu  p$nSSSS	S
.n[        5       nU R                  S:w  Ga  U R                  U;   a#  [        SU R                  -  U R                  5      eUR                  U R                  5        U R                  S:X  a!  U R                  S5        U R                  SS9nO|U R                  S:X  a!  U R                  S5        U R                  SS9nOKU R                  U;   a  SnX&U R!                  5          -  nO#[        SU R                  -  U R                  5      eU R                  S:w  a  GM  U R                  S5        [#        X4U/5      (       d  [        SU R                  5      eU R                  R                  UUUUS9$ )N
lookupflagrU   rD   F)r   NNr            )RightToLeftIgnoreBaseGlyphsIgnoreLigaturesIgnoreMarksz%s can be specified only onceMarkAttachmentTyper   UseMarkFilteringSetTz#"%s" is not a recognized lookupflagzlookupflag must have a value)markAttachmentmarkFilteringSetrE   )r`   r_   r3   r   NUMBERr   r   r*   LookupFlagStatementr(   r4   r   r6   r   r   r   r   r   )r:   rE   value
value_seenrD  rE  flagsseens           r   parse_lookupflag_Parser.parse_lookupflag_|  s    ##L1111++   ELL0'')E$88///II 
2?// ! 	
 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++)-	 , 
 	
rB   c                 R   U R                  S5      (       d   eU R                  nU R                  SS9nUR                  5       (       d  [	        SU5      eU R                  5       nU R                  5       nU R                  S5        U R                  R                  R                  U5      nUcN  U R                  R                  U5      nXPR                  R                  U'   U R                  R                  XE5        U R                  R                  XSX!S9nUR!                  U5        U$ )NrO   Tr   z*Empty glyph class in mark class definitionrU   rD   )r`   r_   r   glyphSetr   r   expect_class_name_r   r,   markClassesgetr*   r   r/   r   MarkClassDefinitionaddDefinition)r:   rE   r   ry   rr   rO   mcdefs          r   rh   Parser.parse_markClass_  s   ##K0000++'''>  !<h  ##%&&(C II))--d3	**40I*3II!!$'%%d6,,v - 
 	&rB   c           	      l   U R                   S;   d   eU R                  S:X  a  U R                  X5      $ U R                  S:X  a  U R                  X5      $ U R                  S:X  a  U R	                  X5      $ U R                  S:X  a  U R                  X5      $ U R                  nU R                  U5      u  pEpgpU R                  S5        [        U5      (       a7  [        U5      (       a  [        SU5      eU R                  R                  XEXUS9$ U(       d]  U(       dV  [        U5      S	:X  aG  U	(       d@  US
   c  UR                  5         U R                  R                  US
   US
   US   US   UUS9$ U(       a  [        SU5      eU R                  R!                  [#        [%        XW5      5      UUU	US9$ )N>   r  r  cursivebaseligaturer   rU   z3If "lookup" is present, no values must be specifiedrD   r;  r   r   )r   rE   z2"enumerate" is only allowed with pair positionings
forceChainrE   )r^   r4   parse_position_cursive_parse_position_base_parse_position_ligature_parse_position_mark_r_   r  r   r   r   r*   ChainContextPosStatementr&   reversePairPosStatementSinglePosStatementlistzip)
r:   r   rN   rE   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$% + 
 	
rB   c                    U R                   nU R                  S5        U(       a  [        SU5      eU R                  SS9nU R	                  5       nU R	                  5       nU R                  S5        U R                  R                  XEXcS9$ )NrX  z>"enumerate" is not allowed with cursive attachment positioningTr   rU   rD   )r_   r   r   r   r   r   r*   CursivePosStatement)r:   r   rN   rE   r   entryAnchor
exitAnchors          r   r]  Parser.parse_position_cursive_   s    ++Y'!S  ++T+B
((*'')
C xx++Z , 
 	
rB   c                     U R                   nU R                  S5        U(       a  [        SU5      eU R                  SS9nU R	                  5       nU R                  S5        U R                  R                  XEUS9$ )NrY  zC"enumerate" is not allowed with mark-to-base attachment positioningTr   rU   rD   )r_   r   r   r   r   r   r*   MarkBasePosStatement)r:   r   rN   rE   rY  markss         r   r^  Parser.parse_position_base_  s~    ++V$!6 
 %%t%<((*C xx,,T8,LLrB   c                    U R                   nU R                  S5        U(       a  [        SU5      eU R                  SS9nU R	                  5       /nU R
                  S:X  aB  U R                  S5        UR                  U R	                  5       5        U R
                  S:X  a  MB  U R                  S5        U R                  R                  XEUS9$ )NrZ  zG"enumerate" is not allowed with mark-to-ligature attachment positioningTr   ligComponentrU   rD   )
r_   r   r   r   r   r4   r\   r   r*   MarkLigPosStatement)r:   r   rN   rE   	ligaturesro  s         r   r_  Parser.parse_position_ligature_  s    ++Z(!: 
 **D*A	))+,.0  0LL1134 .0 	C xx++Ix+PPrB   c                     U R                   nU R                  S5        U(       a  [        SU5      eU R                  SS9nU R	                  5       nU R                  S5        U R                  R                  XEUS9$ )Nr   zC"enumerate" is not allowed with mark-to-mark attachment positioningTr   rU   rD   )r_   r   r   r   r   r   r*   MarkMarkPosStatement)r:   r   rN   rE   	baseMarksro  s         r   r`  Parser.parse_position_mark_/  s~    ++V$!6 
 **D*A	((*C xx,,Y,QQrB   c                     U R                  S5      (       d   eU R                  U R                  5       p!U R                  S5        U R                  R                  X!S9$ )NscriptrU   rD   )r`   r_   expect_script_tag_r   r*   ScriptStatement)r:   rE   r{  s      r   parse_script_Parser.parse_script_=  sU    ##H----33T5L5L5N&C xx'''BBrB   c           
      z   U R                   S;   d   eU R                  nU R                   S;   nU R                  SS9u  nnnnnn[        U5      (       a  [	        SU5      e/ n	U R
                  S:X  aU  U R                  S5      n
U R
                  S:w  a3  U R                  SSS	9nU	R                  U5        U R
                  S:w  a  M3  O4U R
                  S
:X  a"  U R                  S
5      n
U R                  SS9/n	OS n
U R                  S5        [        U	5      S:X  a&  [        U5      (       d  [	        SU R                  5      eU
S
:X  a  U(       a  [	        SU5      e[        U5      S:w  d   [        US   R                  5       5      S:w  a  [	        SU5      e[        U	5      S:w  a  [	        SU5      eU R                  R                  X4S   XyS   US9$ [        U Vs/ s H	  oc  M  UPM     sn5      nSn[        U	5      S:X  a&  [        U	S   [        R                  5      (       a  / n	SnU(       d  [        U5      S:X  a  [        U	5      S:X  a  US:X  a  [!        US   R                  5       5      n[!        U	S   R                  5       5      n[        U5      S:X  a  U[        U5      -  n[        U5      [        U5      :w  a#  [	        S[        U5      [        U5      4-  U5      eU R                  R#                  XIX7XS9$ U(       a6  [        U5      S:X  a'  US:X  a!  U R                  R%                  UUS   USUUS9$ U(       d  [        U5      S:X  a  [        U	5      S:  a  US:X  a  [        US   R                  5       5      nU	 H  n[!        UR                  5       5      (       d  [	        SU5      e[        UR                  5       5      S:w  d  ML  [        UR                  5       5      U:w  d  Mk  [	        SU S[        UR                  5       5       S3U5      e   U R                  R%                  UUS   UU	UUS9$ U(       d  [        U5      S:  ap  [        U	5      S:X  aa  [        U	S   R                  5       5      S:X  aA  US:X  a;  U R                  R'                  UUU[!        U	S   R                  5       5      S   UUS9$ U(       Ga  [        U5      S:w  a  [	        SU5      e[        U	5      S:w  a  [	        SU5      eUS:w  a  [	        SU5      e[)        [!        US   R                  5       5      5      n[)        [!        U	S   R                  5       5      5      n[        U5      S:X  a  U[        U5      -  n[        U5      [        U5      :w  a#  [	        S[        U5      [        U5      4-  U5      eU R                  R+                  X7XIUS9$ [        U5      S:  a  [        U	5      S:  a  [	        SU5      e[        U	5      S:w  d  U(       a  [	        SU5      eU R                  R-                  X4XuUS9nU$ s  snf )N>   r  rsub
reversesubr  >   r  r  FrM   z-Substitution statements cannot contain valuesr   rU   T)r   r   r   r   r   z3Expected "by", "from" or explicit lookup referencesz4Reverse chaining substitutions do not support "from"r   z%Expected a single glyph before "from"z)Expected a single glyphclass after "from"rD   z\Expected a glyph class with %d elements after "by", but found a glyph class with %d elementsr[   zEmpty class in replacementz!Expected a glyph class with 1 or z3 elements after "by", but found a glyph class with z	 elementsz\In reverse chaining single substitutions, only a single glyph or glyph class can be replacedzlIn reverse chaining single substitutions, the replacement (after "by") must be a single glyph or glyph classz8Reverse chaining substitutions cannot call named lookupszJDirect substitution of multiple glyphs by multiple glyphs is not supportedzInvalid substitution statement)r^   r_   r  r   r   r4   r   r   r\   r   r&   rO  r*   AlternateSubstStatementr   r   re  SingleSubstStatementMultipleSubstStatementLigatureSubstStatementsorted ReverseChainSingleSubstStatementChainContextSubstStatement)r:   rE   rb  
old_prefixoldr   r   
old_suffixr   newkeywordr   r   num_lookupsis_deletionr   replacementscountnrules                       r   parse_substitute_Parser.parse_substitute_C  s@   "MMMM++//%;; %%u%5	
v;;!?  t#**40G""c)++Tt+T

2 ""c) '**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1g?@s8q=ZA>>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    3s8q=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   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 
 K @s   X8$X8c                     U R                  S5      (       d   eU R                  nU R                  S5        U R                  R	                  US9$ )NsubtablerU   rD   )r`   r_   r   r*   SubtableStatement)r:   rE   s     r   parse_subtable_Parser.parse_subtable_  sJ    ##J////++C xx))8)<<rB   c                    U R                  S5      (       d   eU R                  nU R                  5       nU R                  5       nSnSnU R                  [
        R                  [
        R                  4;   d  US:w  a   U R                  5       nU R                  5       nU R                  S5        U R                  R                  X#XEUS9$ )N
parametersg        r   rU   rD   )r`   r_   expect_decipoint_r   r3   r   rF  FLOATr   r*   SizeParameters)r:   rE   
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 ' 
 	
rB   c           	          U R                  S5      (       d   eU R                  nU R                  5       u  p#pEU R                  R	                  SX#XEUS9$ )NsizemenunamesizerD   )r`   r_   parse_name_r*   FeatureNameStatement)r:   rE   
platformID	platEncIDlangIDstrings         r   parse_size_menuname_Parser.parse_size_menuname_  s\    ##N3333++040@0@0B-
vxx,,J6H - 
 	
rB   c           	         U R                  S5      (       d   eU R                  U R                  5       p!U R                  R	                  X!S9nU R                  S5        U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  S.R                  U5      nU(       a	  U" U5        O[        SUR!                  5       -  U5      eU R                  S5        U R                  5       nXR:w  a'  [        SUR!                  5       -  U R                  5      eU R                  S5        U$ )	NrS   rD   {)GDEFheadhheavhearr   BASEzOS/2STATz"table %s" is not supportedr   Expected "%s"rU   )r`   r_   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_rR  r   strip)r:   rE   rr   rS   handlerr   s         r   rk   Parser.parse_table_  s5   ##G,,,,1143C3C3E$##D#<C ****************	
 #d) 	 EN!-

<h  	C ""$?!$**,.0H0H  	C rB   c                    UR                   nU R                  S:w  d  U R                  (       Ga  U R                  SS9  U R                  [
        R                  L a?  UR                  U R                  R                  U R                  U R                  S95        GOU R                  S5      (       a   UR                  U R                  5       5        OU R                  S5      (       a   UR                  U R                  5       5        OU R                  S5      (       a   UR                  U R                  5       5        O_U R                  S5      (       a   UR                  U R!                  5       5        O)U R                  S	:X  a  GMx  [#        S
U R                  5      eU R                  S:w  a  GM  U R                  (       a  GM  g g )Nr   Tr!   rD   r   r   r&  r-  rU   z<Expected Attach, LigatureCaretByIndex, or LigatureCaretByPos)rY   r4   r5   r9   rZ   r   r[   r\   r*   r]   r^   r_   r`   r   r   r*  r/  r   r:   rS   rY   s      r   r  Parser.parse_table_GDEF_;  s_   %%
#%);););.##u}}4!!HH$$T__t?W?W$X %%h//!!$"4"4"67%%o66!!$";";"=>%%&<==!!$"B"B"DE%%&:;;!!$"@"@"BCC'%U,, # #%);););rB   c                 :   UR                   nU R                  S:w  d  U R                  (       a  U R                  SS9  U R                  [
        R                  L a>  UR                  U R                  R                  U R                  U R                  S95        O^U R                  S5      (       a   UR                  U R                  5       5        O(U R                  S:X  a  M  [        SU R                  5      eU R                  S:w  a  M  U R                  (       a  M  g g )Nr   Tr!   rD   FontRevisionrU   zExpected FontRevision)rY   r4   r5   r9   rZ   r   r[   r\   r*   r]   r^   r_   r`   parse_FontRevision_r   r  s      r   r  Parser.parse_table_head_S  s    %%
#%););.##u}}4!!HH$$T__t?W?W$X %%n55!!$":":"<=C'%&=t?W?WXX #%);););rB   c                 <   UR                   nSnU R                  S:w  d  U R                  (       Gal  U R                  SS9  U R                  [
        R                  L a>  UR                  U R                  R                  U R                  U R                  S95        OU R                  [
        R                  L a  U R                  U;   a  U R                  R                  5       nU R                  5       nUR                  U R                  R                  XEU R                  S95        U R                  S:w  a  [!        SU R"                  5      eO)U R                  S:X  a  GMP  [!        SU R                  5      eU R                  S:w  a  GMW  U R                  (       a  GMk  g g )	N)CaretOffsetAscender	DescenderLineGapr   Tr!   rD   rU   Incomplete statementz4Expected CaretOffset, Ascender, Descender or LineGap)rY   r4   r5   r9   rZ   r   r[   r\   r*   r]   r^   r_   rm   lowerr   	HheaFieldr   r6   r:   rS   rY   fieldskeyrH  s         r   r  Parser.parse_table_hhea_b  sY   %%
D#%);););.##u}}4!!HH$$T__t?W?W$X %%368Qoo++-++-!!HH&&sD<T<T&U ##s*).0I0I  + C'%M,, ' #%);););rB   c                 <   UR                   nSnU R                  S:w  d  U R                  (       Gal  U R                  SS9  U R                  [
        R                  L a>  UR                  U R                  R                  U R                  U R                  S95        OU R                  [
        R                  L a  U R                  U;   a  U R                  R                  5       nU R                  5       nUR                  U R                  R                  XEU R                  S95        U R                  S:w  a  [!        SU R"                  5      eO)U R                  S:X  a  GMP  [!        SU R                  5      eU R                  S:w  a  GMW  U R                  (       a  GMk  g g )	N)VertTypoAscenderVertTypoDescenderVertTypoLineGapr   Tr!   rD   rU   r  z?Expected VertTypoAscender, VertTypoDescender or VertTypoLineGap)rY   r4   r5   r9   rZ   r   r[   r\   r*   r]   r^   r_   rm   r  r   	VheaFieldr   r6   r  s         r   r  Parser.parse_table_vhea_}  s[   %%
M#%);););.##u}}4!!HH$$T__t?W?W$X %%368Qoo++-++-!!HH&&sD<T<T&U ##s*).0I0I  + C'%;,, ' #%);););rB   c                 L   UR                   nU R                  S:w  d  U R                  (       a  U R                  SS9  U R                  [
        R                  L a>  UR                  U R                  R                  U R                  U R                  S95        OgU R                  S5      (       a)  U R                  5       nU(       a  UR                  U5        O(U R                  S:X  a  M  [        SU R                  5      eU R                  S:w  a  M  U R                  (       a  M  g g )Nr   Tr!   rD   nameidrU   zExpected nameid)rY   r4   r5   r9   rZ   r   r[   r\   r*   r]   r^   r_   r`   parse_nameid_r   )r:   rS   rY   	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 #%);););rB   c                 D   SnSnU R                   [        R                  ;   am  U R                  5       nU R                  nUS;  a  [        SU5      eU R                   [        R                  ;   a   U R                  5       nU R                  5       nOSnU R                  nUS:X  a  U=(       d    SnU=(       d    SnOU=(       d    SnU=(       d    SnU R                  5       nU R                  S5        [        X1U5      nUc  [        S	U5      eU R                  XV5      nX1X'4$ )
z~Parses a name record. See `section 9.e <https://adobe-type-tools.github.io/afdko/OpenTypeFeatureFileSpecification.html#9.e>`_.Nr      Expected platform id 1 or 3r  r   r   	  rU   Unsupported encoding)
r3   r   NUMBERSexpect_any_number_r_   r   expect_string_r   r   unescape_string_r:   r  r  r  rE   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7rB   c                 "   S nS nU R                   [        R                  ;   am  U R                  5       nU R                  nUS;  a  [        SU5      eU R                   [        R                  ;   a   U R                  5       nU R                  5       nOSnU R                  nUS:X  a  U=(       d    SnU=(       d    SnOU=(       d    SnU=(       d    SnU R                  5       n[        X1U5      nUc  [        SU5      eU R                  XV5      nX1X'4$ )Nr  r  r  r   r   r  r  )	r3   r   r  r  r_   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7rB   c           	         U R                   S:X  d   U R                   5       eU R                  U R                  5       p!US:  a  [        SU R                  5      eU R	                  5       u  p4pVU R
                  R                  X#XEXaS9$ )Nr  i  z*Name id value cannot be greater than 32767rD   )r^   r_   r  r   r  r*   
NameRecord)r:   rE   nameIDr  r  r  r  s          r   r  Parser.parse_nameid_  s    (*;DOO;*33T5L5L5N&E>!<d>V>V  150@0@0B-
vxx""	6 # 
 	
rB   c                    ^ ^ TS:X  a#  [         R                  " ST R                  U5      nOUU 4S jn[         R                  " SXA5      n[        USS5      n[	        US5      $ )N	utf_16_bez\\[0-9a-fA-F]{4}c                 (   > TR                  U T5      $ r   )unescape_byte_)mr  r:   s    r   <lambda>)Parser.unescape_string_.<locals>.<lambda>  s    !4!4Q!ArB   z\\[0-9a-fA-F]{2}surrogatepass)rer  unescape_unichr_r
   r   )r:   r  r  r   unescapeutf16s   ` `   r   r  Parser.unescape_string_  sW    {"*D,A,A6JAAH*H=A ;8UK((rB   c                 T    U R                  S5      SS  n[        [        US5      5      $ Nr   r      )groupchrint)matchr  s     r   r  Parser.unescape_unichr_  s&    KKN123q":rB   c                 r    U R                  S5      SS  n[        [        US5      5      R                  U5      $ r	  )r  r	   r  decode)r  r  r  s      r   r  Parser.unescape_byte_  s2    KKN12s1bz"))(33rB   c                     [        U5       H=  n[        X0R                  R                  5      (       a  M)  [        X25      (       a  Us  $   g    g r   )reversedr   r*   r]   )r:   rY   class_previouss       r   find_previousParser.find_previous	  sC     ,H(HH$4$455H--  - rB   c           	      h   UR                   nU R                  S:w  d  U R                  (       Ga  U R                  SS9  U R                  [
        R                  L a?  UR                  U R                  R                  U R                  U R                  S95        GOqU R                  S5      (       a  U R                  5       nGOIU R                  S5      (       aQ  U R                  [        W5      5      nUR                  U R                  R!                  UUSU R                  S95        GOU R                  S5      (       a  U R#                  U[        R                   5      nUc  [%        S	U R                  5      eUR&                  (       a  [%        S
U R                  5      eUR(                  R                  U R+                  5       5        GOAU R                  S5      (       a  U R                  5       nGOU R                  S5      (       aP  U R                  [        W5      5      nUR                  U R                  R!                  UUSU R                  S95        OU R                  S5      (       a  U R#                  U[        R                   5      nUc  [%        S	U R                  5      eUR&                  (       d  [%        SU R                  5      eUR(                  R                  U R+                  5       5        OU R                  S:X  a  GM  U R                  S:w  a  GM  U R                  (       a  GM  g g )Nr   Tr!   rD   HorizAxis.BaseTagListHorizAxis.BaseScriptListFzHorizAxis.MinMaxz)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 statementsrU   )rY   r4   r5   r9   rZ   r   r[   r\   r*   r]   r^   r_   r`   parse_base_tag_list_parse_base_script_list_r&   BaseAxisr  r   rN   minmaxparse_base_minmax_)r:   rS   rY   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)Q00  !''..t/F/F/HIC's #%);););rB   c                 Z   UR                   nSnSnU R                  S:w  d  U R                  (       Ga  U R                  SS9  U R                  [
        R                  L a?  UR                  U R                  R                  U R                  U R                  S95        GOfU R                  [
        R                  L Ga5  U R                  R                  5       nS nU R                  U;   a  U R                  5       nOU R                  S5      (       a4  / n[!        S5       H"  nUR                  U R                  5       5        M$     OzU R                  U;   aD  / nU R                  S	:w  a1  UR                  U R                  5       5        U R                  S	:w  a  M1  O&U R                  S
5      (       a  U R#                  5       nUR                  U R                  R%                  XVU R                  S95        OU R                  S	:X  a  GM  U R                  S:w  a  GM  U R                  (       a  GM  g g )N)FSTypeTypoAscenderTypoDescenderTypoLineGap	winAscent
winDescentXHeight	CapHeightWeightClass
WidthClassLowerOpSizeUpperOpSize)UnicodeRangeCodePageRanger   Tr!   rD   Panose
   rU   Vendor)rY   r4   r5   r9   rZ   r   r[   r\   r*   r]   r^   r_   rm   r  r   r`   r   r  OS2Field)r:   rS   rY   numbersr   r  rH  r   s           r   r  Parser.parse_table_OS_2_S  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%:; **c1))(33 //1E!!HH%%c4;S;S%T C'3 #%);););rB   c           	         U R                  S5      (       d   eU R                  S5        / nU R                  S:w  d  U R                  (       a  U R	                  5         U R                  S5      (       aM  U R                  5       u  p#pEU R                  R                  SUUUUU R                  S9nUR                  U5        O4U R                  S:w  a$  [        SU R                   S	3U R                  5      eU R                  S:w  a  M  U R                  (       a  M  U R                  S5        U(       d  [        S
U R                  5      eU$ )NElidedFallbackNamer  r   rr   statrD   rU   Unexpected token z in ElidedFallbackNameExpected "name")r`   r   r4   r5   r9   r  r*   STATNameStatementr_   r\   r^   r   )r:   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rB   c           	         U R                  S5      (       d   e/ nU R                  5       nUS;  a.  UR                  5       (       d  [        R	                  SU S35        U R                  5       nU R                  S5        U R                  S:w  d  U R                  (       a  U R                  5         U R                  [        R                  L a  MP  U R                  S5      (       aM  U R                  nU R                  5       u  pVpxU R                  R!                  SXVXxUS	9n	UR#                  U	5        O5U R$                  S
:X  a  M  ['        SU R$                   3U R                  5      eU R                  S:w  a  M  U R                  (       a  M  U R                  S5        U R                  R)                  X#XR                  5      $ )N
DesignAxis)italopszslntwdthwghtzUnregistered axis tag z should be uppercase.r  r   rr   r@  rD   rU   zExpected "name", got )r`   r   isupperr   r   r   r   r4   r5   r9   rZ   r   r[   r_   r  r*   rC  r\   r^   r   STATDesignAxisStatement)
r:   rD  axisTag	axisOrderrE   r  r  r  r  rr   s
             r   parse_STAT_design_axisParser.parse_STAT_design_axis  s   ##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//'?'?
 	
rB   c           	      l   U R                  S5      (       d   eU R                  S5        / n/ nSnU R                  S:w  d  U R                  (       GaN  U R	                  SS9  U R
                  [        R                  L a  MP  U R                  S5      (       aM  U R                  nU R                  5       u  pVpxU R                  R                  SXVXxUS	9n	UR                  U	5        OU R                  S
5      (       a"  U R                  5       nUR                  U5        O^U R                  S5      (       a  U R                  5       nO7U R                  S:X  a  GM%  [!        SU R                   S3U R                  5      eU R                  S:w  a  GM:  U R                  (       a  GMN  U R                  S5        U(       d  [!        SU R                  5      eU(       d  [!        SU R                  5      e[#        U5      S:  a  U HI  n[#        UR$                  5      S:  d  M  [!        S[#        UR$                  5       S3U R                  5      e   / n
U H?  nUR&                  nX;   a  [!        SU S3U R                  5      eU
R                  U5        MA     U R                  R)                  X!X0R                  5      $ )N	AxisValuer  r   r   Tr!   rr   r@  rD   rE   flagrU   rA  z in AxisValuezExpected "Axis Name"zExpected "Axis location"r   z?Only one value is allowed in a Format 4 Axis Value Record, but z were found.	Axis tag z already defined.)r`   r   r4   r5   r9   rZ   r   r[   r_   r  r*   rC  r\   parse_STAT_locationexpect_stat_flagsr^   r   r&   r   r   STATAxisValueStatement)r:   	locationsrD  rJ  rE   r  r  r  r  rr   format4_tagsr   s               r   parse_STAT_axis_value_Parser.parse_STAT_axis_value_  s   ##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%=%=
 	
rB   c           	         / nU R                  5       n[        UR                  5       5      S:w  a$  [        SU R                   S3U R
                  5      eU R                  S:w  a  U R                  [        R                  L a"  U R                  5       nUR                  U5        OcU R                  [        R                  L a"  U R                  5       nUR                  U5        O$[        SU R                   S3U R                  5      eU R                  S:w  a  M  [        U5      S:X  a/  Uu  pEnXE:  d  XF:  a   [        SU S	U S
U S3U R                  5      eU R                  R!                  X!5      $ )Nr<  rX  z must be 4 charactersrU   zUnexpected value "z". Expected integer or float.r  zDefault value z is outside of specified range r   .)r   r&   r  r   r^   r_   r4   r3   r   r  expect_float_r\   rF  r   r6   r*   AxisValueLocationStatement)r:   r   r   rH  nominalmin_valmax_vals          r   rY  Parser.parse_STAT_location  sf    syy{q !DOO,,EE(( 
 #%$$3**,e$&&%,,6++-e$%()9)9(: ;1 1--  #% v;!(.%Gg G$5%$WI .*iq	, --	  xx223??rB   c                    UR                   n/ nU R                  S:w  d  U R                  (       Ga  U R                  SS9  U R                  [
        R                  L a?  UR                  U R                  R                  U R                  U R                  S95        GOU R                  [
        R                  L Ga  U R                  S5      (       a<  U R                  5       nUR                  U R                  R                  U5      5        GOU R                  S5      (       aM  U R!                  5       nUR                  U R                  R#                  U5      5        U R%                  S5        GO*U R                  S5      (       aN  U R'                  5       nUR                  UR(                  5        UR                  U5        U R%                  S5        OU R                  S	5      (       az  U R+                  5       nUR,                   H7  nUR(                  U;  d  M  [/        S
UR(                   S3U R                  5      e   UR                  U5        U R%                  S5        O6[/        SU R                   3U R                  5      eU R                  S:X  a  GM  U R                  S:w  a  GM{  U R                  (       a  GM  g g )Nr   Tr!   rD   r?  ElidedFallbackNameIDrU   rI  rV  zDesignAxis not defined for ra  rA  )rY   r4   r5   r9   rZ   r   r[   r\   r*   r]   r^   r_   rm   r`   rF  r?  r   ri  r   rS  r   r^  r\  r   )	r:   rS   rY   design_axesrD  rH  
designAxisaxisValueRecordrE   s	            r   r  Parser.parse_table_STAT_  s8   %%
#%);););.##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 #%);););rB   c                     U R                   S;   d   U R                   5       e/ nU R                  S:w  a1  UR                  U R                  5       5        U R                  S:w  a  M1  U R	                  S5        U$ )N)r  r  rU   )r^   r4   r\   r|  r   )r:   basess     r   r  Parser.parse_base_tag_list_?  sx     #
 
 	 ??	 
 #%LL0023 #%C rB   c                 4   U R                   S;   d   U R                   5       eU R                  U5      /nU R                  S:X  aC  U R                  S5        UR	                  U R                  U5      5        U R                  S:X  a  MC  U R                  S5        U$ )N)r  r  r   rU   )r^   parse_base_script_record_r4   r   r\   )r:   r  scriptss      r   r  Parser.parse_base_script_list_K  s     #
 
 	 ??	 
 2259;#%$NN499%@A #% 	C rB   c                     U R                  5       nU R                  5       n[        U5       Vs/ s H  o@R                  5       PM     nnX#U4$ s  snf r   )r|  r   r   )r:   r  
script_tagbase_tagr   coordss         r   rr   Parser.parse_base_script_record_W  sM    ,,.
**,16u>A%%'>V++ ?s   Ac                 |   U R                  5       nU R                  5       nU R                  5       nU R                  5         U R                  [
        R                  L a  U R                  S:X  d  [        SU R                  5      eU R                  5       nU R                  S:X  a  [        SU R                  5      eXX44$ )Nr   z0Expected a comma between min and max coordinatesz0Feature tags are not yet supported in BASE table)r|  r   r   r9   rZ   r   ro   r^   r   r_   r4   )r:   rv  r  	min_coord	max_coords        r   r"  Parser.parse_base_minmax_]  s    ,,.
,,.'')	$$4C9O!B((  '')	s"!B(( 
 Y99rB   c                    S nU R                  S5        U R                  S5        U R                  S:X  a  U R                  S5        OU R                  5       U R                  5       4/nU R                  S:X  aR  U R                  S5        UR	                  U R                  5       U R                  5       45        U R                  S:X  a  MR  [        U5      nU R                  S5        U$ )Nrx   devicerz   r   r{   )r   r   r4   r   r\   tuple)r:   results     r   r   Parser.parse_device_p  s    C X&v%  (**,d.A.A.CDEF""c)##C(t224d6I6I6KLM ""c) 6]FC rB   c                     U R                   [        R                  L =(       d%    U R                  S:H  =(       d    U R                  S:H  $ )Nrx   ()r3   r   rF  r4   r:   s    r   r   Parser.is_next_value_  s?    !!U\\1 '3&'3&	
rB   c                    U R                   [        R                  L a  U R                  S:X  d  U R                   [        R                  L aY  U R                  SS9U R                  p2U(       a  U R                  R                  X!US9nU$ U R                  R                  X!US9nU$ U R                  S5        U R                  nU R                   [        R                  L a  U R                  5       nUS:X  a+  U R                  S5        U R                  R                  5       $ U R                  R                  U5      nUc  [        S	U-  U R                  5      eUR                  nUR                   UR"                  pUR$                  UR&                  pO=U R                  SS9U R                  SS9U R                  SS9U R                  SS94u  ppU R                  S:X  a  U R)                  5       U R)                  5       U R)                  5       U R)                  5       4u  pp[+        U(       a  UOS
U(       a  UOS
-   U(       a  UOS
-   U(       a  UOS
-    VVs/ s H  u  nnUPM
     snn5      nUS   S:  d	  US   S:  a  [        SU R                  5      eOSu  ppU R                  S5        U R                  R                  UU	U
UUUUUUUS9
$ s  snnf )Nr  Tr   )yAdvancerN   rE   )xAdvancerN   rE   rx   rz   r{   zUnknown valueRecordDef "%s"r  r   ir      z+Device value out of valid range (-128..127))NNNN)rN   rE   )r3   r   ro   r4   rF  r   r_   r*   ValueRecordr   rm   r   r1   r   r   rH  
xPlacement
yPlacementr  r  r   r  )r:   rN   numberrE   valrr   vrdrH  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   K
c                    U R                  S5      (       d   eU R                  nU R                  U5      nU R                  5       nU R	                  S5        U R
                  R                  XCUS9nU R                  R                  XE5        U$ )NrT   rU   rD   )	r`   r_   r   r   r   r*   ValueRecordDefinitionr1   r   )r:   rN   rE   rH  rr   r  s         r   rl   $Parser.parse_valuerecord_definition_  s    ##$45555++''1  "C hh,,T8,L!!$,
rB   c                     U R                   S:X  d   eU R                  nU R                  5       nU R                  5       nU R	                  S5        U R
                  R                  X#US9$ )NrK   rU   rD   )r^   r_   r|  r   r   r*   LanguageSystemStatement)r:   rE   r{  r  s       r   rf   Parser.parse_languagesystem_  sd    "2222++((*,,.C xx//8/TTrB   c                    U(       a  U R                   S:X  d   eOU R                   S:X  d   eU R                  nU R                  5       nUS;   nS nS nSnX0R                  ;   a  UnOX0R                  ;   a  UnOUS:X  a  SnU(       a  U R                  5       nSn	U R                  S:X  a  U R                  S5        Sn	U(       a  U R                  R                  UWXS9n
OU R                  R                  X9US9n
U R                  XXWU5        U
$ )	NrR   rP   >   valtvhalvkrnvpalFr  Tr2  )r6  rE   )r^   r_   r   SS_FEATURE_TAGSCV_FEATURE_TAGSr   r4   r   r*   VariationBlockFeatureBlockr5  )r:   rR   rE   r   rN   stylisticset
cv_featuresize_featurerQ   r6  r7  s              r   ri   Parser.parse_feature_block_  s   ??k111??i///++ ::
&&&L(((JF]L,,.L~-  0 MHH++\ , E HH))8 * E 	%<zRrB   c                     U R                   S:X  d   U R                   5       eU R                  nU R                  5       nU R                  S5        U R                  R                  X!S9$ )NrP   rU   rD   )r^   r_   r   r   r*   FeatureReferenceStatement)r:   rE   featureNames      r   parse_feature_reference_Parser.parse_feature_reference_  s\    )+<T__<+++&&(C xx11+1QQrB   c                 6   U R                   S:X  d   U R                   5       eU R                  R                  XR                   U R                  S9nU R	                  S5        U R
                   H  nUR                  5         M     U R                  S:w  d  U R                  (       Ga.  U R                  SS9  U R                  [        R                  L aH  UR                  R                  U R                  R                  U R                   U R                  S95        OU R!                  S5      (       aT  U R                  nU R#                  5       u  pVpxUR                  R                  U R                  R%                  XXgXS95        O)U R                   S:X  a  GM  ['        S	U R                  5      eU R                  S:w  a  GM  U R                  (       a  GM.  U R	                  S5        U R
                   H  nUR)                  5         M     U R	                  S5        U$ )
zParses a ``featureNames`` statement found in stylistic set features.
See section `8.c <https://adobe-type-tools.github.io/afdko/OpenTypeFeatureFileSpecification.html#8.c>`_.
featureNamesrD   r  r   Tr!   rr   rU   rB  )r^   r*   NestedBlockr_   r   r2   enter_scoper4   r5   r9   rZ   r   r[   rY   r\   r]   r`   r  r  r   
exit_scope)	r:   r   r7  symtabrE   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 rB   c                    U R                   S:X  d   U R                   5       eU R                  R                  XR                   U R                  S9nU R	                  S5        U R
                   H  nUR                  5         M     UR                  nU R                  S:w  d  U R                  (       GaX  U R                  SS9  U R                  [        R                  L a>  UR                  U R                  R                  U R                   U R                  S95        OU R!                  1 Sk5      (       a+  UR                  U R#                  XR                   5      5        OU R!                  S5      (       a!  UR                  U R%                  U5      5        OMU R                   S	:X  a  GM  ['        S
R)                  U R                  U R                   5      U R                  5      eU R                  S:w  a  GMD  U R                  (       a  GMX  U R	                  S5        U R
                   H  nUR+                  5         M     U R	                  S	5        U$ )NcvParametersrD   r  r   Tr!   >   SampleTextNameIDFeatUILabelNameIDParamUILabelNameIDFeatUITooltipTextNameID	CharacterrU   zExpected statement: got {} {})r^   r*   r  r_   r   r2   r  rY   r4   r5   r9   rZ   r   r[   r\   r]   r`   parse_cvNameIDs_parse_cvCharacter_r   rp   r  )r:   r   r7  r  rY   s        r   parse_cvParameters_Parser.parse_cvParameters_7  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 ,,	 ) #%);););6 	C ))F *C rB   c                 *   U R                   U:X  d   U R                   5       eU R                  R                  XU R                  S9nU R	                  S5        U R
                   H  nUR                  5         M     U R                  S:w  d  U R                  (       Ga2  U R                  SS9  U R                  [        R                  L aH  UR                  R                  U R                  R                  U R                   U R                  S95        OU R!                  S5      (       aX  U R                  nU R#                  5       u  pgpUR                  R                  U R                  R%                  UUUUU	UUS95        O)U R                   S:X  a  GM  ['        SU R                  5      eU R                  S:w  a  GM  U R                  (       a  GM2  U R	                  S5        U R
                   H  nUR)                  5         M     U R	                  S5        U$ )	NrD   r  r   Tr!   rr   rU   rB  )r^   r*   r  r_   r   r2   r  r4   r5   r9   rZ   r   r[   rY   r\   r]   r`   r  CVParametersNameStatementr   r  )
r:   r   
block_namer7  r  rE   r  r  r  r  s
             r   r  Parser.parse_cvNameIDs_d  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/ #%);););0 	C ))F *C rB   c                 &   U R                   S:X  d   U R                   5       eU R                  U R                  5       p2U R                  S5        SUs=:  a  S:  d  O  [	        SR                  SS5      U5      eU R                  R                  X1US9$ )Nr  rU   i r   z/Character value must be between {:#x} and {:#x}rD   )r^   r_   r  r   r   rp   r*   CharacterStatement)r:   r   rE   	characters       r   r  Parser.parse_cvCharacter_  s    +->t>-"668O8O8Q)C I**!""(&H"5 
 xx**9H*MMrB   c                     U R                   S:X  d   U R                   5       eU R                  U R                  5       p!U R                  S5        US::  a  [	        SU5      eU R
                  R                  X!S9$ )Nr  rU   r   z&Font revision numbers must be positiverD   )r^   r_   rb  r   r   r*   FontRevisionStatement)r:   rE   versions      r   r  Parser.parse_FontRevision_  sp     .0A$//A0 44d6H6H6J'C a<!"JHUUxx--g-IIrB   c                    U R                  5       n0 nU R                  S5        U R                  S:w  GaK  U R                  5         U R                  [
        R                  La  [        SU R                  5      eU R                  nX2;   a  [        SU 3U R                  5      eU R                  [
        R                  L a  U R                  5       nO,U R                  [
        R                  L a  U R                  SS9nU R                  [
        R                  L a  U R                  5       nO,U R                  [
        R                  L a  U R                  SS9nU R                  S5        WW4X#'   U R                  S:w  a  GMK  U R                  S5        U R                  5       nXa:w  a  [        SU-  U R                  5      eU R                  R!                  X5      $ )	Nr  r   Expected an axis namezRepeated condition for axis Fr   rU   r  )r   r   r4   r9   rZ   r   rm   r   r_   r^   r3   r  rb  rF  r   r*   ConditionsetStatement)r:   rr   
conditionsaxis	min_value	max_value	finalnames          r   rj   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- #%0 	C %%'	!/D"8$:R:RSSxx--d??rB   c                 n   U R                  S5        U R                   H  nUR                  5         M     UR                  nU R                  S:w  d  U R
                  (       GaM  U R                  SS9  U R                  [        R                  L a?  UR                  U R                  R                  U R                  U R                  S95        GOU R                  [        R                  L a!  UR                  U R!                  5       5        GO}U R#                  S5      (       a!  UR                  U R%                  5       5        GOFU R#                  SS15      (       a   UR                  U R'                  US	95        GOU R#                  S
5      (       a!  UR                  U R)                  5       5        GOU R#                  S5      (       a!  UR                  U R+                  5       5        GOU R#                  S5      (       a!  UR                  U R-                  5       5        GOiU R#                  S5      (       a"  UR                  U R/                  U5      5        GO1U R#                  S5      (       a!  UR                  U R1                  5       5        GOU R#                  S5      (       a!  UR                  U R3                  5       5        GOU R#                  SS15      (       a!  UR                  U R5                  SUS95        GOU R#                  S5      (       a!  UR                  U R7                  5       5        GOSU R#                  1 Sk5      (       a!  UR                  U R9                  5       5        GOU R#                  S5      (       a!  UR                  U R;                  5       5        GOU R#                  S5      (       a"  UR                  U R=                  U5      5        GOU(       a8  U R#                  S5      (       a"  UR                  U R?                  U5      5        GOlU(       a8  U R#                  S5      (       a"  UR                  U RA                  U5      5        GO-U(       a6  U R#                  S5      (       a   UR                  U RC                  5       5        OU(       a6  U R#                  S5      (       a   UR                  U RE                  5       5        OU R                  [        RF                  L aI  U R                  U RH                  ;   a/  UR                  U RH                  U R                     " U 5      5        OMU R                  S:X  a  GM  [K        SRM                  U R                  U R                  5      U R                  5      eU R                  S:w  a  GM9  U R
                  (       a  GMM  U R                  S5        U R                   H  nURO                  5         M     U RQ                  5       nXRR                  RU                  5       :w  a1  [K        SURR                  RU                  5       -  U R                  5      eU R                  S5        Sn	Sn
U H  n[W        XR                  RX                  5      (       a3  [[        UR\                  UR^                  UR`                  /5      (       + n	MZ  [W        XR                  Rb                  5      (       d  M  [[        UR\                  UR^                  UR`                  /5      (       + n
M     U	(       Ga   U
(       Ga  / nUR                   H  n[W        XR                  RX                  5      (       a  URd                  S   Rg                  5       nURh                  S   Rg                  5       n[k        U5      S :X  a  U[k        U5      -  n[m        U5       H]  u  pUR                  U R                  Rc                  UR\                  UUR^                  X   /UR`                  URn                  S95        M_     M  UR                  U5        GM      Xql        g g g )!Nr  r   Tr!   rD   rJ   r   r   rM   rP   r  r  rL   r:  rO   r  r  Fr   r{  >   r  r  r  r  r  rT   r  r  r  r  rU   z7Expected glyph class definition or statement: got {} {}r  r   r   )8r   r2   r  rY   r4   r5   r9   rZ   r   r[   r\   r*   r]   r^   r_   rb   rc   r`   re   r   r  r  r#  rg   rL  rh   r   r~  r  r  rl   r  r  r  r  rm   rn   r   rp   r  r   rr   r  r   r  r   r   r   r\  r  r   rO  r  r&   r   rE   )r:   r7  rN   r  r  r  r  rY   rr   
has_singlehas_multipler   r   r  r   r   s                   r   r5  Parser.parse_block_  sI    	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 ,,	 i #%);););v 	C ))F *   "::##%%!%**"2"2"44d6N6N  	C  
A!XX::;;!$ahh!,,%G!HH
Axx>>??#&!((ALL'I#JJ	  ,J%%a!>!>??XXa[113F#$>>!#4#=#=#?L<(A-$F3$-f$5")) HH;; ! % !!- 1 !)* < 	 %6 %%a(% &&  *+ ':rB   c                     U R                   [        R                  L a8  [        U[	        S5      5      (       a  U R
                  U:H  $ U R
                  U;   $ g)Nr   F)rZ   r   rm   r   typer^   )r:   r   s     r   r`   Parser.is_cur_keyword_7  sF    5::-!T"X&&!++!++rB   c                     U R                  5         U R                  [        R                  La  [	        SU R
                  5      eU R                  $ )NzExpected @NAME)r9   rZ   r   rb   r   r_   r^   r  s    r   rP  Parser.expect_class_name_?  s@    u'7'77!"2D4L4LMMrB   c                     U R                  5         U R                  [        R                  L a  U R                  $ [        SU R                  5      e)NzExpected a CID)r9   rZ   r   r   r^   r   r_   r  s    r   r   Parser.expect_cid_E  s>    599,??".0H0HIIrB   c                     U R                  5         U R                  [        R                  La  [	        SU R
                  5      eU R                  $ )NzExpected file name)r9   rZ   r   FILENAMEr   r_   r^   r  s    r   r  Parser.expect_filename_K  s>    u~~5!"68P8PQQrB   c                    U R                  5         U R                  [        R                  L a  U R                  R                  S5      $ U R                  [        R                  L a  SU R                  -  $ [        SU R                  5      e)N\cid%05dzExpected a glyph name or CID)	r9   rZ   r   rm   r^   lstripr   r   r_   r  s    r   r   Parser.expect_glyph_Q  sj    5::-??))$//!!UYY.t..<d>V>VWWrB   c                     U R                   (       aE  U H>  nX R                   ;   a  M  X R                  ;  d  M%  U R                  U R                  U'   M@     gg)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)   r8   r_   )r:   rD  rr   s      r   r   $Parser.check_glyph_name_in_glyph_setY  sI     +++||+)-)A)ADLL&	  rB   c                    U R                  5       nU R                  R                  U5      nUc  [        SU-  U R                  5      e[        X R                  R                  5      (       d  [        SU-  U R                  5      eU$ )NzUnknown markClass @%sz@%s is not a markClass)rP  r/   r   r   r_   r   r*   r   )r:   rr   mcs      r   r   "Parser.expect_markClass_reference_g  s    &&(''-:!'$.0H0H  "hh0011!(4/1I1I  	rB   c                 
   U R                  5         U R                  [        R                  La  [	        SU R
                  5      e[        U R                  5      S:  a  [	        SU R
                  5      eU R                  S-   S S $ )NzExpected a tagr<  z'Tags cannot be longer than 4 charactersz    )r9   rZ   r   rm   r   r_   r&   r^   r  s    r   r   Parser.expect_tag_t  su    uzz1!"2D4L4LMMt!#!94;S;S  &("1--rB   c                 ^    U R                  5       nUS:X  a  [        SU R                  5      eU$ )Ndfltz4"dflt" is not a valid script tag; use "DFLT" insteadr   r   r_   r:   r   s     r   r|  Parser.expect_script_tag_~  s7     &=!F((  
rB   c                 ^    U R                  5       nUS:X  a  [        SU R                  5      eU$ )NDFLTz6"DFLT" is not a valid language tag; use "dflt" insteadr  r  s     r   r   Parser.expect_language_tag_  s7     &=!H((  
rB   c                     U R                  5         U R                  [        R                  L a  U R                  U:X  a  U$ [        SU-  U R                  5      e)NzExpected '%s')r9   rZ   r   ro   r^   r   r_   )r:   symbols     r   r   Parser.expect_symbol_  sH    5<</DOOv4MMo68P8PQQrB   c                     U R                  5         U R                  [        R                  L a  U R                  U:X  a  U R                  $ [        SU-  U R                  5      e)Nr  r9   rZ   r   rm   r^   r   r_   )r:   r  s     r   r   Parser.expect_keyword_  sM    5::-$//W2L??"o79Q9QRRrB   c                     U R                  5         U R                  [        R                  L a  U R                  $ [        SU R                  5      e)NzExpected a namer  r  s    r   r   Parser.expect_name_  s>    5::-??"/1I1IJJrB   c                 (   U R                  5         U R                  [        R                  L a  U R                  $ U(       a=  U R                  [        R
                  L a   U R                  S:X  a  U R                  5       $ [        SU R                  5      e)Nr  zExpected a number)	r9   rZ   r   rF  r^   ro   expect_variable_scalar_r   r_   )r:   r   s     r   r   Parser.expect_number_  sm    5<</??",,<TWAW//11143K3KLLrB   c                     U R                  5         [        5       n U R                  [        R                  :X  a  U R
                  S:X  a   U$ U R                  5       u  p#UR                  X#5        MV  )NrW   )r9   r   rZ   r   ro   r^   expect_master_	add_value)r:   scalarrE   rH  s       r   r  Parser.expect_variable_scalar_  se    !##u||338N  #113OHX-	 rB   c                    0 n U R                   [        R                  La  [        SU R                  5      eU R
                  nU R                  5         U R                   [        R                  L a  U R
                  S:X  d  [        SU R                  5      eU R                  5       nX1U'   U R                  [        R                  L a  U R                  S   S:X  a  OfU R                  5         U R                   [        R                  L a  U R
                  S:X  d  [        SU R                  5      eU R                  5         GM=  U R                  5         [        U R
                  SS  5      nU R                  5         X4$ )	Nr  r   zExpected an equals signr   :r   z#Expected an comma or an equals signr   )rZ   r   rm   r   r_   r^   r9   ro   r   r3   r4   r  )r:   rE   r  rH  s       r   r  Parser.expect_master_  sE   ##5::5%&=t?W?WXX??D!((ELL8T__PS=S%-t/G/G  '')E"TN$$

2t7G7G7Jc7Q!((ELL8T__PS=S%94;S;S  !' ( 	DOOAB'(rB   c                     U R                  5         U R                  [        R                  ;   a  U R                  $ [        SU R                  5      e)Nz/Expected a decimal, hexadecimal or octal number)r9   rZ   r   r  r^   r   r_   r  s    r   r  Parser.expect_any_number_  sB    5==0??"=t?W?W
 	
rB   c                     U R                  5         U R                  [        R                  L a  U R                  $ [        SU R                  5      e)Nz Expected a floating-point number)r9   rZ   r   r  r^   r   r_   r  s    r   rb  Parser.expect_float_  sB    5;;.??".0H0H
 	
rB   c                     U R                   [        R                  :X  a  U R                  5       $ U R                   [        R                  L a  U R                  5       S-  $ [        SU R                  5      e)Nr9  ,Expected an integer or floating-point numberr3   r   r  rb  rF  r   r   r_   r  s    r   r  Parser.expect_decipoint_  sa      EKK/%%''""ell2&&(2--!>@X@X rB   c                     SnSSS.nU R                   S:w  a]  U R                   U;   a  U R                  5       nXU   -  nO#[        SU R                   3U R                  5      eU R                   S:w  a  M]  U$ )Nr   r   r;  )OlderSiblingFontAttributeElidableAxisValueNamerU   zUnexpected STAT flag )r4   r   r   r^   r_   )r:   rH  rJ  rr   s       r   rZ  Parser.expect_stat_flags  s    )*%&
 #%5(((*d+%+DOO+<=t?W?W  #% rB   c                     U R                   [        R                  :X  a  U R                  5       $ U R                   [        R                  L a  U R                  5       $ [        SU R                  5      e)Nr  r  r  s    r   expect_stat_values_Parser.expect_stat_values_  s\      EKK/%%''""ell2&&((!>@X@X rB   c                     U R                  5         U R                  [        R                  L a  U R                  $ [        SU R                  5      e)NzExpected a string)r9   rZ   r   STRINGr^   r   r_   r  s    r   r  Parser.expect_string_	  s>    5<</??"143K3KLLrB   c                 L   U(       aO  U R                   (       a>  [        R                  U l        U R                   R	                  S5      u  U l        U l        g U R                  U R                  U R                  sU l        U l        U l          [        U R                  5      u  U l        U l        U l	        U R                  [        R                  :w  a  g U R                   R                  U R                  U R                  45        M{  ! [         a    Su  U l        U l         Nmf = f)Nr   r   )r5   r   r[   rZ   r%   r^   r_   r3   r4   r6   nextr7   StopIterationr\   )r:   r"   s     r   r9   Parser.advance_lexer_		  s   **#(==D 8<8J8J8N8Nq8Q5DOT5 %%  )) LD $/43K
 G
 %	)$- $$5%%t'7'79R9R&ST  ! G:F7%t'7Gs   (D D#"D#c                 H    SR                  [        [        U 5      5      5      $ )z'abc' --> 'cba'r   )r'   r  re  )r   s    r   reverse_string_Parser.reverse_string_!	  s     wwxQ())rB   c                     [        5       nX#:  a  [        SU5      e[        X#S-   5       H  nUR                  SU-  5        M     U$ )z>(location, 999, 1001) --> ["cid00999", "cid01000", "cid01001"]z*Bad range: start should be less than limitr   r  )re  r   r   r\   )r:   rE   r   r   r  r   s         r   r   Parser.make_cid_range_&	  sJ    =!<h  	*CMM)c/* +rB   c                    [        5       n[        U5      [        U5      :w  a  [        SU< SU< S3U5      eU R                  n[        R
                  R                  X#/5      nU" [        R
                  R                  U" U5      U" U5      /5      5      n[        U5      S:  a1  U[        U5      [        U5      *  nU[        U5      [        U5      *  n	OU[        U5      S nU[        U5      S n	X:  a  [        SU5      e[        R                  " S5      n
U
R                  U5      (       aV  U
R                  U	5      (       a@  [        [        U5      [        U	5      S-   5       H  nUR                  S	XkU4-  5        M     U$ [        R                  " S
5      nUR                  U5      (       aV  UR                  U	5      (       a@  [        [        U5      [        U	5      S-   5       H  nUR                  S	XkU4-  5        M     U$ [        R                  " S5      nUR                  U5      (       aw  UR                  U	5      (       aa  [        [        US5      [        U	S5      S-   5       H8  nS[        U5      -   [        U5      * S nUR                  U< U< U< 35        M:     U$ [        SU< SU< S3U5      e)z?(location, "a.sc", "d.sc") --> ["a.sc", "b.sc", "c.sc", "d.sc"]zBad range: "z" and "z" should have the same lengthr   Nz+Start of range must be smaller than its endz^[A-Z]$r   z%s%c%sz^[a-z]$z^[0-9]{1,3}$r9  000r   r   )re  r&   r   r$  ospathcommonprefixr  compiler  r   ordr\   r  r   )r:   rE   r   r   r  revr   r   start_rangelimit_range	uppercasec	lowercasedigitsr   r  s                   r   r   Parser.make_glyph_range_1	  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NrB   )r.   r5   r^   r_   rZ   r,   r)   r/   r7   r0   r8   r4   r6   r3   r2   r1   )r  TN)F)NFN)m__name__
__module____qualname____firstlineno____doc__rn   r*   r   r  r  r@   ru   r   r   re   rd   r   r   r   rc   r   r   r  r  r  r  ra   r#  r*  r/  rg   rL  rh   r   r]  r^  r_  r`  r~  r  r  r  r  rk   r  r  r  r  r  r  r  r  r  staticmethodr  r  r  r  r  rF  rS  r^  rY  r  r  r  rr  r"  r   r   r   rl   rf   ri   r  r  r  r  r  r  rj   r5  r`   rP  r   r  r   r   r   r   r|  r   r   r   r   r   r  r  r  rb  r  rZ  r  r  r9   r$  r   r   __static_attributes__)r   r   s   00r   r   r      s   0 J
C-21f-=>-=x!|-=>O-21f-=>-=x!|-=>O KO+B=~4
l
"
H	RH
8(TbH[Gz&
A
YW27
r,3
j
 MQ"RCxt=
$
<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#@L RVr*hJXB.RSKM6

 MU0 * *	+OOH ?>s
   FFr   c                   2    \ rS rSrS rS rS rS rS rSr	g)	r-   i_	  c                     0 /U l         g r   scopes_r  s    r   r@   SymbolTable.__init__`	  s    trB   c                 :    U R                   R                  0 5        g r   )rA  r\   r  s    r   r  SymbolTable.enter_scopec	  s    BrB   c                 8    U R                   R                  5         g r   )rA  r%   r  s    r   r  SymbolTable.exit_scopef	  s    rB   c                 &    X R                   S   U'   g )Nr   r@  )r:   rr   items      r   r   SymbolTable.definei	  s    !%RrB   c                 t    [        U R                  5       H  nUR                  U5      nU(       d  M  Us  $    g r   )r  rA  rR  )r:   rr   scoperH  s       r   r   SymbolTable.resolvel	  s1    dll+E99T?Dt , rB   r@  N)
r7  r8  r9  r:  r@   r  r  r   r   r=  r  rB   r   r-   r-   _	  s     &rB   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  	getLoggerr7  r   objectr   r-   r  rB   r   <module>rW     sY    2 K K : 4 < < " "  	 	 !M%OV M%O`J& rB   