a
    ;@bJ                     @   sr   d Z ddlZddlmZmZ ddlmZmZ ddlm	Z	m
Z
mZmZmZmZmZmZmZ dgZG dd deZdS )z
    pygments.lexers.modula2
    ~~~~~~~~~~~~~~~~~~~~~~~

    Multi-Dialect Lexer for Modula-2.

    :copyright: Copyright 2006-2021 by the Pygments team, see AUTHORS.
    :license: BSD, see LICENSE for details.
    N)
RegexLexerinclude)get_bool_optget_list_opt)	TextCommentOperatorKeywordNameStringNumberPunctuationErrorModula2Lexerc                   @   s  e Zd ZdZdZddgZddgZdgZej	ej
B Zdefd	efgd
ejfdejfdejfdejfdejfdejfdejfdejfgdefgdejfdejfgdejfdejfdejfgdejfdejfdejfgdejfdejfgdefdefdefd efd!efd"efd#efd$efd%efd&efg
d'efd(efd)efd*efd+efd,efd-efd.efd/efg	d0efd1efd2efd3efd4efd5efd6efgd7efd8efd9efgd:ejfd;ejfd<ejfgd=ejfd>ejfged?ed@edAedBedCedDedEedFedGedHedIedJedKgdLZdMZdNZ dOZ!dPZ"dQZ#dRZ$dSZ%dTZ&dUZ'dVZ(dWZ)dXZ*dYZ+dZZ,d[Z-d\Z.d]Z/d^Z0d_Z1d_Z2d`Z3d_Z4daZ5dbZ6d_Z7d_Z8d_Z9dcZ:ddZ;deZ<dfZ=dgZ>dhZ?diZ@djZAdkZBd_ZCd_ZDd_ZEd_ZFd_ZGdlZHdmZIdnZJdoZKdpZLdqZMdrZNdsZOd_e"fe&fe*fe.fe&fe"fe&fe&fds	ZPee#e'e+fee#fee'fee+fee+e/fee'e2fee#e5fee'e8fee'e;fds	ZQe e$e(e,fe e$fe e(fe e,fe e,e0fe e(e3fe e$e6fe e(e9fe e(e<fds	ZRe!e%e)e-fe!e%fe!e)fe!e-fe!e-e1fe!e)e4fe!e%e7fe!e)e:fe!e)e=fds	ZSd_d_d_eHfeHfd_d_d_d_ds	ZTd_e>feCfeIeJeHfeIeJfeCfe>feCfeCfds	ZUd_e?feDfeKfeKfeDfe?feDfeDfds	ZVd_e@feEfeLfeLfeEfe@feEfeEfds	ZWd_eAfeFfeMfeMfeFfeAfeFfeFfds	ZXd_eBfeGfeNfeNfeGfeBfeGfeGfds	ZYdtdu ZZdvdw Z[dxdy Z\dzd{ Z]d|d} Z^d~S )r   a  
    For `Modula-2 <http://www.modula2.org/>`_ source code.

    The Modula-2 lexer supports several dialects.  By default, it operates in
    fallback mode, recognising the *combined* literals, punctuation symbols
    and operators of all supported dialects, and the *combined* reserved words
    and builtins of PIM Modula-2, ISO Modula-2 and Modula-2 R10, while not
    differentiating between library defined identifiers.

    To select a specific dialect, a dialect option may be passed
    or a dialect tag may be embedded into a source file.

    Dialect Options:

    `m2pim`
        Select PIM Modula-2 dialect.
    `m2iso`
        Select ISO Modula-2 dialect.
    `m2r10`
        Select Modula-2 R10 dialect.
    `objm2`
        Select Objective Modula-2 dialect.

    The PIM and ISO dialect options may be qualified with a language extension.

    Language Extensions:

    `+aglet`
        Select Aglet Modula-2 extensions, available with m2iso.
    `+gm2`
        Select GNU Modula-2 extensions, available with m2pim.
    `+p1`
        Select p1 Modula-2 extensions, available with m2iso.
    `+xds`
        Select XDS Modula-2 extensions, available with m2iso.


    Passing a Dialect Option via Unix Commandline Interface

    Dialect options may be passed to the lexer using the `dialect` key.
    Only one such option should be passed. If multiple dialect options are
    passed, the first valid option is used, any subsequent options are ignored.

    Examples:

    `$ pygmentize -O full,dialect=m2iso -f html -o /path/to/output /path/to/input`
        Use ISO dialect to render input to HTML output
    `$ pygmentize -O full,dialect=m2iso+p1 -f rtf -o /path/to/output /path/to/input`
        Use ISO dialect with p1 extensions to render input to RTF output


    Embedding a Dialect Option within a source file

    A dialect option may be embedded in a source file in form of a dialect
    tag, a specially formatted comment that specifies a dialect option.

    Dialect Tag EBNF::

       dialectTag :
           OpeningCommentDelim Prefix dialectOption ClosingCommentDelim ;

       dialectOption :
           'm2pim' | 'm2iso' | 'm2r10' | 'objm2' |
           'm2iso+aglet' | 'm2pim+gm2' | 'm2iso+p1' | 'm2iso+xds' ;

       Prefix : '!' ;

       OpeningCommentDelim : '(*' ;

       ClosingCommentDelim : '*)' ;

    No whitespace is permitted between the tokens of a dialect tag.

    In the event that a source file contains multiple dialect tags, the first
    tag that contains a valid dialect option will be used and any subsequent
    dialect tags will be ignored.  Ideally, a dialect tag should be placed
    at the beginning of a source file.

    An embedded dialect tag overrides a dialect option set via command line.

    Examples:

    ``(*!m2r10*) DEFINITION MODULE Foobar; ...``
        Use Modula2 R10 dialect to render this source file.
    ``(*!m2pim+gm2*) DEFINITION MODULE Bazbam; ...``
        Use PIM dialect with GNU extensions to render this source file.


    Algol Publication Mode:

    In Algol publication mode, source text is rendered for publication of
    algorithms in scientific papers and academic texts, following the format
    of the Revised Algol-60 Language Report.  It is activated by passing
    one of two corresponding styles as an option:

    `algol`
        render reserved words lowercase underline boldface
        and builtins lowercase boldface italic
    `algol_nu`
        render reserved words lowercase boldface (no underlining)
        and builtins lowercase boldface italic

    The lexer automatically performs the required lowercase conversion when
    this mode is activated.

    Example:

    ``$ pygmentize -O full,style=algol -f latex -o /path/to/output /path/to/input``
        Render input file in Algol publication mode to LaTeX output.


    Rendering Mode of First Class ADT Identifiers:

    The rendering of standard library first class ADT identifiers is controlled
    by option flag "treat_stdlib_adts_as_builtins".

    When this option is turned on, standard library ADT identifiers are rendered
    as builtins.  When it is turned off, they are rendered as ordinary library
    identifiers.

    `treat_stdlib_adts_as_builtins` (default: On)

    The option is useful for dialects that support ADTs as first class objects
    and provide ADTs in the standard library that would otherwise be built-in.

    At present, only Modula-2 R10 supports library ADTs as first class objects
    and therefore, no ADT identifiers are defined for any other dialects.

    Example:

    ``$ pygmentize -O full,dialect=m2r10,treat_stdlib_adts_as_builtins=Off ...``
        Render standard library ADTs as ordinary library types.

    .. versionadded:: 1.3

    .. versionchanged:: 2.1
       Added multi-dialect support.
    zModula-2Zmodula2Zm2z*.defz*.modztext/x-modula2z\n+z\s+z\(\*!m2pim\*\)z\(\*!m2iso\*\)z\(\*!m2r10\*\)z\(\*!objm2\*\)z\(\*!m2iso\+aglet\*\)z\(\*!m2pim\+gm2\*\)z\(\*!m2iso\+p1\*\)z\(\*!m2iso\+xds\*\)z([a-zA-Z_$][\w$]*)z0b[01]+(\'[01]+)*z0[ux][0-9A-F]+(\'[0-9A-F]+)*z>[0-9]+(\'[0-9]+)*\.[0-9]+(\'[0-9]+)*[eE][+-]?[0-9]+(\'[0-9]+)*z$[0-9]+(\'[0-9]+)*\.[0-9]+(\'[0-9]+)*z[0-9]+(\'[0-9]+)*z[0-7]+Bz[0-7]+Cz
[0-9A-F]+Hz"(\\\\|\\[^\\]|[^"\\])*"z'(\\\\|\\[^\\]|[^'\\])*'z\*\.z\+><><=>===:::=z\+\+--z[+-]z[*/]z\\z[=#<>]z\^@&~`z\.\.<<>>->z\|###z\|\*z[()\[\]{},.:;|]!z\?z^//.*?\nz\(\*([^$].*?)\*\)z/\*(.*?)\*/z	<\*.*?\*>z\(\*\$.*?\*\)
whitespacedialecttagspragmascommentsidentifierssuffixed_number_literalsprefixed_number_literalsplain_number_literalsstring_literalsdigraph_punctuationdigraph_operatorsunigraph_punctuationunigraph_operators)r    r!   r$   r&   r'   r%   r(   r*   r,   r)   r+   r#   r"   root)%ZANDZARRAYZBEGINZBYZCASEZCONSTZ
DEFINITIONZDIVZDOELSEZELSIFZENDZEXITZFORZFROMZIFZIMPLEMENTATIONZIMPORTINZLOOPZMODZMODULEZNOTZOFORZPOINTERZ	PROCEDUREZRECORDREPEATZRETURNZSETZTHENZTOZTYPEZUNTILZVARZWHILE)ZABSZBOOLEANCARDINALZCHARZCHRZFALSEZINTEGERZLONGINTZLONGREALMAXZMINNILZODDZORDZREALTRUE)ZADDRESSZBYTEZWORDADR)r   r   r   $%?\r   ++r   r   *.+>r   r   r   |#r   )EXPORT	QUALIFIEDWITH)BITSETCAPDECDISPOSEEXCLFLOATHALTHIGHINCINCLNEWr4   PROCSIZETRUNCVAL)SYSTEMPROCESSTSIZE
NEWPROCESSTRANSFER)r   r7   r8   r9   r:   r   r;   r   r   r<   r=   r   r   r   r>   r   )ZEXCEPTr?   ZFINALLYZFORWARDZ	PACKEDSETr@   ZREMZRETRYrA   ZABSTRACTZASCLASSZGUARDZINHERITZOVERRIDEZREADONLYZREVEALZTRACEDZUNSAFEGUARDED)rB   rC   ZCMPLXCOMPLEXrD   rE   rF   rG   rH   rI   ZIMrJ   rK   ZINTZINTERRUPTIBLELENGTHZLFLOATLONGCOMPLEXrL   rM   Z
PROTECTIONZRErN   rO   ZUNINTERRUBTIBLErP   ZCREATEZDESTROYEMPTYZISMEMBERZSELF):rQ   Z
BITSPERLOCZLOCSPERBYTEZLOCSPERWORDZLOCZADDADRZSUBADRZDIFADRZMAKEADRr6   ZROTATEZSHIFTCASTrS   Z
COROUTINESZATTACHZ	COROUTINEZCURRENTZDETACHZHANDLERZINTERRUPTSOURCEZ
IOTRANSFERZ
IsATTACHEDZLISTENZNEWCOROUTINEZPROTrU   Z
EXCEPTIONSZAllocateSourceZCurrentNumberZExceptionNumberZExceptionSourceZ
GetMessageZIsCurrentSourceZIsExceptionalExecutionZRAISEZTERMINATIONZIsTerminatingZ	HasHaltedZM2EXCEPTIONZM2ExceptionsZM2ExceptionZIsM2ExceptionZindexExceptionZrangeExceptionZcaseSelectExceptionZinvalidLocationZfunctionExceptionZwholeValueExceptionZwholeDivExceptionZrealValueExceptionZrealDivExceptionZcomplexValueExceptionZcomplexDivExceptionZprotExceptionZsysExceptionZcoExceptionZexException)r   r   r   r7   r8   r   r   )ZALIASZARGLISTZ	BLUEPRINTZCOPYZGENLIBZINDETERMINATErL   ZNONEZOPAQUEZREFERENTIALZRELEASEZRETAINASMZREG)r2   ZCOUNTrZ   ZEXISTSZINSERTrX   LONGCARDZOCTETZPTRZPREDZREADZREADNEWZREMOVEZRETRIEVEZSORTZSTOREZSUBSETZSUCCZTLIMITZTMAXZTMINr5   rS   ZUNICHARZWRITEZWRITEF)KZTPROPERTIESZPROPERTYLITERALZ	TPROPERTYZTLITERALZTBUILTINZTDYNZTREFCZTNILZTBASEZ
TPRECISIONZTMAXEXPZTMINEXPZ
CONVERSIONZTSXFSIZEZSXFrP   ZUNSAFEr[   	INTRINSICAVAILZADDZSUBZADDCZSUBCZFETCHADDZFETCHSUBZSHLZSHRZASHRZROTLZROTRZROTLCZROTRCZBWNOTBWANDBWORBWXORBWNANDZBWNORZSETBITZTESTBITZLSBITZMSBITZCSBITSZBAILrH   ZTODOZFFIZADDRZVARGLISTZVARGCZATOMICr_   r`   ZSWAPZCASrJ   rD   ra   rd   rb   rc   ZCOMPILERDEBUGZMODNAMEZPROCNAMEZLINENUMZDEFAULTZHASHZ	ASSEMBLERZREGISTERZSETREGZGETREGZCODE)r   r7   r8   r   r   )ZBYCOPYZBYREFrV   ZCONTINUEZCRITICALZINOUTZMETHODZONOPTIONALZOUTZPRIVATEZ	PROTECTEDZPROTOCOLZPUBLICZSUPERZTRY)ZOBJECTZNOZYES )	BITSET8BITSET16BITSET32	CARDINAL8
CARDINAL16
CARDINAL32INTEGER8	INTEGER16	INTEGER32)
r\   Z__ATTRIBUTE__Z__BUILTIN__Z
__COLUMN__Z__DATE__Z__FILE__Z__FUNCTION__Z__LINE__Z
__MODULE__ZVOLATILE)rh   ri   rj   rk   rl   rm   
CARDINAL64Z	COMPLEX32Z	COMPLEX64Z	COMPLEX96Z
COMPLEX128rn   ro   rp   	INTEGER64ZREAL8ZREAL16ZREAL32ZREAL96ZREAL128ZTHROW)BCD)ZSEQ)	ZASHASSERTZDIFFADR_TYPEZENTIERZINDEXZLENr]   	SHORTCARDSHORTINT)rR   rT   ZBOOL8ZBOOL16ZBOOL32CARD8CARD16CARD32INT8INT16INT32ZREFZMOVEZFILLZGETZPUTZCCintZunsignedZsize_tZvoidCOMPILERZOPTIONZEQUATION)ZTerminal
FileSystemZInOutZ	RealInOutZMathLib0Storage)FlagZFlagSetZResponseZCommandLockZ
PermissionZ
MediumTypeFileZFileProcZDirectoryProcZFileCommandZDirectoryCommand)9ZReadZBusyReadZ	ReadAgainZWriteZWriteStringZWriteLnZCreateZLookupZCloseZDeleteZRenameZSetReadZSetWriteZ	SetModifyZSetOpenZDoioZSetPosZGetPosZLengthZResetZAgainZReadWordZ	WriteWordZReadCharZ	WriteCharZCreateMediumZDeleteMediumZ
AssignNameZDeassignNameZ
ReadMediumZLookupMediumZ	OpenInputZ
OpenOutputZ
CloseInputZCloseOutputZ
ReadStringZReadIntZReadCardZReadWrdZWriteIntZ	WriteCardZWriteOctZWriteHexZWriteWrdZReadRealZ	WriteRealZ
WriteFixPtZWriteRealOctZsqrtZexpZlnZsinZcosZarctanZentierALLOCATE
DEALLOCATE)ZDoneZtermCHinout)ZEOL)0rs   ZLONGBCDrB   ZSHORTBITSETZ
LONGBITSETZLONGLONGBITSETrW   rY   ru   ZLONGLONGCARDrv   ZLONGLONGINTZPOSINTZSHORTPOSINTZ
LONGPOSINTZLONGLONGPOSINTrh   ri   rj   ZBITSET64Z	BITSET128ZBS8ZBS16ZBS32ZBS64ZBS128rk   rl   rm   rq   ZCARDINAL128rw   rx   ry   ZCARD64ZCARD128rn   ro   rp   rr   Z
INTEGER128rz   r{   r|   ZINT64ZINT128STRINGZ	UNISTRING)Z	ProtoRootZProtoComputationalZProtoNumericZProtoScalarZProtoNonScalarZProtoCardinalZProtoIntegerZ	ProtoRealZProtoComplexZProtoVectorZ
ProtoTupleZProtoCompArrayZProtoCollectionZProtoStaticArrayZProtoStaticSetZProtoStaticStringZ
ProtoArrayZProtoStringZProtoSetZProtoMultiSetZProtoDictionaryZProtoMultiDictZProtoExtensionZProtoIOZProtoCardMathZProtoIntMathZProtoRealMath)ASCIIZ	BooleanIOZCharIOZ	UnicharIOZOctetIOZ
CardinalIOZ
LongCardIOZ	IntegerIOZ	LongIntIOZRealIOZ
LongRealIOZBCDIOZ	LongBCDIOZCardMathZLongCardMathZIntMathZLongIntMathZRealMathZLongRealMathZBCDMathZLongBCDMathFileIOr~   r   Z	IOSupport)r   ZStatus)r   r   rN   )ZstdInZstdOutZstdErr)ZpiZtau)	unknownm2pimZm2isom2r10objm2zm2iso+agletz	m2pim+gm2zm2iso+p1z	m2iso+xdsc                 K   s   t |dg }|D ]$}|| jdd v r| |  q@q| d d| _t |dg }d|v sbd|v rjd	| _nd| _t|d
d	| _tj| fi | d S )Ndialect   r   FZstyleZalgolZalgol_nuTtreat_stdlib_adts_as_builtins)	r   dialectsset_dialectdialect_set_by_tagalgol_publication_moder   r   r   __init__)selfoptionsr   Zdialect_optionZstylesrg   rg   6lib/python3.9/site-packages/pygments/lexers/modula2.pyr     s    

zModula2Lexer.__init__c                 C   s  || j vrd}n|}t }| j| D ]}|t| q$t }| j| D ]}|t| qHt }| j| D ]}|t|| qlt }| j| D ]}|t|| qt }| j| D ]}|t|| qt }	| j	| D ]}|	t|| qt }
| j
| D ]}|
t|| qt }| j| D ]}|t|| q@t }| j| D ]}|t|| qlt }| j| D ]}|t|| q|| _|| _|| _|| _|| _|| _|	| _|
| _|| _|| _|| _d S )Nr   )r   setlexemes_to_reject_dbupdatereserved_words_dbbuiltins_db
differencepseudo_builtins_dbstdlib_adts_dbstdlib_modules_dbstdlib_types_dbstdlib_procedures_dbstdlib_variables_dbstdlib_constants_dbr   lexemes_to_rejectreserved_wordsbuiltinspseudo_builtinsadtsmodulestypes
procedures	variables	constants)r   Z
dialect_idr   Zlexemes_to_reject_setlistZreswords_setZbuiltins_setZpseudo_builtins_setZadts_setZmodules_setZ	types_setZprocedures_setZvariables_setZconstants_setrg   rg   r   r     sX    
zModula2Lexer.set_dialectc           
      C   s   d}d}t |}t |}|}| }t ||| kr||r||r||| }tdt | jD ]}	|| j|	 krb|  S qbdS dS d S )Nz(*!*)r   r   )len
startswithendswithranger   )
r   Zdialect_tagZleft_tag_delimZright_tag_delimZleft_tag_delim_lenZright_tag_delim_lenZindicator_startZindicator_endZ	indicatorindexrg   rg   r   get_dialect_from_dialect_tag|  s"    
z)Modula2Lexer.get_dialect_from_dialect_tagc                 c   s  t | |D ]\}}}| jsJ|tjkrJ| |}|dkrJ| | d| _|tu rJ|| jv rtt	j
}| jrr| }n|| jv rtj}| jr| }n|| jv rtjj}| jr| }n|| jv r| jstj}ntjj}| jr| }n`|| jv rtj}nN|| jv rtj}n:|| jv r tj}n&|| jv r4tj}n|| jv rtj}nt|tv r| jdvrd|v s||dd dv rt}nT| jdv r|tj u rt}n6|tj!u rd	|v rt}n|tj"u rd
|v rt}n|tv rX|tj#u r| jdvrt}|tj$u r|%dr*| j%dr*t}n,|%dr| jdkr| j%dstj&}nf|| j'v rht}| jr|dkrd}n>|dkrd}n.|dkrd}n|dkrd}n|dkrd}|||fV  qd S )Nr   T)r   r   r   'r      )Z0b0xZ0u)r   r   HEz<*r   z(*$#u   ≠r   u   ≤r   u   ≥r   u   ≡r<   u   •)(r   get_tokens_unprocessedr   r   Specialr   r   r
   r   r	   ZReservedr   lowerr   ZBuiltinr   ZPseudor   r   	Namespacer   r   ZClassr   ZFunctionr   ZVariabler   ZConstantr   r   r   OctHexFloatSinglePreprocr   	Multiliner   )r   textr   tokenvalueZindicated_dialectrg   rg   r   r     s    





















