
    <`jn                        d dl mZ d dlmZmZ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)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	 dfd
Z	d Z
d Zd Zd Zd Zd Zd Zd Zd Zd Zdgd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 Z2e3d5             Z4e3d6             Z5d7 Z6d8 Z7d9 Z8d: Z9d; Z:d< Z;d= Z<d> Z=d? Z>d@ Z?dA Z@dB ZAdC ZBdD ZCdE ZDdF ZEdG ZFdH ZGdI ZHdJ ZIdK ZJdL ZK	 dhdMZLdN ZMdO ZNdP ZOdQ ZPdR ZQdS ZRdT ZSdU ZTdV ZUdW ZVdX ZWdY ZXdZ ZYd[ ZZd\ Z[d] Z\d^ Z]d_ Z^d` Z_da Z`dgdbZae3dc             Zbdd Zcde Zdd	S )i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     7lib/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,          } |||          | _        |                     d           d S )NglyphMapr   )deprecateArgumentz#use 'glyphNames' (iterable) insteadz?'glyphNames' and (deprecated) 'glyphMap' are mutually exclusivezunsupported keyword argumentr    sz: , 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_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                 L   | j         j        }| j        | j        r|                     d           | j        t          j        u r;|                    | j	        
                    | j        | j                             n|                     d          r)|                    |                                            n| j        t          j        u r)|                    |                                            n|                     d          r)|                    |                                            nW|                     d          r)|                    |                                            n|                     d          r)|                    |                                            n|                     d	          r+|                    |                     d
                     n|                     d          r)|                    |                                            n]|                     d          r)|                    |                                            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Ot9          d                    | j        | j                  | j                  | j        {| j        | 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tablevalueRecordDef;zbExpected feature, languagesystem, lookup, markClass, table, or glyph class definition, got {} "{}")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_table_parse_valuerecord_definition_NAME
extensionsSYMBOLr   format)r?   rW   s     r   parsezParser.parseM   s    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 !!$";";"="=>>>>%%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 ,  E #/43E/R 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 }| j        dk    r)|                     d           |                                 }| j        dk    r)|                                 }|                                 }nd\  }}|                      d           | j                            ||d ||||          S )	N<anchorNULL>zUnknown anchor "%s")namecontourpointxDeviceTableyDeviceTablerH   ru   r%   )expect_symbol_expect_keyword_r]   r:   r9   r   rj   expect_name_r4   resolver   r0   Anchorxyru   expect_number_parse_device_)	r?   rH   rt   	anchordefr}   r~   ru   rv   rw   s	            r   parse_anchor_zParser.parse_anchor_}   s    	C   X&&&+v%%  ((($$$4 EJ..$$&&D--d33I %)D0$2J   $$$8??&3!!! #    ""$$d&9&9&;&;1~--  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 )Nrp   mark)r:   r   ry   expect_markClass_reference_rZ   )r?   anchorMarksrq   rR   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 )NrM   ru   rV   )ru   rH   )r^   r]   r   r:   ry   rz   rx   r0   AnchorDefinitionr4   define)r?   rH   r}   r~   ru   rt   r   s          r   rc   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 )NrJ   }z-bad splitting in Lexer.scan_anonymous_block()rV   rG   )r^   expect_tag_r=   scan_anonymous_blockr>   rx   r0   AnonymousBlock)r?   tag_contentrH   end_tags         r   rb   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_glyphnamerV   rG   )	r^   r]   parse_glyphclass_r   r:   addrx   r0   AttachStatement)r?   rH   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
enumeratedrQ   )r\   r>   parse_position_)r?   rQ   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   rV   rG   )r^   r]   r:   r   rx   r0   GlyphClassDefStatement)r?   rH   
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   rV   rG   )r]   r\   rx   r   r0   GlyphClassDefinitionr5   r   )r?   rH   rt   r   
glyphclasss        r   ra   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   
<listcomp>z-Parser.split_glyph_range_.<locals>.<listcomp>6  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/   rZ   r   )	r?   rt   rH   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 )Nrr   rG   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   rj   CIDr:   r>   r0   	NullGlyphr]   expect_glyph_check_glyph_name_in_glyph_set	GlyphNamer`   r5   r{   r\   r   
isinstance	MarkClassMarkClassNameGlyphClassNamerx   
GlyphClassr/   r   	add_rangemake_glyph_range_logwarningstrrZ   expect_cid_add_cid_rangemake_cid_range_	add_classr<   )r?   r   accept_nullglyphgcrH   r   r   r   range_locationrange_start	range_end
glyph_names                r   r   zParser.parse_glyphclass_=  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   rV   Tr   'z_Unsupported contextual target sequence: at most one run of marked (') glyph/class names allowedrO   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   rx   r   r]   rZ   is_next_value_parse_valuerecord_ry   rz   r6   r{   r,   any)r?   rQ   prefixr   lookupsvaluessuffixhasMarksr   marked
lookuplistlookup_namerO   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          \  }}}}}}|||fg}t          |          }	| j        dk    rf|                     d           |                     d          \  }}}}}}|                    |||f           |	pt          |          }	| j        dk    f|                     d           ||	fS )NFrP   r   rV   )r]   r   r   r:   rx   rZ   )
r?   rH   r   r   r   r   r   r   chainContext
hasLookupss
             r   parse_chain_context_zParser.parse_chain_context_  s    +<@<U<U =V =
 =
