§
    ]ö6i7  ã                   óX  — d Z ddlmZ ddlmZ ddlZddlmZ ddlmZ ddl	m
Z
  G d	„ d
e¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Zd„ Zedk    rÄddlZdZ eej        ¦  «        dk    rej        d         Z ee¦  «        Ze                     dd¬¦  «          eed¦  «        5 Ze                     ¦   «         Z ee¦  «         e                     e¦  «         	  ej        ¦   «         Zesn ee¦  «         Œ	 ddd¦  «         dS # 1 swxY w Y   dS dS )z?
The lexer for AnkiBuffers
Author: Mark Pauley
Date: 12/8/2014
é    )Úabsolute_import)Úprint_functionNé   )Ú	constants)Úlex)ÚTOKENc                   ó    — e Zd Zd„ Zd„ Zd„ ZdS )ÚWrappedIntConstantc                 óL   — || _         || _        t          ||¦  «        | _        d S ©N)ÚtextÚtypeÚintÚvalue)Úselfr   r   Úbases       úO/home/metal/girl-os/anki/victor/victor-clad/tools/message-buffers/clad/lexer.pyÚ__init__zWrappedIntConstant.__init__    s#   € ØˆŒ	ØˆŒ	Ý˜˜t‘_”_ˆŒ
ˆ
ˆ
ó    c                 ó   — | j         S r   ©r   ©r   s    r   Ú__str__zWrappedIntConstant.__str__%   ó
   € ØŒyÐr   c                 ót   — d                      t          | ¦  «        j        | j        | j        | j        ¦  «        S ©Nz{0}({1!r}, {2!r}, {3!r})©Úformatr   Ú__name__r   r   r   s    r   Ú__repr__zWrappedIntConstant.__repr__(   ó/   € Ø)×0Ò0µ°d±´Ô1DÀdÄiÐQUÔQZÐ\`Ô\fÑgÔgÐgr   N©r   Ú
__module__Ú__qualname__r   r   r    © r   r   r
   r
      sF   € € € € € ð%ð %ð %ð
ð ð ðhð hð hð hð hr   r
   c                   ó    — e Zd Zd„ Zd„ Zd„ ZdS )ÚWrappedFloatConstantc                 óJ   — || _         || _        t          |¦  «        | _        d S r   )r   r   Úfloatr   )r   r   r   s      r   r   zWrappedFloatConstant.__init__-   s!   € ØˆŒ	ØˆŒ	Ý˜4‘[”[ˆŒ
ˆ
ˆ
r   c                 ó   — | j         S r   r   r   s    r   r   zWrappedFloatConstant.__str__2   r   r   c                 ót   — d                      t          | ¦  «        j        | j        | j        | j        ¦  «        S r   r   r   s    r   r    zWrappedFloatConstant.__repr__5   r!   r   Nr"   r%   r   r   r'   r'   +   sF   € € € € € ð!ð !ð !ð
ð ð ðhð hð hð hð hr   r'   c                   ó    — e Zd Zd„ Zd„ Zd„ ZdS )ÚWrappedStringConstantc                 óX   — || _         d | _        |                     dd¦  «        | _        d S )Nz	verbatim Ú )r   r   Úreplacer   ©r   r   s     r   r   zWrappedStringConstant.__init__:   s+   € ØˆŒ	ØˆŒ	ð —\’\ +¨rÑ2Ô2ˆŒ
ˆ
ˆ
r   c                 ó   — | j         S r   r   r   s    r   Ú__strzWrappedStringConstant.__strA   r   r   c                 ót   — d                      t          | ¦  «        j        | j        | j        | j        ¦  «        S r   r   r   s    r   r    zWrappedStringConstant.__repr__D   r!   r   N)r   r#   r$   r   Ú_WrappedStringConstant__strr    r%   r   r   r-   r-   8   sF   € € € € € ð3ð 3ð 3ðð ð ðhð hð hð hð hr   r-   c                   ó|  — e Zd ZdZdd„ d„ fd„Zd„ Zd„ Zd„ Zd	„ Zd
„ Z	dZ
dZi Ze
D ]<Ze                     ¦   «         Zeee                     ¦   «         <   e eeg¦  «        z   ZŒ=edz   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 e e¦  «        d„ ¦   «         Z! e e¦  «        d„ ¦   «         Z"d„ Z#d„ Z$d„ Z%d„ Z&d „ Z'd!S )"ÚAnkiBufferLexera   A lexer for the Anki Buffer definition language.  After building it, set the
    input text with input(), and call token() to get new tokens.

    The initial filename attribute can be set to an initial filename, but the lexer will update it upon include directives
    Fc                 ó   — dS ©NFr%   )Únames    r   ú<lambda>zAnkiBufferLexer.<lambda>O   s   € ¨u€ r   c                 ó   — dS r9   r%   )ÚmessageÚlineÚcolumns      r   r;   zAnkiBufferLexer.<lambda>P   s   € ¸5€ r   c                 óZ   — || _         d| _        d| _        d| _        || _        || _        dS )z¾ Create a new lexer
        error_func:
          An error function. Will be called with an error message,
          line and locumn as arguments, in case of an error during lexing.
        r/   N)Ú
error_funcÚinput_directoryÚfilenameÚ
last_tokenÚtype_lookup_funcÚ	lex_debug)r   rF   rE   rA   s       r   r   zAnkiBufferLexer.__init__M   s4   € ð %ˆŒØ!ˆÔØˆŒØˆŒØ 0ˆÔØ"ˆŒˆˆr   c                 ó6   — t          j         dd| i|¤Ž| _        dS )z¯ Builds the lexer from the spec given.  Must be called
        after the lexer object is created.
        The PLY manual warns against calling lex.lex inside __init__
        ÚobjectNr%   )r   Úlexer)r   Úkwargss     r   ÚbuildzAnkiBufferLexer.build]   s$   € õ
 ”WÐ3Ð3 DÐ3¨FÐ3Ð3ˆŒ
ˆ
ˆ
r   c                 ó:   — | j                              |¦  «         d S r   )rI   Úinputr1   s     r   rM   zAnkiBufferLexer.inpute   s   € ØŒ
×Ò˜ÑÔÐÐÐr   c                 óˆ   — | j                              ¦   «         | _        | j        rt	          d| j        z  ¦  «         | j        S )Nz
(Lexer) %s)rI   ÚtokenrD   rF   Úprintr   s    r   rO   zAnkiBufferLexer.tokenh   s>   € Øœ*×*Ò*Ñ,Ô,ˆŒØŒ>ð 	2Ý�, ¤Ñ0Ñ1Ô1Ð1ØŒÐr   c                 ón   — | j         j                             dd|¦  «        }|t          d|¦  «        z
  }|S )z2 Find the column of the token in its line
        ú
r   )rI   ÚlexdataÚrfindÚmax)r   ÚlexposÚfoundr?   s       r   Úfind_tok_columnzAnkiBufferLexer.find_tok_columnn   s7   € ð ”
Ô"×(Ò(¨¨q°&Ñ9Ô9ˆØ�#˜a ™-œ-Ñ'ˆØˆr   c                 ó¬   — | j         r|                       ||¦  «         d S t          j        d                     t          t
          |¬¦  «        ¦  «         d S )Nz{lineno}:{column}: {msg})Úlinenor?   Úmsg)rA   ÚsysÚexitr   rZ   r?   )r   r[   Úts      r   Ú_errorzAnkiBufferLexer._errorv   sT   € ØŒ?ð 	_Ø�OŠO˜C Ñ#Ô#Ð#Ð#Ð#åŒHÐ/×6Ò6½fÍVÐY\Ð6Ñ]Ô]Ñ^Ô^Ð^Ð^Ð^r   )ÚboolÚfloat_32Úfloat_64ÚstringÚenumÚint_8Úint_16Úint_32Úint_64Úuint_8Úuint_16Úuint_32Úuint_64r=   Ú	structureÚunionÚ	autounionÚ	namespaceÚincludeÚno_cpp_classÚno_default_constructorÚenum_conceptÚdupes_allowedr%   )ÚSTRING_LITERALÚIDÚQUOTED_PATHÚINT_CONST_DECÚINT_CONST_HEXÚFLOAT_CONST_DECÚLBRACEÚRBRACEÚLSQÚRSQÚCOMMAÚEQÚCOLONz3(?:[a-zA-Z_][0-9a-zA-Z_]*::)*[a-zA-Z_][0-9a-zA-Z_]*z 	c                 ó`   — |j         xj        |j                             d¦  «        z  c_        dS )z\n+rR   N©rI   rZ   r   Úcount©r   r^   s     r   Ú	t_NEWLINEzAnkiBufferLexer.t_NEWLINEÀ   ó&   € à	ŒˆŒ˜!œ'Ÿ-š-¨Ñ-Ô-Ñ-ˆŒˆˆr   z\{z\}z\[z\]ú,ú=z\:z(verbatim [^,\{\}\[\]=;\n]*)c                 ó`   — |j         xj        |j                             d¦  «        z  c_        dS )z(/\*(.|\n)*?\*/)|(//.*)rR   Nr„   r†   s     r   Ú	t_COMMENTzAnkiBufferLexer.t_COMMENTÔ   rˆ   r   c                 ó„   — t          |j        ¦  «        |_        |j        j        dk    r|                      d|¦  «         |S )Nr/   z No text after "verbatim" keyword)r-   r   r_   r†   s     r   Út_STRING_LITERALz AnkiBufferLexer.t_STRING_LITERALØ   s<   € å'¨¬Ñ0Ô0ˆŒØŒ7Œ=˜BÒÐØ
