
    A6i                         d Z ddlmZ ddlZddlZddlZddlZddlm	Z	 ddl
mZ ddl
mZ ddlmZ dd	lmZ dd
lmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZ  G d de       Z! G d de       Z" G d de       Z#y)a  
.. module:: lesscpy.lessc.parser
    :synopsis: Lesscss parser.

    http://www.dabeaz.com/ply/ply.html
    http://www.w3.org/TR/CSS21/grammar.html#scanner
    http://lesscss.org/#docs

    Copyright (c)
    See LICENSE for details.
.. moduleauthor:: Johann T. Mariusson <jtm@robot.is>
    )print_functionN)string_types   )lexer)utility)Scope)Color)CompilationError)BlockCallDeferred
Expression
IdentifierMixinNegatedExpressionProperty	StatementVariableImportKeyframeSelectorc                   &    e Zd ZdZd Zd Zd ZeZy)ErrorRegisterz9

    Raises CompilationError when an error occurs.

    c                     g | _         y N)errorsselfs    W/home/azureuser/techstart-app/venv/lib/python3.12/site-packages/lesscpy/lessc/parser.py__init__zErrorRegister.__init__&   s	        c                 :    | j                   j                  |       y r   )r   append)r   errors     r   registerzErrorRegister.register)   s    5!r    c                 d    | j                   r$t        dj                  | j                               y )N
)r   r
   joinr   s    r   	__close__zErrorRegister.__close__,   s&    ;;"499T[[#9:: r    N__name__
__module____qualname____doc__r   r$   r(   close r    r   r   r      s    "; Er    r   c                   &    e Zd ZdZd Zd Zd ZeZy)PrintErrorRegisterz+

    Colored error output to stderr.

    c                     d| _         y )NF)has_erroredr   s    r   r   zPrintErrorRegister.__init__:   s
     r    c                 l    d| _         |d   dk(  rdnd}t        ||ddt        j                         y )NTr   Ez[31mz[33mz[0m)endfile)r3   printsysstderr)r   r#   colors      r   r$   zPrintErrorRegister.register=   s0    #Ah#o
