+
    hjH                        R t ^ RIHt ^RIHtHtHtHtHtH	t	H
t
HtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtH t H!t!H"t"H#t# ^RI$H%t%H&t& 0 Rmt'0 Rmt( ! R R])4      t*R R lt+ ! R R	4      t,R
 R lt-R# )a  Recursive-descent parser for MicroBasic.

Grammar and precedence follow the confirmed evidence in
docs/reverse_engineering.md, not just the manual's prose (which doesn't
state operator precedence explicitly). Precedence, loosest to tightest
binding -- confirmed by decoding real compiled output, not assumed:

    Or / XOr
    And
    Not                     (unary; confirmed to bind tighter than And)
    relational: = <> < > <= <=
    shift: << >>
    additive: + -
    multiplicative: * / Mod
    unary -                 (confirmed: unary + does not compile at all --
                              RoborunPlus itself rejects it)
    postfix ++ --
    primary (literals, var refs incl. array index, calls, parens,
              prefix ++/--)

Compound assignment (+=, -=, *=, /=, <<=, >>=) is desugared here into a
plain '=' with a synthesized BinaryOp RHS, since that's confirmed to be
exactly how the real compiler treats it -- codegen.py never sees a compound
assignment operator.
)annotations) 
AssignStmtBinaryOpBoolLiteralCallContinueStmtDimStmtDoLoopUntilStmtDoLoopWhileStmtDoUntilStmtExitStmtExprExprStmtForCStyleStmtForTraditionalStmt	GosubStmtGotoStmtIfStmt
IncDecExpr
IncDecStmt
IntLiteralLabelOptionExplicitStmt	PrintStmtProgram
ReturnStmtStmtStringLiteralTerminateStmtUnaryOpVarRefWaitStmt	WhileStmt)Token	TokenTypec                  .   a  ] tR t^EtR V 3R lltRtV ;t# )
ParseErrorc                    V ^8  d   QhRRRR/# )   messagestrtokenr#    )formats   "l\\thalassa.shore.mbari.org\ProjectLibrary\ESP\FIDO\PumpController\compiler\src\microbasic_compiler\parser.py__annotate__ParseError.__annotate__F   s       E     c                	>   < \         SV `  V R V: 24       W n        R# )z at N)super__init__r+   )selfr)   r+   	__class__s   &&&r.   r4   ParseError.__init__F   s     G9D	23
r1   )r+   )__name__
__module____qualname____firstlineno__r4   __static_attributes____classcell__)r6   s   @r.   r&   r&   E   s     r1   r&   c                    V ^8  d   QhRRRR/# )r(   textr*   returnintr,   )r-   s   "r.   r/   r/   K   s      C C r1   c                    V P                  4       pVP                  R 4      '       d   \        V ^4      # VP                  R4      '       d   \        V ^4      # \        V ^
4      # )0x0b)lower
startswithrA   )r?   lows   & r.   parse_int_literalrH   K   sO    
**,C
~~d4}
~~d4|tR=r1   c                     ] tR t^TtR R ltR R ltR R ltR R ltR	 R
 ltR R lt	R R lt
