+
    bgj                        R t ^ RIHt ^RIHtHtHtHtHt  ! R R]	4      t
RRRRRRR	R
RRRRRRRRRRRR/
t ! R R4      tR R ltR# )a2  Lexer for MicroBasic source (.mb files).

Handles:
  - comments: ' to end of line
  - numbers: decimal (120), hex (0xA1), binary (0b101)
  - strings: "..." with \-escapes and \xHH hex escapes
  - identifiers / keywords (case-insensitive)
  - labels: identifier at start of line followed by ':'
  - operators, per tokens.MULTI_CHAR_OPERATORS / SINGLE_CHAR_OPERATORS
  - significant newlines (MicroBasic statements are one-per-line)

This does not yet resolve #define macro substitution -- that belongs in a
preprocessing pass ahead of the parser. Left as a TODO.
)annotations)KEYWORDSMULTI_CHAR_OPERATORSSINGLE_CHAR_OPERATORSToken	TokenTypec                  .   a  ] tR t^tR V 3R lltRtV ;t# )LexErrorc               $    V ^8  d   QhRRRRRR/# )   messagestrlineintcol )formats   "k\\thalassa.shore.mbari.org\ProjectLibrary\ESP\FIDO\PumpController\compiler\src\microbasic_compiler\lexer.py__annotate__LexError.__annotate__   s!       3 S     c                	P   < \         SV `  V R V RV R24       W n        W0n        R# )z (line z, col )N)super__init__r   r   )selfr   r   r   	__class__s   &&&&r   r   LexError.__init__   s-    G9GD6uA>?	r   )r   r   )__name__
__module____qualname____firstlineno__r   __static_attributes____classcell__)r   s   @r   r	   r	      s     r   r	   '"\ abfn
rt	vc                  z    ] tR t^0tR R ltR R ltRR R lltR R ltR	 R
 ltR R lt	R R lt
R R ltRtR# )Lexerc                   V ^8  d   QhRR/# )r   sourcer   r   )r   s   "r   r   Lexer.__annotate__1   s     # #s #r   c                	J    Wn         ^ V n        ^V n        ^V n        RV n        R# )    TN)srcposr   r   _at_line_start)r   r9   s   &&r   r   Lexer.__init__1   s$    	"r   c                   V ^8  d   QhRR/# )r   returnlist[Token]r   )r   s   "r   r   r:   8   s      + r   c                	    . p V P                  4       pVP                  V4       VP                  \        P                  8X  g   KC   V# )T)_next_tokenappendtyper   EOF)r   tokenstoks   &  r   tokenizeLexer.tokenize8   s<     ""$CMM#xx9==(r   c                    V ^8  d   QhRRRR/# )r   offsetr   rB   r   r   )r   s   "r   r   r:   C   s     8 8C 8 8r   c                	    V P                   V,           pV\        V P                  4      8  d   V P                  V,          # R # ) )r>   lenr=   )r   rN   is   && r   _peekLexer._peekC   s2    HHv#dhh-/txx{7R7r   c                   V ^8  d   QhRR/# )r   rB   r   r   )r   s   "r   r   r:   G   s      # r   c                	    V P                   V P                  ,          pV ;P                  ^,          un        VR8X  d#   V ;P                  ^,          un        ^V n        V# V ;P                  ^,          un        V# )   r/   )r=   r>   r   r   )r   chs   & r   _advanceLexer._advanceG   sW    XXdhhA:IINIDH 	 HHMH	r   c                   V ^8  d   QhRR/# )r   rB   r   r   )r   s   "r   r   r:   Q   s     DB DBU DBr   c                	<    V P                  4       R9   d   V P                  4        K'  V P                  4       R8X  d@   V P                  4       '       d(   V P                  4       R8w  d   V P                  4        K=  K|   T P                  4       '       g1   \        \        P                  RT P
                  T P                  4      # T P
                  T P                  r!T P                  4       pTR8X  d3   T P                  4        R T n        \        \        P                  RY4      # T P                  pRT n        TP                  4       '       d   T P                  Y4      # TR8X  d   T P                  Y4      # TP                  4       '       g   TR8X  d   T P                  YT4      # TR8X  d   T P                  YT4      # TR8X  d,   T P                  4        \        \        P                  RY4      # TR	8X  d,   T P                  4        \        \        P                  R	Y4      # TR