:ue,)#**Mr    c                      y r   r/   r   s    r   r(   zPrintErrorRegister.__close__B   s    r    Nr)   r/   r    r   r1   r1   3   s    !N
 Er    r1   c            	          e Zd ZdZddddd ej
                         dddf	dZdyd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 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 Z0d2 Z1d3 Z2d4 Z3d5 Z4d6 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 ZKdM 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`db Zadc Zbdd Zcde Zddf Zedg Zfdh Zgdi Zhdj Zidk Zjdl Zkdm Zldn Zmdo Zndp Zodq Zpdr Zqds Zrdt Zsdu Ztdv Zudw ZvdzdxZwy){
LessParser))left+-)r?   */TyacctabFNr   c
                    || _         || _        t        j                         | _        |sd}d| _        | j                  j                  D 
cg c]  }
|
| j
                  vs|
 c}
| _        t        j                  j                  | d||||      | _	        |r|n	t               | _        i | _        d| _        d| _        |	| _        |	rt!               | _        yt%               | _        yc c}
w )aB   Parser object

            Kwargs:
                lex_optimize (bool): Optimize lexer
                yacc_optimize (bool): Optimize parser
                tabfile (str): Yacc tab filename
                yacc_debug (bool): yacc debug mode
                scope (Scope): Inherited scope
                outputdir (str): Output (debugging)
                importlvl (int): Import depth
                verbose (bool): Verbose mode
                fail_with_exc (bool): Throw exception on syntax error instead
                                      of printing to stderr
        rD   )css_commentless_commentcss_vendor_hacktunit)modulestartdebugoptimize	tabmodule	outputdirN)verbose	importlvlr   	LessLexerlexignoredtokensplyyaccparserr   scopestashresulttargetfail_with_excr   r$   r1   )r   lex_optimizeyacc_optimizetabfile
yacc_debugrY   rO   rQ   rP   r]   ts              r   r   zLessParser.__init__N   s    0 "??$GI"&((//KQQdll5JqKhhmm" $ ! $U

*)ODM.0DM! Ls   C&C&c                    | j                   j                          |s|}n(t        |d      r|t        d      |j                  }nd}|| _        | j                  r*| j                  st        d|z  t        j                         | j                  j                  || j                  |      | _        | j                          | j                   j#                          y)z Parse file.
        kwargs:
            filename (str): File to parse
            debuglevel (int): Parser debuglevel
        nameNz*names of file and filename are in conflictz(stream)zCompiling target: %s)r7   )r   rL   )rY   pushhasattrAssertionErrorrd   r\   rP   r]   r8   r9   r:   rX   parserS   r[   
post_parser$   r.   )r   filenamer7   
debuglevels       r   rh   zLessParser.parse   s     	

D tV$'(DF F99%<< 2 2(83#**Ekk''DHHJ'Or    c                 0   | j                   rbg }| j                   D ]-  }	 |j                  |j                  | j                               / t        t        j                  |            | _         yy# t        $ r}| j                  |d       Y d}~ud}~ww xY w)z Post parse cycle. nodejs version allows calls to mixins
        not yet defined or known to the parser. We defer all calls
        to mixins until after first cycle when all names are known.
        r   N)	r[   r"   rh   rY   SyntaxErrorhandle_errorlistr   flatten)r   outpues       r   ri   zLessParser.post_parse   s    
 ;;Ckk ,,JJrxx

34,
 ws34DK 
 # ,%%a++,s   *A00	B9BBc                 B    t        j                  | j                         y)z Output scopemap.
        N)r   debug_printr[   r   s    r   scopemapzLessParser.scopemap   s     	DKK(r    c                 @    |d   D cg c]  }|s|	 c}|d<   yc c}w )z. tunit                    : unit_list
        r   r   Nr/   )r   pus      r   p_tunitzLessParser.p_tunit   s!     Q4%a1%!%s   c                     t        |d   t              rQt        |      dk\  rLt        |d   t              r|d   j                  |d          n!|d   j	                  |d          n	|d   g|d<   |d   |d<   y)z_ unit_list                : unit_list unit
                                     | unit
        r         r   N)
isinstancero   lenextendr"   r   rx   s     r   p_unit_listzLessParser.p_unit_list   so     adD!1v{adD)aDKK!%aDKK!%aD6AaDt!r    c                     |d   |d<   y)a1   unit                     : statement
                                     | variable_decl
                                     | block_decl
                                     | mixin_decl
                                     | call_mixin
                                     | import_statement
        r   r   Nr/   r   s     r   p_unitzLessParser.p_unit        t!r    c                     t        t        |      dd |j                  d            |d<   |d   j                  d       y)z statement            : css_charset t_ws css_string t_semicolon
                                 | css_namespace t_ws css_string t_semicolon
        r   Nr   r   ro   linenorh   r   s     r   p_statement_auxzLessParser.p_statement_aux   s6     aahhqk2!	!

4r    c                     t        t        |      dd |j                  d            |d<   |d   j                  d       y)zO statement            : css_namespace t_ws word css_string t_semicolon
        r   Nr   r   r   s     r   p_statement_namespacez LessParser.p_statement_namespace   s6     aahhqk2!	!

4r    c                 v   | j                   dkD  rt        d      t        |d   t              rt	        j
                  |d         }nt        |d   t              rSt        |d   |j                  d            j                  | j                        |d<   t	        j
                  |d         }nOt        |d   t              r<|d   j                  | j                        |d<   t	        j
                  |d   dd       }t        j                  j                        \  }}|r|j                         dk(  r	 t        j                  j!                  t        j                  j#                  | j$                              }|s|dz  }|t        j&                  |}t        j                  j)                  |      rRt+        | j                   dz   | j,                  | j                        }|j                  |d	
       |j.                  |d	<   n,d|z  }| j1                  ||j                  d      d       d|d	<   n>t3        t        |      dd |j                  d            |d	<   |d	   j                  d       t4        j6                  j9                          y# t        $ r}	| j1                  |	|       Y d}	~	?d}	~	ww xY w)a   import_statement     : css_import t_ws string t_semicolon
                                 | css_import t_ws css_string t_semicolon
                                 | css_import t_ws css_string media_query_list t_semicolon
                                 | css_import t_ws fcall t_semicolon
                                 | css_import t_ws fcall media_query_list t_semicolon
           z7Recrusive import level too deep > 8 (circular import ?)r|      z.lessr   )rQ   rP   rY   r   )rj   rk   z"Cannot import '%s', file not foundWN)rQ   ImportErrorr~   r   r   destringro   r   r   rh   rY   r   ospathsplitextlowerdirnameabspathr\   sepexistsr>   rP   r[   rn   r   r9   stdoutflush)
r   rx   ipathfnfecpathrj   recurseerrrs   s
             r   p_statement_importzLessParser.p_statement_import   s/    >>AIK KadL)$$QqT*E!d#!A$,224::>AaD$$QqT*E!d# Q4::

AaD$$QqT!BZ0E!!%(BRXXZ7*((DEW$E',bffe<77>>(+("&..1"4 $"jj*G MM8MB">>AaD>IC%%c188A;<AaD T!WQR[!((1+6AaDaDJJt

  (!!!Q''(s   5D J 	J8J33J8c                     t        t        |      dd |j                  d            |d<   | j                  j	                          | j                  j                  |d          y)zL block_decl               : block_open declaration_list brace_close
        r   r   r|   r   N)r   ro   r   rY   pop	add_blockr   s     r   p_blockzLessParser.p_block  sJ     T!WQr]AHHQK0!



QqT"r    c                    |d   j                  d      }| j                  j                  |j                               }|r|j	                  | j                        |d<   yt        |d   d|j                  d            |d<   y)z; block_decl               : identifier t_semicolon
        r   Nr   r}   )rh   rY   blocksraw
copy_innerr   r   )r   rx   mblocks       r   p_block_replacezLessParser.p_block_replace  sk     aDJJt

!!!%%'*##DJJ/AaD AaD$4AaDr    c                     	 |d   j                  | j                         |d   |d<   |d   | j                  _        y# t        $ r Y (w xY w)z; block_open                : identifier brace_open
        r   r   N)rh   rY   rm   currentr   s     r   p_block_openzLessParser.p_block_open'  sN    	aDJJtzz" t!qT

  		s   = 	A	A	c                 X    t        |d         j                  | j                        |d<   y)zA block_open                : media_query_decl brace_open
        r   r   Nr   rh   rY   r   s     r   p_block_open_media_queryz#LessParser.p_block_open_media_query1  s%     !A$%%djj1!r    c                 b    t        |d   |d   g      j                  | j                        |d<   y)zC block_open                : css_font_face t_ws brace_open
        r   r}   r   Nr   r   s     r   p_font_face_openzLessParser.p_font_face_open6  s-     1Q41,'--djj9!r    c                 Z    t        |d   g      j                  | j                        |d<   y)zblock_open                 : css_keyframe_selector brace_open
                                      | number brace_open
        r   r   N)r   rh   rY   r   s     r   p_keyframe_openzLessParser.p_keyframe_open;  s'      1'--djj9!r    c                     | j                   j                  t        t        |      dd |j	                  d            j                  | j                                | j                   j                          d|d<   y)zM mixin_decl                : open_mixin declaration_list brace_close
        r   Nr|   r   )rY   	add_mixinr   ro   r   rh   r   r   s     r   p_mixinzLessParser.p_mixinE  sU     	

U4712;<BB4::NO

!r    c                     |d   j                  | j                         |d   | j                  _        |d   |d   g|d<   t        |      dkD  r|d   j	                  |d          y|d   j	                  d       y)z open_mixin                : identifier t_popen mixin_args_list t_pclose brace_open
                                      | identifier t_popen mixin_args_list t_pclose mixin_guard brace_open
        r   r|   r         N)rh   rY   r   r   r"   r   s     r   p_open_mixinzLessParser.p_open_mixinL  sl     	
!

4::qT

!ad|!q6A:aDKK!aDKKr    c                     |d   |d<   y)zE mixin_guard               : less_when mixin_guard_cond_list
        r}   r   Nr/   r   s     r   p_mixin_guardzLessParser.p_mixin_guardX       t!r    c                 p    |d   j                  |d          |d   j                  |d          |d   |d<   y)z mixin_guard_cond_list    : mixin_guard_cond_list t_comma mixin_guard_cond
                                     | mixin_guard_cond_list less_and mixin_guard_cond
        r   r}   r|   r   N)r"   r   s     r   p_mixin_guard_cond_list_auxz&LessParser.p_mixin_guard_cond_list_aux]  s9     	
!AaD	!AaDt!r    c                     |d   g|d<   y)z6 mixin_guard_cond_list     : mixin_guard_cond
        r   r   Nr/   r   s     r   p_mixin_guard_cond_listz"LessParser.p_mixin_guard_cond_liste       !v!r    c                 L    t        j                  t        |      dd       |d<   y)z mixin_guard_cond          : less_not t_popen argument mixin_guard_cmp argument t_pclose
                                      | less_not t_popen argument t_pclose
        r|   r   r   N)r   reverse_guardro   r   s     r   p_mixin_guard_cond_revz!LessParser.p_mixin_guard_cond_revj  s"     $$T!WQr]3!r    c                 &    t        |      dd |d<   y)z mixin_guard_cond          : t_popen argument mixin_guard_cmp argument t_pclose
                                      | t_popen argument t_pclose
        r}   r   r   Nro   r   s     r   p_mixin_guard_condzLessParser.p_mixin_guard_condp  s     Awq}!r    c                 D    dj                  t        |      dd       |d<   y)z mixin_guard_cmp           : '>'
                                      | '<'
                                      | '='
                                      | '>' '='
                                      | '=' '<'
         r   Nr   )r'   ro   r   s     r   p_mixin_guard_cmpzLessParser.p_mixin_guard_cmpv  s      wwtAwqr{#!r    c                 v    |d   j                  d       t        |d   |d   |j                  d            |d<   y)z] call_mixin                : identifier t_popen mixin_args_list t_pclose t_semicolon
        r   Nr|   r   r   )rh   r   r   r   s     r   p_call_mixinzLessParser.p_call_mixin  s6     	
!

4!adAHHQK0!r    c                     |d   g|d<   y)z3 mixin_args_list          : less_arguments
        r   r   Nr/   r   s     r   p_mixin_args_argumentsz!LessParser.p_mixin_args_arguments  r   r    c                 D    |d   j                  |d   g       |d   |d<   y)z mixin_args_list          : mixin_args_list t_comma mixin_args
                                     | mixin_args_list t_semicolon mixin_args
        r   r|   r   Nr   r   s     r   p_mixin_args_list_auxz LessParser.p_mixin_args_list_aux  s'     	
!QqTFt!r    c                     |d   g|d<   y)z/ mixin_args_list          : mixin_args
        r   r   Nr/   r   s     r   p_mixin_args_listzLessParser.p_mixin_args_list  r   r    c                 T    |d   j                  t        |      dd        |d   |d<   y)z9 mixin_args                : mixin_args argument
        r   r}   Nr   r   ro   r   s     r   p_mixin_args_auxzLessParser.p_mixin_args_aux  +     	
!DGABK t!r    c                     |d   g|d<   y)zb mixin_args                : argument
                                      | mixin_kwarg
        r   r   Nr/   r   s     r   p_mixin_argszLessParser.p_mixin_args  s     !v!r    c                     d|d<   y)z+ mixin_args                : empty
        Nr   r/   r   s     r   p_mixin_args_emptyzLessParser.p_mixin_args_empty  s     !r    c                 X    t        t        |      dd |j                  d            |d<   y)zL mixin_kwarg                : variable t_colon mixin_kwarg_arg_list
        r   Nr}   r   )r   ro   r   r   s     r   p_mixin_kwargzLessParser.p_mixin_kwarg  s&     QQXXa[1!r    c                 T    |d   j                  t        |      dd        |d   |d<   y)zD mixin_kwarg_arg_list       : mixin_kwarg_arg_list argument
        r   r}   Nr   r   r   s     r   p_margument_list_auxzLessParser.p_margument_list_aux  r   r    c                     |d   g|d<   y)z. mixin_kwarg_arg_list      : argument
        r   r   Nr/   r   s     r   p_margument_listzLessParser.p_margument_list  r   r    c                 ^    t        |      dkD  r|d   j                  |d          |d   |d<   y)z declaration_list           : declaration_list declaration
                                       | declaration
                                       | empty
        r}   r   r   N)r   r   r   s     r   p_declaration_listzLessParser.p_declaration_list  s0    
 q6A:aDKK!t!r    c                 N    t        |d   t              r	|d   |d<   y|d   g|d<   y)aA   declaration                : variable_decl
                                       | property_decl
                                       | block_decl
                                       | mixin_decl
                                       | call_mixin
                                       | import_statement
        r   r   Nr~   ro   r   s     r   p_declarationzLessParser.p_declaration  s,     "!A$-qt!AaD6!r    c                     t        t        |      dd |j                  d            |d<   |d   j                  | j                         y)zL variable_decl            : variable t_colon style_list t_semicolon
        r   r   r   r   N)r   ro   r   rh   rY   r   s     r   p_variable_declzLessParser.p_variable_decl  s:     Q"qxx{3!	!

4::r    c                 t    t        |      }t        t        |      dd |j                  |dz
              |d<   y)z property_decl           : prop_open style_list t_semicolon
                                    | prop_open style_list css_important t_semicolon
                                    | prop_open empty t_semicolon
        r   r   r   N)r   r   ro   r   )r   rx   ls      r   p_property_declzLessParser.p_property_decl  s3    
 FQ"qxxA7!r    c                 R    t        |d   |d   gg|j                  d            |d<   y)zH property_decl           : prop_open less_arguments t_semicolon
        r   r}   r|   r   N)r   r   r   s     r   p_property_decl_argumentsz$LessParser.p_property_decl_arguments  s*     1!v4!r    c                 *    |d   d   |d   d   f|d<   y)z1 prop_open               : '*' prop_open
        r   r   r}   Nr/   r   s     r   p_prop_open_ie_hackzLessParser.p_prop_open_ie_hack  s"     !Q1a!!r    c                     |d   d   df|d<   y)z prop_open               : property t_colon
                                    | vendor_property t_colon
                                    | user_property t_colon
                                    | word t_colon
        r   r   r   Nr/   r   s     r   p_prop_openzLessParser.p_prop_open  s     !Q}!r    c                 T    |d   j                  t        |      dd        |d   |d<   y)z style_list              : style_list style
                                    | style_list t_comma style
                                    | style_list t_ws style
        r   r}   Nr   r   r   s     r   p_style_list_auxzLessParser.p_style_list_aux  s+    
 	
!DGABK t!r    c                     |d   g|d<   y)z) style_list              : style
        r   r   Nr/   r   s     r   p_style_listzLessParser.p_style_list  r   r    c                     |d   |d<   y)a   style                   : expression
                                    | string
                                    | word
                                    | property
                                    | vendor_property
                                    | estring
        r   r   Nr/   r   s     r   p_stylezLessParser.p_style  r   r    c                 (    t        |d   d      |d<   y)z identifier                : identifier_list
                                      | page
                                      | page filter
        r   r   N)r   r   s     r   p_identifierzLessParser.p_identifier  s    
 !A$"!r    c                 D    t        t        |d   |d   g      d      |d<   y)z> identifier                : t_popen estring t_pclose
        r}   r|   r   N)r   r   r   s     r   p_identifier_istrzLessParser.p_identifier_istr  s%     $!ad|,a0!r    c                 r    |d   j                  |d   g       |d   j                  |d          |d   |d<   y)zN identifier_list           : identifier_list t_comma identifier_group
        r   r}   r|   r   Nr   r   s     r   p_identifier_list_auxz LessParser.p_identifier_list_aux!  s;     	
!QqTF	!AaDt!r    c                     |d   |d<   y)z6 identifier_list           : identifier_group
        r   r   Nr/   r   s     r   p_identifier_listzLessParser.p_identifier_list(  r   r    c                 &    t        |      dd |d<   y)z identifier_list           : css_keyframes t_ws css_ident
                                      | css_keyframes t_ws css_ident t_ws
        r   Nr   r   r   s     r   p_identifier_list_keyframez%LessParser.p_identifier_list_keyframe-       Awqr{!r    c                 &    t        |      dd |d<   y)zl identifier_list           : css_viewport
                                      | css_viewport t_ws
        r   Nr   r   r   s     r   p_identifier_list_viewportz%LessParser.p_identifier_list_viewport3  r  r    c                     |d   j                  |d   g       t        |      dkD  r|d   j                  |d          |d   |d<   y)a5   identifier_group          : identifier_group child_selector ident_parts
                                      | identifier_group '+' ident_parts
                                      | identifier_group general_sibling_selector ident_parts
                                      | identifier_group '*'
        r   r}   r|   r   N)r   r   r   s     r   p_identifier_group_opz LessParser.p_identifier_group_op9  sF     	
!QqTFq6A:aDKK!t!r    c                     |d   |d<   y)z1 identifier_group          : ident_parts
        r   r   Nr/   r   s     r   p_identifier_groupzLessParser.p_identifier_groupD  r   r    c                     t        |d   t              r|d   j                  |d          n|d   j                  |d          |d   |d<   y)z} ident_parts               : ident_parts ident_part
                                      | ident_parts filter_group
        r}   r   r   N)r~   ro   r   r"   r   s     r   p_ident_parts_auxzLessParser.p_ident_parts_auxI  sG     adD!aDKK!aDKK!t!r    c                 L    t        |d   t              s	|d   g|d<   |d   |d<   y)z ident_parts               : ident_part
                                      | selector
                                      | filter_group
        r   r   Nr   r   s     r   p_ident_partszLessParser.p_ident_partsS  s.    
 !A$%aD6AaDt!r    c                 &    t        |      dd |d<   y)z media_query_decl            : css_media t_ws
                                        | css_media t_ws media_query_list
        r   Nr   r   r   s     r   p_media_query_declzLessParser.p_media_query_decl`  r  r    c                 &    t        |      dd |d<   y)zL media_query_list            : media_query_list t_comma media_query
        r   Nr   r   r   s     r   p_media_query_list_auxz!LessParser.p_media_query_list_auxf  s     Awqr{!r    c                     |d   g|d<   y)z3 media_query_list            : media_query
        r   r   Nr/   r   s     r   p_media_query_listzLessParser.p_media_query_listk  r   r    c                 &    t        |      dd |d<   y)a   media_query                 : media_type
                                        | media_type media_query_expression_list
                                        | not media_type
                                        | not media_type media_query_expression_list
                                        | only media_type
                                        | only media_type media_query_expression_list
        r   Nr   r   r   s     r   p_media_query_azLessParser.p_media_query_ap  s     Awqr{!r    c                 &    t        |      dd |d<   y)z media_query                 : media_query_expression media_query_expression_list
                                        | media_query_expression
        r   Nr   r   r   s     r   p_media_query_bzLessParser.p_media_query_bz  r  r    c                 &    t        |      dd |d<   y)z media_query_expression_list : media_query_expression_list and media_query_expression
                                        | and media_query_expression
        r   Nr   r   r   s     r   !p_media_query_expression_list_auxz,LessParser.p_media_query_expression_list_aux  r  r    c                 &    t        |      dd |d<   y)z media_query_expression      : t_popen css_media_feature t_pclose
                                        | t_popen css_media_feature t_colon media_query_value t_pclose
        r   Nr   r   r   s     r   p_media_query_expressionz#LessParser.p_media_query_expression  r  r    c                    t        j                  |d         rn| j                  j                  dj	                  |d               }|r?|j
                  d   }t        |d      r|j                  | j                        |d<   n||d<   t        |d   t              r"|d   j                  | j                        |d<   y|d   |d<   y)z media_query_value           : number
                                        | variable
                                        | word
                                        | color
                                        | expression
        r   r   r   rh   N)