9  01\\
#%%$$$ ))5)99 8999#3s7||J #%% 	C   Z''r   c                    |                      d          sJ | j        }|                                  | j        dv rE|                                 \  }}|rt          d|          | j                            ||          S | j        dv rE|                                 \  }}|rt          d|          | j                            ||          S t          d| j                  )Nignore)
substitutesubz,No lookups can be specified for "ignore sub"rG   )positionposz,No lookups can be specified for "ignore pos"z#Expected "substitute" or "position")	r^   r]   r>   r\   r   r   r0   IgnoreSubstStatementIgnorePosStatement)r?   rH   r   r   s       r   parse_ignore_zParser.parse_ignore_  s   ##H-----+?333'+'@'@'B'B$L* %BH   8000QQQ?111'+'@'@'B'B$L* %BH   8..|h.OOO143K
 
 	
r   c                 ~    | j         dk    sJ | j        }|                                 }t          j        ||          S )NrI   rG   )r\   r]   expect_filename_r0   IncludeStatement)r?   rH   filenames      r   r_   zParser.parse_include_+  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  requiredTrV   rG   )	r^   r]   expect_language_tag_r:   rz   ry   rx   r0   LanguageStatement)r?   rH   r  include_defaultr  s        r   parse_language_zParser.parse_language_2  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   rV   rG   )	r^   r]   r   r   r:   rZ   rx   r0   LigatureCaretByIndexStatementr?   rH   r   caretss       r   parse_ligatureCaretByIndex_z"Parser.parse_ligatureCaretByIndex_A  s    ##$:;;;;;+'''>>%%''(#%%MM$--//000 #%%C   x55ffx5XXXr   c                 r   |                      d          sJ | j        }|                     d          }|                                 g}| j        dk    r2|                    |                                            | j        dk    2|                     d           | j                            |||          S )NLigatureCaretByPosTr   rV   rG   )	r^   r]   r   r   r:   rZ   rx   r0   LigatureCaretByPosStatementr  s       r   parse_ligatureCaretByPos_z Parser.parse_ligatureCaretByPos_K  s    ##$899999+'''>>%%''(#%%MM$--//000 #%%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 )NrO   rV   r   rG   FuseExtensionT)r^   r]   rz   r:   r6   r{   r   rx   r0   LookupReferenceStatementry   LookupBlockparse_block_r   )r?   rQ   rH   rt   rO   use_extensionblocks          r   re   zParser.parse_lookup_U  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
lookupflagrV   rG   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markFilteringSetrH   )r^   r]   r9   r   NUMBERr   rx   r0   LookupFlagStatementr.   r:   r   r<   r   ry   r   rz   r   )r?   rH   value
value_seenr(  r)  flagsseens           r   parse_lookupflag_zParser.parse_lookupflag_n  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          }|                                 }|                                 }|                     d           | j        j                            |          }|D| j	        
                    |          }|| j        j        |<   | j                            ||           | j	                            ||||          }|                    |           |S )NrR   Tr   rV   rG   )r^   r]   r   r   expect_class_name_rx   r2   markClassesgetr0   r   r5   r   MarkClassDefinitionaddDefinition)r?   rH   r   rq   rt   rR   mcdefs          r   rf   zParser.parse_markClass_  s   ##K00000+'''>>##%%&&((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   rV   z3If "lookup" is present, no values must be specifiedrG   r  r   r   )r   rH   z2"enumerate" is only allowed with pair positionings