8X  d,   T P                  4        \        \        P                   R
Y4      # TR8X  d,   T P                  4        \        \        P"                  RY4      # TR8X  d,   T P                  4        \        \        P$                  RY4      # TR8X  d,   T P                  4        \        \        P&                  RY4      # \(         Fd  pT P*                  P-                  YPP.                  4      '       g   K0  T F  pT P                  4        K  	  \        \        P0                  YQT4      u # 	  T\2        9   d,   T P                  4        \        \        P0                  Y1T4      # \5        RT: 2Y4      h)Tr$   r/   rP   Fr%   _#(r   [],:zUnexpected character ) r3   r1   )rS   rY   r   r   rH   r   r   r?   NEWLINEisdigit_read_number_read_stringisalpha_read_identifierLPARENRPARENLBRACKETRBRACKETCOMMACOLONr   r=   
startswithr>   OPr   r	   )r   r   r   rX   at_line_startopr]   s   &      r   rE   Lexer._next_tokenQ   s   **,"33zz|s"jjlltzz|t';MMOzz||DIItxx@@IItxxcZZ\:MMO"&D**D$<<++#::<<$$T//9$$T//::<<29((MBB9((MBB9MMO))3::9MMO))3::9MMO++S$<<9MMO++S$<<9MMO#t999MMO#t99&Bxx""2xx00AMMO Y\\2S99	 ' &&MMOr55.rf5tAAr   c               $    V ^8  d   QhRRRRRR/# r   r   r   r   rB   r   r   )r   s   "r   r   r:      s!     9 9 93 95 9r   c                	   V P                   pV P                  4       R 8X  du   V P                  ^4      R9   d_   V P                  4        V P                  4        V P                  4       '       d(   V P                  4       R9   d   V P                  4        K=  MV P                  4       R 8X  d_   V P                  ^4      R9   dI   V P                  4        V P                  4        V P                  4       R9   d   V P                  4        K'  M6V P                  4       P                  4       '       d   V P                  4        K6  V P                  W0P                    p\        \        P                  WAV4      # )00123456789abcdefABCDEF)xX)r*   B)ry   1)r>   rS   rY   rf   r=   r   r   INTEGER)r   r   r   starttexts   &&&  r   rg   Lexer._read_number   s    ::<34::a=J#>MMOMMO**,,DJJL4L$LZZ\S TZZ]j%@MMOMMO**,*, - **,&&((xxhh'Y&&C88r   c               $    V ^8  d   QhRRRRRR/# rw   r   )r   s   "r   r   r:      s&     B B B3 B5 Br   c                	   V P                  4        . p V P                  4       pV'       d   VR8X  d   \        RW4      hVR8X  d   V P                  4        EM\VR8X  Ed3   V P                  4        V P                  4       pVR8X  d   V P                  4        RpV P                  4       '       d.   V P                  4       R9   d   W`P                  4       ,          pKC  V'       g"   \        RV P                  V P                  4      hVP                  \        \        V^4      ^,          4      4       EK   V\        9   d0   V P                  4        VP                  \        V,          4       EKZ  \        R	V R
2V P                  V P                  4      hVP                  V P                  4       4       EK  \        \        P                  RP                  V4      W4      # )Tr/   zUnterminated string literalr%   r&   r{   rP   rz   zEmpty hex escapezUnknown escape sequence '\r$   )rY   rS   r	   r   r   rF   chrr   _SIMPLE_ESCAPESr   r   STRINGjoin)r   r   r   charsrX   esc
hex_digitss   &&&    r   rh   Lexer._read_string   sL   Bt<dHHSyTzjjl#:MMO!#J**,,4::<;S+S"mmo5
%&'9499dhhOOLLSR%84%?!@AO+MMOLL!56"%@Q#GTXT\T\]]T]]_-Y%%rwwu~tAAr   c               (    V ^8  d   QhRRRRRRRR/# )r   r   r   r   rs   boolrB   r   r   )r   s   "r   r   r:      s(     7 7S 7s 74 7E 7r   c                	   V P                   pV P                  4       R 8X  d   V P                  4        V P                  4       '       dL   V P                  4       P                  4       '       g   V P                  4       R8X  d   V P                  4        Ka  V P                  W@P                    pV'       dA   V P                  4       R8X  d,   V P                  4        \        \        P                  WQV4      # VP                  4       \        9   d*   \        \        P                  VP                  4       W4      # \        \        P                  WQV4      # )r^   r]   rc   )r>   rS   rY   isalnumr=   r   r   LABELlowerr   KEYWORDIDENT)r   r   r   rs   r   r   s   &&&&  r   rj   Lexer._read_identifier   s    ::<3MMOjjll

 4 4 6 6$**,#:MMMOxxhh' TZZ\S0MMO$c::::<8#**DJJL$DDY__d#66r   )r?   r   r   r>   r=   N)r<   )r   r   r    r!   r   rK   rS   rY   rE   rg   rh   rj   r"   r   r   r   r7   r7   0   s3    #8DBL9$B<7 7r   r7   c                    V ^8  d   QhRRRR/# )r   r9   r   rB   rC   r   )r   s   "r   r   r      s     $ $S $[ $r   c                4    \        V 4      P                  4       # )N)r7   rK   )r9   s   &r   rK   rK      s    =!!##r   N)__doc__
__future__r   rI   r   r   r   r   r   	Exceptionr	   r   r7   rK   r   r   r   <module>r      sr    # y  $g7 g7T$r   