
    ]Mh                        d dl mZ d dlmZmZmZ d dlmZ d dlm	Z	 d dl
mZmZmZ d dlmc mZ d dlZd dlZd dlZ ej        e          Z G d de          Z G d	 d
e          ZdS )    )FeatureLibError)LexerIncludingLexerNonIncludingLexer)VariableScalar)getEncoding)bytechrtobytestostrNc                      e Zd ZdZi ZeZd  edd          D             Zd  edd          D             Z	 dld
Z	d Z
d Zd Zd Zd Zd Zd Zd Zd Zd ZdmdZd Zd Zd Zd Zd Zd Zd Zd Zd Zd  Zd! Zd" Z d# Z!d$ Z"d% Z#d& Z$d' Z%d( Z&d) Z'd* Z(d+ Z)d, Z*d- Z+d. Z,d/ Z-d0 Z.d1 Z/d2 Z0d3 Z1d4 Z2d5 Z3e4d6             Z5e4d7             Z6d8 Z7d9 Z8d: Z9d; Z:d< Z;d= Z<d> Z=d? Z>d@ Z?dA Z@dB ZAdC ZBdD ZCdE ZDdF ZEdG ZFdH ZGdmdIZHdJ ZIdK ZJdL ZKdM ZLdN ZMdO ZNdP ZO	 dndQZPdR ZQdS ZRdT ZSdU ZTdV ZUdW ZVdX ZWdY ZXdZ ZYd[ ZZd\ Z[d] Z\d^ Z]dmd_Z^d` Z_da Z`db Zadc Zbdd Zcde Zddf Zedg ZfdmdhZge4di             Zhdj Zidk Zjd	S )oParsera
  Initializes a Parser object.

    Example:

        .. code:: python

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

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

    By default, the parser will follow ``include()`` statements in the feature
    file. To turn this off, pass ``followIncludes=False``. Pass a directory string as
    ``includeDir`` to explicitly declare a directory to search included feature files
    in.
    c                     h | ]}d |z  S )zss%02d .0is     W/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/fontTools/feaLib/parser.py	<setcomp>zParser.<setcomp>*       >>>x!|>>>          c                     h | ]}d |z  S )zcv%02dr   r   s     r   r   zParser.<setcomp>+   r   r   d   r   TNc           	         d|v r8ddl m}  |dd           |rt          d          |                    d          }|rGt          dt	          |          dk    rdnd	d
d                    d |D                                 t          |          | _        | j        	                                | _
        t                      | _        t                      | _        t                      | _        t                      | _        | j        | j        h| _        d\  | _        | _        g | _        d | _        |rt*          nt,          } |||          | _        i | _        |                     d           d S )NglyphMapr   )deprecateArgumentz#use 'glyphNames' (iterable) insteadz?'glyphNames' and (deprecated) 'glyphMap' are mutually exclusivezunsupported keyword argumentr    sz: z, c              3   4   K   | ]}t          |          V  d S N)repr)r   ks     r   	<genexpr>z"Parser.__init__.<locals>.<genexpr><   s(      =V=V!d1gg=V=V=V=V=V=Vr   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__zParser.__init__-   s    EEEEEEj*OPPP X    J//J 	)V))22s22DII=V=Vv=V=V=V4V4V4VX  
 z??H((**	#(]]#(]]#}d.@A2>/t/$(!'5L^^;L
 jDDDT*****r   c                    | j         j        }| j        | j        r|                     d           | j        t          j        u r;|                    | j	        
                    | j        | j                             n|                     d          r)|                    |                                            nO| j        t          j        u r)|                    |                                            n|                     d          r)|                    |                                            n|                     d          r)|                    |                                            n|                     d          r)|                    |                                            nY|                     d	          r+|                    |                     d
                     n|                     d          r)|                    |                                            n|                     d          r)|                    |                                            n|                     d          r)|                    |                                            n_|                     d          r+|                    |                     d                     n|                     d          r(|                    |                                            n|                     d          r*|                    |                     d
                     n| j        t          j        u r=| j        | j        v r/|                     | j        | j                 |                      nS| j        t          j        u r| j        dk    rt;          d                    | j        | j                  | j                  | j        | j        | j        rId | j                                         D             }t;          dd!                    |          z   d          | j         S )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)rV   tablevalueRecordDef;zbExpected feature, languagesystem, lookup, markClass, table, or glyph class definition, got {} "{}"c                 &    g | ]\  }}d |d|dS ) z (first found at )r   )r   namelocs      r   
<listcomp>z Parser.parse.<locals>.<listcomp>   s;       D## .2TT3337  r   zMThe following glyph names are referenced but are missing from the glyph set:

)"r2   
statementsr9   r;   r?   cur_token_type_r   COMMENTappendr0   Comment
cur_token_cur_token_location_is_cur_keyword_parse_include_
GLYPHCLASSparse_glyphclass_definition_parse_anonymous_parse_anchordef_parse_languagesystem_parse_lookup_parse_markClass_parse_feature_block_parse_conditionset_parse_table_parse_valuerecord_definition_NAME
extensionsSYMBOLr   formatr>   itemsr-   )r@   ra   errors      r   parsezParser.parseN   sf    Y)
#/43E/...#u}44!!H$$T_t?W$XX    %%i00 &!!$"5"5"7"78888%)999!!$"C"C"E"EFFFF%%&;<< "!!$"7"7"9"9::::%%k22  !!$"7"7"9"9::::%%&677 !!$"<"<">">????%%h// !!$"4"4e"4"D"DEEEE%%k22 !!$"7"7"9"9::::%%i00 !!$";";"="=>>>>%%n55 !!$":":"<"<====%%k22 !!$";";d";"K"KLLLL%%g.. !!$"3"3"5"56666%%&677 !!$"D"De"D"T"TUUUU$
22Ot66!!"B$/$/"B4"H"HIIII%55$/S:P:P%DDJF,doE E ,  M #/43E/\ < 		 !%!3!3!5!5  E ""&))E"2"24  
 yr   c           	         |                      d           |                     d           | j        }| j        dk    r,|                     d           |                      d           d S | j        t
          j        k    r|                                 }| j        	                    |          }|t          d|z  | j                  |                      d           | j                            |j        |j        ||j        d d |          S |                     d          |                     d          }}d }| j        d	k    r)|                     d	           |                                 }| j        dk    r)|                                 }|                                 }nd
\  }}|                      d           | j                            ||d ||||          S )N<anchorNULL>zUnknown anchor "%s")r]   contourpointxDeviceTableyDeviceTablerI   Tvariabler   r%   )expect_symbol_expect_keyword_rg   r:   r9   r   ru   expect_name_r4   resolver   r0   Anchorxyr   expect_number_parse_device_)	r@   rI   r]   	anchordefr   r   r   r   r   s	            r   parse_anchor_zParser.parse_anchor_   s    	C   X&&&+v%%  ((($$$4 EJ..$$&&D--d33I %)D0$2J   $$$8??&3!!! #    ""D"1143F3FPT3F3U3U1~--  000..00Ls""--//L--//LL)3&L,C   x%%%  
 
 	
r   c                     g }| j         dk    rm|                                 }|| j         dk    r-|                     d           |                                 }|                    ||f           | j         dk    m|S )Nr}   mark)r:   r   r   expect_markClass_reference_rd   )r@   anchorMarksr~   rS   s       r   parse_anchor_marks_zParser.parse_anchor_marks_   s    #%%''))F~$"2f"<"<  (((88::I	2333 #%% r   c                    |                      d          sJ | j        }|                                 |                                 }}d }| j        dk    r)|                     d           |                                 }|                                 }|                     d           | j                            |||||          }| j	        
                    ||           |S )NrN   r   rY   )r   rI   )rh   rg   r   r:   r   r   r   r0   AnchorDefinitionr4   define)r@   rI   r   r   r   r]   r   s          r   rm   zParser.parse_anchordef_   s    ##K00000+""$$d&9&9&;&;1~--  000..00L  ""C   H--!Q\H . 
 
	 	T9---r   c                    |                      d          sJ |                                 }| j                            |          \  }}}|                                  |                     d           |                                 }||k    s
J d            |                     d           | j                            |||          S )NrK   }z-bad splitting in Lexer.scan_anonymous_block()rY   rH   )rh   expect_tag_r=   scan_anonymous_blockr?   r   r0   AnonymousBlock)r@   tag_contentrI   end_tags         r   rl   zParser.parse_anonymous_   s    ##$9:::::  #{??DD7HC   ""$$g~~~N~~~C   x&&sGh&GGGr   c                 r   |                      d          sJ | j        }|                     d          }|                                 h}| j        dk    r2|                    |                                            | j        dk    2|                     d           | j                            |||          S )NAttachTaccept_glyphnamerY   rH   )	rh   rg   parse_glyphclass_r   r:   addr   r0   AttachStatement)r@   rI   glyphscontourPointss       r   parse_attach_zParser.parse_attach_   s    ##H-----+'''>>,,../#%%d1133444 #%%C   x'''QQQr   c                 n    | j         dv sJ |                                  |                     d|          S )N>   enum	enumerateT
enumeratedrR   )rf   r?   parse_position_)r@   rR   s     r   parse_enumerate_zParser.parse_enumerate_   sA    "77777##th#GGGr   c                 D   |                      d          sJ | j        }| j        dk    r|                     d          }nd }|                     d           | j        dk    r|                     d          }nd }|                     d           | j        dk    r|                     d          }nd }|                     d           | j        dk    r|                     d          }nd }|                     d           | j                            |||||          S )NGlyphClassDef,Fr   rY   rH   )rh   rg   r:   r   r   r0   GlyphClassDefStatement)r@   rI   
baseGlyphsligatureGlyphs
markGlyphscomponentGlyphss         r   parse_GlyphClassDef_zParser.parse_GlyphClassDef_   sJ   ##O44444+s""///GGJJJC   s""!33U3KKNN!NC   s""///GGJJJC   s"""44e4LLOO"OC   x..
NOh / 
 
 	
r   c                    | j         | j        }}|                     d           |                     d          }|                     d           | j                            |||          }| j                            ||           |S )N=Fr   rY   rH   )rg   rf   r   r   r0   GlyphClassDefinitionr5   r   )r@   rI   r]   r   
glyphclasss        r   rk   z#Parser.parse_glyphclass_definition_  s    14?$C   '''??C   X224(2SS
!!$
333r   c                 0   |                     d          }g }t          t          |                    D ]e}d                    |d|                   d                    ||d                    }}|| j        v r || j        v r|                    ||f           ft          |          dk    r|d         \  }}||fS t          |          dk    rt          d|z  |          d                    d |D                       }t          d|d|d	|          )
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 c                 &    g | ]\  }}d |d|d S )"z - r   )r   r   ls      r   r_   z-Parser.split_glyph_range_.<locals>.<listcomp>F  s+    !M!M!M41aaAAA"6!M!M!Mr   zAmbiguous glyph range "z"; please use z to clarify what you mean)splitranger,   r-   r/   rd   r   )	r@   r]   rI   parts	solutionsr   startlimitrangess	            r   split_glyph_range_zParser.split_glyph_range_#  sA   & 

