
    y              	          S r SSKrSSKrSSKrSSKrSSKJrJrJ	r	  Sr
\" \
SSS9rS r\	" S	S
9 " S S\5      5       rS rSS jrSS jrS r\S:X  a  \" 5       r\" \R*                  5      S:X  a-  \R-                  \R.                  5        \R0                  " S5        \R3                  5       r\" \" \R                  \R8                  \R:                  \R<                  S95        gg)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                 p    SSS.R                  X 5      n SU R                  SS5      R                  5       -   $ )N	_ws_maybe_ws)___n_$
__DOLLAR__)getreplacelower)names    %lib/third_party/lark/tools/nearley.py_get_rulenamer   1   s6    E*..t:D$,,sL177999    T)inlinec                   \    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rS rSrg)NearleyToLark5   c                 <    SU l         0 U l        0 U l        0 U l        g )Nr   )_countextra_rulesextra_rules_revalias_js_codeselfs    r   __init__NearleyToLark.__init__7   s!    !r   c                 j    SU R                   -  nU =R                   S-  sl         XR                  U'   U$ )Nzalias_%d   )r   r!   )r#   coder   s      r   _new_functionNearleyToLark._new_function=   s1    DKK'q#'4 r   c                     XR                   ;   a  U R                   U   $ S[        U R                  5      -  nX R                  ;  d   eXR                  U'   X R                   U'   U$ )Nzxrule_%d)r    lenr   )r#   ruler   s      r   _extra_ruleNearleyToLark._extra_ruleD   sg    '''''--C 0 011+++++!%%)T"r   c                     [        U5      $ Nr   )r#   r   s     r   r-   NearleyToLark.ruleN   s    T""r   c                 (    S[        U5      < SU< 3$ )N!z: r2   )r#   r   expss      r   ruledefNearleyToLark.ruledefQ   s    )$/66r   c                 8    SU< SU< 3nU R                  U5      $ )N()r.   )r#   itemopr-   s       r   exprNearleyToLark.exprT   s    $%%r   c                     SU-  $ )Nz/%s/ )r#   rs     r   regexpNearleyToLark.regexpX   s    zr   c                     g)N rB   r"   s    r   nullNearleyToLark.null[   s    r   c                 $    U R                  U5      $ r1   r<   )r#   ss     r   stringNearleyToLark.string^   s    ""r   c                     US S US   p!UR                   (       a(  UR                   u  nUSS nSU R                  U5      -   nOSnSR                  U5      U-   $ )N   z-> rG    )childrenr)   join)r#   xjsjs_codealiass        r   	expansionNearleyToLark.expansiona   s]    #2"2;;{{IGamGD..w77EExx{U""r   c                 *    SSR                  U5      -  $ )Nz%sz
    |)rT   )r#   rU   s     r   
expansionsNearleyToLark.expansionsk   s    y~~a())r   c                 8    SR                  [        S U5      5      $ N
)rT   filter)r#   ruless     r   startNearleyToLark.startn   s    yye,--r   )r   r!   r   r    N)__name__
__module____qualname____firstlineno__r$   r)   r.   r-   r7   r?   rD   rH   rL   rY   r\   rc   __static_attributes__rB   r   r   r   r   5   s>     #7&##*.r   r   c                 f   / n[         R                  U 5      nUR                   GHw  nUR                  S:X  a  UR                  u  pU	S;   a  U	S:X  a  UOUn[        R
                  R                  XSS 5      nX;  a  UR                  U5        [        R                  " USS9 nUR                  5       nS S S 5        U[        WXU[        R
                  R                  [        R
                  R                  U5      5      U5      -  nM  M   U	5       eUR                  S:X  a'  UR                  u  nUS	S
 nUR                  U5        GM&  UR                  S:X  a  GM9  UR                  S:X  a#  UR                  UR                  U5      5        GMl  [!        SU-  5      e   U$ ! , (       d  f       N= f)N	directive)builtinincluderl   r'   rO   utf8encodingrW   rP   rQ   macror7   zUnknown statement: %s)nearley_grammar_parserparserS   dataospathrT   addcodecsopenread_nearley_to_larkabspathdirnameappend	transform	Exception)gbuiltin_pathn2lrW   folder_pathincludes	rule_defstree	statementrk   argfolderrv   ftextr(   s                   r   r{   r{   q   s|   I!''*D]]	>>[(&//NI22)2i)?[ww||F"I6'LL&TF;q vvx <!1$7TVT[T[TcTcdfdkdkdsdstxdyTz  }E  "F  FI	 ( (i'u^^y(&&FD":DNN4 ^^w&^^y(S]]9563i?@@- #0 ! <;s   #F""
F0	c           	      6  ^ SS K n/ mSU4S jjnS/n[        5       n[        XXU[        5       5      n	SR	                  U	5      n
U
SSR	                  S UR
                  R                  5        5       5      -   -  n
U" S5        U" 5         U" S[        U
5      -   5        U" 5         UR                  R                  5        H  u  pUR                  U< SU< S	35        M      U(       a'  U" UR                  SR	                  U5      5      5        O&U" UR                  SR	                  U5      5      5        U" S
5        UR                   H  nU" SU< SU< S35        M     U" S5        U" 5         U" SU-  5        U" S5        U" S5        SR	                  T5      $ )Nr   c                 X   > U (       a  TR                  U 5        TR                  S5        g r_   )r~   )rU   	emit_codes    r   emit-create_code_for_nearley_grammar.<locals>.emit   s"    Qr   zfunction id(x) {return x[0];}r`   c              3   ,   #    U  H
  nS U-  v   M     g7f)z!%s: %sNrB   ).0r=   s     r   	<genexpr>2create_code_for_nearley_grammar.<locals>.<genexpr>   s     R:Q$Y-:Qs   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))rG   r1   )js2pyr   r{   setrT   r   itemsreprr!   r~   translate_js6translate_js)r   rc   r   r   es6r   r   rW   r   r   lark_grX   r(   r   s                @r   create_code_for_nearley_grammarr      s\   I
 //G
/C #SUSIYYy!F
d499R#//:O:O:QRRRRF	-.FV	$%F((..0ud34 1 U  7!345U		' 234	/0""UEBC #	CDF	IE	QR		FG779r   c           
      J   [         R                  " U SS9 nUR                  5       nS S S 5        [        WU[        R
                  R                  US5      [        R
                  R                  [        R
                  R                  U 5      5      US9$ ! , (       d  f       Ns= f)Nrn   ro   rl   )r   )	rx   ry   rz   r   ru   rv   rT   r|   r}   )fnrc   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                      [         R                  " SS9n U R                  SSS9  U R                  SSS9  U R                  SS	S9  U R                  S
SSS9  U $ )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   rc   r   r   )F)__doc__os.pathru   sysrx   r   larkr   r   r   r   rr   r   r   r{   r   r   r   re   r   r,   argv
print_helpstderrexit
parse_argsargsprintr   r   r   rB   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   