r   is_variablerY   	variablesr'   valuerf   rh   r~   r   )r   rx   varr$  s       r   p_media_query_valuezLessParser.p_media_query_value  s     qt$**&&rwwqt}5C		!5'* ;;tzz2AaD AaDadJ'Q4::djj)AaDQ4AaDr    c                     |d   |d<   y)z selector                  : '*'
                                      | '+'
                                      | child_selector
                                      | general_sibling_selector
        r   r   Nr/   r   s     r   
p_selectorzLessParser.p_selector  s     t!r    c                     |d   |d<   y)z ident_part                : iclass
                                      | id
                                      | dom
                                      | combinator
                                      | color
        r   r   Nr/   r   s     r   p_ident_partzLessParser.p_ident_part       t!r    c                     |d   |d   g|d<   y)z@ ident_part                : combinator vendor_property
        r   r}   r   Nr/   r   s     r   p_ident_part_auxzLessParser.p_ident_part_aux  s     !ad|!r    c                 B    |d   j                  |d          |d   |d<   y)z9 filter_group              : filter_group filter
        r   r}   r   Nr   r   s     r   p_filter_group_auxzLessParser.p_filter_group_aux  s%     	
!AaDt!r    c                     |d   |d<   y)z, filter_group              : filter
        r   r   Nr/   r   s     r   p_filter_groupzLessParser.p_filter_group  r   r    c                 &    t        |      dd |d<   y)a   filter                    : css_filter
                                      | css_filter t_ws
                                      | t_colon word
                                      | t_colon vendor_property
                                      | t_colon vendor_property t_ws
                                      | t_colon css_property
                                      | t_colon css_property t_ws
                                      | t_colon css_filter
                                      | t_colon css_filter t_ws
                                      | t_colon t_colon word
                                      | t_colon t_colon vendor_property
        r   Nr   r   r   s     r   p_filterzLessParser.p_filter  s     Awqr{!r    c                 8    t        t        |      dd       |d<   y)zZ ms_filter       : css_ms_filter
                            | css_ms_filter t_ws
        r   Nr   tuplero   r   s     r   p_ms_filterzLessParser.p_ms_filter       T!WQR[!!r    c                 :    t        t        |      dd d      |d<   y)a_   fcall           : word t_popen argument_list t_pclose
                            | property t_popen argument_list t_pclose
                            | vendor_property t_popen argument_list t_pclose
                            | less_open_format argument_list t_pclose
                            | ms_filter t_popen argument_list t_pclose
        r   Nr   )r   ro   r   s     r   p_fcallzLessParser.p_fcall  s     DGABK#!r    c                     d|d<   y)z% argument_list       : empty
        r   r   Nr/   r   s     r   p_argument_list_emptyz LessParser.p_argument_list_empty  s     !r    c                 T    |d   j                  t        |      dd        |d   |d<   y)zw argument_list       : argument_list argument
                                | argument_list t_comma argument
        r   r}   Nr   r   r   s     r   p_argument_list_auxzLessParser.p_argument_list_aux  s+     	