3	s5zz"" 	1 	1A88E!A#J//%)1D1D5E(((Ud6F-F-F  %000y>>Q$Q<LE5%<^^q  !/156   [[!M!M9!M!M!MNNF!/<@DD&&&J  r   Fc           	      z
   |r| j         t          j        t          j        fv r|r?| j        dk    r4|                                  | j                            | j                  S | 	                                }| 
                    |           | j                            || j                  S | j         t          j        u r|                                  | j                            | j                  }|t!          d| j        z  | j                  t#          || j        j                  r!| j                            || j                  S | j                            || j                  S |                     d           | j        }| j                            |          }| j        dk    ru| j         t          j        u ru| 	                                }| j        }d|v rm| j        rf|| j        vr]|                     ||          \  }}| 
                    ||           |                    |||                     |||                     n| j        dk    ro|}|                     d           | 	                                }| 
                    ||           |                    |||                     |||                     nOd|v r?| j        s8t6                              t;          t!          d||                               | 
                    |           |                    |           n| j         t          j        u r| 	                                }| j        dk    r| j        }	| j        }
|                     d           |                                 }| 
                    d|
d	d|d	           |                     |
|| !                    |	|
|                     n+d| j        d	}| 
                    |           |                    |           n| j         t          j        u r|                                  | j                            | j                  }|t!          d| j        z  | j                  t#          || j        j                  r"| j                            || j                  }n!| j                            || j                  }|"                    |           nt!          d
| j        | j#                  | j        dk    u|                     d           |S )Nr   rH   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 )$r9   r   ru   CIDr:   r?   r0   	NullGlyphrg   expect_glyph_check_glyph_name_in_glyph_set	GlyphNamerj   r5   r   rf   r   
isinstance	MarkClassMarkClassNameGlyphClassNamer   
GlyphClassr/   r   	add_rangemake_glyph_range_logwarningstrrd   expect_cid_add_cid_rangemake_cid_range_	add_classr<   )r@   r   accept_nullglyphgcrI   r   r   r   range_locationrange_start	range_end
glyph_names                r   r   zParser.parse_glyphclass_M  s     	P 5%*ei9P P P Mt/699##%%%x))43K)LLL&&((E..u5558%%ed6N%OOO E$444!!!#++DO<<Bz%-?,   "dh011 Vx--b4;S-TTTx..rD<T.UUUC   +$$h$77#%%$
22**,,3%<<D$4<dFV9V9V#'#:#:5(#K#KLE566ueDDD$$ud&<&<Xue&T&T    %,,!E'',,, ..00E66ueDDD$$ud&<&<Xue&T&T    e||D,<| /$^UZ$^$^$,!" !"    66u===MM%((((&%)33**,,#s**%)%=N"&/K'',,, $ 0 0 2 2I66/k///-i---   ((#!,,^[)TT    "=t!<!<!<J66zBBBMM*----&%*:::##%%%'//@@:)1DOC0   b$("455 X//T=U/VVBB00d>V0WWB  $$$$%L7;7GL L-  A #%%J 	C   r   c                 n   g g g g g f\  }}}}}d}| j         dvr|                     d          }d}	| j         dk    r|                     d           dx}}	|	r-|rt          d| j                  |                    |           n-|r|                    |           n|                    |           |                                 r)|                    |                     |                     n|                    d            d }
| j         dk    r|
g }
|                     d           |	st          d| j                  | 	                                }| j
                            |          }|t          d	|z  | j                  |
                    |           | j         dk    |	r|                    |
           | j         dv|s#|s!|g k    sJ g |d gt          |          z  |g |fS t          |d t          |                             rt          d
| j                  |t          |          t          |          t          |          z            }t          |          rLt          |t          |          t          |          z   d                    rt          d| j                  |}nx|rR|d         rJt          |          dk    st          |d d                   rt          d| j                  |dd          }n$t          |          rt          d| j                  ||||||fS )NF>   byfromr   rY   Tr   'z_Unsupported contextual target sequence: at most one run of marked (') glyph/class names allowedrP   z%Lookups can only follow marked glyphsUnknown lookup "%s"z_Positioning cannot be applied in the bactrack glyph sequence, before the marked glyph sequence.zPositioning values are allowed only in the marked glyph sequence, or after the final glyph node when only one glyph node is marked.r   )r:   r   r   r   rg   rd   is_next_value_parse_valuerecord_r   r   r6   r   r,   any)r@   rR   prefixr   lookupsvaluessuffixhasMarksr   marked
lookuplistlookup_namerP   marked_valuess                 r   parse_glyph_pattern_zParser.parse_glyph_pattern_  s    46r2r22F/&>>>'''>>BF3&&##C((($((6 "  *J0  
 b!!!! "b!!!!b!!!""$$ $d55h??@@@@d###J"h..%!#J$$X... )?0   #//11..{;;>)-;T=U   !!&))) "h..   +z***[ &>>>^  $	Gf $	Gb====V 4fb(KK6-CKK-()) %8,  
 #3v;;Vs6{{1J#JKM=!! vc&kkCKK799:;; )* 0	   ' F2J v;;??c&"+&6&6?)* 0	    V %& ,	   FGVVXFFr   c                 @   | j         }|                     d          \  }}}}}}t          |          rt          d| d|          |sOt          d| d|          }	t                              t          |	                     |dd          |dd         }}|||f}
|
S )	NFrQ   z(No lookups can be specified for "ignore r   zAmbiguous "ignore z)", there should be least one marked glyphr   r   )rg   r   r   r   r   r   r   )r@   subrI   r   r   r   r   r   r   rz   chainContexts              r   parse_ignore_glyph_pattern_z"Parser.parse_ignore_glyph_pattern_  s    +<@<U<U =V =
 =
9 w<< 	!A3AAA8    	5#SSSSS E KKE

####ABBZ!FF/r   c                    | j         }|                     |          g}| j        dk    rH|                     d           |                    |                     |                     | j        dk    H|                     d           |S )Nr   rY   )rg   r  r:   r   rd   )r@   r   rI   r  s       r   parse_ignore_context_zParser.parse_ignore_context_!  s    +88==>#%%$$$ @ @ E EFFF #%% 	C   r   c                 x   |                      d          sJ | j        }|                                  | j        dv r1|                     d          }| j                            ||          S | j        dv r1|                     d          }| j                            ||          S t          d| j                  )Nignore)
substituter   r   rH   )positionposr	  z#Expected "substitute" or "position")	rh   rg   r?   rf   r  r0   IgnoreSubstStatementIgnorePosStatementr   )r@   rI   r  s      r   parse_ignore_zParser.parse_ignore_*  s    ##H-----+?33355e<<L8000QQQ?11155e<<L8..|h.OOO143K
 
 	
r   c                 ~    | j         dk    sJ | j        }|                                 }t          j        ||          S )NrJ   rH   )rf   rg   expect_filename_r0   IncludeStatement)r@   rI   filenames      r   ri   zParser.parse_include_9  sD    )+++++((**#Hx@@@@r   c                 \   |                      d          sJ | j        }|                                 }d\  }}| j        dv r|                                 dk    }| j        dk    r|                     d           d}|                     d           | j                            ||||          S )	Nlanguage)TF>   exclude_dfltinclude_dfltr  requiredTrY   rH   )	rh   rg   expect_language_tag_r:   r   r   r   r0   LanguageStatement)r@   rI   r  include_defaultr  s        r   parse_language_zParser.parse_language_@  s    ##J/////+,,..$1!???"//11^COz))  ,,,HC   x))ox( * 
 
 	
r   c                 r   |                      d          sJ | j        }|                     d          }|                                 g}| j        dk    r2|                    |                                            | j        dk    2|                     d           | j                            |||          S )NLigatureCaretByIndexTr   rY   rH   )	rh   rg   r   r   r:   rd   r   r0   LigatureCaretByIndexStatementr@   rI   r   caretss       r   parse_ligatureCaretByIndex_z"Parser.parse_ligatureCaretByIndex_O  s    ##$:;;;;;+'''>>%%''(#%%MM$--//000 #%%C   x55ffx5XXXr   c                 z   |                      d          sJ | j        }|                     d          }|                     d          g}| j        dk    r4|                    |                     d                     | j        dk    4|                     d           | j                            |||          S )NLigatureCaretByPosTr   r   rY   rH   )	rh   rg   r   r   r:   rd   r   r0   LigatureCaretByPosStatementr  s       r   parse_ligatureCaretByPos_z Parser.parse_ligatureCaretByPos_Y  s    ##$899999+'''>>%%t%445#%%MM$--t-<<=== #%%C   x33FFX3VVVr   c                 .   |                      d          sJ | j        |                                 }}| j        dk    re| j                            |          }|t          d|z  | j                  |                     d           | j        	                    ||          S d}| j        dk    r| 
                    d           d}| j                            |||          }|                     ||           | j                            ||           |S )NrP   rY   r   rH   FuseExtensionT)rh   rg   r   r:   r6   r   r   r   r0   LookupReferenceStatementr   LookupBlockparse_block_r   )r@   rR   rI   r]   rP   use_extensionblocks          r   ro   zParser.parse_lookup_c  s)    ##H-----143D3D3F3F$s""]**400F~%)D0$2J   $$$844Vh4OOO~--  000 M$$T=8$LL%***T5)))r   c                    |                      d          sJ | j        }| j        t          j        k    rE|                                 }|                     d           | j                            ||          S d}d\  }}}dddd	d
}t                      }| j
        dk    r| j
        |v rt          d| j
        z  | j                  |                    | j
                   | j
        dk    r,|                     d           |                     d          }n}| j
        dk    r,|                     d           |                     d          }nF| j
        |v r d}|||                                          z  }nt          d| j
        z  | j                  | j
        dk    |                     d           t#          |||g          st          d| j                  | j                            ||||          S )N