forceChainrH   )r\   r:   parse_position_cursive_parse_position_base_parse_position_ligature_parse_position_mark_r]   r   rx   r   r   r0   ChainContextPosStatementr,   reversePairPosStatementSinglePosStatementlistzip)
r?   r   rQ   rH   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 )Nr9  z>"enumerate" is not allowed with cursive attachment positioningTr   rV   rG   )r]   ry   r   r   r   rx   r0   CursivePosStatement)r?   r   rQ   rH   r   entryAnchor
exitAnchors          r   r>  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 )Nr:  zC"enumerate" is not allowed with mark-to-base attachment positioningTr   rV   rG   )r]   ry   r   r   r   rx   r0   MarkBasePosStatement)r?   r   rQ   rH   r:  markss         r   r?  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 )Nr;  zG"enumerate" is not allowed with mark-to-ligature attachment positioningTr   ligComponentrV   rG   )
r]   ry   r   r   r   r:   rZ   rx   r0   MarkLigPosStatement)r?   r   rQ   rH   	ligaturesrN  s         r   r@  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   rV   rG   )r]   ry   r   r   r   rx   r0   MarkMarkPosStatement)r?   r   rQ   rH   	baseMarksrN  s         r   rA  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scriptrV   rG   )r^   r]   expect_script_tag_rx   r0   ScriptStatement)r?   rH   rW  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                                                   dk    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 |st          |          dk    rt          |d                                                   dk    rt          |	          dk    rt#          d |	D                       dk    rh|dk    rb| j                            |t%          |d                                                   d         |t%          d |	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   >   r\  r]  FrP   z-Substitution statements cannot contain valuesr   rV   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"rG   c                     g | ]}||S r!   r   )r   r   s     r   r   z,Parser.parse_substitute_.<locals>.<listcomp>d  s    ???1r   z\Expected a glyph class with %d elements after "by", but found a glyph class with %d elementsr<  r   c                 P    g | ]#}t          |                                          $S r   )r,   glyphSetr   ns     r   r   z,Parser.parse_substitute_.<locals>.<listcomp>  s(    4441S&&444r   c                 \    g | ])}t          |                                          d          *S )r   )rF  r`  ra  s     r   r   z,Parser.parse_substitute_.<locals>.<listcomp>  s-    :::tAJJLL))!,:::r   z\In reverse chaining single substitutions, only a single glyph or glyph class can be replacedzlIn reverse chaining single substitutions, the replacement (after "by") must be a single glyph or glyph classz8Reverse chaining substitutions cannot call named lookupszJDirect substitution of multiple glyphs by multiple glyphs is not supportedzInvalid substitution statement)r\   r]   r   r   r   r:   ry   r   rZ   rx   r,   r`  r0   AlternateSubstStatementrF  SingleSubstStatementMultipleSubstStatementmaxtupleLigatureSubstStatementsorted ReverseChainSingleSubstStatementChainContextSubstStatement)r?   rH   rC  
old_prefixoldr   r   
old_suffixr   newkeywordr   num_lookupsis_deletionr   replacementsrules                    r   parse_substitute_zParser.parse_substitute_1  sn   "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==SQ!2!233q88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    	CACFOO%%&&!++C14444455::q  822c!foo''((+::c:::;;#! 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subtablerV   rG   )r^   r]   rx   r0   SubtableStatement)r?   rH   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   rV   rG   )r^   r]   expect_decipoint_r   r9   r   r*  FLOATrx   r0   SizeParameters)r?   rH   
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sizerG   )r^   r]   parse_name_r0   FeatureNameStatement)r?   rH   
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 )	NrT   rG   {)GDEFheadhheavheart   BASEzOS/2STATz"table %s" is not supportedr   Expected "%s"rV   )r^   r]   r   r0   
TableBlockrx   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_r4  r   strip)r?   rH   rt   rT   handlerr   s         r   rh   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'   rG   r   r   r  r  rV   z<Expected Attach, LigatureCaretByIndex, or LigatureCaretByPos)rW   r:   r;   r>   rX   r   rY   rZ   r0   r[   r\   r]   r^   r   r   r  r  r   r?   rT   rW   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'   rG   FontRevisionrV   zExpected FontRevision)rW   r:   r;   r>   rX   r   rY   rZ   r0   r[   r\   r]   r^   parse_FontRevision_r   r  s      r   r  zParser.parse_table_head_9  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'   rG   rV   Incomplete statementz4Expected CaretOffset, Ascender, Descender or LineGap)rW   r:   r;   r>   rX   r   rY   rZ   r0   r[   r\   r]   rj   lowerr   	HheaFieldr   r<   r?   rT   rW   fieldskeyr,  s         r   r  zParser.parse_table_hhea_H  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'   rG   rV   r  z?Expected VertTypoAscender, VertTypoDescender or VertTypoLineGap)rW   r:   r;   r>   rX   r   rY   rZ   r0   r[   r\   r]   rj   r  r   	VheaFieldr   r<   r  s         r   r  zParser.parse_table_vhea_c  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'   rG   nameidrV   zExpected nameid)rW   r:   r;   r>   rX   r   rY   rZ   r0   r[   r\   r]   r^   parse_nameid_r   )r?   rT   rW   	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   	  rV   Unsupported encoding)
r9   r   NUMBERSexpect_any_number_r]   r   expect_string_rx   r   unescape_string_r?   r  r  r  rH   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  r]   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                  d|cxk    rdk    r6n n3t                              d|z             |                                  d S |                                 \  }}}}| j                            ||||||          S )Nr  i  z*Name id value cannot be greater than 32767r      z?Name id %d cannot be set from the feature file. Ignoring recordrG   )	r\   r]   r  r   r   r   r  r0   
NameRecord)r?   rH   nameIDr  r  r  r  s          r   r  zParser.parse_nameid_  s    (***DO***3T5L5L5N5N&E>>!<d>V   !KK"$*+   4040@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)matchrb  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  rb  s      r   r  zParser.unescape_byte_  s>    KKNN122s1bzz""))(333r   c                    |j         }| j        dk    s| j        r|                     d           | j        t
          j        u r;|                    | j        	                    | j
        | j                             n>|                     d          r|                                 }n|                     d          rY|                     t          |                    }|                    | j                            ||d| j                             n|                     d          r|                                 }n{|                     d	          rY|                     t          |                    }|                    | j                            ||d| j                             n| j
        d