R R ltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR R  ltR! R" ltR# R$ ltR% R& ltR' R( ltR) R* ltR+ R, ltR- R. ltR/ R0 ltR1 R2 ltR3 R4 ltR5 R6 ltR7 R8 ltR9 R: lt R; R< lt!R= R> lt"R? R@ lt#RA RB lt$RC RD lt%RE RF lt&RG RH lt'RI RJ lt(RK RL lt)RM RN lt*RO RP lt+RQ RR lt,RS RT lt-RUt.RV# )WParserc                   V ^8  d   QhRR/# )r(   tokenslist[Token]r,   )r-   s   "r.   r/   Parser.__annotate__U   s      { r1   c                	     Wn         ^ V n        R# )    NrL   pos)r5   rL   s   &&r.   r4   Parser.__init__U   s    r1   c                   V ^8  d   QhRR/# )r(   r@   r   r,   )r-   s   "r.   r/   rN   Y   s     . .w .r1   c                	N    V P                  \        4       R 7      p\        VR7      # ))terminators)
statements)parse_blocksetr   )r5   rW   s   & r.   parseParser.parseY   s"    %%#%%8
*--r1   c                   V ^8  d   QhRR/# r(   r@   r#   r,   )r-   s   "r.   r/   rN   _   s     % %u %r1   c                	<    V P                   V P                  ,          # NrQ   r5   s   &r.   _peekParser._peek_   s    {{488$$r1   c                   V ^8  d   QhRR/# )r(   r@   boolr,   )r-   s   "r.   r/   rN   b   s     2 2 2r1   c                	X    V P                  4       P                  \        P                  8H  # r_   )ra   typer$   EOFr`   s   &r.   _at_endParser._at_endb   s    zz|  IMM11r1   c                   V ^8  d   QhRR/# r]   r,   )r-   s   "r.   r/   rN   e   s      % r1   c                	    V P                   V P                  ,          pV P                  4       '       g   V ;P                  ^,          un        V# )   )rL   rR   rh   )r5   toks   & r.   _advanceParser._advancee   s1    kk$((#||~~HHMH
r1   c                    V ^8  d   QhRRRR/# )r(   type_r$   r@   rd   r,   )r-   s   "r.   r/   rN   k   s     * *I *$ *r1   c                	<    V P                  4       P                  V8H  # r_   )ra   rf   )r5   rq   s   &&r.   _checkParser._checkk   s    zz|  E))r1   c                    V ^8  d   QhRRRR/# )r(   valuesr*   r@   rd   r,   )r-   s   "r.   r/   rN   n   s     J J J Jr1   c                	    V P                  \        P                  4      ;'       d    V P                  4       P                  V9   # r_   )rs   r$   OPra   value)r5   rv   s   &*r.   	_check_opParser._check_opn   s.    {{9<<(IITZZ\-?-?6-IIr1   c                    V ^8  d   QhRRRR/# )r(   wordsr*   r@   rd   r,   )r-   s   "r.   r/   rN   q   s     N NS NT Nr1   c                	    V P                  \        P                  4      ;'       d    V P                  4       P                  V9   # r_   )rs   r$   KEYWORDra   ry   )r5   r}   s   &*r.   _check_keywordParser._check_keywordq   s0    {{9,,-MM$**,2D2D2MMr1   c               $    V ^8  d   QhRRRRRR/# )r(   rq   r$   r)   r*   r@   r#   r,   )r-   s   "r.   r/   rN   t   s!      Y   r1   c                	    V P                  V4      '       g   \        W P                  4       4      hV P                  4       # r_   )rs   r&   ra   rn   )r5   rq   r)   s   &&&r.   _expectParser._expectt   s.    {{5!!Wjjl33}}r1   c                    V ^8  d   QhRRRR/# )r(   wordr*   r@   r#   r,   )r-   s   "r.   r/   rN   y   s      C E r1   c                	    V P                  V4      '       g   \        R V R2V P                  4       4      hV P                  4       # z
expected '')r   r&   ra   rn   )r5   r   s   &&r.   _expect_keywordParser._expect_keywordy   s;    ""4((z$q14::<@@}}r1   c                    V ^8  d   QhRRRR/# )r(   ry   r*   r@   r#   r,   )r-   s   "r.   r/   rN   ~   s        r1   c                	    V P                  V4      '       g   \        R V R2V P                  4       4      hV P                  4       # r   )rz   r&   ra   rn   )r5   ry   s   &&r.   
_expect_opParser._expect_op~   s9    ~~e$$z%2DJJLAA}}r1   c                   V ^8  d   QhRR/# )r(   r@   Noner,   )r-   s   "r.   r/   rN      s       r1   c                	t    V P                  \        P                  4      '       d   V P                  4        K7  R # r_   )rs   r$   NEWLINErn   r`   s   &r.   _skip_newlinesParser._skip_newlines   s%    kk)++,,MMO -r1   c                    V ^8  d   QhRRRR/# )r(   rV   zset[str]r@   z
list[Stmt]r,   )r-   s   "r.   r/   rN      s     	 	x 	J 	r1   c                	    . p V P                  4        V P                  4       '       d    V# V'       d   V P                  ! V!  '       d    V# VP                  V P	                  4       4       Kl  )T)r   rh   r   appendparse_statement)r5   rV   stmtss   && r.   rX   Parser.parse_block   s_    !||~~  t22K@@ LL--/0r1   c                   V ^8  d   QhRR/# r(   r@   r   r,   )r-   s   "r.   r/   rN      s     - - -r1   c                	   V P                  \        P                  4      '       d&   V P                  4       p\	        VP
                  4      # V P                  \        P                  4      '       d   V P                  4       P
                  pR V P                  RV P                  RV P                  RV P                  RV P                  RV P                  RV P                  RV P                  RV P                   R	V P"                  R
