aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/Pygments/py3/pygments/lexers/tcl.py
blob: 9f67fd3a2d3620539aecf09b790b8fd5a4dd7b4c (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
""" 
    pygments.lexers.tcl 
    ~~~~~~~~~~~~~~~~~~~ 
 
    Lexers for Tcl and related languages. 
 
    :copyright: Copyright 2006-2021 by the Pygments team, see AUTHORS.
    :license: BSD, see LICENSE for details. 
""" 
 
from pygments.lexer import RegexLexer, include, words 
from pygments.token import Text, Comment, Operator, Keyword, Name, String, \ 
    Number, Whitespace
from pygments.util import shebang_matches 
 
__all__ = ['TclLexer'] 
 
 
class TclLexer(RegexLexer): 
    """ 
    For Tcl source code. 
 
    .. versionadded:: 0.10 
    """ 
 
    keyword_cmds_re = words(( 
        'after', 'apply', 'array', 'break', 'catch', 'continue', 'elseif', 'else', 'error', 
        'eval', 'expr', 'for', 'foreach', 'global', 'if', 'namespace', 'proc', 'rename', 'return', 
        'set', 'switch', 'then', 'trace', 'unset', 'update', 'uplevel', 'upvar', 'variable', 
        'vwait', 'while'), prefix=r'\b', suffix=r'\b') 
 
    builtin_cmds_re = words(( 
        'append', 'bgerror', 'binary', 'cd', 'chan', 'clock', 'close', 'concat', 'dde', 'dict', 
        'encoding', 'eof', 'exec', 'exit', 'fblocked', 'fconfigure', 'fcopy', 'file', 
        'fileevent', 'flush', 'format', 'gets', 'glob', 'history', 'http', 'incr', 'info', 'interp', 
        'join', 'lappend', 'lassign', 'lindex', 'linsert', 'list', 'llength', 'load', 'loadTk', 
        'lrange', 'lrepeat', 'lreplace', 'lreverse', 'lsearch', 'lset', 'lsort', 'mathfunc', 
        'mathop', 'memory', 'msgcat', 'open', 'package', 'pid', 'pkg::create', 'pkg_mkIndex', 
        'platform', 'platform::shell', 'puts', 'pwd', 're_syntax', 'read', 'refchan', 
        'regexp', 'registry', 'regsub', 'scan', 'seek', 'socket', 'source', 'split', 'string', 
        'subst', 'tell', 'time', 'tm', 'unknown', 'unload'), prefix=r'\b', suffix=r'\b') 
 
    name = 'Tcl' 
    aliases = ['tcl'] 
    filenames = ['*.tcl', '*.rvt'] 
    mimetypes = ['text/x-tcl', 'text/x-script.tcl', 'application/x-tcl'] 
 
    def _gen_command_rules(keyword_cmds_re, builtin_cmds_re, context=""): 
        return [ 
            (keyword_cmds_re, Keyword, 'params' + context), 
            (builtin_cmds_re, Name.Builtin, 'params' + context), 
            (r'([\w.-]+)', Name.Variable, 'params' + context), 
            (r'#', Comment, 'comment'), 
        ] 
 
    tokens = { 
        'root': [ 
            include('command'), 
            include('basic'), 
            include('data'), 
            (r'\}', Keyword),  # HACK: somehow we miscounted our braces 
        ], 
        'command': _gen_command_rules(keyword_cmds_re, builtin_cmds_re), 
        'command-in-brace': _gen_command_rules(keyword_cmds_re, 
                                               builtin_cmds_re, 
                                               "-in-brace"), 
        'command-in-bracket': _gen_command_rules(keyword_cmds_re, 
                                                 builtin_cmds_re, 
                                                 "-in-bracket"), 
        'command-in-paren': _gen_command_rules(keyword_cmds_re, 
                                               builtin_cmds_re, 
                                               "-in-paren"), 
        'basic': [ 
            (r'\(', Keyword, 'paren'), 
            (r'\[', Keyword, 'bracket'), 
            (r'\{', Keyword, 'brace'), 
            (r'"', String.Double, 'string'), 
            (r'(eq|ne|in|ni)\b', Operator.Word), 
            (r'!=|==|<<|>>|<=|>=|&&|\|\||\*\*|[-+~!*/%<>&^|?:]', Operator), 
        ], 
        'data': [ 
            (r'\s+', Whitespace),
            (r'0x[a-fA-F0-9]+', Number.Hex), 
            (r'0[0-7]+', Number.Oct), 
            (r'\d+\.\d+', Number.Float), 
            (r'\d+', Number.Integer), 
            (r'\$([\w.:-]+)', Name.Variable), 
            (r'([\w.,@:-]+)', Text),
        ], 
        'params': [ 
            (r';', Keyword, '#pop'), 
            (r'\n', Text, '#pop'), 
            (r'(else|elseif|then)\b', Keyword), 
            include('basic'), 
            include('data'), 
        ], 
        'params-in-brace': [ 
            (r'\}', Keyword, ('#pop', '#pop')), 
            include('params') 
        ], 
        'params-in-paren': [ 
            (r'\)', Keyword, ('#pop', '#pop')), 
            include('params') 
        ], 
        'params-in-bracket': [ 
            (r'\]', Keyword, ('#pop', '#pop')), 
            include('params') 
        ], 
        'string': [ 
            (r'\[', String.Double, 'string-square'), 
            (r'(?s)(\\\\|\\[0-7]+|\\.|[^"\\])', String.Double), 
            (r'"', String.Double, '#pop') 
        ], 
        'string-square': [ 
            (r'\[', String.Double, 'string-square'), 
            (r'(?s)(\\\\|\\[0-7]+|\\.|\\\n|[^\]\\])', String.Double), 
            (r'\]', String.Double, '#pop') 
        ], 
        'brace': [ 
            (r'\}', Keyword, '#pop'), 
            include('command-in-brace'), 
            include('basic'), 
            include('data'), 
        ], 
        'paren': [ 
            (r'\)', Keyword, '#pop'), 
            include('command-in-paren'), 
            include('basic'), 
            include('data'), 
        ], 
        'bracket': [ 
            (r'\]', Keyword, '#pop'), 
            include('command-in-bracket'), 
            include('basic'), 
            include('data'), 
        ], 
        'comment': [ 
            (r'.*[^\\]\n', Comment, '#pop'), 
            (r'.*\\\n', Comment), 
        ], 
    } 
 
    def analyse_text(text): 
        return shebang_matches(text, r'(tcl)')