�+Š+Ð8¸!Ñ
<Ô
<Ð
<Øˆr   c                 ó  — | j                              |j        d¦  «        |_        |j        dk    rN|j        t          j        v r;d|j        ›dt	          j        |j        ¦  «        ›d�}|                      ||¦  «         |S )Nrw   zAttempt to use the name "z", which is a keyword in ú.)Úkeyword_mapÚgetr   r   r   ÚkeywordsÚwhat_language_uses_keywordr_   ©r   r^   r[   s      r   Út_IDzAnkiBufferLexer.t_IDß   sz   € àÔ!×%Ò% a¤g¨tÑ4Ô4ˆŒàŒ6�TŠ>ˆ>˜aœg­Ô);Ð;Ð;Ð;à”���Ô=¸a¼gÑFÔFÐFÐFðHˆCà�KŠK˜˜QÑÔÐàˆr   c                 ó   — |S )z4\"([0-9a-zA-Z_]+/)*[0-9a-zA-Z_]+(\.[0-9a-zA-Z_]+)?\"r%   r†   s     r   Út_QUOTED_PATHzAnkiBufferLexer.t_QUOTED_PATHê   s	   € ð ˆr   c                 ó:   — t          |j        d¦  «        |_        |S )z-?[0-9]+\.[0-9]+Údec)r'   r   r†   s     r   Út_FLOAT_CONST_DECz!AnkiBufferLexer.t_FLOAT_CONST_DECð   s   € å& q¤w°Ñ6Ô6ˆŒØˆr   c                 ó<   — t          |j        dd¦  «        |_        |S )z0[xX][0-9a-fA-F]+Úhexé   ©r
   r   r†   s     r   Út_INT_CONST_HEXzAnkiBufferLexer.t_INT_CONST_HEXõ   ó   € å$ Q¤W¨e°RÑ8Ô8ˆŒØˆr   c                 ó<   — t          |j        dd¦  «        |_        |S )z-?[0-9]+rš   é
   rŸ   r†   s     r   Út_INT_CONST_DECzAnkiBufferLexer.t_INT_CONST_DECú   r¡   r   c                 ól   — dt          |j        d         ¦  «        z  }|                      ||¦  «         d S )NzIllegal character %sr   )Úreprr   r_   r•   s      r   Út_errorzAnkiBufferLexer.t_errorÿ   s4   € Ø$¥t¨A¬G°A¬JÑ'7Ô'7Ñ7ˆØ�Š�C˜ÑÔÐÐÐr   N)(r   r#   r$   Ú__doc__r   rK   rM   rO   rX   r_   r“   Úkeywords_upperr‘   ÚkeywordÚupperÚkeyword_upperÚlowerÚtupleÚtokensÚ
identifierÚstatesÚt_ignorer‡   Út_LBRACEÚt_RBRACEÚt_LSQÚt_RSQÚt_COMMAÚt_EQÚt_COLONÚstring_literalrŒ   r   rŽ   r–   r˜   r›   r    r¤   r§   r%   r   r   r7   r7   G   sô  € € € € € ðð ð "Ø"4Ð"4Ø@Ð@ð#ð #ð #ð #ð 4ð 4ð 4ðð ð ðð ð ðð ð ð_ð _ð _ð€Hð6 €NØ€KØð Að AˆØŸš™œˆØ'4ˆ�G—M’M‘O”OÑ$Ø'¨%¨%°°Ñ*@Ô*@Ñ@ˆˆð
 ð ñ €Fð$ H€Jð€Fð €Hð.ð .ð .ð €HØ€HØ€EØ€EØ€GØ€DØ€Gð 5€Nð.ð .ð .ð €Uˆ>ÑÔðð ñ Ôðð €Uˆ:ÑÔðð ñ Ôððð ð ðð ð ð
ð ð ð
ð ð ð
ð ð ð ð r   r7   c                 ó0   — t          d| ||fz  ¦  «         d S )NzLexical Error: %s(%d,%d))rP   )r[   r>   r?   s      r   Ú	errorFuncr¼     s#   € Ý	Ð
$¨¨T°6Ð':Ñ
:Ñ;Ô;Ð;Ð;Ð;r   Ú__main__z../emitters/tests/src/Foo.cladF)ÚoptimizeÚdebugÚr)r¨   Ú
__future__r   r   r\   r/   r   Úplyr   Úply.lexr   rH   r
   r'   r-   r7   r¼   r   Úin_fileÚlenÚargvÚ
test_lexerrK   ÚopenÚfÚreadr   rP   rM   rO   Útokr%   r   r   ú<module>rÌ      s‡  ððð ð 'Ð &Ð &Ð &Ð &Ð &Ø %Ð %Ð %Ð %Ð %Ð %à 
€
€
€
à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðhð hð hð hð h˜ñ hô hð hðhð hð hð hð h˜6ñ hô hð hðhð hð hð hð h˜Fñ hô hð hðzð zð zð zð z�fñ zô zð zð~<ð <ð <ð ˆzÒÐØ€J€J€JØ.€GØ
€sˆ3Œ8�}„}�qÒÐØ”(˜1”+ˆà � Ñ+Ô+€JØ×Ò˜e¨1ÐÑ-Ô-Ð-Ø	ˆˆg�sÑ	Ô	ð ˜qØ�vŠv‰xŒxˆØˆˆd‰ŒˆØ×Ò˜ÑÔÐð	Ø�#”)‘+”+ˆCØÐ˜ØˆE�#‰JŒJˆJð	àðð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð ð Ðs   Â;ADÄD!Ä$D!