!DGABK t!r    c                     |d   g|d<   y)z( argument_list       : argument
        r   r   Nr/   r   s     r   p_argument_listzLessParser.p_argument_list  r   r    c                     |d   |d<   y)aQ   argument        : expression
                            | string
                            | estring
                            | word
                            | id
                            | css_uri
                            | css_user_property
                            | '='
                            | fcall
        r   r   Nr/   r   s     r   
p_argumentzLessParser.p_argument   s     t!r    c                 :    t        t        |      dd d      |d<   y)a2   expression             : expression '+' expression
                                   | expression '-' expression
                                   | expression '/' expression
                                   | expression '*' expression
                                   | word '/' expression
        r   Nr   )r   ro   r   s     r   p_expression_auxzLessParser.p_expression_aux  s     $q'!"+q)!r    c                 *    t        |d   gd      |d<   y)zB expression             : '-' t_popen expression t_pclose
        r|   r   N)r   r   s     r   p_expression_p_negzLessParser.p_expression_p_neg  s     !!A$+!r    c                     |d   |d<   y)z> expression             : t_popen expression t_pclose
        r}   r   Nr/   r   s     r   p_expression_pzLessParser.p_expression_p  r   r    c                     |d   |d<   y)z* expression              : factor
        r   r   Nr/   r   s     r   p_expressionzLessParser.p_expression$  r   r    c                     |d   |d<   y)z factor                  : color
                                    | number
                                    | variable
                                    | css_dom
                                    | fcall
        r   r   Nr/   r   s     r   p_factorzLessParser.p_factor)  r+  r    c                     |d   |d<   y)z estring                 : t_eopen style_list t_eclose
                                    | t_eopen identifier_list t_eclose
        r}   r   Nr/   r   s     r   p_escaped_stringzLessParser.p_escaped_string6       t!r    c                     |d   |d<   y)z] string_part             : variable
                                    | css_string
        r   r   Nr/   r   s     r   p_string_partzLessParser.p_string_part@  rO  r    c                 D    |d   j                  |d   g       |d   |d<   y)z@ string_part_list        : string_part_list string_part
        r   r}   r   Nr   r   s     r   p_string_part_list_auxz!LessParser.p_string_part_list_auxF  '     	