V P$                  RV P&                  RV P(                  /pW#9   d   W2,          ! 4       # V P+                  4       # )dimoptionifwhiledoforgotogosubr@   	terminateprintexitcontinue)rs   r$   LABELrn   r   ry   r   ra   	parse_dimparse_option_explicitparse_ifparse_whileparse_do	parse_for
parse_gotoparse_gosubparse_returnparse_terminateparse_print
parse_exitparse_continueparse_simple_statement)r5   rm   kwdispatchs   &   r.   r   Parser.parse_statement   s    ;;y''--/C##;;y(())##Bt~~$44dmm))dmmt~~))$++T11))D//H ~|~%**,,r1   c                   V ^8  d   QhRR/# )r(   r@   r   r,   )r-   s   "r.   r/   rN      s     < <7 <r1   c                	   V P                  4        V P                  \        P                  R 4      pRpV P	                  \        P
                  4      '       df   V P                  4        V P                  \        P                  R4      p\        VP                  4      pV P                  \        P                  R4       V P                  R4       V P                  R4      '       d   V P                  4        RpMDV P                  R4      '       d   V P                  4        RpM\        R	V P                  4       4      h\        VP                  WB4      # )
z expected variable name after DimNzexpected array lengthexpected ']'asintegerIntegerbooleanBooleanzexpected 'Integer' or 'Boolean')rn   r   r$   IDENTrs   LBRACKETINTEGERrH   ry   RBRACKETr   r   r&   ra   r   )r5   name_tok	array_lenlen_tokvar_types   &    r.   r   Parser.parse_dim   s    <<	1ST	;;y))**MMOll9#4#46MNG)'--8ILL++^<T"y))MMO H  ++MMO H>

MMx~~x;;r1   c                   V ^8  d   QhRR/# )r(   r@   r   r,   )r-   s   "r.   r/   rN      s     $ $'9 $r1   c                	X    V P                  4        V P                  R 4       \        4       # )explicit)rn   r   r   r`   s   &r.   r   Parser.parse_option_explicit   s"    Z(!##r1   c                   V ^8  d   QhRR/# )r(   r@   r   r,   )r-   s   "r.   r/   rN      s     "> ">& ">r1   c                	   V P                  4        V P                  4       pV P                  R 4      '       d   V P                  4        V P                  \        P
                  4      '       g   V P                  4       '       Ed4   V P                  4        V P                  0 Rm4      p. pV P                  R4      '       d   V P                  4        V P                  4       pV P                  R 4      '       d   V P                  4        V P                  4        V P                  0 Rm4      pVP                  WE34       K  RpV P                  R4      '       d3   V P                  4        V P                  4        V P                  R04      pV P                  R4       V P                  R4       \        WW64      # V P                  4       pRpV P                  R4      '       d"   V P                  4        V P                  4       .p\        W.. V4      # )thenelseelseifendNr   >   r   r   r   )rn   parse_expressionr   rs   r$   r   rh   r   rX   r   r   r   r   )r5   	condition
then_blockelseif_clausescond2body2
else_block	then_stmts   &       r.   r   Parser.parse_if   s   ))+	v&&MMO;;y(())T\\^^!))*CDJ<>N%%h//--/&&v..MMO##%(()BC%%un5J""6**##%!--ug6
  '  &)LL ((*	
