B
    ›³ëb¡  ã               @   s  d Z ddlZddlZddlm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mZ ee e Zej dd	¡Zejd
krœdddgZnddgZedœdd„Zedœdd„Zedœdd„Zedœdd„Zdee dœdd„Zddœdd„Zee dœdd„Z dS )a(  Tool-specific initialization for yacc.

This tool should support multiple yacc implementations,
but is in actuality biased towards GNU Bison.

There normally shouldn't be any need to import this module directly.
It will usually be imported through the generic SCons.Tool.Tool()
selection method.
é    N)ÚOptional)ÚMINGW_DEFAULT_PATHS)ÚCYGWIN_DEFAULT_PATHS)ÚCHOCO_DEFAULT_PATH)ÚCLVarÚ	to_Stringz$YACCCOMz$YACCCOMSTRÚwin32ZbisonZyaccZ	win_bison)Úreturnc             C   sŒ  |j d| |d}|d }tj t| d ƒ¡\}}d|krB|d g} d|krd|  ||j|| |d ¡ d|kr˜tj t|d ƒ¡\}	}
|  |	| d¡ ¡ d	|krÈ| |d
 | d ¡ | | d |d
 ¡ dddg}xL|D ]D}x>|D ]6}t	|ƒ}|d|… |krâ||d…  
¡ }|  |¡ qâW qØW |jd| |d}|rR|  |¡ |j| |¡d |jd| |d}|r„|  |¡ |j| |¡d | |fS )z:Adds extra files generated by yacc program to target list.z
$YACCFLAGS)ÚtargetÚsourcer   z.ymz.mz-dz-gz$YACCVCGFILESUFFIXz-vz.outputz
--defines=z	--header=z--graph=Nz$YACC_HEADER_FILE)ÚYACC_HEADER_FILEz$YACC_GRAPH_FILE)ÚYACC_GRAPH_FILE)Z
subst_listÚosÚpathÚsplitextr   ÚappendZsubstZ
SideEffectZCleanÚlenÚstripZReplaceZFile)r
   r   ÚenvZysufZhsufZ	yaccflagsÚflagsZ
targetBaseZ	targetExtÚbaseZextZfileGenOptionsZoptionZfileGenOptionÚlZfileNameZyaccheaderfileZyaccgraphfile© r   ú.lib/python3.7/site-packages/SCons/Tool/yacc.pyÚ_yaccEmitter8   s:    





r   c             C   s   t | ||ddgdƒS )Nz.yz.yaccz$YACCHFILESUFFIX)r   )r
   r   r   r   r   r   ÚyEmittert   s    r   c             C   s   t | ||dgdƒS )Nz.ymz$YACCHFILESUFFIX)r   )r
   r   r   r   r   r   Ú	ymEmitterx   s    r   c             C   s   t | ||dgdƒS )Nz.yyz$YACCHXXFILESUFFIX)r   )r
   r   r   r   r   r   Ú	yyEmitter|   s    r   Fc             C   s@   x(t D ] }tjj| |t|d}|r|S qW tj tjjd¡ dS )aF  
    Returns the path to the yacc tool, searching several possible names.

    Only called in the Windows case, so the `default_path` argument to
    :func:`find_program_path` can be Windows-specific.

    Args:
        env: current construction environment
        append_paths: if true, add the path to the tool to PATH
    )Zdefault_pathsZadd_pathzCyacc tool requested, but yacc or bison binary not found in ENV PATHN)ÚBINSÚSConsÚToolZfind_program_pathÚDEFAULT_PATHSZWarningsÚwarnZSConsWarning)r   Úappend_pathsÚprogZbin_pathr   r   r   Úget_yacc_path€   s    
r%   c             C   sÖ   t j | ¡\}}| dt¡ | dt¡ | dt¡ | dt¡ | dt¡ | dt¡ | dt¡ | dt¡ t	j
dkr†t| dd}| j|  t¡tdƒddd	 d
| d< d| d< d| d< d| d< d| d< d| d< dS )zCAdd Builders and construction variables for yacc to an Environment.z.yz.yaccz.ymz.yyr   T)r#   Ú )ÚYACCZ	YACCFLAGSr   r   z?$YACC $YACCFLAGS $_YACC_HEADER $_YACC_GRAPH -o $TARGET $SOURCESZYACCCOMz.hZYACCHFILESUFFIXz.hppZYACCHXXFILESUFFIXz.vcgZYACCVCGFILESUFFIXz;${YACC_HEADER_FILE and "--header=" + str(YACC_HEADER_FILE)}Z_YACC_HEADERz8${YACC_GRAPH_FILE and "--graph=" + str(YACC_GRAPH_FILE)}Z_YACC_GRAPHN)r   r    ZcreateCFileBuildersZ
add_actionÚ
YaccActionZadd_emitterr   r   r   ÚsysÚplatformr%   Z
SetDefaultÚDetectr   r   )r   Zc_fileZcxx_fileÚ_r   r   r   Úgenerate›   s,    
r-   c             C   s6   d| kr|   | d ¡S tjdkr(t| ƒS |   t¡S d S )Nr'   r   )r+   r)   r*   r%   r   )r   r   r   r   ÚexistsÁ   s
    
r.   )F)!Ú__doc__Úos.pathr   r)   Útypingr   ZSCons.Defaultsr   Z
SCons.ToolZSCons.WarningsZSCons.Platform.mingwr   ZSCons.Platform.cygwinr   ZSCons.Platform.win32r   Z
SCons.Utilr   r   r!   ZActionr(   r*   r   Útupler   r   r   r   Ústrr%   r-   r.   r   r   r   r   Ú<module>    s,   
<&