§
    Z¸£j*  ã                  óÐ  — d Z ddlmZ ddlZddlmZmZ ddlmZm	Z	m
Z
mZmZmZ  G d„ de¦  «        Ze G d„ d	¦  «        ¦   «         Ze G d
„ d¦  «        ¦   «         Ze G d„ d¦  «        ¦   «         Zeeeef         Ze G d„ d¦  «        ¦   «         Zh d£Z ej        d¦  «        Z ej        d¦  «        Z ej        d¦  «        Z ej        d¦  «        Zd%d„Zd&d„Zd'd!„Zd(d$„ZdS ))uü  
AutoPOE2 Pickit DSL Parser (Phase P2 - Doc 29 má»¥c 9)
PhÃ¢n tÃ­ch cÃº phÃ¡p cÃ¡c quy táº¯c lá»�c Ä‘á»“ .ipd thÃ nh cáº¥u trÃºc AST vÃ  danh sÃ¡ch PickitRule.
CÃº phÃ¡p:
  [KEY] OP "VALUE" (&&|\|\|) ... # [KEY] OP "VALUE" ...
  - BÃªn trÃ¡i dáº¥u '#': Pre-condition (trÃªn sÃ n, chÆ°a ID).
  - BÃªn pháº£i dáº¥u '#': Post-condition vÃ  cÃ¡c hÃ nh Ä‘á»™ng (Stash, Run, Sell, Salvage...).
  - '//': ChÃº thÃ­ch dÃ²ng hoáº·c trailing comment.
  - '//[' hoáº·c '//!': Quy táº¯c bá»‹ vÃ´ hiá»‡u hÃ³a (disabled).