v&&MMO..01Jib*==r1   c                   V ^8  d   QhRR/# )r(   r@   r"   r,   )r-   s   "r.   r/   rN      s     * *Y *r1   c                	    V P                  4        V P                  4       pV P                  4        V P                  R 04      pV P	                  R 4       V P	                  R4       \        W4      # )r   r   )rn   r   r   rX   r   r"   r5   r   bodys   &  r.   r   Parser.parse_while   s^    ))+	(U#W%))r1   c                   V ^8  d   QhRR/# r   r,   )r-   s   "r.   r/   rN      s     S S$ Sr1   c                	   V P                  4        V P                  R 4      '       d_   V P                  4        V P                  4       pV P                  4        V P	                  R04      pV P                  R4       \        W4      # V P                  R4      '       d_   V P                  4        V P                  4       pV P                  4        V P	                  R04      pV P                  R4       \        W4      # V P                  4        V P	                  R04      pV P                  R4       V P                  R 4      '       d,   V P                  4        V P                  4       p\        W!4      # V P                  R4      '       d,   V P                  4        V P                  4       p\        W!4      # \        RV P                  4       4      h)r   loopuntilz(expected 'While' or 'Until' after 'Loop')rn   r   r   r   rX   r   r"   r   r
   r	   r&   ra   r   s   &  r.   r   Parser.parse_do   sq   w''MMO--/I!##VH-D  (Y--w''MMO--/I!##VH-D  (y// 	)V$w''MMO--/I"433w''MMO--/I"433CTZZ\RRr1   c                   V ^8  d   QhRR/# r   r,   )r-   s   "r.   r/   rN     s     "W "W4 "Wr1   c                	   V P                  4        V P                  \        P                  R 4      pV P	                  R4       V P                  4       pV P                  R4      '       d   V P                  4        V P                  4       pRpV P                  R4      '       d!   V P                  4        V P                  4       pV P                  4        V P                  R04      pV P                  R4       V P                  \        P                  4      '       d   V P                  4        \        VP                  W#WE4      # V P                  R4      '       d   V P                  4        V P                  4       pRpV P                  R4      '       d!   V P                  4        V P                  4       pV P                  4        V P                  R04      pV P                  R4       V P                  \        P                  4      '       d   V P                  4        \        VP                  W&Wu4      # \        RV P!                  4       4      h)	zexpected loop variable name=toNstepnextandwhileevaluatez,expected 'To' or 'AndWhile' in For statement)rn   r   r$   r   r   r   r   r   rX   r   rs   r   ry   r   r   r&   ra   )r5   var_tokinitlimitr   r   r   r   s   &       r.   r   Parser.parse_for  s   ,,y0MN$$&t$$MMO))+ED""6**,,.!##VH-D  ({{9??++%gmmT$MMz**MMO--/IH"":..668!##VH-D  ({{9??++ PPGVVr1   c                   V ^8  d   QhRR/# )r(   r@   r   r,   )r-   s   "r.   r/   rN   9  s     ) )H )r1   c                	    V P                  4        V P                  \        P                  R 4      p\	        VP
                  4      # )zexpected label name after GoTo)rn   r   r$   r   r   ry   r5   	label_toks   & r.   r   Parser.parse_goto9  s/    LL2RS		((r1   c                   V ^8  d   QhRR/# )r(   r@   r   r,   )r-   s   "r.   r/   rN   >  s     * *Y *r1   c                	    V P                  4        V P                  \        P                  R 4      p\	        VP
                  4      # )zexpected label name after GoSub)rn   r   r$   r   r   ry   r   s   & r.   r   Parser.parse_gosub>  s/    LL2ST	))r1   c                   V ^8  d   QhRR/# )r(   r@   r   r,   )r-   s   "r.   r/   rN   C  s      j r1   c                	6    V P                  4        \        4       # r_   )rn   r   r`   s   &r.   r   Parser.parse_returnC  s    |r1   c                   V ^8  d   QhRR/# )r(   r@   r   r,   )r-   s   "r.   r/   rN   G  s       r1   c                	6    V P                  4        \        4       # r_   )rn   r   r`   s   &r.   r   Parser.parse_terminateG  s    r1   c                   V ^8  d   QhRR/# )r(   r@   r   r,   )r-   s   "r.   r/   rN   K  s      Y r1   c                	    V P                  4        V P                  \        P                  R 4       V P	                  4       pV P                  \        P
                  R4       \        V4      # )zexpected '(' after Printexpected ')')rn   r   r$   LPAREN_parse_arg_listRPARENr   r5   argss   & r.   r   Parser.parse_printK  sL    Y%%'AB##%Y%%~6r1   c                   V ^8  d   QhRR/# )r(   r@   r   r,   )r-   s   "r.   r/   rN   R  s     2 2H 2r1   c                	T    V P                  4        \        V P                  4       4      # r_   )rn   r   _expect_loop_kindr`   s   &r.   r   Parser.parse_exitR  s    ..011r1   c                   V ^8  d   QhRR/# )r(   r@   r   r,   )r-   s   "r.   r/   rN   V  s     6 6 6r1   c                	T    V P                  4        \        V P                  4       4      # r_   )rn   r   r  r`   s   &r.   r   Parser.parse_continueV  s    D22455r1   c                   V ^8  d   QhRR/# )r(   r@   r*   r,   )r-   s   "r.   r/   rN   Z  s     K K3 Kr1   c                	    R F0  w  rV P                  V4      '       g   K  V P                  4        Vu # 	  \        RV P                  4       4      h)r   z expected 'For', 'While', or 'Do'))r   For)r   While)r   Do)r   rn   r&   ra   )r5   r   kinds   &  r.   r  Parser._expect_loop_kindZ  sD    JHB""2&& K ;TZZ\JJr1   c                   V ^8  d   QhRR/# r   r,   )r-   s   "r.   r/   rN   a  s     (? (? (?r1   c                	   V P                  R R4      '       dQ   V P                  4       P                  pV P                  \        P
                  R4      p\        VP                  V4      # V P                  \        P
                  4      '       Ed_   V P                  4       pV P                  \        P                  4      '       d   V P                  VP                  4      pVP                  P                  4       R8X  dC   \        VP                  4      ^8w  d   \        RV4      h\        VP                  ^ ,          4      # \        V4      # V P                  R R4      '       d1   V P                  4       P                  p\        VP                  V4      # RpV P                  \        P                   4      '       dA   V P                  4        V P#                  4       pV P                  \        P$                  R4       V P                  \        P&                  4      '       d   V P)                  4       P                  \*        9   d   V P                  4       P                  pV P#                  4       p\-        VP                  V4      pVR8X  d   \/        Wv4      # VRR p\1        V\-        VP                  V4      V4      p	\/        Wy4      # \        RVP                   R	2V P)                  4       4      h\        R
