Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

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

# -*- coding: utf-8 -*- 

""" 

    pygments.lexers.apl 

    ~~~~~~~~~~~~~~~~~~~ 

 

    Lexers for APL. 

 

    :copyright: Copyright 2006-2014 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 

 

__all__ = ['APLLexer'] 

 

 

class APLLexer(RegexLexer): 

    """ 

    A simple APL lexer. 

 

    .. versionadded:: 2.0 

    """ 

    name = 'APL' 

    aliases = ['apl'] 

    filenames = ['*.apl'] 

 

    tokens = { 

        'root': [ 

            # Whitespace 

            # ========== 

            (r'\s+', Text), 

            # 

            # Comment 

            # ======= 

            # '⍝' is traditional; '#' is supported by GNU APL and NGN (but not Dyalog) 

            (u'[⍝#].*$', 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) 

            (u'[⋄◇()]', 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 

            (u'⎕[A-Za-zΔ∆⍙][A-Za-zΔ∆⍙_¯0-9]*', Name.Function), 

            # 

            # Labels 

            # ====== 

            # following IBM APL2 standard 

            # (u'[A-Za-zΔ∆⍙][A-Za-zΔ∆⍙_¯0-9]*:', Name.Label), 

            # 

            # Variables 

            # ========= 

            # following IBM APL2 standard 

            (u'[A-Za-zΔ∆⍙][A-Za-zΔ∆⍙_¯0-9]*', Name.Variable), 

            # 

            # Numbers 

            # ======= 

            (u'¯?(0[Xx][0-9A-Fa-f]+|[0-9]*\.?[0-9]+([Ee][+¯]?[0-9]+)?|¯|∞)' 

             u'([Jj]¯?(0[Xx][0-9A-Fa-f]+|[0-9]*\.?[0-9]+([Ee][+¯]?[0-9]+)?|¯|∞))?', 

             Number), 

            # 

            # Operators 

            # ========== 

            (u'[\.\\\/⌿⍀¨⍣⍨⍠⍤∘]', Name.Attribute),  # closest token type 

            (u'[+\-×÷⌈⌊∣|⍳?*⍟○!⌹<≤=>≥≠≡≢∊⍷∪∩~∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⌷⍋⍒⊤⊥⍕⍎⊣⊢⍁⍂≈⌸⍯↗]', 

             Operator), 

            # 

            # Constant 

            # ======== 

            (u'⍬', Name.Constant), 

            # 

            # Quad symbol 

            # =========== 

            (u'[⎕⍞]', Name.Variable.Global), 

            # 

            # Arrows left/right 

            # ================= 

            (u'[←→]', Keyword.Declaration), 

            # 

            # D-Fn 

            # ==== 

            (u'[⍺⍵⍶⍹∇:]', Name.Builtin.Pseudo), 

            (r'[{}]', Keyword.Type), 

        ], 

    }