lookupflagrY   rH   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markFilteringSetrI   )rh   rg   r9   r   NUMBERr   r   r0   LookupFlagStatementr.   r:   r   r<   r   r   r   r   r   )r@   rI   value
value_seenr6  r7  flagsseens           r   parse_lookupflag_zParser.parse_lookupflag_|  sW    ##L11111+  EL00''))E$$$8///III 
2?/~/ ! 	
 
 uu#%%4''%3d6FF-   HHT%&&&#777$$%9:::!%!7!7!7!O!O!%:::$$%:;;;#'#9#95#9#Q#Q  !U**!
d&7&7&9&9 ::%9D<LL-  # #%%* 	C   J0@ABB 	!.0I   x++)-	 , 
 
 	
r   c                 `   |                      d          sJ | j        }|                     d          }|                                st	          d|          |                                 }|                                 }|                     d           | j        j	        
                    |          }|D| j                            |          }|| j        j	        |<   | j                            ||           | j                            ||||          }|                    |           |S )NrS   Tr   z*Empty glyph class in mark class definitionrY   rH   )rh   rg   r   glyphSetr   r   expect_class_name_r   r2   markClassesgetr0   r   r5   r   MarkClassDefinitionaddDefinition)r@   rI   r   r~   r]   rS   mcdefs          r   rp   zParser.parse_markClass_  s6   ##K00000+'''>>   	!<h   ##%%&&((C   I)--d33	**400I*3DI!$'%%dI666,,vv - 
 
 	&&&r   c                    | j         dv sJ | j        dk    r|                     ||          S | j        dk    r|                     ||          S | j        dk    r|                     ||          S | j        dk    r|                     ||          S | j        }|                     |          \  }}}}}}	|                     d           t          |          r>t          |          rt          d|          | j                            |||||          S |sk|sit          |          d	k    rV|	sT|d
         |                                 | j                            |d
         |d
         |d         |d         ||          S |rt          d|          | j                            t#          t%          ||                    |||	|          S )N>   r	  r  cursivebaseligaturer   rY   z3If "lookup" is present, no values must be specifiedrH   r-  r   r   )r   rI   z2"enumerate" is only allowed with pair positionings
forceChainrI   )rf   r:   parse_position_cursive_parse_position_base_parse_position_ligature_parse_position_mark_rg   r   r   r   r   r0   ChainContextPosStatementr,   reversePairPosStatementSinglePosStatementlistzip)
r@   r   rR   rI   r   r   r   r   r   r   s
             r   r   zParser.parse_position_  s,   "55555y((//
HEEE'',,ZBBB++00XFFF'',,ZBBB+<@<U<U=
 =
9 	C   w<< 	6{{ %I8   844( 5     
	f 
	V)9)9()9ay    8,,q	q	q	q	%! -     	!Dh   x**VV$$%% + 
 
 	
r   c                 @   | j         }|                     d           |rt          d|          |                     d          }|                                 }|                                 }|                     d           | j                            ||||          S )NrH  z>"enumerate" is not allowed with cursive attachment positioningTr   rY   rH   )rg   r   r   r   r   r   r0   CursivePosStatement)r@   r   rR   rI   r   entryAnchor
exitAnchors          r   rM  zParser.parse_position_cursive_   s    +Y''' 	!S   ++T+BB
((**''))
C   x++Z( , 
 
 	
r   c                    | j         }|                     d           |rt          d|          |                     d          }|                                 }|                     d           | j                            |||          S )NrI  zC"enumerate" is not allowed with mark-to-base attachment positioningTr   rY   rH   )rg   r   r   r   r   r   r0   MarkBasePosStatement)r@   r   rR   rI   rI  markss         r   rN  zParser.parse_position_base_  s    +V$$$ 	!6  
 %%t%<<((**C   x,,T58,LLLr   c                    | j         }|                     d           |rt          d|          |                     d          }|                                 g}| j        dk    rG|                     d           |                    |                                            | j        dk    G|                     d           | j        	                    |||          S )NrJ  zG"enumerate" is not allowed with mark-to-ligature attachment positioningTr   ligComponentrY   rH   )
rg   r   r   r   r   r:   rd   r   r0   MarkLigPosStatement)r@   r   rR   rI   	ligaturesr]  s         r   rO  zParser.parse_position_ligature_  s    +Z((( 	!:  
 **D*AA	))++,.00  000LL1133444 .00 	C   x++Iux+PPPr   c                    | j         }|                     d           |rt          d|          |                     d          }|                                 }|                     d           | j                            |||          S )Nr   zC"enumerate" is not allowed with mark-to-mark attachment positioningTr   rY   rH   )rg   r   r   r   r   r   r0   MarkMarkPosStatement)r@   r   rR   rI   	baseMarksr]  s         r   rP  zParser.parse_position_mark_/  s    +V$$$ 	!6  
 **D*AA	((**C   x,,Y,QQQr   c                     |                      d          sJ | j        |                                 }}|                     d           | j                            ||          S )NscriptrY   rH   )rh   rg   expect_script_tag_r   r0   ScriptStatement)r@   rI   rf  s      r   parse_script_zParser.parse_script_=  sc    ##H-----3T5L5L5N5N&C   x'''BBBr   c           
         | j         dv sJ | j        }| j         dv }|                     d          \  }}}}}}t          |          rt	          d|          g }	| j        dk    rX|                     d          }
| j        dk    r7|                     dd	          }|	                    |           | j        dk    7n:| j        d
k    r-|                     d
          }
|                     d          g}	nd }
| 	                    d           t          |	          dk    r$t          |          st	          d| j                  |
d
k    r|rt	          d|          t          |          dk    s+t          |d                                                   dk    rt	          d|          t          |	          dk    rt	          d|          | j                            ||d         ||	d         |          S t          d |D                       }d}t          |	          dk    r$t          |	d         t          j                  rg }	d}|st          |          dk    rt          |	          dk    r|dk    rt!          |d                                                   }t!          |	d                                                   }t          |          dk    r|t          |          z  }t          |          t          |          k    r/t	          dt          |          t          |          fz  |          | j                            ||	||||          S |r?t          |          dk    r,|dk    r&| j                            ||d         |d||          S |s2t          |          dk    rt          |	          dk    r
|dk    rt          |d                                                   }|	D ]}t!          |                                          st	          d|          t          |                                          dk    r[t          |                                          |k    r6t	          d| dt          |                                           d|          | j                            ||d         ||	||          S |st          |          dk    rt          |	          dk    r|t          |	d                                                   dk    rQ|dk    rK| j                            |||t!          |	d                                                   d         ||          S |rWt          |          dk    rt	          d|          t          |	          dk    rt	          d|          |dk    rt	          d|          t)          t!          |d                                                             }t)          t!          |	d                                                             }t          |          dk    r|t          |          z  }t          |          t          |          k    r/t	          dt          |          t          |          fz  |          | j                            ||||	|          S t          |          dk    r#t          |	          dk    rt	          d|          t          |	          dk    s|rt	          d|          | j                            |||||          }|S ) N>   r   rsub
reversesubr  >   rk  rl  FrQ   z-Substitution statements cannot contain valuesr   rY   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"rH   c                     g | ]}||S r!   r   )r   r   s     r   r_   z,Parser.parse_substitute_.<locals>.<listcomp>v  s    ???1r   z\Expected a glyph class with %d elements after "by", but found a glyph class with %d elementsrK  r   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)rf   rg   r   r   r   r:   r   r   rd   r   r,   r@  r0   AlternateSubstStatementr   r   rU  SingleSubstStatementMultipleSubstStatementLigatureSubstStatementsorted ReverseChainSingleSubstStatementChainContextSubstStatement)r@   rI   rR  
old_prefixoldr   r   
old_suffixr   newkeywordr   num_lookupsis_deletionr   replacementscountnrules                      r   parse_substitute_zParser.parse_substitute_C  s   "MMMMM+/%;; %%u%55	
v;; 	!?   t##**400G"c))++Tt+TT

2 "c)) ''**622G))5)AABCCGC   s88q==W=!E(   f %JH   3xx1}}CFOO$5$5 6 6! ; ;%&MxXXX3xx1}}%?   833CFJA 4    ??g???@@s88q==ZA>>=CK  	3s88q==SXX]]{a?O?O#a&//++,,FA 1 122L<  A%%+c&kk96{{c,////%?6{{C$5$567 	   800S*jXPX 1     	3s88q==[A-=-=822A#! 3      	3s88q==SXX\\kQ>N>NA))**E  AJJLL)) R)*FQQQqzz||$$))c!**,,.?.?5.H.H)UE U U8;AJJLL8I8IU U U   
 822A#! 3    	C1CACFOO%%&&!++q  822SV__&&''*#! 3     	3xx1}}%I  
 3xx1}}%% 	   a%NPX   DQ!2!23344F!$s1v'8'8"9"9::L<  A%%+c&kk96{{c,////%?6{{C$5$567 	   8<<JS8 =    s88a<<CHHqLL!#   s88q==K=!"BHMMM x22Z8 3 
 
 r   c                     |                      d          sJ | j        }|                     d           | j                            |          S )NsubtablerY   rH   )rh   rg   r   r0   SubtableStatement)r@   rI   s     r   parse_subtable_zParser.parse_subtable_  sQ    ##J/////+C   x))8)<<<r   c                    |                      d          sJ | j        }|                                 }|                                 }d}d}| j        t
          j        t
          j        fv s|dk    r(|                                 }|                                 }|                     d           | j	        
                    |||||          S )N
parametersg        r   rY   rH   )rh   rg   expect_decipoint_r   r9   r   r8  FLOATr   r0   SizeParameters)r@   rI   
DesignSizeSubfamilyID
RangeStartRangeEnds         r   parse_size_parameters_zParser.parse_size_parameters_  s     ##L11111+++--
))++
 U\5;$???;RSCSCS//11J--//HC   x&&ZH ' 
 
 	
r   c                     |                      d          sJ | j        }|                                 \  }}}}| j                            d|||||          S )NsizemenunamesizerH   )rh   rg   parse_name_r0   FeatureNameStatement)r@   rI   
platformID	platEncIDlangIDstrings         r   parse_size_menuname_zParser.parse_size_menuname_  sj    ##N33333+040@0@0B0B-
Ivvx,,J	66H - 
 
 	
r   c           	         |                      d          sJ | j        |                                 }}| j                            ||          }|                     d           | j        | j        | j        | j	        | j
        | j        | j        | j        d                    |          }|r ||           n%t          d|                                z  |          |                     d           |                                 }||k    r*t          d|                                z  | j                  |                     d           |S )	NrW   rH   {)GDEFheadhheavhear]   BASEzOS/2STATz"table %s" is not supportedr   Expected "%s"rY   )rh   rg   r   r0   
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_rC  r   strip)r@   rI   r]   rW   handlerr   s         r   rs   zParser.parse_table_  s]   ##G,,,,,143C3C3E3E$##D8#<<C   ********	
 	
 #d)) 	  	GENNNN!-

<h   	C   ""$$d??!$**,,.0H   	C   r   c                 Z   |j         }| j        dk    s| j        r|                     d           | j        t
          j        u r;|                    | j        	                    | j
        | j                             n|                     d          r(|                    |                                            n|                     d          r(|                    |                                            n|                     d          r(|                    |                                            n_|                     d          r(|                    |                                            n"| j
        d	k    rxt#          d
| j                  | j        dk    | j        d S d S )Nr   Tr'   rH   r   r   r  r!  rY   z<Expected Attach, LigatureCaretByIndex, or LigatureCaretByPos)ra   r:   r;   r?   rb   r   rc   rd   r0   re   rf   rg   rh   r   r   r  r#  r   r@   rW   ra   s      r   r  zParser.parse_table_GDEF_;  s   %
#%%);%...#u}44!!H$$T_t?W$XX    %%h// !!$"4"4"6"67777%%o66 !!$";";"="=>>>>%%&<== 
!!$"B"B"D"DEEEE%%&:;; !!$"@"@"B"BCCCCC''%U,  # #%%);%%%%%r   c                    |j         }| j        dk    s| j        r|                     d           | j        t
          j        u r:|                    | j        	                    | j
        | j                             n^|                     d          r(|                    |                                            n!| j
        dk    rt          d| j                  | j        dk    | j        d S d S )Nr   Tr'   rH   FontRevisionrY   zExpected FontRevision)ra   r:   r;   r?   rb   r   rc   rd   r0   re   rf   rg   rh   parse_FontRevision_r   r  s      r   r  zParser.parse_table_head_S  s   %
#%%);%...#u}44!!H$$T_t?W$XX    %%n55 Y!!$":":"<"<====C''%&=t?WXXX #%%);%%%%%r   c                    |j         }d}| j        dk    s| j        r:|                     d           | j        t
          j        u r:|                    | j        	                    | j
        | j                             n| j        t
          j        u r| j
        |v r| j
                                        }|                                 }|                    | j                            ||| j                             | j        dk    rt!          d| j                  n"| j
        dk    r"t!          d| j                  | j        dk    0| j        8d S d S )	N)CaretOffsetAscender	DescenderLineGapr   Tr'   rH   rY   Incomplete statementz4Expected CaretOffset, Ascender, Descender or LineGap)ra   r:   r;   r?   rb   r   rc   rd   r0   re   rf   rg   ru   lowerr   	HheaFieldr   r<   r@   rW   ra   fieldskeyr:  s         r   r  zParser.parse_table_hhea_b  s}   %
D#%%);%...#u}44!!H$$T_t?W$XX    %3368Q8Qo++--++--!!H&&sED<T&UU   #s**).0I   + C''%M,  ' #%%);%%%%%r   c                    |j         }d}| j        dk    s| j        r:|                     d           | j        t
          j        u r:|                    | j        	                    | j
        | j                             n| j        t
          j        u r| j
        |v r| j
                                        }|                                 }|                    | j                            ||| j                             | j        dk    rt!          d| j                  n"| j
        dk    r"t!          d| j                  | j        dk    0| j        8d S d S )	N)VertTypoAscenderVertTypoDescenderVertTypoLineGapr   Tr'   rH   rY   r  z?Expected VertTypoAscender, VertTypoDescender or VertTypoLineGap)ra   r:   r;   r?   rb   r   rc   rd   r0   re   rf   rg   ru   r  r   	VheaFieldr   r<   r  s         r   r  zParser.parse_table_vhea_}  s   %
M#%%);%...#u}44!!H$$T_t?W$XX    %3368Q8Qo++--++--!!H&&sED<T&UU   #s**).0I   + C''%;,  ' #%%);%%%%%r   c                    |j         }| j        dk    s| j        r|                     d           | j        t
          j        u r:|                    | j        	                    | j
        | j                             nb|                     d          r,|                                 }|r|                    |           n!| j
        dk    rt          d| j                  | j        dk    | j        d S d S )Nr   Tr'   rH   nameidrY   zExpected nameid)ra   r:   r;   r?   rb   r   rc   rd   r0   re   rf   rg   rh   parse_nameid_r   )r@   rW   ra   	statements       r   r  zParser.parse_table_name_  s   %
#%%);%...#u}44!!H$$T_t?W$XX    %%h// S ..00	 1%%i000C''%&79QRRR #%%);%%%%%r   c                    d}d}| j         t          j        v rk|                                 }| j        }|dvrt          d|          | j         t          j        v r(|                                 }|                                 }n	d}| j        }|dk    r	|pd}|pd}n|pd}|pd}|                                 }|                     d           t          |||          }|t          d	|          | 	                    ||          }||||fS )
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   	  rY   Unsupported encoding)
r9   r   NUMBERSexpect_any_number_rg   r   expect_string_r   r   unescape_string_r@   r  r  r  rI   r  encoding	unescapeds           r   r  zParser.parse_name_  s2   	 EM110022J/H''%&CXNNN$55 3355	0022J/H??!QI[qFF!QI%vF$$&&C   z9f==!"8(CCC))&(;;	9fi77r   c                    d }d }| j         t          j        v rk|                                 }| j        }|dvrt          d|          | j         t          j        v r(|                                 }|                                 }n	d}| j        }|dk    r	|pd}|pd}n|pd}|pd}|                                 }t          |||          }|t          d|          |                     ||          }||||fS )Nr  r  r  r   r   r  r  )	r9   r   r  r  rg   r   r  r   r  r  s           r   parse_stat_name_zParser.parse_stat_name_  s   	 EM110022J/H''%&CXNNN$55 3355	0022J/H??!QI[qFF!QI%vF$$&&z9f==!"8(CCC))&(;;	9fi77r   c                    | j         dk    sJ | j                     | j        |                                 }}|dk    rt          d| j                  |                                 \  }}}}| j                            ||||||          S )Nr  i  z*Name id value cannot be greater than 32767rH   )rf   rg   r  r   r  r0   
NameRecord)r@   rI   nameIDr  r  r  r  s          r   r  zParser.parse_nameid_  s    (***DO***3T5L5L5N5N&E>>!<d>V   150@0@0B0B-
Ivvx""J	66H # 
 
 	
r   c                      dk    rt          j        d j        |          }n fd}t          j        d||          }t          |dd          }t	          |d          S )N	utf_16_bez\\[0-9a-fA-F]{4}c                 0                         |           S r!   )unescape_byte_)mr  r@   s    r   <lambda>z)Parser.unescape_string_.<locals>.<lambda>  s    !4!4Q!A!A r   z\\[0-9a-fA-F]{2}surrogatepass)rer   unescape_unichr_r
   r   )r@   r  r  r   unescapeutf16s   ` `   r   r  zParser.unescape_string_  sp    {""*D,A6JJAAAAAAAH*Hf==A ;88UK(((r   c                 v    |                      d          dd          }t          t          |d                    S Nr   r      )groupchrint)matchr~  s     r   r  zParser.unescape_unichr_  s.    KKNN1223q"::r   c                     |                      d          dd          }t          t          |d                                        |          S r  )r  r	   r  decode)r  r  r~  s      r   r  zParser.unescape_byte_  s>    KKNN122s1bzz""))(333r   c                     t          |          D ]3}t          || j        j                  rt          ||          r|c S  d S d S r!   )reversedr   r0   re   )r@   ra   class_previouss       r   find_previouszParser.find_previous	  s\     ,, 	 	H(DH$455 Hf--  tttr   c                    |j         }| j        dk    s| j        r|                     d           | j        t
          j        u r;|                    | j        	                    | j
        | j                             nk|                     d          r|                                 }n@|                     d          rZ|                     t          |                    }|                    | j                            ||d| j                             n|                     d          r|                     |t          j                  }|t%          d	| j                  |j        rt%          d
| j                  |j                            |                                            n;|                     d          r|                                 }n|                     d          rY|                     t          |                    }|                    | j                            ||d| j                             n|                     d          r|                     |t          j                  }|t%          d	| j                  |j        st%          d| j                  |j                            |                                            n| j
        dk    r| j        dk    | j        d S d S )Nr   Tr'   rH   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 statementsrY   )ra   r:   r;   r?   rb   r   rc   rd   r0   re   rf   rg   rh   parse_base_tag_list_parse_base_script_list_r,   BaseAxisr  r   rR   minmaxparse_base_minmax_)r@   rW   ra   horiz_baseshoriz_scriptsbase_script_list
vert_basesvert_scriptss           r   r  zParser.parse_table_BASE_  s>   %
#%%);%...#u}44!!H$$T_t?W$XX    %%&=>> 3"7799%%&@AA 1 $ < <S=M=M N N!!H%%#%!%!9	 &      %%&899 '#'#5#5j#,#O#O #+)C0   $, )S0   !'..t/F/F/H/HIIII%%&<== !6688

%%&?@@ #;;C
OOLL!!H%%"$!%!9	 &      %%&788 #'#5#5j#,#O#O #+)C0   (0 )Q0   !'..t/F/F/H/HIIIIC''s #%%);%%%%%r   c                    |j         }d}d}| j        dk    s| j        r|                     d           | j        t
          j        u r;|                    | j        	                    | j
        | j                             nS| j        t
          j        u r2| j
                                        }d }| j
        |v r|                                 }n|                     d          r<g }t!          d          D ])}|                    |                                            *nr| j
        |v r@g }| j        d	k    r2|                    |                                            | j        d	k    2n)|                     d
          r|                                 }|                    | j                            ||| j                             n| j
        d	k    r| j        dk    | j        d S d S )N)FSTypeTypoAscenderTypoDescenderTypoLineGap	winAscent
winDescentXHeight	CapHeightWeightClass
WidthClassLowerOpSizeUpperOpSize)UnicodeRangeCodePageRanger   Tr'   rH   Panose
   rY   Vendor)ra   r:   r;   r?   rb   r   rc   rd   r0   re   rf   rg   ru   r  r   rh   r   r  OS2Field)r@   rW   ra   numbersr   r  r:  r   s           r   r  zParser.parse_table_OS_2_S  s   %

 3#%%);%...#u}44!!H$$T_t?W$XX    %33o++--?g-- //11EE))(33 	2E"2YY < <T%8%8%:%:;;;;<_..E*c11T%8%8%:%:;;; *c11))(33 2 //11E!!H%%c54;S%TT    C''3 #%%);%%%%%r   c                 N   |                      d          sJ |                     d           g }| j        dk    s| j        r|                                  |                      d          rT|                                 \  }}}}| j                            d||||| j                  }|	                    |           n)| j
        dk    rt          d| j
         d	| j                  | j        dk    | j        |                     d           |st          d
| j                  |S )NElidedFallbackNamer  r   r]   statrH   rY   Unexpected token z in ElidedFallbackNameExpected "name")rh   r   r:   r;   r?   r  r0   STATNameStatementrg   rd   rf   r   )r@   namesr  r  r  r  
nameRecords          r   parse_STAT_ElidedFallbackNamez$Parser.parse_STAT_ElidedFallbackName  s[   ##$899999C   #%%);%!!!##F++ 8<8M8M8O8O5
Ivv!X77!5 8  
 Z((((?c)))WDOWWW0   #%%);%& 	C    	O!"3T5MNNNr   c                 H   |                      d          sJ g }|                                 }|dvr2|                                st                              d| d           |                                 }|                     d           | j        dk    s| j        r| 	                                 | j
        t          j        u r:|                      d          rV| j        }|                                 \  }}}}| j                            d|||||	          }	|                    |	           n)| j        d
k    rt'          d| j         | j                  | j        dk    | j        |                     d           | j                            |||| j                  S )N
DesignAxis)italopszslntwdthwghtzUnregistered axis tag z should be uppercase.r  r   r]   r  rH   rY   zExpected "name", got )rh   r   isupperr   r   r   r   r:   r;   r?   rb   r   rc   rg   r  r0   r  rd   rf   r   STATDesignAxisStatement)
r@   r  axisTag	axisOrderrI   r  r  r  r  r]   s
             r   parse_STAT_design_axiszParser.parse_STAT_design_axis  s   ##L11111""$$CCCOO%% D KKOOOOPPP''))	C   #%%);%!!!#u}44%%f-- 38<8M8M8O8O5
Ivvx11J	66H 2   T""""C''%=DO==t?W   #%%);%$ 	C   x//Yt'?
 
 	
r   c                    |                      d          sJ |                     d           g }g }d}| j        dk    s| j        r=|                     d           | j        t          j        u r=|                      d          rV| j        }| 	                                \  }}}}| j
                            d|||||	          }	|                    |	           n|                      d
          r*|                                 }|                    |           nU|                      d          r|                                 }n+| j        dk    rt!          d| j         d| j                  | j        dk    5| j        =|                     d           |st!          d| j                  |st!          d| j                  t#          |          dk    r|D ]E}t#          |j                  dk    r+t!          dt#          |j                   d| j                  Fg }
|D ];}|j        }||
v rt!          d| d| j                  |
                    |           <| j
                            |||| j                  S )N	AxisValuer  r   r   Tr'   r]   r  rH   rI   flagrY   r  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.)rh   r   r:   r;   r?   rb   r   rc   rg   r  r0   r  rd   parse_STAT_locationexpect_stat_flagsrf   r   r,   r   r   STATAxisValueStatement)r@   	locationsr  r<  rI   r  r  r  r  r]   format4_tagsr   s               r   parse_STAT_axis_value_zParser.parse_STAT_axis_value_  s   ##K00000C   	#%%);%...#u}44%%f-- 38<8M8M8O8O5
Ivvx11J	66H 2   T""""%%j11 3355  ****%%f-- ..00C''%JJJJ,  ' #%%);%. 	C    	T!"8$:RSSS 	X!"<d>VWWWy>>A%  x''!++)>x//> > > 0	   , L% ) )l,&&)=C===t?W   ##C((((x..9eT%=
 
 	
r   c           	         g }|                                  }t          |                                          dk    rt          d| j         d| j                  | j        dk    r| j        t          j	        u r*| 
                                }|                    |           n[| j        t          j        u r*|                                 }|                    |           nt          d| j         d| j                  | j        dk    t          |          dk    r1|\  }}}||k     s||k    rt          d| d	| d
| d| j                  | j                            ||          S )Nr.  r,  z must be 4 charactersrY   zUnexpected value "z". Expected integer or float.r  zDefault value z is outside of specified range r   .)r   r,   r  r   rf   rg   r:   r9   r   r  expect_float_rd   r8  r   r<   r0   AxisValueLocationStatement)r@   r   r   r:  nominalmin_valmax_vals          r   r-  zParser.parse_STAT_location  s     syy{{q  !EDOEEE(  
 #%%$33**,,e$$$$&%,66++--e$$$$%1)9 1 1 1-   #%% v;;!(.%GWg  Gg$5$5%,W , ,, ,!(, , , -	   x223???r   c                    |j         }g }| j        dk    s| j        rp|                     d           | j        t
          j        u r;|                    | j        	                    | j
        | j                             n| j        t
          j        u r|                     d          rC|                                 }|                    | j                            |                     n|                     d          rX|                                 }|                    | j                            |                     |                     d           n|                     d          rY|                                 }|                    |j                   |                    |           |                     d           n|                     d	          rp|                                 }|j        D ])}|j        |vrt/          d
|j         d| j                  *|                    |           |                     d           n*t/          d| j
         | j                  | j
        dk    rm| j        dk    f| j        nd S d S )Nr   Tr'   rH   r  ElidedFallbackNameIDrY   r  r*  zDesignAxis not defined for r4  r  )ra   r:   r;   r?   rb   r   rc   rd   r0   re   rf   rg   ru   rh   r  r  r   r;  r   r(  r   r2  r0  r   )	r@   rW   ra   design_axesr  r:  
designAxisaxisValueRecordrI   s	            r   r  zParser.parse_table_STAT_  s   %
#%%);%...#u}44!!H$$T_t?W$XX    %33''(<==  >>@@E%%dh&A&A%&H&HIIII))*@AA  //11E%%dh&C&CE&J&JKKK'',,,,)),77 !%!<!<!>!>J&&z~666%%j111'',,,,))+66 &*&A&A&C&CO$3$=  #<{:: #2 P P P P $ 8# #  ; %%o666'',,,,)=DO==t?W   C''I #%%);%%%%%r   c                     | j         dv sJ | j                     g }| j        dk    r2|                    |                                            | j        dk    2|                     d           |S )N)r  r  rY   )rf   r:   rd   rg  r   )r@   basess     r   r  zParser.parse_base_tag_list_?  s     #
 
 
 
 ?
 
 
 #%%LL0022333 #%%C   r   c                 2   | j         dv sJ | j                     |                     |          g}| j        dk    rH|                     d           |                    |                     |                     | j        dk    H|                     d           |S )N)r  r  r   rY   )rf   parse_base_script_record_r:   r   rd   )r@   r}  scriptss      r   r  zParser.parse_base_script_list_K  s     #
 
 
 
 ?
 
 
 11%889#%%$$$NN499%@@AAA #%% 	C   r   c                                                        }                                  } fdt          |          D             }|||fS )Nc                 8    g | ]}                                 S r   )r   )r   r   r@   s     r   r_   z4Parser.parse_base_script_record_.<locals>.<listcomp>Z  s%    >>>A$%%''>>>r   )rg  r   )r@   r}  
script_tagbase_tagcoordss   `    r   rB  z Parser.parse_base_script_record_W  sQ    ,,..
**,,>>>>u>>>8V++r   c                 |   |                                  }|                                 }|                                 }|                                  | j        t
          j        u r| j        dk    st          d| j	                  |                                 }| j
        dk    rt          d| j	                  ||||fS )Nr   z0Expected a comma between min and max coordinatesz0Feature tags are not yet supported in BASE table)rg  r  r   r?   rb   r   rw   rf   r   rg   r:   )r@   rF  r  	min_coord	max_coords        r   r  zParser.parse_base_minmax_]  s    ,,..