V P)                  4       4      h)++--expected variable namewaitzWait expects exactly 1 argumentNr   r   zunexpected token after 'r   zexpected a statement)rz   rn   ry   r   r$   r   r   rs   r	  _parse_callrE   lenr  r&   r!   r   r   r   r   rx   ra   
ASSIGN_OPSr    r   r   )
r5   opr   rm   callindexry   targetbinop	desugareds
   &         r.   r   Parser.parse_simple_statementa  s"   >>$%%&&B||IOO5MNHhnnb11;;y''--/C{{9++,,''		299??$.499~*()JCPP#DIIaL11~%~~dD))]]_**!#))R00E{{9--..--/Y//@{{9<<((TZZ\-?-?:-M]]_**--/		519%f443B$UF399e,DeL	!&447		{!DdjjlSS/>>r1   c                   V ^8  d   QhRR/# )r(   r@   z
list[Expr]r,   )r-   s   "r.   r/   rN     s       r1   c                	>   . pV P                  \        P                  4      '       gv   VP                  V P	                  4       4       V P                  \        P
                  4      '       d2   V P                  4        VP                  V P	                  4       4       KV  V# r_   )rs   r$   r  r   r   COMMArn   r  s   & r.   r
  Parser._parse_arg_list  sg    {{9++,,KK--/0++ioo..D1134r1   c                    V ^8  d   QhRRRR/# )r(   namer*   r@   r   r,   )r-   s   "r.   r/   rN     s            r1   c                	    V P                  \        P                  R 4       V P                  4       pV P                  \        P                  R4       \        W4      # )zexpected '('r  )r   r$   r	  r
  r  r   )r5   r3  r  s   && r.   r$  Parser._parse_call  sC    Y%%~6##%Y%%~6Dr1   c                   V ^8  d   QhRR/# r(   r@   r   r,   )r-   s   "r.   r/   rN     s      $ r1   c                	"    V P                  4       # r_   )parse_orr`   s   &r.   r   Parser.parse_expression  s    }}r1   c                   V ^8  d   QhRR/# r7  r,   )r-   s   "r.   r/   rN     s      $ r1   c                	    V P                  4       pV P                  R R4      '       d9   V P                  4       P                  pV P                  4       p\	        W!V4      pKP  V# )orxor)	parse_andr   rn   ry   r   r5   leftr'  rights   &   r.   r9  Parser.parse_or  sO    ~~!!$..&&BNN$EBe,Dr1   c                   V ^8  d   QhRR/# r7  r,   )r-   s   "r.   r/   rN     s      4 r1   c                	    V P                  4       pV P                  R 4      '       d/   V P                  4        V P                  4       p\        R W4      pKE  V# )and)	parse_notr   rn   r   )r5   rA  rB  s   &  r.   r?  Parser.parse_and  sE    ~~!!%((MMONN$EE4/Dr1   c                   V ^8  d   QhRR/# r7  r,   )r-   s   "r.   r/   rN     s     ' '4 'r1   c                	    V P                  R 4      '       d+   V P                  4        \        R V P                  4       4      # V P	                  4       # )not)r   rn   r   rG  parse_relationalr`   s   &r.   rG  Parser.parse_not  s?    u%%MMO5$.."233$$&&r1   c                   V ^8  d   QhRR/# r7  r,   )r-   s   "r.   r/   rN     s      $ r1   c                	&   V P                  4       pV P                  \        P                  4      '       d\   V P	                  4       P
                  \        9   d9   V P                  4       P
                  pV P                  4       p\        W!V4      pK  V# r_   )	parse_shiftrs   r$   rx   ra   ry   RELATIONAL_OPSrn   r   r@  s   &   r.   rL  Parser.parse_relational  sf    !kk),,''DJJL,>,>.,P&&B$$&EBe,Dr1   c                   V ^8  d   QhRR/# r7  r,   )r-   s   "r.   r/   rN     s      T r1   c                	    V P                  4       pV P                  R R4      '       d9   V P                  4       P                  pV P                  4       p\	        W!V4      pKP  V# )z<<z>>)parse_additiverz   rn   ry   r   r@  s   &   r.   rP  Parser.parse_shift  sQ    ""$nnT4((&&B'')EBe,Dr1   c                   V ^8  d   QhRR/# r7  r,   )r-   s   "r.   r/   rN     s       r1   c                	    V P                  4       pV P                  R R4      '       d9   V P                  4       P                  pV P                  4       p\	        W!V4      pKP  V# )+-)parse_multiplicativerz   rn   ry   r   r@  s   &   r.   rU  Parser.parse_additive  sQ    ((*nnS#&&&&B--/EBe,Dr1   c                   V ^8  d   QhRR/# r7  r,   )r-   s   "r.   r/   rN     s      d r1   c                	    V P                  4       pV P                  R R4      '       g   V P                  R4      '       d9   V P                  4       P                  pV P                  4       p\        W!V4      pKg  V# )*/mod)parse_unaryrz   r   rn   ry   r   r@  s   &   r.   r[  Parser.parse_multiplicative  sa    !nnS#&&$*=*=e*D*D&&B$$&EBe,Dr1   c                   V ^8  d   QhRR/# r7  r,   )r-   s   "r.   r/   rN     s     $ $T $r1   c                	    V P                  R 4      '       d+   V P                  4        \        R V P                  4       4      # V P	                  4       # )rZ  )rz   rn   r   rb  parse_postfixr`   s   &r.   rb  Parser.parse_unary  s?    >>#MMO3 0 0 233!!##r1   c                   V ^8  d   QhRR/# r7  r,   )r-   s   "r.   r/   rN     s      t r1   c                	6   V P                  4       pV P                  R R4      '       dq   V P                  4       P                  p\	        V\
        4      '       d   VP                  e   \        RV P                  4       4      h\        VP                  VRR7      # V# )r  r   z-'++'/'--' can only apply to a simple variableFprefix)parse_primaryrz   rn   ry   
isinstancer    r)  r&   ra   r   r3  )r5   exprr'  s   &  r.   rf  Parser.parse_postfix  sx    !!#>>$%%&&BdF++tzz/E !PRVR\R\R^__diiE::r1   c                   V ^8  d   QhRR/# r7  r,   )r-   s   "r.   r/   rN     s     0I 0It 0Ir1   c                	   V P                  4       pV P                  R R4      '       dS   V P                  4       P                  pV P	                  \
        P                  R4      p\        VP                  VRR7      # V P                  \
        P                  4      '       d/   V P                  4        \        \        VP                  4      4      # V P                  \
        P                  4      '       d&   V P                  4        \        VP                  4      # V P                  R4      '       d   V P                  4        \        R4      # V P                  R4      '       d   V P                  4        \        R4      # V P                  R4      '       dn   V P                  4        V P	                  \
        P                   R	4       V P#                  4       pV P	                  \
        P$                  R