k    r| j        dk    | j        d S d S )Nr   Tr'   rG   HorizAxis.BaseTagListHorizAxis.BaseScriptListFVertAxis.BaseTagListVertAxis.BaseScriptListrV   )rW   r:   r;   r>   rX   r   rY   rZ   r0   r[   r\   r]   r^   parse_base_tag_list_parse_base_script_list_r,   BaseAxis)r?   rT   rW   horiz_baseshoriz_scripts
vert_basesvert_scriptss          r   r  zParser.parse_table_BASE_  s   %
#%%);%...#u}44!!H$$T_t?W$XX    %%&=>> "7799%%&@AA  $ < <S=M=M N N!!H%%#%!%!9	 &      %%&<== !6688

%%&?@@ #;;C
OOLL!!H%%"$!%!9	 &      C''? #%%);%%%%%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'   rG   Panose
   rV   Vendor)rW   r:   r;   r>   rX   r   rY   rZ   r0   r[   r\   r]   rj   r  r   r^   r   r  OS2Field)r?   rT   rW   numbersr   r  r,  r   s           r   r  zParser.parse_table_OS_2_  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   rt   statrG   rV   Unexpected token z in ElidedFallbackNameExpected "name")r^   rx   r:   r;   r>   r  r0   STATNameStatementr]   rZ   r\   r   )r?   namesr  r  r  r  
