110 lines
3.3 KiB
Python
110 lines
3.3 KiB
Python
|
"""
|
|||
|
pygments.lexers.bqn
|
|||
|
~~~~~~~~~~~~~~~~~~~
|
|||
|
|
|||
|
Lexer for BQN.
|
|||
|
|
|||
|
:copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS.
|
|||
|
:license: BSD, see LICENSE for details.
|
|||
|
"""
|
|||
|
|
|||
|
from pygments.lexer import RegexLexer
|
|||
|
from pygments.token import Comment, Operator, Keyword, Name, String, \
|
|||
|
Number, Punctuation, Whitespace
|
|||
|
|
|||
|
__all__ = ['BQNLexer']
|
|||
|
|
|||
|
|
|||
|
class BQNLexer(RegexLexer):
|
|||
|
"""
|
|||
|
A simple BQN lexer.
|
|||
|
"""
|
|||
|
name = 'BQN'
|
|||
|
url = 'https://mlochbaum.github.io/BQN/index.html'
|
|||
|
aliases = ['bqn']
|
|||
|
filenames = ['*.bqn']
|
|||
|
mimetypes = []
|
|||
|
version_added = '2.16'
|
|||
|
|
|||
|
tokens = {
|
|||
|
'root': [
|
|||
|
# Whitespace
|
|||
|
# ==========
|
|||
|
(r'\s+', Whitespace),
|
|||
|
#
|
|||
|
# Comment
|
|||
|
# =======
|
|||
|
# '#' is a comment that continues to the end of the line
|
|||
|
(r'#.*$', Comment.Single),
|
|||
|
#
|
|||
|
# Strings
|
|||
|
# =======
|
|||
|
(r'\'((\'\')|[^\'])*\'', String.Single),
|
|||
|
(r'"(("")|[^"])*"', String.Double),
|
|||
|
#
|
|||
|
# Null Character
|
|||
|
# ==============
|
|||
|
# Literal representation of the null character
|
|||
|
(r'@', String.Symbol),
|
|||
|
#
|
|||
|
# Punctuation
|
|||
|
# ===========
|
|||
|
# This token type is used for diamond, commas
|
|||
|
# and array and list brackets and strand syntax
|
|||
|
(r'[\.⋄,\[\]⟨⟩‿]', Punctuation),
|
|||
|
#
|
|||
|
# Expression Grouping
|
|||
|
# ===================
|
|||
|
# Since this token type is important in BQN, it is not included in
|
|||
|
# the punctuation token type but rather in the following one
|
|||
|
(r'[\(\)]', String.Regex),
|
|||
|
#
|
|||
|
# Numbers
|
|||
|
# =======
|
|||
|
# Includes the numeric literals and the Nothing character
|
|||
|
(r'¯?([0-9]+\.?[0-9]+|[0-9]+)([Ee][¯]?[0-9]+)?|¯|∞|π|·', Number),
|
|||
|
#
|
|||
|
# Variables
|
|||
|
# =========
|
|||
|
(r'\b[a-z]\w*\b', Name.Variable),
|
|||
|
#
|
|||
|
# 1-Modifiers
|
|||
|
# ===========
|
|||
|
(r'[˙˜˘¨⌜⁼´˝`𝕣]', Name.Attribute),
|
|||
|
(r'\b_[a-zA-Z0-9]+\b', Name.Attribute),
|
|||
|
#
|
|||
|
# 2-Modifiers
|
|||
|
# ===========
|
|||
|
(r'[∘○⊸⟜⌾⊘◶⎉⚇⍟⎊]', Name.Property),
|
|||
|
(r'\b_[a-zA-Z0-9]+_\b', Name.Property),
|
|||
|
#
|
|||
|
# Functions
|
|||
|
# =========
|
|||
|
# The monadic or dyadic function primitives and function
|
|||
|
# operands and arguments, along with function self-reference
|
|||
|
(r'[+\-×÷\*√⌊⌈∧∨¬|≤<>≥=≠≡≢⊣⊢⥊∾≍⋈↑↓↕«»⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!𝕎𝕏𝔽𝔾𝕊]',
|
|||
|
Operator),
|
|||
|
(r'[A-Z]\w*|•\w+\b', Operator),
|
|||
|
#
|
|||
|
# Constant
|
|||
|
# ========
|
|||
|
(r'˙', Name.Constant),
|
|||
|
#
|
|||
|
# Define/Export/Change
|
|||
|
# ====================
|
|||
|
(r'[←↩⇐]', Keyword.Declaration),
|
|||
|
#
|
|||
|
# Blocks
|
|||
|
# ======
|
|||
|
(r'[{}]', Keyword.Type),
|
|||
|
#
|
|||
|
# Extra characters
|
|||
|
# ================
|
|||
|
(r'[;:?𝕨𝕩𝕗𝕘𝕤]', Name.Entity),
|
|||
|
#
|
|||
|
|
|||
|
],
|
|||
|
}
|
|||
|
|
|||
|
|