
    Xhy                        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      Zd Z e	d	
       G d de             Zd ZddZddZd Zedk(  r e       Z eej*                        dk(  r-ej-                  ej.                          ej0                  d       ej3                         Z e eej                  ej8                  ej:                  ej<                               yy)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

    earleybasic)parserlexerc                 r    dddj                  | |       } d| j                  dd      j                         z   S )N	_ws_maybe_ws)___n_$
__DOLLAR__)getreplacelower)names    F/var/www/html/myenv/lib/python3.12/site-packages/lark/tools/nearley.py_get_rulenamer   1   s8    E*..tT:D$,,sL177999    T)inlinec                   T    e 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y)NearleyToLarkc                 <    d| _         i | _        i | _        i | _        y )Nr   )_countextra_rulesextra_rules_revalias_js_codeselfs    r   __init__zNearleyToLark.__init__7   s!    !r   c                 l    d| j                   z  }| xj                   dz  c_         || j                  |<   |S )Nzalias_%d   )r   r    )r"   coder   s      r   _new_functionzNearleyToLark._new_function=   s3    DKK'q#'4 r   c                     || j                   v r| j                   |   S dt        | j                        z  }|| j                  vsJ || j                  |<   || j                   |<   |S )Nzxrule_%d)r   lenr   )r"   ruler   s      r   _extra_rulezNearleyToLark._extra_ruleD   so    4'''''--C 0 0114+++++!%%)T"r   c                     t        |      S Nr   )r"   r   s     r   r*   zNearleyToLark.ruleN   s    T""r   c                 $    dt        |      d|S )N!z: r.   )r"   r   expss      r   ruledefzNearleyToLark.ruledefQ   s    )$/66r   c                 4    d|d|}| j                  |      S )N()r+   )r"   itemopr*   s       r   exprzNearleyToLark.exprT   s    $%%r   c                     d|z  S )Nz/%s/ )r"   rs     r   regexpzNearleyToLark.regexpX   s    zr   c                      y)N r;   r!   s    r   nullzNearleyToLark.null[   s    r   c                 $    | j                  |      S r-   r6   )r"   ss     r   stringzNearleyToLark.string^   s    ""r   c                     |d d |d   }}|j                   r(|j                   \  }|dd }d| j                  |      z   }nd}dj                  |      |z   S )N   z-> r?    )childrenr'   join)r"   xjsjs_codealiass        r   	expansionzNearleyToLark.expansiona   s_    #2"2;;{{IGamGD..w77EExx{U""r   c                 *    ddj                  |      z  S )Nz%sz
    |)rJ   )r"   rK   s     r   
expansionszNearleyToLark.expansionsk   s    y~~a())r   c                 8    dj                  t        d |            S N
)rJ   filter)r"   ruless     r   startzNearleyToLark.startn   s    yye,--r   N)__name__
__module____qualname__r#   r'   r+   r*   r2   r9   r=   r@   rC   rO   rQ   rW   r;   r   r   r   r   5   s>     #7&##*.r   r   c                 J   g }t         j                  |       }|j                  D ]o  }|j                  dk(  r|j                  \  }	}
|	dv r|	dk(  r|n|}t        j
                  j                  ||
dd       }||vsW|j                  |       t        j                  |d      5 }|j                         }d d d        |t        |||t        j
                  j                  t        j
                  j                  |            |      z  }J |	       |j                  dk(  r&|j                  \  }|d	d
 }|j                  |       "|j                  dk(  r3|j                  dk(  r"|j                  |j                  |             dt!        d|z         |S # 1 sw Y   xY w)N	directive)builtinincluder]   r%   rE   utf8encodingrM   rF   rG   macror2   zUnknown statement: %s)nearley_grammar_parserparserI   dataospathrJ   addcodecsopenread_nearley_to_larkabspathdirnameappend	transform	Exception)gbuiltin_pathn2lrM   folder_pathincludes	rule_defstree	statementr\   argfolderrg   ftextr&   s                   r   rl   rl   q   s   I!''*D]] A	>>[(&//NIs22)2i)?[ww||FC"I6x'LL&TF; (q vvx(!1$c7TVT[T[TcTcdfdkdkdsdstxdyTz  }E  "F  FI'i'u^^y(&&FD":DNN4 ^^w&^^y(S]]9563i?@@-A0 !( (s   #FF"	c           	         dd l }g dfd	}dg}t               }t        | ||||t                     }	dj	                  |	      }
|
ddj	                  d |j
                  j                         D              z   z  }
 |d        |         |dt        |
      z           |        |j                  j                         D ]  \  }}|j                  |d|d	        |r' ||j                  dj	                  |                   n& ||j                  dj	                  |                    |d
       |j                  D ]  } |d|d|d         |d        |         |d|z          |d        |d       dj	                        S )Nr   c                 N    | rj                  |        j                  d       y rS   )ro   )rK   	emit_codes    r   emitz-create_code_for_nearley_grammar.<locals>.emit   s"    Qr   zfunction id(x) {return x[0];}rT   c              3   &   K   | ]	  }d |z    yw)z!%s: %sNr;   ).0r7   s     r   	<genexpr>z2create_code_for_nearley_grammar.<locals>.<genexpr>   s     R$Y-Rs   z"from lark import Lark, Transformerz
grammar = z = (z);z$class TransformNearley(Transformer):z    z = var.get('z').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   rl   setrJ   r   itemsreprr    ro   translate_js6translate_js)rr   rW   rs   ru   es6r   r   rM   rt   rw   lark_grN   r&   r   s                @r   create_code_for_nearley_grammarr      sn   I
 //G
/C L#wSUSIYYy!F
d499R#//:O:O:QRRRRF	-.FV	$%F((..0 5tud345 U  7!345U		' 234	/0"" DUEBCD	CDF	IE	QR		FG779r   c           
      J   t        j                  | d      5 }|j                         }d d d        t        |t        j
                  j                  |d      t        j
                  j                  t        j
                  j                  |             |      S # 1 sw Y   qxY w)Nr_   r`   r]   )r   )	ri   rj   rk   r   rf   rg   rJ   rm   rn   )fnrW   nearley_libr   r|   grammars         r   mainr      s    	R&	) Q&&(*7E277<<U^;_acahahapapqsqxqx  rA  rA  BD  rE  bF  LO  P  P s   BB"c                      t        j                  d      } | j                  dd       | j                  dd       | j                  dd	       | j                  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 ruler   zHPath to root directory of nearley codebase (used for including builtins)z--es6zEnable experimental ES6 support
store_true)r   action)argparseArgumentParseradd_argument)r   s    r   get_arg_parserr      sr    $$  2G  HF
)0ab
+bc
,vw
&GP\]Mr   __main__r%   )r   rW   r   r   )F)__doc__os.pathrf   sysri   r   larkr   r   r   r   rc   r   r   rl   r   r   r   rX   r   r)   argv
print_helpstderrexit
parse_argsargsprintr   r   r   r;   r   r   <module>r      s    #  
   + *"H ohgN : t9.K 9. 9.v>%NP
 zF
388}#**%D	$$&&doo4K[K[aeaiai
jk r   