a
    khN                     @   s|   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 edZ	G dd dZ
e	dur`e
 Zedd	d
ZdddZdS )    N)Path)import_module)TransformToSymPyExprZlarkc                   @   s(   e Zd ZdZd
ddZeddd	ZdS )LarkLaTeXParseraF  Class for converting input `\mathrm{\LaTeX}` strings into SymPy Expressions.
    It holds all the necessary internal data for doing so, and exposes hooks for
    customizing its behavior.

    Parameters
    ==========

    print_debug_output : bool, optional

        If set to ``True``, prints debug output to the logger. Defaults to ``False``.

    transform : bool, optional

        If set to ``True``, the class runs the Transformer class on the parse tree
        generated by running ``Lark.parse`` on the input string. Defaults to ``True``.

        Setting it to ``False`` can help with debugging the `\mathrm{\LaTeX}` grammar.

    grammar_file : str, optional

        The path to the grammar file that the parser should use. If set to ``None``,
        it uses the default grammar, which is in ``grammar/latex.lark``, relative to
        the ``sympy/parsing/latex/lark/`` directory.

    transformer : str, optional

        The name of the Transformer class to use. If set to ``None``, it uses the
        default transformer class, which is :py:func:`TransformToSymPyExpr`.

    FTNc                 C   s   t jt jtd}|d u r:tt j|djdd}nt|jdd}tj||ddddd	d	d
d	| _	|| _
|| _|d u rt | _n| | _d S )Nzgrammar/z
latex.larkzutf-8)encodingZearleyZlatex_stringautoexplicitFT)source_pathparserstartlexerZ	ambiguityZpropagate_positionsZmaybe_placeholdersZkeep_all_tokens)ospathjoindirname__file__r   	read_text_larkZLarkr
   print_debug_outputtransform_exprr   transformer)selfr   	transformZgrammar_filer   Zgrammar_dir_pathZlatex_grammar r   S/var/www/auris/lib/python3.9/site-packages/sympy/parsing/latex/lark/latex_parser.py__init__+   s(    
zLarkLaTeXParser.__init__sc                 C   s   | j rtjtj | j|}| jsTtj	d| tj	| tj	|
  |S | j rxtj	d| tj	|
  | j|}| j rtj	d| |S )Nzexpression = %szSymPy expression = %s)r   r   loggersetLevelloggingDEBUGr
   parser   debugprettyr   r   )r   r   Z
parse_treeZsympy_expressionr   r   r   doparseF   s    zLarkLaTeXParser.doparse)FTNN)__name__
__module____qualname____doc__r   strr%   r   r   r   r   r      s   
r   r   c                 C   s   t du rtdt| S )z
    Experimental LaTeX parser using Lark.

    This function is still under development and its API may change with the
    next releases of SymPy.
    NzLark is probably not installed)r   ImportError_lark_latex_parserr%   r   r   r   r   parse_latex_larke   s    r-   Tc                    s   t | tjr| jS t| j}|d}|r8tdd|}|dk}|rN|d  n| d}| p^}|rt|t|d 7 }|r|dd	 fd	d
| j
D  7 }n |d	 fdd
| j
D 7 }|r|d7 }|S )NZ
expressionz^expressionEZ_ambig    (
c                    s    g | ]}d   t |  qS ) _pretty_print_lark_trees.0iZ
new_indent	show_exprr   r   
<listcomp>       z,_pretty_print_lark_trees.<locals>.<listcomp>,c                    s   g | ]}t | qS r   r4   r6   r9   r   r   r;      r<   ))
isinstancer   Tokenvaluer*   data
startswithresubr   children)treeindentr:   rB   Zis_exprZis_ambigoutputZ	show_noder   r9   r   r5   q   s(    



& r5   )r   T)r   r    rD   pathlibr   Zsympy.externalr   Z$sympy.parsing.latex.lark.transformerr   r   r   r,   r*   r-   r5   r   r   r   r   <module>   s   U