nameRecords          r   parse_STAT_ElidedFallbackNamez$Parser.parse_STAT_ElidedFallbackNameF  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   rt   r  rG   rV   zExpected "name", got )r^   r   isupperr   r   r   rx   r:   r;   r>   rX   r   rY   r]   r  r0   r  rZ   r\   r   STATDesignAxisStatement)
r?   r	  axisTag	axisOrderrH   r  r  r  r  rt   s
             r   parse_STAT_design_axiszParser.parse_STAT_design_axisb  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'   rt   r  rG   rH   flagrV   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.)r^   rx   r:   r;   r>   rX   r   rY   r]   r  r0   r  rZ   parse_STAT_locationexpect_stat_flagsr\   r   r,   r   r   STATAxisValueStatement)r?   	locationsr	  r.  rH   r  r  r  r  rt   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 charactersrV   zUnexpected value "z". Expected integer or float.r  zDefault value z is outside of specified range r   .)r   r,   r  r   r\   r]   r:   r9   r   r~  expect_float_rZ   r*  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'   rG   r  ElidedFallbackNameIDrV   r  r  zDesignAxis not defined for r#  r  )rW   r:   r;   r>   rX   r   rY   rZ   r0   r[   r\   r]   rj   r^   r  r  r   r*  rx   r  r   r!  r  r   )	r?   rT   rW   design_axesr	  r,  
designAxisaxisValueRecordrH   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  rV   )r\   r:   rZ   rX  rx   )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   rV   )r\   parse_base_script_record_r:   rx   rZ   )r?   countscriptss      r   r  zParser.parse_base_script_list_  s     #
 
 
 
 ?
 
 
 2259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>!  s%    >>>A$%%''>>>r   )rX  r   )r?   r2  