,,..''))	$44C9O9O!B(   ''))	s""!B(  
 8Y	99r   c                    d }|                      d           |                     d           | j        dk    r|                     d           n|                                 |                                 fg}| j        dk    r[|                      d           |                    |                                 |                                 f           | j        dk    [t          |          }|                      d           |S )Nr}   devicer   r   r   )r   r   r:   r   rd   tuple)r@   results     r   r   zParser.parse_device_p  s    C   X&&&v%%  ((((**,,d.A.A.C.CDEF"c))##C(((t2244d6I6I6K6KLMMM "c)) 6]]FC   r   c                 T    | j         t          j        u p| j        dk    p
| j        dk    S )Nr}   ()r9   r   r8  r:   r@   s    r   r   zParser.is_next_value_  s4    !U\1 '3&'3&	
r   c                 l   | j         t          j        u r| j        dk    s| j         t          j        u r\|                     d          | j        }}|r| j                            |||          }n| j                            |||          }|S | 	                    d           | j        }| j         t          j
        u r|                                 }|dk    r.| 	                    d           | j                                        S | j                            |          }|t          d	|z  | j                  |j        }|j        |j        }	}|j        |j        }}
n[|                     d          |                     d          |                     d          |                     d          f\  }}	}
}| j        dk    r|                                 |                                 |                                 |                                 f\  }}}}t+          d
 |r|nd|r|ndz   |r|ndz   |r|ndz   D                       }|d         dk     s|d         dk    rt          d| j                  nd\  }}}}| 	                    d           | j                            ||	|
