o
    0 iy                     @   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rue Zeejdkraeej ed e Zeeej
ejejejd dS 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   ^/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/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sJ || 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      zNearleyToLark.rulec                 C   s   dt ||f S )N!%s: %sr#   )r   r   Zexpsr   r   r   ruledefQ      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   r$   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   xjsjs_codealiasr   r   r   	expansiona   s   zNearleyToLark.expansionc                 G   s   dd | S )Nz%sz
    |)r7   )r   r8   r   r   r   
expansionsk   s   zNearleyToLark.expansionsc                 G   s   d td |S N
)r7   filter)r   rulesr   r   r   startn   r'   zNearleyToLark.startN)__name__
__module____qualname__r   r   r!   r    r&   r+   r-   r/   r1   r<   r=   rB   r   r   r   r   r   5   s    

r   c                 C   s4  g }t | }|jD ]}|jdkri|j\}	}
|	dv re|	dkr |n|}tj||
dd }||vrd|| tj	|dd}|
 }W d    n1 sLw   Y  |t||||tjtj||7 }q
J |	|jd	kr~|j\}|d
d }|| q
|jdkrq
|jdkr||| q
td| |S )N	directive)builtinincluderG   r   r2   utf8encodingFr:   r3   r4   macror&   zUnknown statement: %s)nearley_grammar_parserparser6   dataospathr7   addcodecsopenread_nearley_to_larkabspathdirnameappendZ	transform	Exception)gbuiltin_pathn2lr:   folder_pathZincludes	rule_defstreeZ	statementrF   argfolderrQ   ftextr   r   r   r   rV   q   s4   





&


rV   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  qJ|re||
d| n
||d| |d |jD ]
}|d||f  qv|d |  |d|  |d |d d S )Nr   c                    s   | r  |    d d S r>   )rY   )r8   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>   s    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.   r"   )js2pyr   rV   setr7   r   itemsreprr   rY   Ztranslate_js6Ztranslate_js)r[   rB   r\   r^   es6ri   rf   r:   r]   r_   Zlark_gr;   r   r   re   r   create_code_for_nearley_grammar   s4   
"

rn   c              	   C   sb   t j| dd}| }W d    n1 sw   Y  t||tj|dtjtj| |dS )NrI   rJ   rG   )rm   )	rS   rT   rU   rn   rP   rQ   r7   rW   rX   )fnrB   nearley_librm   rc   Zgrammarr   r   r   main   s   
,rq   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 rulerp   zHPath to root directory of nearley codebase (used for including builtins)z--es6zEnable experimental ES6 support
store_true)rt   action)argparseArgumentParseradd_argument)r   r   r   r   get_arg_parser   s   r{   __main__r   )ro   rB   rp   rm   )F)__doc__Zos.pathrP   sysrS   rx   Zlarkr   r   r   rs   rM   r   r   rV   rn   rq   r{   rC   r   r   argv
print_helpstderrexit
parse_argsargsprintru   rp   rm   r   r   r   r   <module>   s.    $;

'
 