script_tagbase_tagcoordss   `    r   r1  z Parser.parse_base_script_record_  sQ    ,,..
**,,>>>>u>>>8V++r   c                    d }|                      d           |                     d           | j        dk    r|                     d           n|                                 |                                 fg}| j        dk    r[|                      d           |                    |                                 |                                 f           | j        dk    [t          |          }|                      d           |S )Nrp   devicerr   r   rs   )rx   ry   r:   r   rZ   rh  )r?   results     r   r   zParser.parse_device_$  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                 >    | j         t          j        u p
| j        dk    S )Nrp   )r9   r   r*  r:   r?   s    r   r   zParser.is_next_value_3  s    $4O8HC8OOr   c                    | j         t          j        u rZ|                                 | 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        }}
nS|                                 |                                 |                                 |                                 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 )N)yAdvancerQ   rH   )xAdvancerQ   rH   rp   rr   rs   zUnknown valueRecordDef "%s"c                     g | ]\  }}|S r   r   )r   r  deltas      r   r   z-Parser.parse_valuerecord_.<locals>.<listcomp>a  s,       #e   r   r   r   ir      z+Device value out of valid range (-128..127))NNNN)rQ   rH   )r9   r   r*  r   r]   r0   ValueRecordrx   rj   rz   r7   r{   r   r,  
xPlacement
yPlacementr@  r?  r:   r   rj  )r?   rQ   numberrH   valrt   vrdr,  rE  rF  r@  r?  
xPlaDevice
yPlaDevice
xAdvDevice
yAdvDevice	allDeltass                    r   r   zParser.parse_valuerecord_6  s    EL00#2244d6NHF h**#h +   h**#h +   JC   + EJ..$$&&Dv~~##C(((x++---$,,T22C{%1D8$:R   IE&+&68H
J"'.%.hHH ##%%##%%##%%##%%	: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 )NrU   rV   rG   )	r^   r]   r   rz   rx   r0   ValueRecordDefinitionr7   r   )r?   rQ   rH   r,  rt   rI  s         r   ri   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 )NrN   rV   rG   )r\   r]   rX  r  rx   r0   LanguageSystemStatement)r?   rH   rW  r  s       r   rd   zParser.parse_languagesystem_  sq    "22222+((**,,..C   x//8/TTTr   c                 ^   | j         dk    sJ | j        }|                                 }|dv }d }d }d}|| j        v r|}n|| j        v r|}n|dk    rd}d}| j        dk    r|                     d           d}| j                            |||          }| 	                    |||||           |S )NrS   >   valtvhalvkrnvpalFr  Tr  )r  rH   )
r\   r]   r   SS_FEATURE_TAGSCV_FEATURE_TAGSr:   ry   r0   FeatureBlockr  )	r?   rH   r   rQ   stylisticset
cv_featuresize_featurer  r  s	            r   rg   zParser.parse_feature_block_  s    )+++++  ::
$&&&LLD(((JJF]]L~--  000 M%%}x & 
 
 	%<zRRRr   c                     | j         dk    sJ | j                     | j        }|                                 }|                     d           | j                            ||          S )NrS   rV   rG   )r\   r]   r   rx   r0   FeatureReferenceStatement)r?   rH   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>`_.featureNamesrG   r  r   Tr'   rt   rV   r  )r\   r0   NestedBlockr]   rx   r8   enter_scoper:   r;   r>   rX   r   rY   rW   rZ   r[   r^   r  r  r   
exit_scope)	r?   r   r  symtabrH   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cvParametersrG   r  r   Tr'   >   SampleTextNameIDFeatUILabelNameIDParamUILabelNameIDFeatUITooltipTextNameID	CharacterrV   zExpected statement: got {} {})r\   r0   rd  r]   rx   r8   re  rW   r:   r;   r>   rX   r   rY   rZ   r[   r^   parse_cvNameIDs_parse_cvCharacter_r   rm   rf  )r?   r   r  rg  rW   s        r   parse_cvParameters_zParser.parse_cvParameters_  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 )	NrG   r  r   Tr'   rt   rV   r  )r\   r0   rd  r]   rx   r8   re  r:   r;   r>   rX   r   rY   rW   rZ   r[   r^   r  CVParametersNameStatementr   rf  )
r?   r   
block_namer  rg  rH   r  r  r  r  s
             r   rp  zParser.parse_cvNameIDs_  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 )Nro  rV   i r   z/Character value must be between {:#x} and {:#x}rG   )r\   r]   r  rx   r   rm   r0   CharacterStatement)r?   r   rH   	characters       r   rq  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  rV   r   z&Font revision numbers must be positiverG   )r\   r]   r$  rx   r   r0   FontRevisionStatement)r?   rH   versions      r   r  zParser.parse_FontRevision_3  s     .000$/000 4d6H6H6J6J'C   a<<!"JHUUUx--g-IIIr   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}	d}
|D ]{}tW          || j        j,                  r#t[          |j.        |j/        |j0        g           }	?tW          || j        j1                  r"t[          |j.        |j/        |j0        g           }
||	r|
rg }|j        D ]}tW          || j        j,                  r|j2        d         3                                }|j4        d         3                                }tk          |          d k    r|tk          |          z  }tm          |          D ]S\  }}|
                    | j        1                    |j.        ||j/        ||         g|j0        |j7                             T|
                    |           ||_        d S d S d S )!Nr  r   Tr'   rG   rM   r   r   rP   rS   r   r  rO   r  rR   r   r   Fr   rW  >   r   r\  r]  r   rx  rU   rc  rj  r|  r  rV   z7Expected glyph class definition or statement: got {} {}r  r   r   )8rx   r8   re  rW   r:   r;   r>   rX   r   rY   rZ   r0   r[   r\   r]   r`   ra   r^   rc   r   ra  r   r  re   r0  rf   r   rZ  rv  rz  ri   rh  rr  r  r  rj   rk   r   rm   rf  rz   rt   r  r   re  r   r   r   r=  rf  r   r`  rt  r,   r   rH   )r?   r  rQ   r[  r]  r\  rg  rW   rt   