|||||||
  
        S )NrQ  Tr   )yAdvancerR   rI   )xAdvancerR   rI   r}   r   r   zUnknown valueRecordDef "%s"c                     g | ]\  }}|S r   r   )r   r  deltas      r   r_   z-Parser.parse_valuerecord_.<locals>.<listcomp>  s,       #e   r   r   r   ir      z+Device value out of valid range (-128..127))NNNN)rR   rI   )r9   r   rw   r:   r8  r   rg   r0   ValueRecordr   ru   r   r7   r   r   r:  
xPlacement
yPlacementrU  rT  r   rr  )r@   rR   numberrI   valr]   vrdr:  rZ  r[  rU  rT  
xPlaDevice
yPlaDevice
xAdvDevice
yAdvDevice	allDeltass                    r   r   zParser.parse_valuerecord_  sD   !U\11d6F#6M6M"el22##T#22( F  h**#h +   h**#h +   JC   + EJ..$$&&Dv~~##C(((x++---$,,T22C{%1D8$:R   IE&+&68H
J"'.%.hHH ##T#22##T#22##T#22##T#22	:6J
Hh s""""$$""$$""$$""$$	>:J
J
  6@(H

b%/7zzR(9%/7zzR(9 &07zzR(9   I |d""imc&9&9%A,   ': >V:J
J
C   x## $ 
 
 	
r   c                 .   |                      d          sJ | j        }|                     |          }|                                 }|                     d           | j                            |||          }| j                            ||           |S )NrX   rY   rH   )	rh   rg   r   r   r   r0   ValueRecordDefinitionr7   r   )r@   rR   rI   r:  r]   r^  s         r   rt   z$Parser.parse_valuerecord_definition_  s    ##$455555+''11  ""C   h,,T58,LL!!$,,,
r   c                     | j         dk    sJ | j        }|                                 }|                                 }|                     d           | j                            |||          S )NrO   rY   rH   )rf   rg   rg  r  r   r0   LanguageSystemStatement)r@   rI   rf  r  s       r   rn   zParser.parse_languagesystem_  sq    "22222+((**,,..C   x//8/TTTr   c                    |r| j         dk    sJ n| j         dk    sJ | j        }|                                 }|dv }d }d }d}|| j        v r|}n|| j        v r|}n|dk    rd}|r|                                 }d}	| j        dk    r|                     d           d}	|r| j        	                    |||	|          }
n| j        
                    ||	|          }
|                     |
||||           |
S )	NrV   rT   >   valtvhalvkrnvpalFr  Tr%  )r)  rI   )rf   rg   r   SS_FEATURE_TAGSCV_FEATURE_TAGSr   r:   r   r0   VariationBlockFeatureBlockr(  )r@   rV   rI   r   rR   stylisticset
cv_featuresize_featurerU   r)  r*  s              r   rq   zParser.parse_feature_block_  sZ    	0?k11111?i////+  ::
$&&&LLD(((JJF]]L 	/,,..L~--  000 M 	H++\ ,  EE H))=8 *  E 	%<zRRRr   c                     | j         dk    sJ | j                     | j        }|                                 }|                     d           | j                            ||          S )NrT   rY   rH   )rf   rg   r   r   r0   FeatureReferenceStatement)r@   rI   featureNames      r   parse_feature_reference_zParser.parse_feature_reference_  sg    )+++T_++++&&((C   x11+1QQQr   c           
         | j         dk    sJ | j                     | j                            || j         | j                  }|                     d           | j        D ]}|                                 | j        dk    s| j        r| 	                    d           | j
        t          j        u r?|j                            | j                            | j         | j                             n|                     d          rY| j        }|                                 \  }}}}|j                            | j                            ||||||                     n!| j         dk    rt'          d	| j                  | j        dk    | j        |                     d           | j        D ]}|                                 |                     d           |S )
zParses a ``featureNames`` statement found in stylistic set features.
        See section `8.c <https://adobe-type-tools.github.io/afdko/OpenTypeFeatureFileSpecification.html#8.c>`_.
        featureNamesrH   r  r   Tr'   r]   rY   r  )rf   r0   NestedBlockrg   r   r8   enter_scoper:   r;   r?   rb   r   rc   ra   rd   re   rh   r  r  r   
exit_scope)	r@   r   r*  symtabrI   r  r  r  r  s	            r   parse_featureNames_zParser.parse_featureNames_  s    .000$/000$$4+C % 
 
 	C   ) 	! 	!F    #%%);%...#u}44 ''H$$T_t?W$XX    %%f-- S38<8H8H8J8J5
Ivv ''H11ZFFX 2     
 C''%&79QRRR# #%%);%$ 	C   ) 	  	 FC   r   c                 (   | j         dk    sJ | j                     | j                            || j         | j                  }|                     d           | j        D ]}|                                 |j        }| j        dk    s| j	        r;| 
                    d           | j        t          j        u r:|                    | j                            | j         | j                             n|                     h d          r/|                    |                     || j                              n~|                     d          r)|                    |                     |                     n@| j         d	k    rt'          d
                    | j        | j                   | j                  | j        dk    3| j	        ;|                     d           | j        D ]}|                                 |                     d	           |S )NcvParametersrH   r  r   Tr'   >   SampleTextNameIDFeatUILabelNameIDParamUILabelNameIDFeatUITooltipTextNameID	CharacterrY   zExpected statement: got {} {})rf   r0   rz  rg   r   r8   r{  ra   r:   r;   r?   rb   r   rc   rd   re   rh   parse_cvNameIDs_parse_cvCharacter_r   rx   r|  )r@   r   r*  r}  ra   s        r   parse_cvParameters_zParser.parse_cvParameters_7  sI    .000$/000$$4+C % 
 
 	C   ) 	! 	!F    %
#%%);%...#u}44!!H$$T_t?W$XX    %%     !!$"7"7T_"M"MNNNN%%k22 
!!$"9"9#">">????C''%3::,do  ,	  ) #%%);%6 	C   ) 	  	 FC   r   c                    | j         |k    sJ | j                     | j                            ||| j                  }|                     d           | j        D ]}|                                 | j        dk    s| j        r| 	                    d           | j
        t          j        u r?|j                            | j                            | j         | j                             n|                     d          rZ| j        }|                                 \  }}}}	|j                            | j                            |||||	||                     n!| j         dk    rt'          d| j                  | j        dk    | j        |                     d           | j        D ]}|                                 |                     d           |S )	NrH   r  r   Tr'   r]   rY   r  )rf   r0   rz  rg   r   r8   r{  r:   r;   r?   rb   r   rc   ra   rd   re   rh   r  CVParametersNameStatementr   r|  )
r@   r   
block_namer*  r}  rI   r  r  r  r  s
             r   r  zParser.parse_cvNameIDs_d  s   *,,,do,,,$$S*t?W$XXC   ) 	! 	!F    #%%);%...#u}44 ''H$$T_t?W$XX    %%f-- S38<8H8H8J8J5
Ivv ''H66"!"!) 7  
 
 
 
 C''%&79QRRR/ #%%);%0 	C   ) 	  	 FC   r   c                 6   | j         dk    sJ | j                     | j        |                                 }}|                     d           d|cxk    rdk    s&n t	          d                    dd          |          | j                            |||          S )Nr  rY   i r   z/Character value must be between {:#x} and {:#x}rH   )rf   rg   r  r   r   rx   r0   CharacterStatement)r@   r   rI   	characters       r   r  zParser.parse_cvCharacter_  s    +---t---"68O8O8Q8Q)C   I********!""(&H"5"5  
 x**9cH*MMMr   c                     | j         dk    sJ | j                     | j        |                                 }}|                     d           |dk    rt	          d|          | j                            ||          S )Nr  rY   r   z&Font revision numbers must be positiverH   )rf   rg   r5  r   r   r0   FontRevisionStatement)r@   rI   versions      r   r  zParser.parse_FontRevision_  s     .000$/000 4d6H6H6J6J'C   a<<!"JHUUUx--g-IIIr   c                    |                                  }i }|                     d           | j        dk    r)|                                  | j        t
          j        urt          d| j                  | j	        }||v rt          d| | j                  | j
        t
          j        u r|                                 }n)| j
        t
          j        u r|                     d          }| j
        t
          j        u r|                                 }n)| j
        t
          j        u r|                     d          }|                     d           ||f||<   | j        dk    )|                     d           |                                  }||k    rt          d|z  | j                  | j                            ||          S )	Nr  r   Expected an axis namezRepeated condition for axis Fr   rY   r  )r   r   r:   r?   rb   r   ru   r   rg   rf   r9   r  r5  r8  r   r0   ConditionsetStatement)r@   r]   
conditionsaxis	min_value	max_value	finalnames          r   rr   zParser.parse_conditionset_  s     ""
C   #%%!!!#5:55%&=t?WXXX?Dz!!%94994;S   $33 ..00		&%,66 ///??	$33 ..00		&%,66 ///??	$$$ )95Jt- #%%0 	C   %%''	!/D"8$:RSSSx--dJ???r   c                    |                      d           | j        D ]}|                                 |j        }| j        dk    s| j        rw|                     d           | j        t          j	        u r;|
                    | j                            | j        | j                             n| j        t          j        u r)|
                    |                                            n|                     d          r)|
                    |                                            n|                     ddh          r+|
                    |                     |	                     nC|                     d
          r)|
                    |                                            n|                     d          r)|
                    |                                            n|                     d          r)|
                    |                                            n|                     d          r*|
                    |                     |                     nJ|                     d          r)|
                    |                                            n|                     d          r)|
                    |                                            n|                     ddh          r,|
                    |                     d|                     n|                     d          r)|
                    |                                            nM|                     h d          r)|
                    |                                            n|                     d          r)|
                    |                                            n|                     d          r*|
                    |                     |                     n|r?|                     d          r*|
                    |                     |                     nO|r?|                     d          r*|
                    |                      |                     n|r=|                     d          r(|
                    | !                                           n|r=|                     d          r(|
                    | "                                           n| j        t          j#        u r=| j        | j$        v r/|
                     | j$        | j                 |                      n@| j        dk    rCtK          d&                    | j        | j                  | j                  | j        dk    o| j        w|                      d           | j        D ]}|'                                 | (                                }||j)        *                                k    r/tK          d|j)        *                                z  | j                  |                      d           d S )Nr  r   Tr'   rH   rN   r   r   rQ   rT   r  r  rP   r,  rS   r	  r  Fr   rf  >   r   rk  rl  r  r  rX   ry  r  r  r  rY   z7Expected glyph class definition or statement: got {} {}r  )+r   r8   r{  ra   r:   r;   r?   rb   r   rc   rd   r0   re   rf   rg   rj   rk   rh   rm   r   rw  r  r  ro   r>  rp   r   ri  r  r  rt   r~  r  r  r  ru   rv   r   rx   r|  r   r]   r  )	r@   r*  rR   rq  rs  rr  r}  ra   r]   s	            r   r(  zParser.parse_block_  se    	C   ) 	! 	!F    %
#%%);%...#u}44!!H$$T_t?W$XX    %)999!!$"C"C"E"EFFFF%%k22 1!!$"7"7"9"9::::%%v{&;<< /!!$"7"7"7"J"JKKKK%%i00 -!!$"?"?"A"ABBBB%%h// +!!$"4"4"6"67777%%j11 )!!$"6"6"8"89999%%h// '!!$"4"4X">">????%%l33 %!!$"8"8":":;;;;%%k22 #!!$"7"7"9"9::::%%uj&9:: !!!((EH(MM    %%h// !!$"4"4"6"67777%%&Q&Q&QRR !!$"8"8":":;;;;%%j11 !!$"6"6"8"89999%%&677 !!$"D"DX"N"NOOOO $"6"6~"F"F !!$":":<"H"HIIII  4 4^ D D !!$":"::"F"FGGGG $"6"6|"D"D !!$"="="?"?@@@@ $"6"6~"F"F !!$";";"="=>>>>$
22Ot66!!"B$/$/"B4"H"HIIIIC''%MTT,do  ,	  i #%%);%v 	C   ) 	  	 F  ""5:##%%%%!%*"2"2"4"44d6N   	C     r   c                     | j         t          j        u r1t          |t	          d                    r| j        |k    S | j        |v S dS )Nr   F)rb   r   ru   r   typerf   )r@   r#   s     r   rh   zParser.is_cur_keyword_  sI    5:--!T"XX&& ,!++!++ur   c                     |                                   | j        t          j        urt	          d| j                  | j        S )NzExpected @NAME)r?   rb   r   rj   r   rg   rf   rR  s    r   rA  zParser.expect_class_name_  sA    u'777!"2D4LMMMr   c                     |                                   | j        t          j        u r| j        S t          d| j                  )NzExpected a CID)r?   rb   r   r   rf   r   rg   rR  s    r   r   zParser.expect_cid_  s@    59,,?".0HIIIr   c                     |                                   | j        t          j        urt	          d| j                  | j        S )NzExpected file name)r?   rb   r   FILENAMEr   rg   rf   rR  s    r   r  zParser.expect_filename_%  s@    u~55!"68PQQQr   c                     |                                   | j        t          j        u r| j                            d          S | j        t          j        u r
d| j        z  S t          d| j                  )N\cid%05dzExpected a glyph name or CID)	r?   rb   r   ru   rf   lstripr   r   rg   rR  s    r   r   zParser.expect_glyph_+  sk    5:--?))$///!UY..t..<d>VWWWr   c                 f    | j         r'|D ]&}|| j         v r|| j        vr| j        | j        |<   %dS dS )zAdds a glyph name (just `start`) or glyph names of a
        range (`start` and `end`) which are not in the glyph set
        to the "missing list" for future error reporting.

        If no glyph set is present, does nothing.
        N)r/   r>   rg   )r@   r  r]   s      r   r   z$Parser.check_glyph_name_in_glyph_set3  sg      	B B B4+++t|++)-)ADL&	B 	BB Br   c                     |                                  }| j                            |          }|t          d|z  | j                  t          || j        j                  st          d|z  | j                  |S )NzUnknown markClass @%sz@%s is not a markClass)rA  r5   r   r   rg   r   r0   r   )r@   r]   mcs      r   r   z"Parser.expect_markClass_reference_A  s    &&((''--:!'$.0H   "dh011 	!(4/1I   	r   c                     |                                   | j        t          j        urt	          d| j                  t          | j                  dk    rt	          d| j                  | j        dz   d d         S )NzExpected a tagr.  z'Tags cannot be longer than 4 charactersz    )r?   rb   r   ru   r   rg   r,   rf   rR  s    r   r   zParser.expect_tag_N  s    uz11!"2D4LMMMt!##!94;S   &("1"--r   c                 d    |                                  }|dk    rt          d| j                  |S )Ndfltz4"dflt" is not a valid script tag; use "DFLT" insteadr   r   rg   r@   r   s     r   rg  zParser.expect_script_tag_X  s>      &==!F(   
r   c                 d    |                                  }|dk    rt          d| j                  |S )NDFLTz6"DFLT" is not a valid language tag; use "dflt" insteadr  r  s     r   r  zParser.expect_language_tag_a  s>      &==!H(   
r   c                     |                                   | j        t          j        u r| j        |k    r|S t          d|z  | j                  )NzExpected '%s')r?   rb   r   rw   rf   r   rg   )r@   symbols     r   r   zParser.expect_symbol_j  sM    5<//DOv4M4MMo68PQQQr   c                     |                                   | j        t          j        u r| j        |k    r| j        S t          d|z  | j                  )Nr  r?   rb   r   ru   rf   r   rg   )r@   ry  s     r   r   zParser.expect_keyword_p  sP    5:--$/W2L2L?"o79QRRRr   c                     |                                   | j        t          j        u r| j        S t          d| j                  )NzExpected a namer  rR  s    r   r   zParser.expect_name_v  s@    5:--?"/1IJJJr   c                     |                                   | j        t          j        u r| j        S |r2| j        t          j        u r| j        dk    r|                                 S t          d| j                  )NrQ  zExpected a number)	r?   rb   r   r8  rf   rw   expect_variable_scalar_r   rg   )r@   r   s     r   r   zParser.expect_number_|  sv    5<//?" 	2,<<TWAWAW//111143KLLLr   c                     |                                   t                      }	 | j        t          j        k    r| j        dk    rn.|                                 \  }}|                    ||           O|S )NTr\   )r?   r   rb   r   rw   rf   expect_master_	add_value)r@   scalarrI   r:  s       r   r  zParser.expect_variable_scalar_  sz    !!	.#u|3338N8N"1133OHeXu---		.
 r   c                    i }	 | j         t          j        urt          d| j                  | j        }|                                  | j         t          j        u r| j        dk    st          d| j                  |                                 }|||<   | j	        t          j        u r| j
        d         dk    rn]|                                  | j         t          j        u r| j        dk    st          d| j                  |                                  |                                  t          | j        d	d                    }|                                  ||fS )
NTr  r   zExpected an equals signr   :r   z#Expected an comma or an equals signr   )rb   r   ru   r   rg   rf   r?   rw   r   r9   r:   r  )r@   rI   r  r:  s       r   r  zParser.expect_master_  sk   	"#5:55%&=t?WXXX?D!!!(EL88T_PS=S=S%-t/G   ''))E"HTN$
22t7G7Jc7Q7Q!!!(EL88T_PS=S=S%94;S   !!!'	"( 	DOABB'((r   c                     |                                   | j        t          j        v r| j        S t          d| j                  )Nz/Expected a decimal, hexadecimal or octal number)r?   rb   r   r  rf   r   rg   rR  s    r   r  zParser.expect_any_number_  sF    5=00?"=t?W
 
 	
r   c                     |                                   | j        t          j        u r| j        S t          d| j                  )Nz Expected a floating-point number)r?   rb   r   r  rf   r   rg   rR  s    r   r5  zParser.expect_float_  sF    5;..?".0H
 
 	
r   c                     | j         t          j        k    r|                                 S | j         t          j        u r|                                 dz  S t          d| j                  )Nr  ,Expected an integer or floating-point numberr9   r   r  r5  r8  r   r   rg   rR  s    r   r  zParser.expect_decipoint_  se     EK//%%'''"el22&&((2--!>@X  r   c                     d}ddd}| j         dk    rQ| j         |v r |                                 }|||         z  }nt          d| j         | j                  | j         dk    Q|S )Nr   r   r-  )OlderSiblingFontAttributeElidableAxisValueNamerY   zUnexpected STAT flag )r:   r   r   rf   rg   )r@   r:  r<  r]   s       r   r.  zParser.expect_stat_flags  s    )*%&
 
 #%%5((((**d+%=DO==t?W   #%% r   c                     | j         t          j        k    r|                                 S | j         t          j        u r|                                 S t          d| j                  )Nr  r  rR  s    r   expect_stat_values_zParser.expect_stat_values_  s`     EK//%%'''"el22&&(((!>@X  r   c                     |                                   | j        t          j        u r| j        S t          d| j                  )NzExpected a string)r?   rb   r   STRINGrf   r   rg   rR  s    r   r  zParser.expect_string_  s@    5<//?"143KLLLr   c                    |rA| j         r:t          j        | _        | j                             d          \  | _        | _        d S | j        | j        | j	        c| _        | _        | _        	 	 t          | j                  \  | _        | _        | _	        n# t          $ r d\  | _        | _        Y nw xY w| j        t          j        k    rd S | j                             | j        | j	        f           )Nr   Tr%   )r;   r   rc   rb   r+   rf   rg   r9   r:   r<   nextr=   StopIterationrd   )r@   r(   s     r   r?   zParser.advance_lexer_  s    		* 		#(=D 8<8J8N8Nq8Q8Q5DOT5F % ) LD $/43K
	UG
 %%	)$--  G G G:F7%t'7'7'7G$55%%t'79R&STTT	Us   +'B B/.B/c                 `    d                     t          t          |                               S )z'abc' --> 'cba'r   )r-   r  rU  )r   s    r   reverse_string_zParser.reverse_string_  s$     wwxQ(()))r   c                     t                      }||k    rt          d|          t          ||dz             D ]}|                    d|z             |S )z>(location, 999, 1001) --> ["cid00999", "cid01000", "cid01001"]z*Bad range: start should be less than limitr   r  )rU  r   r   rd   )r@   rI   r   r   rO  r   s         r   r   zParser.make_cid_range_ 	  sh    5==!<h   	** 	+ 	+CMM)c/****r   c                 \   t                      }t          |          t          |          k    rt          d|d|d|          | j        }t          j                            ||g          } |t          j                             ||           ||          g                    }t          |          dk    rK|t          |          t          |                    }|t          |          t          |                    }	n.|t          |          d         }|t          |          d         }	||	k    rt          d|          t          j        d          }
|
	                    |          rb|
	                    |	          rMt          t          |          t          |	          dz             D ]}|                    d	|||fz             |S t          j        d
          }|	                    |          rb|	                    |	          rMt          t          |          t          |	          dz             D ]}|                    d	|||fz             |S t          j        d          }|	                    |          r|	                    |	          rwt          t          |d          t          |	d          dz             D ]E}dt          |          z   t          |           d         }|                    |||           F|S t          d|d|d|          )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}$r  000r   r   )rU  r,   r   r  ospathcommonprefixr  compiler  r   ordrd   r  r   )r@   rI   r   r   rO  revr   r   start_rangelimit_range	uppercasec	lowercasedigitsr   r\  s                   r   r   zParser.make_glyph_range_	  s#   u::U##!/JO%%QVQVQVW  
 "%%uen55RW))33u::ss5zz*BCCDDv;;??Fs6{{l :;KFs6{{l :;KKF.KF.K+%%!=x   Jz**	??;'' 	IOOK,H,H 	3{++S-=-=-ABB > >h&!V)<<====MJz**	??;'' 	IOOK,H,H 	3{++S-=-=-ABB > >h&!V)<<====MO,,<<$$ 	k)B)B 	3{B//["1E1E1IJJ C C#a&&.3{+;+;*;*=*=>&&&&&&ABBBBMoeeeUUUCXNNNr   )r   TN)F)NFN)k__name__
__module____qualname____doc__rv   r0   r   rm  rn  rF   r{   r   r   rm   rl   r   r   r   rk   r   r   r   r  r  r  ri   r  r  r#  ro   r>  rp   r   rM  rN  rO  rP  ri  r  r  r  r  rs   r  r  r  r  r  r  r  r  r  staticmethodr  r  r  r  r  r  r(  r2  r-  r  r  r  rB  r  r   r   r   rt   rn   rq   rw  r~  r  r  r  r  rr   r(  rh   rA  r   r  r   r   r   r   rg  r  r   r   r   r   r  r  r  r5  r  r.  r  r  r?   r  r   r   r   r   r   r   r      s        0 J
C>>UU1f-=-=>>>O>>UU1f-=-=>>>O KO+ + + +B= = =~4
 4
 4
l
 
 
  "
H 
H 
H	R 	R 	RH H H
 
 
8  ( ( (Tb b b bH[G [G [Gz  &  
 
 
A A A
 
 
Y Y YW W W  27
 7
 7
r  ,3
 3
 3
j
 
 
 M M MQ Q Q"R R RC C Cx x xt= = =
 
 
$
 
 
  <  0Y Y Y  6  8S S S"8 8 8@8 8 8:

 

 


) 
) 
)   \ 4 4 \4  ; ; ;z* * *X  8 
  
  
D6
 6
 6
p@ @ @B' ' 'R
 
 

 
 
, , ,: : :&  
 
 
L
 L
 L
\	 	 	U U U$ $ $ $LR R R! ! !F+ + +Z" " "H
N 
N 
NJ J J#@ #@ #@L RVL! L! L! L!\    J J J  X X XB B B  . . .    R R RS S SK K KM M M M    6
 
 

 
 
       M M MU U U U0 * * \*	 	 	+O +O +O +O +Or   r   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )r3   c                     i g| _         d S r!   scopes_rR  s    r   rF   zSymbolTable.__init__:	  s    tr   c                 :    | j                             i            d S r!   )r  rd   rR  s    r   r{  zSymbolTable.enter_scope=	  s    Br   c                 8    | j                                          d S r!   )r  r+   rR  s    r   r|  zSymbolTable.exit_scope@	  s    r   c                 &    || j         d         |<   d S )Nr   r  )r@   r]   items      r   r   zSymbolTable.defineC	  s    !%Rr   c                 j    t          | j                  D ]}|                    |          }|r|c S d S r!   )r  r  rC  )r@   r]   scoper  s       r   r   zSymbolTable.resolveF	  sE    dl++ 	 	E99T??D tr   N)r  r  r  rF   r{  r|  r   r   r   r   r   r3   r3   9	  s_                 & & &    r   r3   )fontTools.feaLib.errorr   fontTools.feaLib.lexerr   r   r   fontTools.feaLib.variableScalarr   fontTools.misc.encodingToolsr   fontTools.misc.textToolsr	   r
   r   fontTools.feaLib.astfeaLibr0   loggingr  r  	getLoggerr  r   objectr   r3   r   r   r   <module>r     s1   2 2 2 2 2 2 K K K K K K K K K K : : : : : : 4 4 4 4 4 4 < < < < < < < < < < " " " " " " " " "  				 				 g!!g$O g$O g$O g$O g$OV g$O g$O g$OTI    &     r   