75 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
"""
 | 
						|
    pygments.lexers.gleam
 | 
						|
    ~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
    Lexer for the Gleam programming language.
 | 
						|
 | 
						|
    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
 | 
						|
    :license: BSD, see LICENSE for details.
 | 
						|
"""
 | 
						|
 | 
						|
from pygments.lexer import RegexLexer, words, bygroups
 | 
						|
from pygments.token import Comment, Operator, Keyword, Name, String, \
 | 
						|
    Number, Punctuation, Whitespace
 | 
						|
 | 
						|
__all__ = ['GleamLexer']
 | 
						|
 | 
						|
 | 
						|
class GleamLexer(RegexLexer):
 | 
						|
    """
 | 
						|
    Lexer for the Gleam programming language (version 1.0.0).
 | 
						|
    """
 | 
						|
 | 
						|
    name = 'Gleam'
 | 
						|
    url = 'https://gleam.run/'
 | 
						|
    filenames = ['*.gleam']
 | 
						|
    aliases = ['gleam']
 | 
						|
    mimetypes = ['text/x-gleam']
 | 
						|
    version_added = '2.19'
 | 
						|
 | 
						|
    keywords = words((
 | 
						|
        'as', 'assert', 'auto', 'case', 'const', 'delegate', 'derive', 'echo',
 | 
						|
        'else', 'fn', 'if', 'implement', 'import', 'let', 'macro', 'opaque',
 | 
						|
        'panic', 'pub', 'test', 'todo', 'type', 'use',
 | 
						|
    ), suffix=r'\b')
 | 
						|
 | 
						|
    tokens = {
 | 
						|
        'root': [
 | 
						|
            # Comments
 | 
						|
            (r'(///.*?)(\n)', bygroups(String.Doc, Whitespace)),
 | 
						|
            (r'(//.*?)(\n)', bygroups(Comment.Single, Whitespace)),
 | 
						|
 | 
						|
            # Keywords
 | 
						|
            (keywords, Keyword),
 | 
						|
            (r'([a-zA-Z_]+)(\.)', bygroups(Keyword, Punctuation)),
 | 
						|
 | 
						|
            # Punctuation
 | 
						|
            (r'[()\[\]{}:;,@]+', Punctuation),
 | 
						|
            (r'(#|!=|!|==|\|>|\|\||\||\->|<\-|&&|<<|>>|\.\.|\.|=)', Punctuation),
 | 
						|
 | 
						|
            # Operators
 | 
						|
            (r'(<>|\+\.?|\-\.?|\*\.?|/\.?|%\.?|<=\.?|>=\.?|<\.?|>\.?|=)', Operator),
 | 
						|
 | 
						|
            # Strings
 | 
						|
            (r'"(\\"|[^"])*"', String),
 | 
						|
 | 
						|
            # Identifiers
 | 
						|
            (r'\b(let)(\s+)(\w+)', bygroups(Keyword, Whitespace, Name.Variable)),
 | 
						|
            (r'\b(fn)(\s+)(\w+)', bygroups(Keyword, Whitespace, Name.Function)),
 | 
						|
            (r'[a-zA-Z_/]\w*', Name),
 | 
						|
 | 
						|
            # numbers
 | 
						|
            (r'(\d+(_\d+)*\.(?!\.)(\d+(_\d+)*)?|\.\d+(_\d+)*)([eEf][+-]?[0-9]+)?', Number.Float),
 | 
						|
            (r'\d+(_\d+)*[eEf][+-]?[0-9]+', Number.Float),
 | 
						|
            (r'0[xX][a-fA-F0-9]+(_[a-fA-F0-9]+)*(\.([a-fA-F0-9]+(_[a-fA-F0-9]+)*)?)?p[+-]?\d+', Number.Float),
 | 
						|
            (r'0[bB][01]+(_[01]+)*', Number.Bin),
 | 
						|
            (r'0[oO][0-7]+(_[0-7]+)*', Number.Oct),
 | 
						|
            (r'0[xX][a-fA-F0-9]+(_[a-fA-F0-9]+)*', Number.Hex),
 | 
						|
            (r'\d+(_\d+)*', Number.Integer),
 | 
						|
 | 
						|
            # Whitespace
 | 
						|
            (r'\s+', Whitespace),
 | 
						|
 | 
						|
        ],
 | 
						|
    }
 |