has_singlehas_multipler   r   rt  r   r   s                   r   r  zParser.parse_block_=  s-    	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    
 	K 	KA!TX:;; K!$ah!,%G!H!HH

Atx>?? K#&!(AL'I#J#JJ  	*, 	*J% ) )a!>?? )Xa[1133F#$>!#4#=#=#?#?L<((A--$F3$-f$5$5 
 
5")) H;; ! % !!-a 1 !)* <  	 	 	 	
 %%a(((()E+	* 	* 	* 	*r   c                     | j         t          j        u r1t          |t	          d                    r| j        |k    S | j        |v S dS )Nr   F)rX   r   rj   r   typer\   )r?   r#   s     r   r^   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>   rX   r   r`   r   r]   r\   r=  s    r   r2  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>   rX   r   r   r\   r   r]   r=  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>   rX   r   FILENAMEr   r]   r\   r=  s    r   r   zParser.expect_filename_  s@    u~55!"68PQQQr   c                 Z   |                                   | j        t          j        u rS| j                            d          | _        t          | j                  dk    rt          d| j                  | j        S | j        t          j	        u r
d| j        z  S t          d| j                  )N\?   z1Glyph names must not be longer than 63 characterscid%05dzExpected a glyph name or CID)
r>   rX   r   rj   r\   lstripr,   r   r]   r   r=  s    r   r   zParser.expect_glyph_  s    5:--"o44T::DO4?##b((%G,   ?"!UY..t..<d>VWWWr   c                       j         r; fd|D             }|r-t          dd                    |            j                  dS dS )zRaises if glyph name (just `start`) or glyph names of a
        range (`start` and `end`) are not in the glyph set.

        If no glyph set is present, does nothing.
        c                 &    g | ]}|j         v|S r   )r/   )r   rt   r?   s     r   r   z8Parser.check_glyph_name_in_glyph_set.<locals>.<listcomp>  s&    NNNT=M1M1Mt1M1M1Mr   zMThe following glyph names are referenced but are missing from the glyph set: r   N)r/   r   r-   r]   )r?   r	  missings   `  r   r   z$Parser.check_glyph_name_in_glyph_set  s{      	NNNNNNNG %7"&))G"4"47 7,  	 	 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)r2  r5   r{   r   r]   r   r0   r   )r?   rt   mcs      r   r   z"Parser.expect_markClass_reference_  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>   rX   r   rj   r   r]   r,   r\   r=  s    r   r   zParser.expect_tag_  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   r]   r?   r   s     r   rX  zParser.expect_script_tag_  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_  s>      &==!H(   
r   c                     |                                   | j        t          j        u r| j        |k    r|S t          d|z  | j                  )NzExpected '%s')r>   rX   r   rl   r\   r   r]   )r?   symbols     r   rx   zParser.expect_symbol_  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>   rX   r   rj   r\   r   r]   )r?   rq  s     r   ry   zParser.expect_keyword_  sP    5:--$/W2L2L?"o79QRRRr   c                     |                                   | j        t          j        u r| j        S t          d| j                  )NzExpected a namer  r=  s    r   rz   zParser.expect_name_  s@    5:--?"/1IJJJr   c                     |                                   | j        t          j        u r| j        S t          d| j                  )NzExpected a number)r>   rX   r   r*  r\   r   r]   r=  s    r   r   zParser.expect_number_#  @    5<//?"143KLLLr   c                     |                                   | j        t          j        v r| j        S t          d| j                  )Nz/Expected a decimal, hexadecimal or octal number)r>   rX   r   r  r\   r   r]   r=  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>   rX   r   r~  r\   r   r]   r=  s    r   r$  zParser.expect_float_1  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~  r$  r*  r   r   r]   r=  s    r   r}  zParser.expect_decipoint_9  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ElidableAxisValueNamerV   zUnexpected STAT flag )r:   rz   r   r\   r]   )r?   r,  r.  rt   s       r   r  zParser.expect_stat_flagsC  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  r=  s    r   expect_stat_values_zParser.expect_stat_values_S  s`     EK//%%'''"el22&&(((!>@X  r   c                     |                                   | j        t          j        u r| j        S t          d| j                  )NzExpected a string)r>   rX   r   STRINGr\   r   r]   r=  s    r   r  zParser.expect_string_]  r  r   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   rY   rX   r+   r\   r]   r9   r:   r<   nextr=   StopIterationrZ   )r?   r(   s     r   r>   zParser.advance_lexer_c  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-   reversedrF  )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  )rF  r   r   rZ   )r?   rH   r   r   r;  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   )rF  r,   r   r  ospathcommonprefixr  compiler  r   ordrZ   r  r   )r?   rH   r   r   r;  revr   r   start_rangelimit_range	uppercasec	lowercasedigitsr   rG  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)e__name__
__module____qualname____doc__rk   r0   r   rX  rY  rE   rn   r   r   rc   rb   r   r   r   ra   r   r   r   r   r   r_   r  r  r  re   r0  rf   r   r>  r?  r@  rA  rZ  rv  rz  r  r  rh   r  r  r  r  r  r  r  r  r  staticmethodr  r  r  r  r  r  r!  r  r  r  r  r1  r   r   r   ri   rd   rg   ra  rh  rr  rp  rq  r  r  r^   r2  r   r   r   r   r   r   rX  r  rx   ry   rz   r   r  r$  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p p pd= = =
 
 
$
 
 
  <  0Y Y Y  6  8S S S"8 8 8@8 8 8:
 
 
