1""" 
    2    pygments.lexers.gleam 
    3    ~~~~~~~~~~~~~~~~~~~~~ 
    4 
    5    Lexer for the Gleam programming language. 
    6 
    7    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. 
    8    :license: BSD, see LICENSE for details. 
    9""" 
    10 
    11from pygments.lexer import RegexLexer, words, bygroups 
    12from pygments.token import Comment, Operator, Keyword, Name, String, \ 
    13    Number, Punctuation, Whitespace 
    14 
    15__all__ = ['GleamLexer'] 
    16 
    17 
    18class GleamLexer(RegexLexer): 
    19    """ 
    20    Lexer for the Gleam programming language (version 1.0.0). 
    21    """ 
    22 
    23    name = 'Gleam' 
    24    url = 'https://gleam.run/' 
    25    filenames = ['*.gleam'] 
    26    aliases = ['gleam'] 
    27    mimetypes = ['text/x-gleam'] 
    28    version_added = '2.19' 
    29 
    30    keywords = words(( 
    31        'as', 'assert', 'auto', 'case', 'const', 'delegate', 'derive', 'echo', 
    32        'else', 'fn', 'if', 'implement', 'import', 'let', 'macro', 'opaque', 
    33        'panic', 'pub', 'test', 'todo', 'type', 'use', 
    34    ), suffix=r'\b') 
    35 
    36    tokens = { 
    37        'root': [ 
    38            # Comments 
    39            (r'(///.*?)(\n)', bygroups(String.Doc, Whitespace)), 
    40            (r'(//.*?)(\n)', bygroups(Comment.Single, Whitespace)), 
    41 
    42            # Keywords 
    43            (keywords, Keyword), 
    44            (r'([a-zA-Z_]+)(\.)', bygroups(Keyword, Punctuation)), 
    45 
    46            # Punctuation 
    47            (r'[()\[\]{}:;,@]+', Punctuation), 
    48            (r'(#|!=|!|==|\|>|\|\||\||\->|<\-|&&|<<|>>|\.\.|\.|=)', Punctuation), 
    49 
    50            # Operators 
    51            (r'(<>|\+\.?|\-\.?|\*\.?|/\.?|%\.?|<=\.?|>=\.?|<\.?|>\.?|=)', Operator), 
    52 
    53            # Strings 
    54            (r'"(\\"|[^"])*"', String), 
    55 
    56            # Identifiers 
    57            (r'\b(let)(\s+)(\w+)', bygroups(Keyword, Whitespace, Name.Variable)), 
    58            (r'\b(fn)(\s+)(\w+)', bygroups(Keyword, Whitespace, Name.Function)), 
    59            (r'[a-zA-Z_/]\w*', Name), 
    60 
    61            # numbers 
    62            (r'(\d+(_\d+)*\.(?!\.)(\d+(_\d+)*)?|\.\d+(_\d+)*)([eEf][+-]?[0-9]+)?', Number.Float), 
    63            (r'\d+(_\d+)*[eEf][+-]?[0-9]+', Number.Float), 
    64            (r'0[xX][a-fA-F0-9]+(_[a-fA-F0-9]+)*(\.([a-fA-F0-9]+(_[a-fA-F0-9]+)*)?)?p[+-]?\d+', Number.Float), 
    65            (r'0[bB][01]+(_[01]+)*', Number.Bin), 
    66            (r'0[oO][0-7]+(_[0-7]+)*', Number.Oct), 
    67            (r'0[xX][a-fA-F0-9]+(_[a-fA-F0-9]+)*', Number.Hex), 
    68            (r'\d+(_\d+)*', Number.Integer), 
    69 
    70            # Whitespace 
    71            (r'\s+', Whitespace), 
    72 
    73        ], 
    74    }