z#Modula2Lexer.get_tokens_unprocessedc                 C   sH   d| v rd| v rd| v sdS d}t d| r4|d7 }t d| rDd	}|S )
zNIt's Pascal-like, but does not use FUNCTION -- uses PROCEDURE
        instead.z(*r   r   Nr   z\bPROCEDURE\bg333333?z\bFUNCTION\bg        )research)r   resultrg   rg   r   analyse_text  s    zModula2Lexer.analyse_textN)___name__
__module____qualname____doc__namealiases	filenamesZ	mimetypesr   	MULTILINEDOTALLflagsr   r   r   r
   r   ZBinr   r   ZIntegerr   r   Doubler   r   r   r   r   r   tokensZcommon_reserved_wordsZcommon_builtinsZcommon_pseudo_builtinsZpim_lexemes_to_rejectZpim_additional_reserved_wordsZpim_additional_builtinsZpim_additional_pseudo_builtinsZiso_lexemes_to_rejectZiso_additional_reserved_wordsZiso_additional_builtinsZiso_additional_pseudo_builtinsZm2r10_lexemes_to_rejectZm2r10_additional_reserved_wordsZm2r10_additional_builtinsZ m2r10_additional_pseudo_builtinsZobjm2_lexemes_to_rejectZobjm2_additional_reserved_wordsZobjm2_additional_builtinsZ objm2_additional_pseudo_builtinsZaglet_additional_reserved_wordsZaglet_additional_builtinsZ aglet_additional_pseudo_builtinsZgm2_additional_reserved_wordsZgm2_additional_builtinsZgm2_additional_pseudo_builtinsZp1_additional_reserved_wordsZp1_additional_builtinsZp1_additional_pseudo_builtinsZxds_additional_reserved_wordsZxds_additional_builtinsZxds_additional_pseudo_builtinsZpim_stdlib_module_identifiersZpim_stdlib_type_identifiersZpim_stdlib_proc_identifiersZpim_stdlib_var_identifiersZpim_stdlib_const_identifiersZiso_stdlib_module_identifiersZiso_stdlib_type_identifiersZiso_stdlib_proc_identifiersZiso_stdlib_var_identifiersZiso_stdlib_const_identifiersZm2r10_stdlib_adt_identifiersZ"m2r10_stdlib_blueprint_identifiersZm2r10_stdlib_module_identifiersZm2r10_stdlib_type_identifiersZm2r10_stdlib_proc_identifiersZm2r10_stdlib_var_identifiersZm2r10_stdlib_const_identifiersr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rg   rg   rg   r   r      s   

  %

			
		+	C	C	B141111&f0n)r   r   Zpygments.lexerr   r   Zpygments.utilr   r   Zpygments.tokenr   r   r   r	   r
   r   r   r   r   __all__r   rg   rg   rg   r   <module>   s   
,