1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
"""
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),
#
],
}
|