!QqTFt!r    c                     |d   g|d<   y)z/ string_part_list        : string_part
        r   r   Nr/   r   s     r   p_string_part_listzLessParser.p_string_part_listL  r   r    c                     d|d   dg|d<   y)zG string                  : t_isopen string_part_list t_isclose
        "r}   r   Nr/   r   s     r   p_string_auxzLessParser.p_string_auxQ  s     QqT3!r    c                     |d   |d<   y)z. string                  : css_string
        r   r   Nr/   r   s     r   p_stringzLessParser.p_stringV  r   r    c                     d|d   g|d<   y)z0 variable                : '-' variable
        rA   r}   r   Nr/   r   s     r   p_variable_negzLessParser.p_variable_neg_  s     QqT{!r    c                     |d   |d<   y)z= variable                : t_popen variable t_pclose
        r}   r   Nr/   r   s     r   p_variable_strangezLessParser.p_variable_stranged  r   r    c                 8    t        t        |      dd       |d<   y)zj variable                : less_variable
                                    | less_variable t_ws
        r   Nr   r5  r   s     r   
p_variablezLessParser.p_variablei  s    
 T!WQR[!!r    c                     	 t               j                  |d         |d<   t        |      dkD  r|d   |d   g|d<   yy# t        $ r3 | j	                  d|d   z  |j                  d      d       |d   |d<   Y yw xY w)zb color                   : css_color
                                    | css_color t_ws
        r   r   r}   zIllegal color value `%s`r   N)r	   fmtr   