(
) 
) 
)   \ 4 4 \4! ! !F* * *X  8 
  
  
D6
 6
 6
p@ @ @B' ' 'R
 
 

 
 
, , ,  P P PG
 G
 G
R	 	 	U U U  6R R R     D+ + +Z" " "H
N 
N 
NJ J J RVr* r* r* r*h    J J J  X X X    . . .    R R RS S SK K KM M M
 
 

 
 
       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_r=  s    r   rE   zSymbolTable.__init__  s    tr   c                 :    | j                             i            d S r!   )r  rZ   r=  s    r   re  zSymbolTable.enter_scope  s    Br   c                 8    | j                                          d S r!   )r  r+   r=  s    r   rf  zSymbolTable.exit_scope  s    r   c                 &    || j         d         |<   d S )Nr   r  )r?   rt   items      r   r   zSymbolTable.define  s    !%Rr   c                 j    t          | j                  D ]}|                    |          }|r|c S d S r!   )r  r  r4  )r?   rt   scoper  s       r   r{   zSymbolTable.resolve  sE    dl++ 	 	E99T??D tr   N)r  r  r  rE   re  rf  r   r{   r   r   r   r3   r3     s_                 & & &    r   r3   )fontTools.feaLib.errorr   fontTools.feaLib.lexerr   r   r   fontTools.misc.encodingToolsr   fontTools.misc.py23r   r	   r
   fontTools.feaLib.astfeaLibr0   loggingr  r  	getLoggerr  r   objectr   r3   r   r   r   <module>r     s   2 2 2 2 2 2 K K K K K K K K K K 4 4 4 4 4 4 7 7 7 7 7 7 7 7 7 7 " " " " " " " " "  				 				 g!!h"O h"O h"O h"O h"OV h"O h"O h"OVE    &     r   