é    )ÚannotationsN)Ú	dataclassÚfield)ÚListÚOptionalÚTupleÚUnionÚDictÚSetc                  ó   — e Zd ZdZdS )ÚPickitParseErroru1   Lá»—i cÃº phÃ¡p khi phÃ¢n tÃ­ch file luáº­t .ipd.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    ú8C:\Projects\AutoPOE2\src\assistant_tool\pickit\parser.pyr   r      s   € € € € € Ø;Ð;Ø€Dr   r   c                  ó:   — e Zd ZU dZded<   ded<   ded<   d	d„ZdS )
ÚClauseu.   Má»‡nh Ä‘á»� so sÃ¡nh Ä‘Æ¡n: [KEY] OP "VALUE" ÚstrÚkeyÚopÚvalueÚreturnc                ó8   — d| j         › d| j        › d| j        › d�S )Nú[z] ú "ú"©r   r   r   ©Úselfs    r   Ú__repr__zClause.__repr__   s)   € Ø9�4”8Ð9Ð9˜tœwÐ9Ð9¨4¬:Ð9Ð9Ð9Ð9r   N©r   r   ©r   r   r   r   Ú__annotations__r#   r   r   r   r   r      sK   € € € € € € à8Ð8Ø€H€H�HØ€G€G�GØ€J€J�Jð:ð :ð :ð :ð :ð :r   r   c                  ó:   — e Zd ZU dZded<   ded<   ded<   dd	„Zd
S )ÚWeightedSumClauseu‚   Má»‡nh Ä‘á»� tá»•ng cÃ³ trá»�ng sá»‘: [WeightedSum] 2*[mod1] + 3*[mod2] OP "VALUE" hoáº·c [WeightedSum(mod1:2,mod2:3)] OP "VALUE" zList[Tuple[float, str]]Útermsr   r   Úfloatr   r   c                óv   — d                      d„ | j        D ¦   «         ¦  «        }d|› d| j        › d| j        › d�S )Nz + c              3  ó,   K  — | ]\  }}|› d |› d�V — ŒdS )z*[ú]Nr   )Ú.0ÚwÚks      r   ú	<genexpr>z-WeightedSumClause.__repr__.<locals>.<genexpr>*   s2   è è € Ð?Ð?©D¨A¨q˜a˜<˜< 1˜<˜<˜<Ð?Ð?Ð?Ð?Ð?Ð?r   z[WeightedSum] ú r   r   )Újoinr)   r   r   )r"   Út_strs     r   r#   zWeightedSumClause.__repr__)   sI   € Ø—
’
Ð?Ð?°D´JÐ?Ñ?Ô?Ñ?Ô?ˆØB ÐBÐB¨¬ÐBÐB°D´JÐBÐBÐBÐBr   Nr$   r%   r   r   r   r(   r(   "   sZ   € € € € € € ð Mð  MØ"Ð"Ð"Ñ"Ø€G€G�GØ€L€L�LðCð Cð Cð Cð Cð Cr   r(   c                  ó:   — e Zd ZU dZded<   ded<   ded<   d
d„Zd	S )ÚBinaryOpu@   ToÃ¡n tá»­ logic káº¿t há»£p: left && right hoáº·c left || rightr   r   ÚASTNodeÚleftÚrightr   c                ó8   — d| j         › d| j        › d| j        › d�S )Nú(r2   ú))r8   r   r9   r!   s    r   r#   zBinaryOp.__repr__5   s)   € Ø6�4”9Ð6Ð6˜tœwÐ6Ð6¨¬Ð6Ð6Ð6Ð6r   Nr$   r%   r   r   r   r6   r6   .   sK   € € € € € € àJÐJØ€G€G�GØ€M€M�MØ€N€N�Nð7ð 7ð 7ð 7ð 7ð 7r   r6   c                  óš   — e Zd ZU dZded<   ded<   ded<   ded<   ded	<   d
Zded<   d
Zded<    ee¬¦  «        Z	ded<   dZ
ded<   dd„Zd
S )Ú
PickitRuleu/   Má»™t quy táº¯c lá»�c Ä‘á»“ .ipd hoÃ n chá»‰nh.ÚintÚline_numr   Úraw_lineÚboolÚenabledÚpre_rawÚpost_rawNúOptional[ASTNode]Úpre_astÚpost_ast)Údefault_factoryzSet[str]ÚactionsFÚrequires_post_modsr   c                óD   — | j         rdnd}d| j        › d|› d| j        › d�S )NÚENABLEDÚDISABLEDz<PickitRule line=r2   z	 actions=ú>)rC   r@   rJ   )r"   Ústatuss     r   r#   zPickitRule.__repr__I   s7   € Ø"œlÐ:��°
ˆØS 4¤=ÐSÐS°6ÐSÐSÀDÄLÐSÐSÐSÐSr   r$   )r   r   r   r   r&   rG   rH   r   ÚsetrJ   rK   r#   r   r   r   r>   r>   <   sµ   € € € € € € à9Ð9Ø€M€M�MØ€M€M�MØ€M€M�MØ€L€L�LØ€M€M�MØ!%€GÐ%Ð%Ð%Ñ%Ø"&€HÐ&Ð&Ð&Ñ&Ø˜¨cÐ2Ñ2Ô2€GÐ2Ð2Ð2Ñ2Ø$ÐÐ$Ð$Ð$Ñ$ðTð Tð Tð Tð Tð Tr   r>   >   ÚSellÚExaltÚRunMapÚAugmentÚCorruptÚSalvageÚSellItemÚ	IgnoreMapÚ	StashItemÚ	StashUnidÚ	UseTabletÚ
DisenchantÚSalvageItemÚIgnoreRitualÚUpgradeToRareÚDisenchantItemz@\[(?P<key>[^\]]+)\]\s*(?P<op>==|!=|<=|>=|<|>)\s*"(?P<val>[^"]*)"zO\[WeightedSum\((?P<args>[^)]+)\)\]\s*(?P<op>==|!=|<=|>=|<|>)\s*"(?P<val>[^"]*)"zS\[WeightedSum\]\s*(?P<expr>[^=!<>\n]+)\s*(?P<op>==|!=|<=|>=|<|>)\s*"(?P<val>[^"]*)"z+([+-]?\s*\d+(?:\.\d+)?)\s*\*\s*\[([^\]]+)\]Úexpr_strr   r@   r?   r   rF   c                ó<  — |                       ¦   «         }|sdS d„ |                     d¦  «        D ¦   «         }t          |¦  «        dk    rJt          |d         |¦  «        }|dd…         D ]'}t          ||¦  «        }|r|rt	          d||¦  «        }Œ(|S d„ |                     d¦  «        D ¦   «         }t          |¦  «        dk    rJt          |d         |¦  «        }|dd…         D ]'}t          ||¦  «        }|r|rt	          d||¦  «        }Œ(|S t
                               |¦  «        }|�r±|                     d¦  «        }	|                     d	¦  «        }