4       \'        RV.4      # V P                  \
        P                   4      '       dC   V P                  4        V P#                  4       pV P	                  \
        P$                  R
4       V# V P                  \
        P                  4      '       d   V P                  4        V P                  \
        P                   4      '       d   V P)                  VP                  4      # RpV P                  \
        P*                  4      '       dA   V P                  4        V P#                  4       pV P	                  \
        P,                  R4       \/        VP                  V4      # \1        RV: R2V4      h)r  r   r!  Trj  truefalseFtoboolzexpected '(' after ToBoolr  Nr   zunexpected token z in expression)ra   rz   rn   ry   r   r$   r   r   rs   r   r   rH   STRINGr   r   r   r	  r   r  r   r$  r   r   r    r&   )r5   rm   r'  r   innerr)  s   &     r.   rl  Parser.parse_primary  sY   jjl>>$%%&&B||IOO5MNHhnnb>>;;y(())MMO/		:;;;;y''((MMO ++v&&MMOt$$w''MMOu%%x((MMOLL))+FG))+ELL))>:5'**;;y''((MMO))+ELL))>:L;;y''MMO{{9++,,''		22E{{9--..--/Y//@#))U++,SG>BCHHr1   )rR   rL   N)/r8   r9   r:   r;   r4   rZ   ra   rh   rn   rs   rz   r   r   r   r   r   rX   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r
  r$  r   r9  r?  rG  rL  rP  rU  r[  rb  rf  rl  r<   r,   r1   r.   rJ   rJ   T   s    .%2*JN


	-6<($
">H*S@"WH)
*
26K(?T '$0I 0Ir1   rJ   c                    V ^8  d   QhRRRR/# )r(   rL   rM   r@   r   r,   )r-   s   "r.   r/   r/     s     " "+ "' "r1   c                4    \        V 4      P                  4       # r_   )rJ   rZ   )rL   s   &r.   rZ   rZ     s    &>!!r1   N>   r   *=+=-=/=<<=>>=>   <r   ><=<>>=).__doc__
__future__r   	ast_nodesr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   rL   r#   r$   r&  rQ  	Exceptionr&   rH   rJ   rZ   r,   r1   r.   <module>r     sq   4 #! ! ! ! ! ! ! ! !D %8
2 @I @IF"r1   