aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/Pygments/py3/pygments/lexers/apl.py
blob: 5024c0c7e22cab165a66a0085ff8d8a673524de9 (plain) (blame)
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
""" 
    pygments.lexers.apl 
    ~~~~~~~~~~~~~~~~~~~ 
 
    Lexers for APL. 
 
    :copyright: Copyright 2006-2021 by the Pygments team, see AUTHORS.
    :license: BSD, see LICENSE for details. 
""" 
 
from pygments.lexer import RegexLexer 
from pygments.token import Text, Comment, Operator, Keyword, Name, String, \ 
    Number, Punctuation, Whitespace
 
__all__ = ['APLLexer'] 
 
 
class APLLexer(RegexLexer): 
    """ 
    A simple `APL <https://en.m.wikipedia.org/wiki/APL_(programming_language)>`_ lexer.
 
    .. versionadded:: 2.0 
    """ 
    name = 'APL' 
    aliases = ['apl'] 
    filenames = [
        '*.apl', '*.aplf', '*.aplo', '*.apln',  
        '*.aplc', '*.apli', '*.dyalog',
    ]
 
    tokens = { 
        'root': [ 
            # Whitespace 
            # ========== 
            (r'\s+', Whitespace),
            # 
            # Comment 
            # ======= 
            # '⍝' is traditional; '#' is supported by GNU APL and NGN (but not Dyalog) 
            (r'[⍝#].*$', Comment.Single),
            # 
            # Strings 
            # ======= 
            (r'\'((\'\')|[^\'])*\'', String.Single), 
            (r'"(("")|[^"])*"', String.Double),  # supported by NGN APL 
            # 
            # Punctuation 
            # =========== 
            # This token type is used for diamond and parenthesis 
            # but not for bracket and ; (see below) 
            (r'[⋄◇()]', Punctuation),
            # 
            # Array indexing 
            # ============== 
            # Since this token type is very important in APL, it is not included in 
            # the punctuation token type but rather in the following one 
            (r'[\[\];]', String.Regex), 
            # 
            # Distinguished names 
            # =================== 
            # following IBM APL2 standard 
            (r'⎕[A-Za-zΔ∆⍙][A-Za-zΔ∆⍙_¯0-9]*', Name.Function),
            # 
            # Labels 
            # ====== 
            # following IBM APL2 standard 
            # (r'[A-Za-zΔ∆⍙][A-Za-zΔ∆⍙_¯0-9]*:', Name.Label),
            # 
            # Variables 
            # ========= 
            # following IBM APL2 standard (with a leading _ ok for GNU APL and Dyalog)
            (r'[A-Za-zΔ∆⍙_][A-Za-zΔ∆⍙_¯0-9]*', Name.Variable),     
            # 
            # Numbers 
            # ======= 
            (r'¯?(0[Xx][0-9A-Fa-f]+|[0-9]*\.?[0-9]+([Ee][+¯]?[0-9]+)?|¯|∞)'
             r'([Jj]¯?(0[Xx][0-9A-Fa-f]+|[0-9]*\.?[0-9]+([Ee][+¯]?[0-9]+)?|¯|∞))?',
             Number), 
            # 
            # Operators 
            # ========== 
            (r'[\.\\\/⌿⍀¨⍣⍨⍠⍤∘⌸&⌶@⌺⍥⍛⍢]', Name.Attribute),  # closest token type
            (r'[+\-×÷⌈⌊∣|⍳?*⍟○!⌹<≤=>≥≠≡≢∊⍷∪∩~∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⌷⍋⍒⊤⊥⍕⍎⊣⊢⍁⍂≈⌸⍯↗⊆⊇⍸√⌾…⍮]',
             Operator), 
            # 
            # Constant 
            # ======== 
            (r'⍬', Name.Constant),
            # 
            # Quad symbol 
            # =========== 
            (r'[⎕⍞]', Name.Variable.Global),
            # 
            # Arrows left/right 
            # ================= 
            (r'[←→]', Keyword.Declaration),
            # 
            # D-Fn 
            # ==== 
            (r'[⍺⍵⍶⍹∇:]', Name.Builtin.Pseudo),
            (r'[{}]', Keyword.Type), 
        ], 
    }