|                     d
¦  «        }g }|	                     d¦  «        D ]ü}|                      ¦   «         }|sŒd|v rb|                     dd¦  «        \  }}|                     t          |                      ¦   «         ¦  «        |                      ¦   «         f¦  «         Œd|v rb|                     dd¦  «        \  }}|                     t          |                      ¦   «         ¦  «        |                      ¦   «         f¦  «         Œå|                     d|f¦  «         Œý|st          d|› d|› �¦  «        ‚	 t          |¦  «        }n$# t          $ r t          d|› d|› d�¦  «        ‚w xY wt          ||
|¬¦  «        S t                               |¦  «        }|�r|                     d¦  «        }|                     d	¦  «        }
|                     d
¦  «        }g }t                               |¦  «        D ]v}t          |                     d¦  «                             dd¦  «        ¦  «        }|                     d¦  «                              ¦   «         }|                     ||f¦  «         Œw|st          d|› d|› �¦  «        ‚	 t          |¦  «        }n$# t          $ r t          d|› d|› d�¦  «        ‚w xY wd|v r€d|vr|d„ |                     d¦  «        D ¦   «         }t          |¦  «        dk    rJt          |d         |¦  «        }|dd…         D ]'}t          ||¦  «        }|r|rt	          d||¦  «        }Œ(|S t"                               |¦  «        }|ru|                     d¦  «                              ¦   «         }|                     d	¦  «                              ¦   «         }
|                     d
¦  «        }t%          ||
|¬¦  «        S t'          j        d|¦  «        }|rB|                     d¦  «                              ¦   «         }|t*          v rt%          |dd ¬¦  «        S t          d|› d!|› d�¦  «        ‚)"u^   PhÃ¢n tÃ­ch biá»ƒu thá»©c Ä‘iá»�u kiá»‡n (chuá»—i cÃ¡c clause káº¿t há»£p bá»Ÿi && hoáº·c ||).Nc                ó6   — g | ]}|                      ¦   «         ‘ŒS r   ©Ústrip©r.   Úps     r   ú
<listcomp>z%_parse_expression.<locals>.<listcomp>k   s    € Ð1Ð1Ð1˜a�—’‘	”	Ð1Ð1Ð1r   z||é   r   c                ó6   — g | ]}|                      ¦   «         ‘ŒS r   re   rg   s     r   ri   z%_parse_expression.<locals>.<listcomp>u   s    € Ð2Ð2Ð2˜q�—’‘”Ð2Ð2Ð2r   z&&Úargsr   Úvalú,ú:Ú*g      ð?õ   DÃ²ng u@   : KhÃ´ng tÃ¬m tháº¥y terms há»£p lá»‡ trong [WeightedSum(...)]: u-   : GiÃ¡ trá»‹ [WeightedSum] pháº£i lÃ  sá»‘: 'ú')r)   r   r   Úexprr2   Ú é   u;   : KhÃ´ng tÃ¬m tháº¥y terms há»£p lá»‡ trong [WeightedSum]: r;   c                ó^   — g | ]*}|                      ¦   «         ¯|                      ¦   «         ‘Œ+S r   re   rg   s     r   ri   z%_parse_expression.<locals>.<listcomp>­   s-   € ÐDÐDÐD Q¸!¿'º'¹)¼)ÐD�q—w’w‘y”yÐDÐDÐDr   r   r    z^\[(?P<action>[^\]]+)\]$Úactionú==Útrueu-   : CÃº phÃ¡p má»‡nh Ä‘á»� khÃ´ng há»£p lá»‡: ')rf   ÚsplitÚlenÚ_parse_expressionr6   ÚWEIGHTED_SUM_FUNC_REÚsearchÚgroupÚappendr*   r   Ú
ValueErrorr(   ÚWEIGHTED_SUM_REÚWEIGHT_TERM_REÚfinditerÚreplaceÚ	CLAUSE_REr   ÚreÚmatchÚKNOWN_ACTIONS)rb   r@   ÚsÚor_partsÚcurrent_nodeÚpartÚ	next_nodeÚ	and_partsÚw_func_matchÚargs_strr   Úval_strr)   Ú	term_itemr0   Úw_strrm   Úw_matchÚ	terms_strÚ
term_matchr/   Úcomma_partsÚc_matchr   Ú
bare_matchÚacts                             r   r|   r|   d   s   € à�ŠÑÔ€AØð Øˆtð 2Ð1 1§7¢7¨4¡=¤=Ð1Ñ1Ô1€HÝ
ˆ8�}„}�qÒÐÝ(¨°!¬°hÑ?Ô?ˆØ˜Q˜R˜R”Lð 	Gð 	GˆDÝ)¨$°Ñ9Ô9ˆIØð G 	ð GÝ'¨¨l¸IÑFÔF�øØÐð 3Ð2 A§G¢G¨D¡M¤MÐ2Ñ2Ô2€IÝ
ˆ9�~„~˜ÒÐÝ(¨°1¬°xÑ@Ô@ˆØ˜a˜b˜b”Mð 	Gð 	GˆDÝ)¨$°Ñ9Ô9ˆIØð G 	ð GÝ'¨¨l¸IÑFÔF�øØÐõ (×.Ò.¨qÑ1Ô1€LØñ @Ø×%Ò% fÑ-Ô-ˆØ×Ò Ñ%Ô%ˆØ×$Ò$ UÑ+Ô+ˆØ)+ˆØ!Ÿš¨Ñ,Ô,ð 	/ð 	/ˆIØ!ŸšÑ)Ô)ˆIØð ØØ�iÐÐØ$Ÿ?š?¨3°Ñ2Ô2‘��5Ø—’�e E§K¢K¡M¤MÑ2Ô2°A·G²G±I´IÐ>Ñ?Ô?Ð?Ð?Ø˜	Ð!Ð!Ø$Ÿ?š?¨3°Ñ2Ô2‘��qØ—’�e E§K¢K¡M¤MÑ2Ô2°A·G²G±I´IÐ>Ñ?Ô?Ð?Ð?à—’˜c 9Ð-Ñ.Ô.Ð.Ð.Øð 	{Ý"Ð#y¨HÐ#yÐ#yÐvwÐ#yÐ#yÑzÔzÐzð	oÝ˜‘.”.ˆCˆCøÝð 	oð 	oð 	oÝ"Ð#m¨HÐ#mÐ#mÐcjÐ#mÐ#mÐ#mÑnÔnÐnð	oøøøå  u°¸3Ð?Ñ?Ô?Ð?õ ×$Ò$ QÑ'Ô'€GØñ oØ—M’M &Ñ)Ô)ˆ	Ø�]Š]˜4Ñ Ô ˆØ—-’- Ñ&Ô&ˆØ)+ˆÝ(×1Ò1°)Ñ<Ô<ð 	!ð 	!ˆJÝ�j×&Ò& qÑ)Ô)×1Ò1°#°rÑ:Ô:Ñ;Ô;ˆAØ× Ò  Ñ#Ô#×)Ò)Ñ+Ô+ˆAØ�LŠL˜!˜Q˜Ñ Ô Ð Ð Øð 	vÝ"Ð#t¨HÐ#tÐ#tÐqrÐ#tÐ#tÑuÔuÐuð	oÝ˜‘.”.ˆCˆCøÝð 	oð 	oð 	oÝ"Ð#m¨HÐ#mÐ#mÐcjÐ#mÐ#mÐ#mÑnÔnÐnð	oøøøð ˆa€x€x�C˜q�L�LØDÐD¨!¯'ª'°#©,¬,ÐDÑDÔDˆÝˆ{ÑÔ˜aÒÐÝ,¨[¸¬^¸XÑFÔFˆLØ# A B Bœð Kð K�Ý-¨d°HÑ=Ô=�	Øð K Ið KÝ#+¨D°,À	Ñ#JÔ#J�LøØÐå×Ò˜qÑ!Ô!€GØð 1Ø�mŠm˜EÑ"Ô"×(Ò(Ñ*Ô*ˆØ�]Š]˜4Ñ Ô ×&Ò&Ñ(Ô(ˆØ�mŠm˜EÑ"Ô"ˆÝ˜# "¨CÐ0Ñ0Ô0Ð0õ ”Ð5°qÑ9Ô9€JØð :Ø×Ò˜xÑ(Ô(×.Ò.Ñ0Ô0ˆØ•-ÐÐÝ˜c d°&Ð9Ñ9Ô9Ð9å
Ð_ HÐ_Ð_Ð[\Ð_Ð_Ð_Ñ
`Ô
`Ð`s   ÊJ) Ê)!K
Ï&O6 Ï6!PÚnodeúTuple[Set[str], bool]c                ó   — t          ¦   «         }d}| €||fS | g}|rà|                     ¦   «         }t          |t          ¦  «        rT|j        t
          v rC|j        dk    r7|j                             ¦   «         dk    r| 	                    |j        ¦  «         ndd}nat          |t          ¦  «        rd}nIt          |t          ¦  «        r4|                     |j        ¦  «         |                     |j        ¦  «         |°à||fS )ud   
    RÃºt trÃ­ch danh sÃ¡ch action vÃ  kiá»ƒm tra xem rule cÃ³ yÃªu cáº§u post mods hay khÃ´ng.
    FNrx   ry   T)rQ   ÚpopÚ
isinstancer   r   r‰   r   r   ÚlowerÚaddr(   r6   r€   r8   r9   )rœ   rJ   rK   ÚstackÚcurrs        r   Ú_extract_actionsr¥   Ç   s  € õ ‰eŒe€GØÐà€|ØÐ*Ð*Ð*àˆF€EØ
ð %Ø�yŠy‰{Œ{ˆÝ�d�FÑ#Ô#ð 	%ØŒx�=Ð(Ð(Ø”7˜d’?�? t¤z×'7Ò'7Ñ'9Ô'9¸VÒ'CÐ'CØ—K’K ¤Ñ)Ô)Ð)øð &*Ð"Ð"Ý˜Õ/Ñ0Ô0ð 	%Ø!%ÐÐÝ˜�hÑ'Ô'ð 	%Ø�LŠL˜œÑ#Ô#Ð#Ø�LŠL˜œÑ$Ô$Ð$ð ð %ð Ð&Ð&Ð&r   rA   úOptional[PickitRule]c                ó  — |                       ¦   «         }|sdS d}|                     d¦  «        s|                     d¦  «        rd}|dd…                               ¦   «         }n|                     d¦  «        rdS d|v rK|                     d¦  «        }d}d}|D ]}|d	k    r| }n
|d
k    r|s n||z  }Œ|                      ¦   «         }|sdS d|vrt          d|› d| › d�¦  «        ‚|                     dd¦  «        }|d                               ¦   «         }|d                               ¦   «         }	|s|	sdS |rt	          ||¦  «        nd}
|	rt	          |	|¦  «        nd}t          |¦  «        \  }}t          || |||	|
|||¬¦	  «	        S )ub   PhÃ¢n tÃ­ch 1 dÃ²ng text .ipd thÃ nh PickitRule (hoáº·c None náº¿u dÃ²ng trá»‘ng/comment thuáº§n).NTz//[z//!Fru   z//rt   r   ú/ú#rq   uA   : Thiáº¿u dáº¥u '#' phÃ¢n tÃ¡ch pre-identify vÃ  post-identify: 'rr   rj   r   )	r@   rA   rC   rD   rE   rG   rH   rJ   rK   )rf   Ú
startswithrz   r   r|   r¥   r>   )rA   r@   ÚlinerC   ÚpartsÚreconstructedÚin_quoteÚchÚpre_strÚpost_strrG   rH   rJ   rK   s                 r   Ú
parse_liner²   ä   s  € à�>Š>ÑÔ€DØð Øˆtð €GØ‡‚�uÑÔð  §¢°Ñ!7Ô!7ð ØˆØ�A�B�BŒx�~Š~ÑÔˆˆØ	�Š˜Ñ	Ô	ð àˆtð ˆt€|€|Ø—
’
˜4Ñ Ô ˆàˆØˆØð 	 ð 	 ˆBØ�SŠyˆyØ'˜<��Ø�s’� 8�à�Ø˜RÑˆMˆMØ×"Ò"Ñ$Ô$ˆàð Øˆtð �$€€ÝØk�XÐkÐkÐ`hÐkÐkÐkñ
ô 
ð 	
ð �JŠJ�s˜AÑÔ€EØ�AŒh�nŠnÑÔ€GØ�QŒx�~Š~ÑÔ€Hàð ˜8ð Øˆtà6=ÐGÕ ¨Ñ2Ô2Ð2À4€GØ8@ÐJÕ  ¨8Ñ4Ô4Ð4Àd€Hå"2°8Ñ"<Ô"<Ñ€GÐåØØØØØØØØØ-ð
ñ 
ô 
ð 
r   ÚcontentúList[PickitRule]c                ó®   — g }|                       ¦   «         }t          |d¬¦  «        D ],\  }}t          ||¦  «        }|�|                     |¦  «         Œ-|S )uH   PhÃ¢n tÃ­ch toÃ n bá»™ ná»™i dung file .ipd thÃ nh danh sÃ¡ch cÃ¡c rule.rj   )Ústart)Ú
splitlinesÚ	enumerater²   r€   )r³   ÚrulesÚlinesÚidxrA   Úrules         r   Ú	parse_ipdr½   %  se   € à €EØ×ÒÑ Ô €EÝ" 5°Ð2Ñ2Ô2ð ð ‰ˆˆXÝ˜( CÑ(Ô(ˆØÐØ�LŠL˜ÑÔÐøØ€Lr   )rb   r   r@   r?   r   rF   )rœ   rF   r   r�   )rA   r   r@   r?   r   r¦   )r³   r   r   r´   )r   Ú
__future__r   r‡   Údataclassesr   r   Útypingr   r   r   r	   r
   r   ÚSyntaxErrorr   r   r(   r6   r7   r>   r‰   Úcompiler†   r}   r‚   rƒ   r|   r¥   r²   r½   r   r   r   ú<module>rÃ      sh  ðð	ð 	ð #Ð "Ð "Ð "Ð "Ð "Ø 	€	€	€	Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :ð	ð 	ð 	ð 	ð 	�{ñ 	ô 	ð 	ð
 ð:ð :ð :ð :ð :ñ :ô :ñ „ð:ð ðCð Cð Cð Cð Cñ Cô Cñ „ðCð ð7ð 7ð 7ð 7ð 7ñ 7ô 7ñ „ð7ð �Ð)¨8Ð3Ô
4€ð ðTð Tð Tð Tð Tñ Tô Tñ „ðTð$ð ð €ð ˆBŒJØGñô €	ð "�r”zØVñô Ð ð �"”*ØZñô €ð �”Ø2ñô €ð
`að `að `að `aðF'ð 'ð 'ð 'ð:>ð >ð >ð >ðBð ð ð ð ð r   