ValueErrorrn   r   r   s     r   p_colorzLessParser.p_colorp  s    	7;;qt$AaD1vz!ad|!  	81Q4?!!#Q4AaD	s   :> 9A:9A:c                 8    t        t        |      dd       |d<   y)zh number                    : css_number
                                      | css_number t_ws
        r   Nr   r5  r   s     r   p_numberzLessParser.p_number}  r8  r    c                 8    t        t        |      dd       |d<   y)zb dom                       : css_dom
                                      | css_dom t_ws
        r   Nr   r5  r   s     r   p_domzLessParser.p_dom  r8  r    c                 8    t        t        |      dd       |d<   y)zf word                      : css_ident
                                      | css_ident t_ws
        r   Nr   r5  r   s     r   p_wordzLessParser.p_word  r8  r    c                 8    t        t        |      dd       |d<   y)zf class                     : css_class
                                      | css_class t_ws
        r   Nr   r5  r   s     r   p_classzLessParser.p_class  r8  r    c                 &    t        |      dd |d<   y)z iclass_part               : less_variable
                                      | less_variable t_ws
                                      | class
        r   Nr   r   r   s     r   p_interpolated_class_partz$LessParser.p_interpolated_class_part  s    
 Awqr{!r    c                 D    |d   j                  |d   g       |d   |d<   y)zB iclass_part_list          : iclass_part_list iclass_part
        r   r}   r   Nr   r   s     r   "p_interpolated_class_part_list_auxz-LessParser.p_interpolated_class_part_list_aux  rT  r    c                     |d   g|d<   y)z1 iclass_part_list          : iclass_part
        r   r   Nr/   r   s     r   p_interpolated_class_part_listz)LessParser.p_interpolated_class_part_list  r   r    c                     |d   |d<   y)z6 iclass                    : iclass_part_list
        r   r   Nr/   r   s     r   p_interpolated_classzLessParser.p_interpolated_class  r   r    c                 8    t        t        |      dd       |d<   y)z` id                        : css_id
                                      | css_id t_ws
        r   Nr   r5  r   s     r   p_idzLessParser.p_id  r8  r    c                 8    t        t        |      dd       |d<   y)zl property                  : css_property
                                      | css_property t_ws
        r   Nr   r5  r   s     r   
p_propertyzLessParser.p_property  r8  r    c                 8    t        t        |      dd       |d<   y)zd page                      : css_page
                                      | css_page t_ws
        r   Nr   r5  r   s     r   p_pagezLessParser.p_page  r8  r    c                 8    t        t        |      dd       |d<   y)zz vendor_property           : css_vendor_property
                                      | css_vendor_property t_ws
        r   Nr   r5  r   s     r   p_vendor_propertyzLessParser.p_vendor_property  r8  r    c                 8    t        t        |      dd       |d<   y)zv user_property             : css_user_property
                                      | css_user_property t_ws
        r   Nr   r5  r   s     r   p_user_propertyzLessParser.p_user_property  r8  r    c                 8    t        t        |      dd       |d<   y)zp media_type                : css_media_type
                                      | css_media_type t_ws
        r   Nr   r5  r   s     r   p_media_typezLessParser.p_media_type  r8  r    c                 8    t        t        |      dd       |d<   y)zZ combinator                : '&' t_ws
                                      | '&'
        r   Nr   r5  r   s     r   p_combinatorzLessParser.p_combinator  r8  r    c                 8    t        t        |      dd       |d<   y)zZ child_selector            : '>' t_ws
                                      | '>'
        r   Nr   r5  r   s     r   p_child_selectorzLessParser.p_child_selector  r8  r    c                 8    t        t        |      dd       |d<   y)zb general_sibling_selector  : t_tilde t_ws
                                      | t_tilde
        r   Nr   r5  r   s     r   p_general_sibling_selectorz%LessParser.p_general_sibling_selector  r8  r    c                 H    | j                   j                          |d   |d<   y)z- brace_open                : t_bopen
        r   r   N)rY   re   r   s     r   p_scope_openzLessParser.p_scope_open  s     	

t!r    c                     |d   |d<   y)z. brace_close               : t_bclose
        r   r   Nr/   r   s     r   p_scope_closezLessParser.p_scope_close  r   r    c                 8    t        t        |      dd       |d<   y)z^ and                       : t_and t_ws
                                      | t_and
        r   Nr   r5  r   s     r   p_andzLessParser.p_and  r8  r    c                 8    t        t        |      dd       |d<   y)z^ not                       : t_not t_ws
                                      | t_not
        r   Nr   r5  r   s     r   p_notzLessParser.p_not  r8  r    c                 8    t        t        |      dd       |d<   y)z` only                      : t_only t_ws
                                      | t_only
        r   Nr   r5  r   s     r   p_onlyzLessParser.p_only  r8  r    c                      y)zempty                        :Nr/   r   s     r   p_emptyzLessParser.p_empty  s    r    c                    |rLd| j                   |j                  |j                  |j                  fz  }| j                  j	                  |       	 | j
                  j                         }|r|j                  dk(  r3t        | j                        dkD  r| j                  j                          n_| j                  j                          |S )zU Internal error handler
        args:
            t (Lex token): Error token
        z/E: %s line: %d, Syntax Error, token: `%s`, `%s`}r   )r\   r   typer$  r$   rS   tokenr   rY   r   rX   restart)r   rb   	error_msgs      r   p_errorzLessParser.p_error  s    
 I{{AHHaffagg>?IMM""9- A3tzz?Q&JJNN$  	r    c                 F    | j                   j                  d|||fz         y)z Custom error handler
        args:
            e (Mixed): Exception or str
            line (int): line number
            t(str): Error type
        z%s: line: %d: %s
N)r$   )r   rs   linerb   s       r   rn   zLessParser.handle_error"  s"     	3q$lBCr    )NNr   )r5   )xr*   r+   r,   
precedencetempfile
gettempdirr   rh   ri   rv   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r
  r  r  r  r  r  r  r  r  r  r  r   r&  r(  r*  r-  r/  r1  r3  r7  r:  r<  r>  r@  rB  rD  rF  rH  rJ  rL  rN  rQ  rS  rV  rY  r[  r]  r_  ra  re  rg  ri  rk  rm  ro  rq  rs  ru  rw  ry  r{  r}  r  r  r  r  r  r  r  r  r  r  r  r  rn   r/   r    r   r>   r>   H   sn   J ##"!.8..0$01d:5)&
-f#	5"2
:
:


4$1


2
:85
"

#1

	


0
&"$

"*,



 


"""""
"""""""""
"""$Dr    r>   )$r-   
__future__r   r   r  r9   ply.yaccrV   sixr   r   r   r   rY   r   r;   r	   lesscpy.exceptionsr
   lesscpy.plibr   r   r   r   r   r   r   r   r   r   r   r   objectr   r1   r>   r/   r    r   <module>r     sm    & 	  
       / Z  Z  Z  ZF ( *aD aDr    