MpjU:dZddlmZmZmZmZmZddlmZddl m Z ddl m Z ddl mZmZddlmZmZmZd d lmZdd lmZd d lmZd d lmZmZmZmZmZerddl m!Z!m"Z"GddZ#y)aThis module implements an Earley parser. The core Earley algorithm used here is based on Elizabeth Scott's implementation, here: https://www.sciencedirect.com/science/article/pii/S1571066108001497 That is probably the best reference for understanding the algorithm here. The Earley parser outputs an SPPF-tree as per that document. The SPPF tree format is explained here: https://lark-parser.readthedocs.io/en/latest/_static/sppf/sppf.html ) TYPE_CHECKINGCallableOptionalListAny)deque)Token)Tree) UnexpectedEOFUnexpectedToken)logger OrderedSet dedup_list)GrammarAnalyzer) NonTerminal)Item)ForestSumVisitor SymbolNodeStableSymbolNode TokenNodeForestToParseTree) LexerConf ParserConfceZdZUded<ded<eed<ddedfddddded eded eeee ge fd efd Z d Z ddZ dZy)Parserr lexer_confr parser_confdebugTF term_matcherresolve_ambiguity tree_class ordered_setsc^t|}||_||_||_||_||_|rt nt|_|rtnt|_ |j|_ |j|_ |j|_ i|_|jD chc]"} | j D]} | j"s| $c} } |_|jD chc]"} | j D]} | j"r| $c} } |_d|_|jD]} | j*|jvrJ|j-| j*D cgc]} | j.c} |j| j*<|j(r| j0j2t4|_|jj6dk7rG|j(;|jj8D]"} | j2st4|_||_y||_ycc} } wcc} } wcc} w)Nbasic)rrrr"r r rsetSetrrFIRSTNULLABLE callbacks predictionsrules expansionis_term TERMINALS NON_TERMINALSforest_sum_visitororigin expand_ruleruleoptionspriorityr lexer_type terminalsr!)selfrrr!r"r r#r$analysisrsymr5xterms a/mnt/ssd/data/Dropbox/adrian/scripts/msg_venv/lib/python3.12/site-packages/lark/parsers/earley.py__init__zParser.__init__ s#;/$&!2  !-:3.:* ^^  )) $..)4(9(9a1Q[[acTWT_T_3a3a,7,=,=iqi#\_\g\gsisi"&%% ;D{{$"2"22AIAUAUVZVaVaAb0cA0c  - &&.4<<3H3H3T*:' ; ?? % % 0T5L5L5T11 ==.>D+(   )/bi 1ds H?H H$>H$H*c4 i}||}t|}|r|j} | jrd| j| j| j |f} | |vr|| n|j | |j| | _| jj| j| j| j dd| jj|| j vrA|| j | j} | j|| jvr|| j| j} n| } t| j| j| j } | j| j |f} | |vr|| n|j | |j| | _| jj| | j| j |j"vr|j%| n| |vr |j%| |j'| n| j |k(}|r#| j|| jj<|| j Dcgc]+}|j |j | jk(s*|-}}|D]}|j)} | j|j |f} | |vr|| n|j | |j| | _| jj| j| j||j| j| j |j"vr|j%| | |vs|j%| |j'| nx| j |j*vr_g}|j,| j D] }t|d|} |j'| "| j |vr| j)} | j| j |f} | |vr|| n|j | |j| | _| jj| j| j| j | j|| j |j'| |D]S} | j |j"vr|j%| -| |vs2|j%| |j'| U|ryycc}w)aThe core Earley Predictor and Completer. At each stage of the input, we handling any completed items (things that matched on the last cycle) and use those to predict what should come next in the input stream. The completions and any predicted non-terminals are recursively processed until we reach a set of, which can be added to the scan list for the next scanner cycle.Nr)rpop is_completenodesstart setdefaultr add_familyr5r3previouscolumnrptradd_pathexpectr0addappendadvancer1r,)r:ito_scancolumns transitives node_cacheheld_completionsrKitemsitemlabel transitiveroot_transitivenew_item is_empty_item originator originators new_itemsr5s r@predict_and_completezParser.predict_and_completeNsf 99;D99$!VVTZZ3E5:j5H 5 1jNcNcdikzkokzkz}BlCODDIII((DJJdS 99##{4::'>>!,TZZ!8!@J!**k*:K:K.LL*5j6G6G*HI\I\*]*4#JOOZ^^ZEUEUVH,..0E0EqIE9>*9LJu$5R\RgRghmo~oso~o~AFpGSHHMMM**?DIIF$..8 H-!/ 8, X.%)JJ!OM$=AYY()9)9:@G @S#V*WaWhWhWtzDzKzKOSOUOUzU:#VK#V&1 3 #-#5#5#7!)Z-=-=q A=Bj=P 5(9V`VkVklqtCswtCtCEJtKWL  00X]]Az`d`i`ij#??dnn<#KK1%V3"JJx0!LL2 3 2 22  ,,T[[9/D#D!Q/H$$X./ ;;"22#||~H%ZZQ7E9>*9LJu$5R\RgRghmo~oso~o~AFpGSHHMMM,,XZZX\XaXacstxttdAB$$X. )/H$..8 H-!/ 8, X. /OT#Vs.TTTNc fd} fd}j jj ig |Dchc]}|j}}d}i} |j |D]V} j | | ||| |\}} |dz }|j ||Dchc]}|jc}z}Xj | | |tdz k(sJ|Scc}wcc}w)Nc|jry|j}|js_|jjvry|jj k(r|jk(ry|j}|js_y)NTF)rDrQrNr*r5r3)rYquasir: start_symbols r@is_quasi_completez(Parser._parse..is_quasi_completesqLLNE''<z.Parser._parse..scan..scylmdedgdgcy)considered_rulesstate)r(rPrNrQrFrG isinstancer gettyperrHrrErIr5r0rOnamer r' frozenset)rRtokenrS next_to_scannext_setrVrYr]rZr? token_noderNrTmatchr:r9rUs r@scanzParser._parse..scans 88:LxxzH NN8 $   r "J) /e,#||~H%ZZQ?E9C5%8P9==4VZD "+5$!CJ9>*9LJu$5R\RgRghmo~oso~o~AFpGSHHMMM,,XZZHNNTXT]T]_ij$..8$((2! X.+ /.L189A!((--99%eVc'lZccyqxcyZyzz+ +:sGrr)r!rterminals_by_namerNlexrbclearlen)r:lexerrTrSrfrgr}rRexpectsrVrxr|r9rUs` ` ` @@@r@_parsez Parser._parses  ) ,) ,Z!!OO55 d &--188--  YYw' 3E  % %a'; S"&q%"9 GZ FA MMO '2Q2 2G 3 !!!Wg{JOCLN"""!.3s C,(C1c|sJ|t||jg}|j}|jD]M}t|dd}|j|j vr|j |:|dj |O|j|||}tfd|dD}|s@|Dcgc]}|jj} }t| td|Dt|dkDr td|\} |jr ddlm}  | } | j#| d |j*g|j, } t/|j*|j0|j2xr|j3|j,| }|j5| S| Scc}w#t$$rt'j(d YwxYw) Nrc3K|]J}|js|j|jk(s-|jdk(s=|jLyw)Nr)rDrErFrG)rnnrfs r@rozParser.parse..s_M!ammPQPVPVPbghgjgjnzgz@A@G@GKL@LqvvMsA AAAAc34K|]}|jywrkrlrms r@rozParser.parse.. sCYAACCCYrp)rrrzOEarley should not generate multiple start symbol items! Please report this bug.)ForestToPyDotVisitorzsppf.pngzBCannot find dependency 'pydot', will not generate sppf debug image)rr(r,rrNr0rOrrrvr rwr RuntimeErrorr earley_forestrvisit ImportErrorrwarningr r"rr+r2 transform)r:rrGrTrSr5rY solutionstexpected_terminalssolutionr debug_walker use_cache transformerrfs @r@parsez Parser.parseseu"5) 88:,((* $$\2 %Da#D{{dnn, D! t$  %++eWg|D Mwr{MM 9@!AA!((--!A !A 2)CYQXCY:YZ Z y>A pq q  :: ; 935 ""8Z8 99 !222I+DIIt~~tG^G^G|cgczczc|CUUW`aK((2 23"B ecd esG3GG'&G'rk)__name__ __module__ __qualname____annotations__boolr rrstrrrrArbrrrhr@rrs K*.5BF[_+);+)\+)Ya+)$(+)6:+)%hT{C/?&@A+)VZ+)\Z/x[z1rhrN)$__doc__typingrrrrr collectionsrrr treer exceptionsr r utilsrrrgrammar_analysisrgrammarr earley_commonrrrrrrrcommonrrrrrhr@rsF @?722-!gg.]]rh