aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/Pygments/py2/pygments/lexers/slash.py
blob: e128f7eb4741449407ae8fae3b958b2f7c170e11 (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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
# -*- coding: utf-8 -*- 
""" 
    pygments.lexers.slash 
    ~~~~~~~~~~~~~~~~~~~~~ 
 
    Lexer for the `Slash <https://github.com/arturadib/Slash-A>`_ programming 
    language. 
 
    :copyright: Copyright 2006-2019 by the Pygments team, see AUTHORS. 
    :license: BSD, see LICENSE for details. 
""" 
 
from pygments.lexer import ExtendedRegexLexer, bygroups, DelegatingLexer 
from pygments.token import Name, Number, String, Comment, Punctuation, \ 
    Other, Keyword, Operator, Whitespace 
 
__all__ = ['SlashLexer'] 
 
 
class SlashLanguageLexer(ExtendedRegexLexer): 
    _nkw = r'(?=[^a-zA-Z_0-9])' 
 
    def move_state(new_state): 
        return ("#pop", new_state) 
 
    def right_angle_bracket(lexer, match, ctx): 
        if len(ctx.stack) > 1 and ctx.stack[-2] == "string": 
            ctx.stack.pop() 
        yield match.start(), String.Interpol, u"}"
        ctx.pos = match.end() 
        pass 
 
    tokens = { 
        "root": [ 
            (r"<%=",        Comment.Preproc,    move_state("slash")), 
            (r"<%!!",       Comment.Preproc,    move_state("slash")), 
            (r"<%#.*?%>",   Comment.Multiline), 
            (r"<%",         Comment.Preproc,    move_state("slash")), 
            (r".|\n",       Other), 
        ], 
        "string": [ 
            (r"\\",         String.Escape,      move_state("string_e")), 
            (r"\"",         String,             move_state("slash")), 
            (r"#\{",        String.Interpol,    "slash"), 
            (r'.|\n',       String), 
        ], 
        "string_e": [ 
            (r'n',                  String.Escape,      move_state("string")), 
            (r't',                  String.Escape,      move_state("string")), 
            (r'r',                  String.Escape,      move_state("string")), 
            (r'e',                  String.Escape,      move_state("string")), 
            (r'x[a-fA-F0-9]{2}',    String.Escape,      move_state("string")), 
            (r'.',                  String.Escape,      move_state("string")), 
        ], 
        "regexp": [ 
            (r'}[a-z]*',            String.Regex,       move_state("slash")), 
            (r'\\(.|\n)',           String.Regex), 
            (r'{',                  String.Regex,       "regexp_r"), 
            (r'.|\n',               String.Regex), 
        ], 
        "regexp_r": [ 
            (r'}[a-z]*',            String.Regex,       "#pop"), 
            (r'\\(.|\n)',           String.Regex), 
            (r'{',                  String.Regex,       "regexp_r"), 
        ], 
        "slash": [ 
            (r"%>",                     Comment.Preproc,    move_state("root")), 
            (r"\"",                     String,             move_state("string")), 
            (r"'[a-zA-Z0-9_]+",         String), 
            (r'%r{',                    String.Regex,       move_state("regexp")), 
            (r'/\*.*?\*/',              Comment.Multiline), 
            (r"(#|//).*?\n",            Comment.Single), 
            (r'-?[0-9]+e[+-]?[0-9]+',   Number.Float), 
            (r'-?[0-9]+\.[0-9]+(e[+-]?[0-9]+)?', Number.Float), 
            (r'-?[0-9]+',               Number.Integer), 
            (r'nil'+_nkw,               Name.Builtin), 
            (r'true'+_nkw,              Name.Builtin), 
            (r'false'+_nkw,             Name.Builtin), 
            (r'self'+_nkw,              Name.Builtin), 
            (r'(class)(\s+)([A-Z][a-zA-Z0-9_\']*)', 
                bygroups(Keyword, Whitespace, Name.Class)), 
            (r'class'+_nkw,             Keyword), 
            (r'extends'+_nkw,           Keyword), 
            (r'(def)(\s+)(self)(\s*)(\.)(\s*)([a-z_][a-zA-Z0-9_\']*=?|<<|>>|==|<=>|<=|<|>=|>|\+|-(self)?|~(self)?|\*|/|%|^|&&|&|\||\[\]=?)', 
                bygroups(Keyword, Whitespace, Name.Builtin, Whitespace, Punctuation, Whitespace, Name.Function)), 
            (r'(def)(\s+)([a-z_][a-zA-Z0-9_\']*=?|<<|>>|==|<=>|<=|<|>=|>|\+|-(self)?|~(self)?|\*|/|%|^|&&|&|\||\[\]=?)', 
                bygroups(Keyword, Whitespace, Name.Function)), 
            (r'def'+_nkw,               Keyword), 
            (r'if'+_nkw,                Keyword), 
            (r'elsif'+_nkw,             Keyword), 
            (r'else'+_nkw,              Keyword), 
            (r'unless'+_nkw,            Keyword), 
            (r'for'+_nkw,               Keyword), 
            (r'in'+_nkw,                Keyword), 
            (r'while'+_nkw,             Keyword), 
            (r'until'+_nkw,             Keyword), 
            (r'and'+_nkw,               Keyword), 
            (r'or'+_nkw,                Keyword), 
            (r'not'+_nkw,               Keyword), 
            (r'lambda'+_nkw,            Keyword), 
            (r'try'+_nkw,               Keyword), 
            (r'catch'+_nkw,             Keyword), 
            (r'return'+_nkw,            Keyword), 
            (r'next'+_nkw,              Keyword), 
            (r'last'+_nkw,              Keyword), 
            (r'throw'+_nkw,             Keyword), 
            (r'use'+_nkw,               Keyword), 
            (r'switch'+_nkw,            Keyword), 
            (r'\\',                     Keyword), 
            (r'λ',                      Keyword), 
            (r'__FILE__'+_nkw,          Name.Builtin.Pseudo), 
            (r'__LINE__'+_nkw,          Name.Builtin.Pseudo), 
            (r'[A-Z][a-zA-Z0-9_\']*'+_nkw, Name.Constant), 
            (r'[a-z_][a-zA-Z0-9_\']*'+_nkw, Name), 
            (r'@[a-z_][a-zA-Z0-9_\']*'+_nkw, Name.Variable.Instance), 
            (r'@@[a-z_][a-zA-Z0-9_\']*'+_nkw, Name.Variable.Class), 
            (r'\(',                     Punctuation), 
            (r'\)',                     Punctuation), 
            (r'\[',                     Punctuation), 
            (r'\]',                     Punctuation), 
            (r'\{',                     Punctuation), 
            (r'\}',                     right_angle_bracket), 
            (r';',                      Punctuation), 
            (r',',                      Punctuation), 
            (r'<<=',                    Operator), 
            (r'>>=',                    Operator), 
            (r'<<',                     Operator), 
            (r'>>',                     Operator), 
            (r'==',                     Operator), 
            (r'!=',                     Operator), 
            (r'=>',                     Operator), 
            (r'=',                      Operator), 
            (r'<=>',                    Operator), 
            (r'<=',                     Operator), 
            (r'>=',                     Operator), 
            (r'<',                      Operator), 
            (r'>',                      Operator), 
            (r'\+\+',                   Operator), 
            (r'\+=',                    Operator), 
            (r'-=',                     Operator), 
            (r'\*\*=',                  Operator), 
            (r'\*=',                    Operator), 
            (r'\*\*',                   Operator), 
            (r'\*',                     Operator), 
            (r'/=',                     Operator), 
            (r'\+',                     Operator), 
            (r'-',                      Operator), 
            (r'/',                      Operator), 
            (r'%=',                     Operator), 
            (r'%',                      Operator), 
            (r'^=',                     Operator), 
            (r'&&=',                    Operator), 
            (r'&=',                     Operator), 
            (r'&&',                     Operator), 
            (r'&',                      Operator), 
            (r'\|\|=',                  Operator), 
            (r'\|=',                    Operator), 
            (r'\|\|',                   Operator), 
            (r'\|',                     Operator), 
            (r'!',                      Operator), 
            (r'\.\.\.',                 Operator), 
            (r'\.\.',                   Operator), 
            (r'\.',                     Operator), 
            (r'::',                     Operator), 
            (r':',                      Operator), 
            (r'(\s|\n)+',               Whitespace), 
            (r'[a-z_][a-zA-Z0-9_\']*',  Name.Variable), 
        ], 
    } 
 
 
class SlashLexer(DelegatingLexer): 
    """ 
    Lexer for the Slash programming language. 
 
    .. versionadded:: 2.4 
    """ 
 
    name = 'Slash' 
    aliases = ['slash'] 
    filenames = ['*.sl'] 
 
    def __init__(self, **options): 
        from pygments.lexers.web import HtmlLexer 
        super(SlashLexer, self).__init__(HtmlLexer, SlashLanguageLexer, **options)