a
    dC                     @   s   d Z ddlZddlZddlZddlZddlmZmZm	Z	 dZ
ee
dddZdd	 Ze	d
dG dd deZdd ZdddZdddZdd Zedkre Zeejdkreej ed e Zeeej
ejejejd dS )z!Converts Nearley grammars to Lark    N)LarkTransformerv_argsa  
    start: (ruledef|directive)+

    directive: "@" NAME (STRING|NAME)
             | "@" JS  -> js_code
    ruledef: NAME "->" expansions
           | NAME REGEXP "->" expansions -> macro
    expansions: expansion ("|" expansion)*

    expansion: expr+ js

    ?expr: item (":" /[+*?]/)?

    ?item: rule|string|regexp|null
         | "(" expansions ")"

    rule: NAME
    string: STRING
    regexp: REGEXP
    null: "null"
    JS: /{%.*?%}/s
    js: JS?

    NAME: /[a-zA-Z_$]\w*/
    COMMENT: /#[^\n]*/
    REGEXP: /\[.*?\]/

    STRING: _STRING "i"?

    %import common.ESCAPED_STRING -> _STRING
    %import common.WS
    %ignore WS
    %ignore COMMENT

    Zearleybasic)parserlexerc                 C   s&   ddd | | } d| dd  S )NZ	_ws_maybe_ws)___Zn_$Z
__DOLLAR__)getreplacelower)name r   [/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/lark/tools/nearley.py_get_rulename1   s    r   T)inlinec                   @   sl   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )NearleyToLarkc                 C   s   d| _ i | _i | _i | _d S )Nr   )_countextra_rulesextra_rules_revalias_js_codeselfr   r   r   __init__7   s    zNearleyToLark.__init__c                 C   s&   d| j  }|  j d7  _ || j|< |S )Nzalias_%d   )r   r   )r   coder   r   r   r   _new_function=   s    

zNearleyToLark._new_functionc                 C   sH   || j v r| j | S dt| j }|| jvs0J || j|< || j |< |S )Nzxrule_%d)r   lenr   )r   ruler   r   r   r   _extra_ruleD   s    



zNearleyToLark._extra_rulec                 C   s   t |S Nr   )r   r   r   r   r   r    N   s    zNearleyToLark.rulec                 C   s   dt ||f S )N!%s: %sr#   )r   r   Zexpsr   r   r   ruledefQ   s    zNearleyToLark.ruledefc                 C   s   d||f }|  |S )Nz(%s)%sr!   )r   itemopr    r   r   r   exprT   s    zNearleyToLark.exprc                 C   s   d| S )Nz/%s/r   )r   rr   r   r   regexpX   s    zNearleyToLark.regexpc                 C   s   dS )N r   r   r   r   r   null[   s    zNearleyToLark.nullc                 C   s
   |  |S r"   r&   )r   sr   r   r   string^   s    zNearleyToLark.stringc                 G   sR   |d d |d  }}|j r@|j \}|dd }d| | }nd}d|| S )N   z-> r,    )childrenr   join)r   xZjsjs_codealiasr   r   r   	expansiona   s    zNearleyToLark.expansionc                 G   s   dd | S )Nz%sz
    |)r5   )r   r6   r   r   r   
expansionsk   s    zNearleyToLark.expansionsc                 G   s   d td |S N
)r5   filter)r   rulesr   r   r   startn   s    zNearleyToLark.startN)__name__
__module____qualname__r   r   r!   r    r%   r)   r+   r-   r/   r9   r:   r?   r   r   r   r   r   5   s   

r   c                 C   sD  g }t | }|jD ](}|jdkr|j\}	}
|	dv r|	dkrB|n|}tj||
dd }||vr|| tj	|dd}|
 }W d    n1 s0    Y  |t||||tjtj||7 }ndsJ |	q|jd	kr|j\}|d
d }|| q|jdkrq|jdkr2||| qtd| q|S )N	directive)builtinincluderD   r   r0   utf8encodingFr7   r1   r2   macror%   zUnknown statement: %s)nearley_grammar_parserparser4   dataospathr5   addcodecsopenread_nearley_to_larkabspathdirnameappendZ	transform	Exception)gbuiltin_pathn2lr7   folder_pathZincludes	rule_defstreeZ	statementrC   argfolderrN   ftextr   r   r   r   rS   q   s0    



&(rS   Fc                    s6  dd l }g  d fdd	}dg}t }t| ||||t }	d|	}
|
dddd |j D  7 }
|d |  |d	t|
  |  |j D ]\}}|	d
||f  q|r||
d| n||d| |d |jD ]}|d||f  q|d |  |d|  |d |d d S )Nr   c                    s   | r  |    d d S r;   )rV   )r6   Z	emit_coder   r   emit   s    
z-create_code_for_nearley_grammar.<locals>.emitzfunction id(x) {return x[0];}r<   c                 s   s   | ]}d | V  qdS )r$   Nr   ).0r'   r   r   r   	<genexpr>       z2create_code_for_nearley_grammar.<locals>.<genexpr>z"from lark import Lark, Transformerz
grammar = z
%s = (%s);z$class TransformNearley(Transformer):z"    %s = var.get('%s').to_python()z8    __default__ = lambda self, n, c, m: c if c else Nonez>parser = Lark(grammar, start="n_%s", maybe_placeholders=False)zdef parse(text):z;    return TransformNearley().transform(parser.parse(text))r,   )N)js2pyr   rS   setr5   r   itemsreprr   rV   Ztranslate_js6Ztranslate_js)rX   r?   rY   r[   es6rg   rc   r7   rZ   r\   Zlark_gr8   r   r   rb   r   create_code_for_nearley_grammar   s4    
"
rl   c              	   C   sb   t j| dd}| }W d    n1 s,0    Y  t||tj|dtjtj| |dS )NrF   rG   rD   )rk   )	rP   rQ   rR   rl   rM   rN   r5   rT   rU   )fnr?   nearley_librk   r`   Zgrammarr   r   r   main   s    &ro   c                  C   sJ   t jdd} | jddd | jddd | jdd	d | jd
ddd | S )NzSReads a Nearley grammar (with js functions), and outputs an equivalent lark parser.)descriptionnearley_grammarz/Path to the file containing the nearley grammar)help
start_rulez5Rule within the nearley grammar to make the base rulern   zHPath to root directory of nearley codebase (used for including builtins)z--es6zEnable experimental ES6 support
store_true)rr   action)argparseArgumentParseradd_argument)r   r   r   r   get_arg_parser   s    ry   __main__r   )rm   r?   rn   rk   )F)F)__doc__os.pathrM   sysrP   rv   Zlarkr   r   r   rq   rJ   r   r   rS   rl   ro   ry   r@   r   r   argv
print_helpstderrexit
parse_argsargsprintrs   rn   rk   r   r   r   r   <module>   s*   $;
'

