1""" 
    2    pygments.lexers.scripting 
    3    ~~~~~~~~~~~~~~~~~~~~~~~~~ 
    4 
    5    Lexer for scripting and embedded languages. 
    6 
    7    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. 
    8    :license: BSD, see LICENSE for details. 
    9""" 
    10 
    11import re 
    12 
    13from pygments.lexer import RegexLexer, include, bygroups, default, combined, \ 
    14    words 
    15from pygments.token import Text, Comment, Operator, Keyword, Name, String, \ 
    16    Number, Punctuation, Error, Whitespace, Other 
    17from pygments.util import get_bool_opt, get_list_opt 
    18 
    19__all__ = ['LuaLexer', 'LuauLexer', 'MoonScriptLexer', 'ChaiscriptLexer', 'LSLLexer', 
    20           'AppleScriptLexer', 'RexxLexer', 'MOOCodeLexer', 'HybrisLexer', 
    21           'EasytrieveLexer', 'JclLexer', 'MiniScriptLexer'] 
    22 
    23 
    24def all_lua_builtins(): 
    25    from pygments.lexers._lua_builtins import MODULES 
    26    return [w for values in MODULES.values() for w in values] 
    27 
    28class LuaLexer(RegexLexer): 
    29    """ 
    30    For Lua source code. 
    31 
    32    Additional options accepted: 
    33 
    34    `func_name_highlighting` 
    35        If given and ``True``, highlight builtin function names 
    36        (default: ``True``). 
    37    `disabled_modules` 
    38        If given, must be a list of module names whose function names 
    39        should not be highlighted. By default all modules are highlighted. 
    40 
    41        To get a list of allowed modules have a look into the 
    42        `_lua_builtins` module: 
    43 
    44        .. sourcecode:: pycon 
    45 
    46            >>> from pygments.lexers._lua_builtins import MODULES 
    47            >>> MODULES.keys() 
    48            ['string', 'coroutine', 'modules', 'io', 'basic', ...] 
    49    """ 
    50 
    51    name = 'Lua' 
    52    url = 'https://www.lua.org/' 
    53    aliases = ['lua'] 
    54    filenames = ['*.lua', '*.wlua'] 
    55    mimetypes = ['text/x-lua', 'application/x-lua'] 
    56    version_added = '' 
    57 
    58    _comment_multiline = r'(?:--\[(?P<level>=*)\[[\w\W]*?\](?P=level)\])' 
    59    _comment_single = r'(?:--.*$)' 
    60    _space = r'(?:\s+(?!\s))' 
    61    _s = rf'(?:{_comment_multiline}|{_comment_single}|{_space})' 
    62    _name = r'(?:[^\W\d]\w*)' 
    63 
    64    tokens = { 
    65        'root': [ 
    66            # Lua allows a file to start with a shebang. 
    67            (r'#!.*', Comment.Preproc), 
    68            default('base'), 
    69        ], 
    70        'ws': [ 
    71            (_comment_multiline, Comment.Multiline), 
    72            (_comment_single, Comment.Single), 
    73            (_space, Whitespace), 
    74        ], 
    75        'base': [ 
    76            include('ws'), 
    77 
    78            (r'(?i)0x[\da-f]*(\.[\da-f]*)?(p[+-]?\d+)?', Number.Hex), 
    79            (r'(?i)(\d*\.\d+|\d+\.\d*)(e[+-]?\d+)?', Number.Float), 
    80            (r'(?i)\d+e[+-]?\d+', Number.Float), 
    81            (r'\d+', Number.Integer), 
    82 
    83            # multiline strings 
    84            (r'(?s)\[(=*)\[.*?\]\1\]', String), 
    85 
    86            (r'::', Punctuation, 'label'), 
    87            (r'\.{3}', Punctuation), 
    88            (r'[=<>|~&+\-*/%#^]+|\.\.', Operator), 
    89            (r'[\[\]{}().,:;]+', Punctuation), 
    90            (r'(and|or|not)\b', Operator.Word), 
    91 
    92            (words([ 
    93                'break', 'do', 'else', 'elseif', 'end', 'for', 'if', 'in', 
    94                'repeat', 'return', 'then', 'until', 'while' 
    95            ], suffix=r'\b'), Keyword.Reserved), 
    96            (r'goto\b', Keyword.Reserved, 'goto'), 
    97            (r'(local)\b', Keyword.Declaration), 
    98            (r'(true|false|nil)\b', Keyword.Constant), 
    99 
    100            (r'(function)\b', Keyword.Reserved, 'funcname'), 
    101 
    102            (words(all_lua_builtins(), suffix=r"\b"), Name.Builtin), 
    103            (fr'[A-Za-z_]\w*(?={_s}*[.:])', Name.Variable, 'varname'), 
    104            (fr'[A-Za-z_]\w*(?={_s}*\()', Name.Function), 
    105            (r'[A-Za-z_]\w*', Name.Variable), 
    106 
    107            ("'", String.Single, combined('stringescape', 'sqs')), 
    108            ('"', String.Double, combined('stringescape', 'dqs')) 
    109        ], 
    110 
    111        'varname': [ 
    112            include('ws'), 
    113            (r'\.\.', Operator, '#pop'), 
    114            (r'[.:]', Punctuation), 
    115            (rf'{_name}(?={_s}*[.:])', Name.Property), 
    116            (rf'{_name}(?={_s}*\()', Name.Function, '#pop'), 
    117            (_name, Name.Property, '#pop'), 
    118        ], 
    119 
    120        'funcname': [ 
    121            include('ws'), 
    122            (r'[.:]', Punctuation), 
    123            (rf'{_name}(?={_s}*[.:])', Name.Class), 
    124            (_name, Name.Function, '#pop'), 
    125            # inline function 
    126            (r'\(', Punctuation, '#pop'), 
    127        ], 
    128 
    129        'goto': [ 
    130            include('ws'), 
    131            (_name, Name.Label, '#pop'), 
    132        ], 
    133 
    134        'label': [ 
    135            include('ws'), 
    136            (r'::', Punctuation, '#pop'), 
    137            (_name, Name.Label), 
    138        ], 
    139 
    140        'stringescape': [ 
    141            (r'\\([abfnrtv\\"\']|[\r\n]{1,2}|z\s*|x[0-9a-fA-F]{2}|\d{1,3}|' 
    142             r'u\{[0-9a-fA-F]+\})', String.Escape), 
    143        ], 
    144 
    145        'sqs': [ 
    146            (r"'", String.Single, '#pop'), 
    147            (r"[^\\']+", String.Single), 
    148        ], 
    149 
    150        'dqs': [ 
    151            (r'"', String.Double, '#pop'), 
    152            (r'[^\\"]+', String.Double), 
    153        ] 
    154    } 
    155 
    156    def __init__(self, **options): 
    157        self.func_name_highlighting = get_bool_opt( 
    158            options, 'func_name_highlighting', True) 
    159        self.disabled_modules = get_list_opt(options, 'disabled_modules', []) 
    160 
    161        self._functions = set() 
    162        if self.func_name_highlighting: 
    163            from pygments.lexers._lua_builtins import MODULES 
    164            for mod, func in MODULES.items(): 
    165                if mod not in self.disabled_modules: 
    166                    self._functions.update(func) 
    167        RegexLexer.__init__(self, **options) 
    168 
    169    def get_tokens_unprocessed(self, text): 
    170        for index, token, value in \ 
    171                RegexLexer.get_tokens_unprocessed(self, text): 
    172            if token is Name.Builtin and value not in self._functions: 
    173                if '.' in value: 
    174                    a, b = value.split('.') 
    175                    yield index, Name, a 
    176                    yield index + len(a), Punctuation, '.' 
    177                    yield index + len(a) + 1, Name, b 
    178                else: 
    179                    yield index, Name, value 
    180                continue 
    181            yield index, token, value 
    182 
    183def _luau_make_expression(should_pop, _s): 
    184    temp_list = [ 
    185        (r'0[xX][\da-fA-F_]*', Number.Hex, '#pop'), 
    186        (r'0[bB][\d_]*', Number.Bin, '#pop'), 
    187        (r'\.?\d[\d_]*(?:\.[\d_]*)?(?:[eE][+-]?[\d_]+)?', Number.Float, '#pop'), 
    188 
    189        (words(( 
    190            'true', 'false', 'nil' 
    191        ), suffix=r'\b'), Keyword.Constant, '#pop'), 
    192 
    193        (r'\[(=*)\[[.\n]*?\]\1\]', String, '#pop'), 
    194 
    195        (r'(\.)([a-zA-Z_]\w*)(?=%s*[({"\'])', bygroups(Punctuation, Name.Function), '#pop'), 
    196        (r'(\.)([a-zA-Z_]\w*)', bygroups(Punctuation, Name.Variable), '#pop'), 
    197 
    198        (rf'[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*(?={_s}*[({{"\'])', Name.Other, '#pop'), 
    199        (r'[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*', Name, '#pop'), 
    200    ] 
    201    if should_pop: 
    202        return temp_list 
    203    return [entry[:2] for entry in temp_list] 
    204 
    205def _luau_make_expression_special(should_pop): 
    206    temp_list = [ 
    207        (r'\{', Punctuation, ('#pop', 'closing_brace_base', 'expression')), 
    208        (r'\(', Punctuation, ('#pop', 'closing_parenthesis_base', 'expression')), 
    209 
    210        (r'::?', Punctuation, ('#pop', 'type_end', 'type_start')), 
    211 
    212        (r"'", String.Single, ('#pop', 'string_single')), 
    213        (r'"', String.Double, ('#pop', 'string_double')), 
    214        (r'`', String.Backtick, ('#pop', 'string_interpolated')), 
    215    ] 
    216    if should_pop: 
    217        return temp_list 
    218    return [(entry[0], entry[1], entry[2][1:]) for entry in temp_list] 
    219 
    220class LuauLexer(RegexLexer): 
    221    """ 
    222    For Luau source code. 
    223 
    224    Additional options accepted: 
    225 
    226    `include_luau_builtins` 
    227        If given and ``True``, automatically highlight Luau builtins 
    228        (default: ``True``). 
    229    `include_roblox_builtins` 
    230        If given and ``True``, automatically highlight Roblox-specific builtins 
    231        (default: ``False``). 
    232    `additional_builtins` 
    233        If given, must be a list of additional builtins to highlight. 
    234    `disabled_builtins` 
    235        If given, must be a list of builtins that will not be highlighted. 
    236    """ 
    237 
    238    name = 'Luau' 
    239    url = 'https://luau-lang.org/' 
    240    aliases = ['luau'] 
    241    filenames = ['*.luau'] 
    242    version_added = '2.18' 
    243 
    244    _comment_multiline = r'(?:--\[(?P<level>=*)\[[\w\W]*?\](?P=level)\])' 
    245    _comment_single = r'(?:--.*$)' 
    246    _s = r'(?:{}|{}|{})'.format(_comment_multiline, _comment_single, r'\s+') 
    247 
    248    tokens = { 
    249        'root': [ 
    250            (r'#!.*', Comment.Hashbang, 'base'), 
    251            default('base'), 
    252        ], 
    253 
    254        'ws': [ 
    255            (_comment_multiline, Comment.Multiline), 
    256            (_comment_single, Comment.Single), 
    257            (r'\s+', Whitespace), 
    258        ], 
    259 
    260        'base': [ 
    261            include('ws'), 
    262 
    263            *_luau_make_expression_special(False), 
    264            (r'\.\.\.', Punctuation), 
    265 
    266            (rf'type\b(?={_s}+[a-zA-Z_])', Keyword.Reserved, 'type_declaration'), 
    267            (rf'export\b(?={_s}+[a-zA-Z_])', Keyword.Reserved), 
    268 
    269            (r'(?:\.\.|//|[+\-*\/%^<>=])=?', Operator, 'expression'), 
    270            (r'~=', Operator, 'expression'), 
    271 
    272            (words(( 
    273                'and', 'or', 'not' 
    274            ), suffix=r'\b'), Operator.Word, 'expression'), 
    275 
    276            (words(( 
    277                'elseif', 'for', 'if', 'in', 'repeat', 'return', 'until', 
    278                'while'), suffix=r'\b'), Keyword.Reserved, 'expression'), 
    279            (r'local\b', Keyword.Declaration, 'expression'), 
    280 
    281            (r'function\b', Keyword.Reserved, ('expression', 'func_name')), 
    282 
    283            (r'[\])};]+', Punctuation), 
    284 
    285            include('expression_static'), 
    286            *_luau_make_expression(False, _s), 
    287 
    288            (r'[\[.,]', Punctuation, 'expression'), 
    289        ], 
    290        'expression_static': [ 
    291            (words(( 
    292                'break', 'continue', 'do', 'else', 'elseif', 'end', 'for', 
    293                'if', 'in', 'repeat', 'return', 'then', 'until', 'while'), 
    294                suffix=r'\b'), Keyword.Reserved), 
    295        ], 
    296        'expression': [ 
    297            include('ws'), 
    298 
    299            (r'if\b', Keyword.Reserved, ('ternary', 'expression')), 
    300 
    301            (r'local\b', Keyword.Declaration), 
    302            *_luau_make_expression_special(True), 
    303            (r'\.\.\.', Punctuation, '#pop'), 
    304 
    305            (r'function\b', Keyword.Reserved, 'func_name'), 
    306 
    307            include('expression_static'), 
    308            *_luau_make_expression(True, _s), 
    309 
    310            default('#pop'), 
    311        ], 
    312        'ternary': [ 
    313            include('ws'), 
    314 
    315            (r'else\b', Keyword.Reserved, '#pop'), 
    316            (words(( 
    317                'then', 'elseif', 
    318            ), suffix=r'\b'), Operator.Reserved, 'expression'), 
    319 
    320            default('#pop'), 
    321        ], 
    322 
    323        'closing_brace_pop': [ 
    324            (r'\}', Punctuation, '#pop'), 
    325        ], 
    326        'closing_parenthesis_pop': [ 
    327            (r'\)', Punctuation, '#pop'), 
    328        ], 
    329        'closing_gt_pop': [ 
    330            (r'>', Punctuation, '#pop'), 
    331        ], 
    332 
    333        'closing_parenthesis_base': [ 
    334            include('closing_parenthesis_pop'), 
    335            include('base'), 
    336        ], 
    337        'closing_parenthesis_type': [ 
    338            include('closing_parenthesis_pop'), 
    339            include('type'), 
    340        ], 
    341        'closing_brace_base': [ 
    342            include('closing_brace_pop'), 
    343            include('base'), 
    344        ], 
    345        'closing_brace_type': [ 
    346            include('closing_brace_pop'), 
    347            include('type'), 
    348        ], 
    349        'closing_gt_type': [ 
    350            include('closing_gt_pop'), 
    351            include('type'), 
    352        ], 
    353 
    354        'string_escape': [ 
    355            (r'\\z\s*', String.Escape), 
    356            (r'\\(?:[abfnrtvz\\"\'`\{\n])|[\r\n]{1,2}|x[\da-fA-F]{2}|\d{1,3}|' 
    357             r'u\{\}[\da-fA-F]*\}', String.Escape), 
    358        ], 
    359        'string_single': [ 
    360            include('string_escape'), 
    361 
    362            (r"'", String.Single, "#pop"), 
    363            (r"[^\\']+", String.Single), 
    364        ], 
    365        'string_double': [ 
    366            include('string_escape'), 
    367 
    368            (r'"', String.Double, "#pop"), 
    369            (r'[^\\"]+', String.Double), 
    370        ], 
    371        'string_interpolated': [ 
    372            include('string_escape'), 
    373 
    374            (r'\{', Punctuation, ('closing_brace_base', 'expression')), 
    375 
    376            (r'`', String.Backtick, "#pop"), 
    377            (r'[^\\`\{]+', String.Backtick), 
    378        ], 
    379 
    380        'func_name': [ 
    381            include('ws'), 
    382 
    383            (r'[.:]', Punctuation), 
    384            (rf'[a-zA-Z_]\w*(?={_s}*[.:])', Name.Class), 
    385            (r'[a-zA-Z_]\w*', Name.Function), 
    386 
    387            (r'<', Punctuation, 'closing_gt_type'), 
    388 
    389            (r'\(', Punctuation, '#pop'), 
    390        ], 
    391 
    392        'type': [ 
    393            include('ws'), 
    394 
    395            (r'\(', Punctuation, 'closing_parenthesis_type'), 
    396            (r'\{', Punctuation, 'closing_brace_type'), 
    397            (r'<', Punctuation, 'closing_gt_type'), 
    398 
    399            (r"'", String.Single, 'string_single'), 
    400            (r'"', String.Double, 'string_double'), 
    401 
    402            (r'[|&\.,\[\]:=]+', Punctuation), 
    403            (r'->', Punctuation), 
    404 
    405            (r'typeof\(', Name.Builtin, ('closing_parenthesis_base', 
    406                                         'expression')), 
    407            (r'[a-zA-Z_]\w*', Name.Class), 
    408        ], 
    409        'type_start': [ 
    410            include('ws'), 
    411 
    412            (r'\(', Punctuation, ('#pop', 'closing_parenthesis_type')), 
    413            (r'\{', Punctuation, ('#pop', 'closing_brace_type')), 
    414            (r'<', Punctuation, ('#pop', 'closing_gt_type')), 
    415 
    416            (r"'", String.Single, ('#pop', 'string_single')), 
    417            (r'"', String.Double, ('#pop', 'string_double')), 
    418 
    419            (r'typeof\(', Name.Builtin, ('#pop', 'closing_parenthesis_base', 
    420                                         'expression')), 
    421            (r'[a-zA-Z_]\w*', Name.Class, '#pop'), 
    422        ], 
    423        'type_end': [ 
    424            include('ws'), 
    425 
    426            (r'[|&\.]', Punctuation, 'type_start'), 
    427            (r'->', Punctuation, 'type_start'), 
    428 
    429            (r'<', Punctuation, 'closing_gt_type'), 
    430 
    431            default('#pop'), 
    432        ], 
    433        'type_declaration': [ 
    434            include('ws'), 
    435 
    436            (r'[a-zA-Z_]\w*', Name.Class), 
    437            (r'<', Punctuation, 'closing_gt_type'), 
    438 
    439            (r'=', Punctuation, ('#pop', 'type_end', 'type_start')), 
    440        ], 
    441    } 
    442 
    443    def __init__(self, **options): 
    444        self.include_luau_builtins = get_bool_opt( 
    445            options, 'include_luau_builtins', True) 
    446        self.include_roblox_builtins = get_bool_opt( 
    447            options, 'include_roblox_builtins', False) 
    448        self.additional_builtins = get_list_opt(options, 'additional_builtins', []) 
    449        self.disabled_builtins = get_list_opt(options, 'disabled_builtins', []) 
    450 
    451        self._builtins = set(self.additional_builtins) 
    452        if self.include_luau_builtins: 
    453            from pygments.lexers._luau_builtins import LUAU_BUILTINS 
    454            self._builtins.update(LUAU_BUILTINS) 
    455        if self.include_roblox_builtins: 
    456            from pygments.lexers._luau_builtins import ROBLOX_BUILTINS 
    457            self._builtins.update(ROBLOX_BUILTINS) 
    458        if self.additional_builtins: 
    459            self._builtins.update(self.additional_builtins) 
    460        self._builtins.difference_update(self.disabled_builtins) 
    461 
    462        RegexLexer.__init__(self, **options) 
    463 
    464    def get_tokens_unprocessed(self, text): 
    465        for index, token, value in \ 
    466                RegexLexer.get_tokens_unprocessed(self, text): 
    467            if token is Name or token is Name.Other: 
    468                split_value = value.split('.') 
    469                complete_value = [] 
    470                new_index = index 
    471                for position in range(len(split_value), 0, -1): 
    472                    potential_string = '.'.join(split_value[:position]) 
    473                    if potential_string in self._builtins: 
    474                        yield index, Name.Builtin, potential_string 
    475                        new_index += len(potential_string) 
    476 
    477                        if complete_value: 
    478                            yield new_index, Punctuation, '.' 
    479                            new_index += 1 
    480                        break 
    481                    complete_value.insert(0, split_value[position - 1]) 
    482 
    483                for position, substring in enumerate(complete_value): 
    484                    if position + 1 == len(complete_value): 
    485                        if token is Name: 
    486                            yield new_index, Name.Variable, substring 
    487                            continue 
    488                        yield new_index, Name.Function, substring 
    489                        continue 
    490                    yield new_index, Name.Variable, substring 
    491                    new_index += len(substring) 
    492                    yield new_index, Punctuation, '.' 
    493                    new_index += 1 
    494 
    495                continue 
    496            yield index, token, value 
    497 
    498class MoonScriptLexer(LuaLexer): 
    499    """ 
    500    For MoonScript source code. 
    501    """ 
    502 
    503    name = 'MoonScript' 
    504    url = 'http://moonscript.org' 
    505    aliases = ['moonscript', 'moon'] 
    506    filenames = ['*.moon'] 
    507    mimetypes = ['text/x-moonscript', 'application/x-moonscript'] 
    508    version_added = '1.5' 
    509 
    510    tokens = { 
    511        'root': [ 
    512            (r'#!(.*?)$', Comment.Preproc), 
    513            default('base'), 
    514        ], 
    515        'base': [ 
    516            ('--.*$', Comment.Single), 
    517            (r'(?i)(\d*\.\d+|\d+\.\d*)(e[+-]?\d+)?', Number.Float), 
    518            (r'(?i)\d+e[+-]?\d+', Number.Float), 
    519            (r'(?i)0x[0-9a-f]*', Number.Hex), 
    520            (r'\d+', Number.Integer), 
    521            (r'\n', Whitespace), 
    522            (r'[^\S\n]+', Text), 
    523            (r'(?s)\[(=*)\[.*?\]\1\]', String), 
    524            (r'(->|=>)', Name.Function), 
    525            (r':[a-zA-Z_]\w*', Name.Variable), 
    526            (r'(==|!=|~=|<=|>=|\.\.\.|\.\.|[=+\-*/%^<>#!.\\:])', Operator), 
    527            (r'[;,]', Punctuation), 
    528            (r'[\[\]{}()]', Keyword.Type), 
    529            (r'[a-zA-Z_]\w*:', Name.Variable), 
    530            (words(( 
    531                'class', 'extends', 'if', 'then', 'super', 'do', 'with', 
    532                'import', 'export', 'while', 'elseif', 'return', 'for', 'in', 
    533                'from', 'when', 'using', 'else', 'and', 'or', 'not', 'switch', 
    534                'break'), suffix=r'\b'), 
    535             Keyword), 
    536            (r'(true|false|nil)\b', Keyword.Constant), 
    537            (r'(and|or|not)\b', Operator.Word), 
    538            (r'(self)\b', Name.Builtin.Pseudo), 
    539            (r'@@?([a-zA-Z_]\w*)?', Name.Variable.Class), 
    540            (r'[A-Z]\w*', Name.Class),  # proper name 
    541            (words(all_lua_builtins(), suffix=r"\b"), Name.Builtin), 
    542            (r'[A-Za-z_]\w*', Name), 
    543            ("'", String.Single, combined('stringescape', 'sqs')), 
    544            ('"', String.Double, combined('stringescape', 'dqs')) 
    545        ], 
    546        'stringescape': [ 
    547            (r'''\\([abfnrtv\\"']|\d{1,3})''', String.Escape) 
    548        ], 
    549        'sqs': [ 
    550            ("'", String.Single, '#pop'), 
    551            ("[^']+", String) 
    552        ], 
    553        'dqs': [ 
    554            ('"', String.Double, '#pop'), 
    555            ('[^"]+', String) 
    556        ] 
    557    } 
    558 
    559    def get_tokens_unprocessed(self, text): 
    560        # set . as Operator instead of Punctuation 
    561        for index, token, value in LuaLexer.get_tokens_unprocessed(self, text): 
    562            if token == Punctuation and value == ".": 
    563                token = Operator 
    564            yield index, token, value 
    565 
    566 
    567class ChaiscriptLexer(RegexLexer): 
    568    """ 
    569    For ChaiScript source code. 
    570    """ 
    571 
    572    name = 'ChaiScript' 
    573    url = 'http://chaiscript.com/' 
    574    aliases = ['chaiscript', 'chai'] 
    575    filenames = ['*.chai'] 
    576    mimetypes = ['text/x-chaiscript', 'application/x-chaiscript'] 
    577    version_added = '2.0' 
    578 
    579    flags = re.DOTALL | re.MULTILINE 
    580 
    581    tokens = { 
    582        'commentsandwhitespace': [ 
    583            (r'\s+', Text), 
    584            (r'//.*?\n', Comment.Single), 
    585            (r'/\*.*?\*/', Comment.Multiline), 
    586            (r'^\#.*?\n', Comment.Single) 
    587        ], 
    588        'slashstartsregex': [ 
    589            include('commentsandwhitespace'), 
    590            (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/' 
    591             r'([gim]+\b|\B)', String.Regex, '#pop'), 
    592            (r'(?=/)', Text, ('#pop', 'badregex')), 
    593            default('#pop') 
    594        ], 
    595        'badregex': [ 
    596            (r'\n', Text, '#pop') 
    597        ], 
    598        'root': [ 
    599            include('commentsandwhitespace'), 
    600            (r'\n', Text), 
    601            (r'[^\S\n]+', Text), 
    602            (r'\+\+|--|~|&&|\?|:|\|\||\\(?=\n)|\.\.' 
    603             r'(<<|>>>?|==?|!=?|[-<>+*%&|^/])=?', Operator, 'slashstartsregex'), 
    604            (r'[{(\[;,]', Punctuation, 'slashstartsregex'), 
    605            (r'[})\].]', Punctuation), 
    606            (r'[=+\-*/]', Operator), 
    607            (r'(for|in|while|do|break|return|continue|if|else|' 
    608             r'throw|try|catch' 
    609             r')\b', Keyword, 'slashstartsregex'), 
    610            (r'(var)\b', Keyword.Declaration, 'slashstartsregex'), 
    611            (r'(attr|def|fun)\b', Keyword.Reserved), 
    612            (r'(true|false)\b', Keyword.Constant), 
    613            (r'(eval|throw)\b', Name.Builtin), 
    614            (r'`\S+`', Name.Builtin), 
    615            (r'[$a-zA-Z_]\w*', Name.Other), 
    616            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float), 
    617            (r'0x[0-9a-fA-F]+', Number.Hex), 
    618            (r'[0-9]+', Number.Integer), 
    619            (r'"', String.Double, 'dqstring'), 
    620            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single), 
    621        ], 
    622        'dqstring': [ 
    623            (r'\$\{[^"}]+?\}', String.Interpol), 
    624            (r'\$', String.Double), 
    625            (r'\\\\', String.Double), 
    626            (r'\\"', String.Double), 
    627            (r'[^\\"$]+', String.Double), 
    628            (r'"', String.Double, '#pop'), 
    629        ], 
    630    } 
    631 
    632 
    633class LSLLexer(RegexLexer): 
    634    """ 
    635    For Second Life's Linden Scripting Language source code. 
    636    """ 
    637 
    638    name = 'LSL' 
    639    aliases = ['lsl'] 
    640    filenames = ['*.lsl'] 
    641    mimetypes = ['text/x-lsl'] 
    642    url = 'https://wiki.secondlife.com/wiki/Linden_Scripting_Language' 
    643    version_added = '2.0' 
    644 
    645    flags = re.MULTILINE 
    646 
    647    lsl_keywords = r'\b(?:do|else|for|if|jump|return|while)\b' 
    648    lsl_types = r'\b(?:float|integer|key|list|quaternion|rotation|string|vector)\b' 
    649    lsl_states = r'\b(?:(?:state)\s+\w+|default)\b' 
    650    lsl_events = r'\b(?:state_(?:entry|exit)|touch(?:_(?:start|end))?|(?:land_)?collision(?:_(?:start|end))?|timer|listen|(?:no_)?sensor|control|(?:not_)?at_(?:rot_)?target|money|email|run_time_permissions|changed|attach|dataserver|moving_(?:start|end)|link_message|(?:on|object)_rez|remote_data|http_re(?:sponse|quest)|path_update|transaction_result)\b' 
    651    lsl_functions_builtin = r'\b(?:ll(?:ReturnObjectsBy(?:ID|Owner)|Json(?:2List|[GS]etValue|ValueType)|Sin|Cos|Tan|Atan2|Sqrt|Pow|Abs|Fabs|Frand|Floor|Ceil|Round|Vec(?:Mag|Norm|Dist)|Rot(?:Between|2(?:Euler|Fwd|Left|Up))|(?:Euler|Axes)2Rot|Whisper|(?:Region|Owner)?Say|Shout|Listen(?:Control|Remove)?|Sensor(?:Repeat|Remove)?|Detected(?:Name|Key|Owner|Type|Pos|Vel|Grab|Rot|Group|LinkNumber)|Die|Ground|Wind|(?:[GS]et)(?:AnimationOverride|MemoryLimit|PrimMediaParams|ParcelMusicURL|Object(?:Desc|Name)|PhysicsMaterial|Status|Scale|Color|Alpha|Texture|Pos|Rot|Force|Torque)|ResetAnimationOverride|(?:Scale|Offset|Rotate)Texture|(?:Rot)?Target(?:Remove)?|(?:Stop)?MoveToTarget|Apply(?:Rotational)?Impulse|Set(?:KeyframedMotion|ContentType|RegionPos|(?:Angular)?Velocity|Buoyancy|HoverHeight|ForceAndTorque|TimerEvent|ScriptState|Damage|TextureAnim|Sound(?:Queueing|Radius)|Vehicle(?:Type|(?:Float|Vector|Rotation)Param)|(?:Touch|Sit)?Text|Camera(?:Eye|At)Offset|PrimitiveParams|ClickAction|Link(?:Alpha|Color|PrimitiveParams(?:Fast)?|Texture(?:Anim)?|Camera|Media)|RemoteScriptAccessPin|PayPrice|LocalRot)|ScaleByFactor|Get(?:(?:Max|Min)ScaleFactor|ClosestNavPoint|StaticPath|SimStats|Env|PrimitiveParams|Link(?:PrimitiveParams|Number(?:OfSides)?|Key|Name|Media)|HTTPHeader|FreeURLs|Object(?:Details|PermMask|PrimCount)|Parcel(?:MaxPrims|Details|Prim(?:Count|Owners))|Attached|(?:SPMax|Free|Used)Memory|Region(?:Name|TimeDilation|FPS|Corner|AgentCount)|Root(?:Position|Rotation)|UnixTime|(?:Parcel|Region)Flags|(?:Wall|GMT)clock|SimulatorHostname|BoundingBox|GeometricCenter|Creator|NumberOf(?:Prims|NotecardLines|Sides)|Animation(?:List)?|(?:Camera|Local)(?:Pos|Rot)|Vel|Accel|Omega|Time(?:stamp|OfDay)|(?:Object|CenterOf)?Mass|MassMKS|Energy|Owner|(?:Owner)?Key|SunDirection|Texture(?:Offset|Scale|Rot)|Inventory(?:Number|Name|Key|Type|Creator|PermMask)|Permissions(?:Key)?|StartParameter|List(?:Length|EntryType)|Date|Agent(?:Size|Info|Language|List)|LandOwnerAt|NotecardLine|Script(?:Name|State))|(?:Get|Reset|GetAndReset)Time|PlaySound(?:Slave)?|LoopSound(?:Master|Slave)?|(?:Trigger|Stop|Preload)Sound|(?:(?:Get|Delete)Sub|Insert)String|To(?:Upper|Lower)|Give(?:InventoryList|Money)|RezObject|(?:Stop)?LookAt|Sleep|CollisionFilter|(?:Take|Release)Controls|DetachFromAvatar|AttachToAvatar(?:Temp)?|InstantMessage|(?:GetNext)?Email|StopHover|MinEventDelay|RotLookAt|String(?:Length|Trim)|(?:Start|Stop)Animation|TargetOmega|RequestPermissions|(?:Create|Break)Link|BreakAllLinks|(?:Give|Remove)Inventory|Water|PassTouches|Request(?:Agent|Inventory)Data|TeleportAgent(?:Home|GlobalCoords)?|ModifyLand|CollisionSound|ResetScript|MessageLinked|PushObject|PassCollisions|AxisAngle2Rot|Rot2(?:Axis|Angle)|A(?:cos|sin)|AngleBetween|AllowInventoryDrop|SubStringIndex|List2(?:CSV|Integer|Json|Float|String|Key|Vector|Rot|List(?:Strided)?)|DeleteSubList|List(?:Statistics|Sort|Randomize|(?:Insert|Find|Replace)List)|EdgeOfWorld|AdjustSoundVolume|Key2Name|TriggerSoundLimited|EjectFromLand|(?:CSV|ParseString)2List|OverMyLand|SameGroup|UnSit|Ground(?:Slope|Normal|Contour)|GroundRepel|(?:Set|Remove)VehicleFlags|(?:AvatarOn)?(?:Link)?SitTarget|Script(?:Danger|Profiler)|Dialog|VolumeDetect|ResetOtherScript|RemoteLoadScriptPin|(?:Open|Close)RemoteDataChannel|SendRemoteData|RemoteDataReply|(?:Integer|String)ToBase64|XorBase64|Log(?:10)?|Base64To(?:String|Integer)|ParseStringKeepNulls|RezAtRoot|RequestSimulatorData|ForceMouselook|(?:Load|Release|(?:E|Une)scape)URL|ParcelMedia(?:CommandList|Query)|ModPow|MapDestination|(?:RemoveFrom|AddTo|Reset)Land(?:Pass|Ban)List|(?:Set|Clear)CameraParams|HTTP(?:Request|Response)|TextBox|DetectedTouch(?:UV|Face|Pos|(?:N|Bin)ormal|ST)|(?:MD5|SHA1|DumpList2)String|Request(?:Secure)?URL|Clear(?:Prim|Link)Media|(?:Link)?ParticleSystem|(?:Get|Request)(?:Username|DisplayName)|RegionSayTo|CastRay|GenerateKey|TransferLindenDollars|ManageEstateAccess|(?:Create|Delete)Character|ExecCharacterCmd|Evade|FleeFrom|NavigateTo|PatrolPoints|Pursue|UpdateCharacter|WanderWithin))\b' 
    652    lsl_constants_float = r'\b(?:DEG_TO_RAD|PI(?:_BY_TWO)?|RAD_TO_DEG|SQRT2|TWO_PI)\b' 
    653    lsl_constants_integer = r'\b(?:JSON_APPEND|STATUS_(?:PHYSICS|ROTATE_[XYZ]|PHANTOM|SANDBOX|BLOCK_GRAB(?:_OBJECT)?|(?:DIE|RETURN)_AT_EDGE|CAST_SHADOWS|OK|MALFORMED_PARAMS|TYPE_MISMATCH|BOUNDS_ERROR|NOT_(?:FOUND|SUPPORTED)|INTERNAL_ERROR|WHITELIST_FAILED)|AGENT(?:_(?:BY_(?:LEGACY_|USER)NAME|FLYING|ATTACHMENTS|SCRIPTED|MOUSELOOK|SITTING|ON_OBJECT|AWAY|WALKING|IN_AIR|TYPING|CROUCHING|BUSY|ALWAYS_RUN|AUTOPILOT|LIST_(?:PARCEL(?:_OWNER)?|REGION)))?|CAMERA_(?:PITCH|DISTANCE|BEHINDNESS_(?:ANGLE|LAG)|(?:FOCUS|POSITION)(?:_(?:THRESHOLD|LOCKED|LAG))?|FOCUS_OFFSET|ACTIVE)|ANIM_ON|LOOP|REVERSE|PING_PONG|SMOOTH|ROTATE|SCALE|ALL_SIDES|LINK_(?:ROOT|SET|ALL_(?:OTHERS|CHILDREN)|THIS)|ACTIVE|PASSIVE|SCRIPTED|CONTROL_(?:FWD|BACK|(?:ROT_)?(?:LEFT|RIGHT)|UP|DOWN|(?:ML_)?LBUTTON)|PERMISSION_(?:RETURN_OBJECTS|DEBIT|OVERRIDE_ANIMATIONS|SILENT_ESTATE_MANAGEMENT|TAKE_CONTROLS|TRIGGER_ANIMATION|ATTACH|CHANGE_LINKS|(?:CONTROL|TRACK)_CAMERA|TELEPORT)|INVENTORY_(?:TEXTURE|SOUND|OBJECT|SCRIPT|LANDMARK|CLOTHING|NOTECARD|BODYPART|ANIMATION|GESTURE|ALL|NONE)|CHANGED_(?:INVENTORY|COLOR|SHAPE|SCALE|TEXTURE|LINK|ALLOWED_DROP|OWNER|REGION(?:_START)?|TELEPORT|MEDIA)|OBJECT_(?:(?:PHYSICS|SERVER|STREAMING)_COST|UNKNOWN_DETAIL|CHARACTER_TIME|PHANTOM|PHYSICS|TEMP_ON_REZ|NAME|DESC|POS|PRIM_EQUIVALENCE|RETURN_(?:PARCEL(?:_OWNER)?|REGION)|ROO?T|VELOCITY|OWNER|GROUP|CREATOR|ATTACHED_POINT|RENDER_WEIGHT|PATHFINDING_TYPE|(?:RUNNING|TOTAL)_SCRIPT_COUNT|SCRIPT_(?:MEMORY|TIME))|TYPE_(?:INTEGER|FLOAT|STRING|KEY|VECTOR|ROTATION|INVALID)|(?:DEBUG|PUBLIC)_CHANNEL|ATTACH_(?:AVATAR_CENTER|CHEST|HEAD|BACK|PELVIS|MOUTH|CHIN|NECK|NOSE|BELLY|[LR](?:SHOULDER|HAND|FOOT|EAR|EYE|[UL](?:ARM|LEG)|HIP)|(?:LEFT|RIGHT)_PEC|HUD_(?:CENTER_[12]|TOP_(?:RIGHT|CENTER|LEFT)|BOTTOM(?:_(?:RIGHT|LEFT))?))|LAND_(?:LEVEL|RAISE|LOWER|SMOOTH|NOISE|REVERT)|DATA_(?:ONLINE|NAME|BORN|SIM_(?:POS|STATUS|RATING)|PAYINFO)|PAYMENT_INFO_(?:ON_FILE|USED)|REMOTE_DATA_(?:CHANNEL|REQUEST|REPLY)|PSYS_(?:PART_(?:BF_(?:ZERO|ONE(?:_MINUS_(?:DEST_COLOR|SOURCE_(ALPHA|COLOR)))?|DEST_COLOR|SOURCE_(ALPHA|COLOR))|BLEND_FUNC_(DEST|SOURCE)|FLAGS|(?:START|END)_(?:COLOR|ALPHA|SCALE|GLOW)|MAX_AGE|(?:RIBBON|WIND|INTERP_(?:COLOR|SCALE)|BOUNCE|FOLLOW_(?:SRC|VELOCITY)|TARGET_(?:POS|LINEAR)|EMISSIVE)_MASK)|SRC_(?:MAX_AGE|PATTERN|ANGLE_(?:BEGIN|END)|BURST_(?:RATE|PART_COUNT|RADIUS|SPEED_(?:MIN|MAX))|ACCEL|TEXTURE|TARGET_KEY|OMEGA|PATTERN_(?:DROP|EXPLODE|ANGLE(?:_CONE(?:_EMPTY)?)?)))|VEHICLE_(?:REFERENCE_FRAME|TYPE_(?:NONE|SLED|CAR|BOAT|AIRPLANE|BALLOON)|(?:LINEAR|ANGULAR)_(?:FRICTION_TIMESCALE|MOTOR_DIRECTION)|LINEAR_MOTOR_OFFSET|HOVER_(?:HEIGHT|EFFICIENCY|TIMESCALE)|BUOYANCY|(?:LINEAR|ANGULAR)_(?:DEFLECTION_(?:EFFICIENCY|TIMESCALE)|MOTOR_(?:DECAY_)?TIMESCALE)|VERTICAL_ATTRACTION_(?:EFFICIENCY|TIMESCALE)|BANKING_(?:EFFICIENCY|MIX|TIMESCALE)|FLAG_(?:NO_DEFLECTION_UP|LIMIT_(?:ROLL_ONLY|MOTOR_UP)|HOVER_(?:(?:WATER|TERRAIN|UP)_ONLY|GLOBAL_HEIGHT)|MOUSELOOK_(?:STEER|BANK)|CAMERA_DECOUPLED))|PRIM_(?:TYPE(?:_(?:BOX|CYLINDER|PRISM|SPHERE|TORUS|TUBE|RING|SCULPT))?|HOLE_(?:DEFAULT|CIRCLE|SQUARE|TRIANGLE)|MATERIAL(?:_(?:STONE|METAL|GLASS|WOOD|FLESH|PLASTIC|RUBBER))?|SHINY_(?:NONE|LOW|MEDIUM|HIGH)|BUMP_(?:NONE|BRIGHT|DARK|WOOD|BARK|BRICKS|CHECKER|CONCRETE|TILE|STONE|DISKS|GRAVEL|BLOBS|SIDING|LARGETILE|STUCCO|SUCTION|WEAVE)|TEXGEN_(?:DEFAULT|PLANAR)|SCULPT_(?:TYPE_(?:SPHERE|TORUS|PLANE|CYLINDER|MASK)|FLAG_(?:MIRROR|INVERT))|PHYSICS(?:_(?:SHAPE_(?:CONVEX|NONE|PRIM|TYPE)))?|(?:POS|ROT)_LOCAL|SLICE|TEXT|FLEXIBLE|POINT_LIGHT|TEMP_ON_REZ|PHANTOM|POSITION|SIZE|ROTATION|TEXTURE|NAME|OMEGA|DESC|LINK_TARGET|COLOR|BUMP_SHINY|FULLBRIGHT|TEXGEN|GLOW|MEDIA_(?:ALT_IMAGE_ENABLE|CONTROLS|(?:CURRENT|HOME)_URL|AUTO_(?:LOOP|PLAY|SCALE|ZOOM)|FIRST_CLICK_INTERACT|(?:WIDTH|HEIGHT)_PIXELS|WHITELIST(?:_ENABLE)?|PERMS_(?:INTERACT|CONTROL)|PARAM_MAX|CONTROLS_(?:STANDARD|MINI)|PERM_(?:NONE|OWNER|GROUP|ANYONE)|MAX_(?:URL_LENGTH|WHITELIST_(?:SIZE|COUNT)|(?:WIDTH|HEIGHT)_PIXELS)))|MASK_(?:BASE|OWNER|GROUP|EVERYONE|NEXT)|PERM_(?:TRANSFER|MODIFY|COPY|MOVE|ALL)|PARCEL_(?:MEDIA_COMMAND_(?:STOP|PAUSE|PLAY|LOOP|TEXTURE|URL|TIME|AGENT|UNLOAD|AUTO_ALIGN|TYPE|SIZE|DESC|LOOP_SET)|FLAG_(?:ALLOW_(?:FLY|(?:GROUP_)?SCRIPTS|LANDMARK|TERRAFORM|DAMAGE|CREATE_(?:GROUP_)?OBJECTS)|USE_(?:ACCESS_(?:GROUP|LIST)|BAN_LIST|LAND_PASS_LIST)|LOCAL_SOUND_ONLY|RESTRICT_PUSHOBJECT|ALLOW_(?:GROUP|ALL)_OBJECT_ENTRY)|COUNT_(?:TOTAL|OWNER|GROUP|OTHER|SELECTED|TEMP)|DETAILS_(?:NAME|DESC|OWNER|GROUP|AREA|ID|SEE_AVATARS))|LIST_STAT_(?:MAX|MIN|MEAN|MEDIAN|STD_DEV|SUM(?:_SQUARES)?|NUM_COUNT|GEOMETRIC_MEAN|RANGE)|PAY_(?:HIDE|DEFAULT)|REGION_FLAG_(?:ALLOW_DAMAGE|FIXED_SUN|BLOCK_TERRAFORM|SANDBOX|DISABLE_(?:COLLISIONS|PHYSICS)|BLOCK_FLY|ALLOW_DIRECT_TELEPORT|RESTRICT_PUSHOBJECT)|HTTP_(?:METHOD|MIMETYPE|BODY_(?:MAXLENGTH|TRUNCATED)|CUSTOM_HEADER|PRAGMA_NO_CACHE|VERBOSE_THROTTLE|VERIFY_CERT)|STRING_(?:TRIM(?:_(?:HEAD|TAIL))?)|CLICK_ACTION_(?:NONE|TOUCH|SIT|BUY|PAY|OPEN(?:_MEDIA)?|PLAY|ZOOM)|TOUCH_INVALID_FACE|PROFILE_(?:NONE|SCRIPT_MEMORY)|RC_(?:DATA_FLAGS|DETECT_PHANTOM|GET_(?:LINK_NUM|NORMAL|ROOT_KEY)|MAX_HITS|REJECT_(?:TYPES|AGENTS|(?:NON)?PHYSICAL|LAND))|RCERR_(?:CAST_TIME_EXCEEDED|SIM_PERF_LOW|UNKNOWN)|ESTATE_ACCESS_(?:ALLOWED_(?:AGENT|GROUP)_(?:ADD|REMOVE)|BANNED_AGENT_(?:ADD|REMOVE))|DENSITY|FRICTION|RESTITUTION|GRAVITY_MULTIPLIER|KFM_(?:COMMAND|CMD_(?:PLAY|STOP|PAUSE|SET_MODE)|MODE|FORWARD|LOOP|PING_PONG|REVERSE|DATA|ROTATION|TRANSLATION)|ERR_(?:GENERIC|PARCEL_PERMISSIONS|MALFORMED_PARAMS|RUNTIME_PERMISSIONS|THROTTLED)|CHARACTER_(?:CMD_(?:(?:SMOOTH_)?STOP|JUMP)|DESIRED_(?:TURN_)?SPEED|RADIUS|STAY_WITHIN_PARCEL|LENGTH|ORIENTATION|ACCOUNT_FOR_SKIPPED_FRAMES|AVOIDANCE_MODE|TYPE(?:_(?:[A-D]|NONE))?|MAX_(?:DECEL|TURN_RADIUS|(?:ACCEL|SPEED)))|PURSUIT_(?:OFFSET|FUZZ_FACTOR|GOAL_TOLERANCE|INTERCEPT)|REQUIRE_LINE_OF_SIGHT|FORCE_DIRECT_PATH|VERTICAL|HORIZONTAL|AVOID_(?:CHARACTERS|DYNAMIC_OBSTACLES|NONE)|PU_(?:EVADE_(?:HIDDEN|SPOTTED)|FAILURE_(?:DYNAMIC_PATHFINDING_DISABLED|INVALID_(?:GOAL|START)|NO_(?:NAVMESH|VALID_DESTINATION)|OTHER|TARGET_GONE|(?:PARCEL_)?UNREACHABLE)|(?:GOAL|SLOWDOWN_DISTANCE)_REACHED)|TRAVERSAL_TYPE(?:_(?:FAST|NONE|SLOW))?|CONTENT_TYPE_(?:ATOM|FORM|HTML|JSON|LLSD|RSS|TEXT|XHTML|XML)|GCNP_(?:RADIUS|STATIC)|(?:PATROL|WANDER)_PAUSE_AT_WAYPOINTS|OPT_(?:AVATAR|CHARACTER|EXCLUSION_VOLUME|LEGACY_LINKSET|MATERIAL_VOLUME|OTHER|STATIC_OBSTACLE|WALKABLE)|SIM_STAT_PCT_CHARS_STEPPED)\b' 
    654    lsl_constants_integer_boolean = r'\b(?:FALSE|TRUE)\b' 
    655    lsl_constants_rotation = r'\b(?:ZERO_ROTATION)\b' 
    656    lsl_constants_string = r'\b(?:EOF|JSON_(?:ARRAY|DELETE|FALSE|INVALID|NULL|NUMBER|OBJECT|STRING|TRUE)|NULL_KEY|TEXTURE_(?:BLANK|DEFAULT|MEDIA|PLYWOOD|TRANSPARENT)|URL_REQUEST_(?:GRANTED|DENIED))\b' 
    657    lsl_constants_vector = r'\b(?:TOUCH_INVALID_(?:TEXCOORD|VECTOR)|ZERO_VECTOR)\b' 
    658    lsl_invalid_broken = r'\b(?:LAND_(?:LARGE|MEDIUM|SMALL)_BRUSH)\b' 
    659    lsl_invalid_deprecated = r'\b(?:ATTACH_[LR]PEC|DATA_RATING|OBJECT_ATTACHMENT_(?:GEOMETRY_BYTES|SURFACE_AREA)|PRIM_(?:CAST_SHADOWS|MATERIAL_LIGHT|TYPE_LEGACY)|PSYS_SRC_(?:INNER|OUTER)ANGLE|VEHICLE_FLAG_NO_FLY_UP|ll(?:Cloud|Make(?:Explosion|Fountain|Smoke|Fire)|RemoteDataSetRegion|Sound(?:Preload)?|XorBase64Strings(?:Correct)?))\b' 
    660    lsl_invalid_illegal = r'\b(?:event)\b' 
    661    lsl_invalid_unimplemented = r'\b(?:CHARACTER_(?:MAX_ANGULAR_(?:ACCEL|SPEED)|TURN_SPEED_MULTIPLIER)|PERMISSION_(?:CHANGE_(?:JOINTS|PERMISSIONS)|RELEASE_OWNERSHIP|REMAP_CONTROLS)|PRIM_PHYSICS_MATERIAL|PSYS_SRC_OBJ_REL_MASK|ll(?:CollisionSprite|(?:Stop)?PointAt|(?:(?:Refresh|Set)Prim)URL|(?:Take|Release)Camera|RemoteLoadScript))\b' 
    662    lsl_reserved_godmode = r'\b(?:ll(?:GodLikeRezObject|Set(?:Inventory|Object)PermMask))\b' 
    663    lsl_reserved_log = r'\b(?:print)\b' 
    664    lsl_operators = r'\+\+|\-\-|<<|>>|&&?|\|\|?|\^|~|[!%<>=*+\-/]=?' 
    665 
    666    tokens = { 
    667        'root': 
    668        [ 
    669            (r'//.*?\n',                          Comment.Single), 
    670            (r'/\*',                              Comment.Multiline, 'comment'), 
    671            (r'"',                                String.Double, 'string'), 
    672            (lsl_keywords,                        Keyword), 
    673            (lsl_types,                           Keyword.Type), 
    674            (lsl_states,                          Name.Class), 
    675            (lsl_events,                          Name.Builtin), 
    676            (lsl_functions_builtin,               Name.Function), 
    677            (lsl_constants_float,                 Keyword.Constant), 
    678            (lsl_constants_integer,               Keyword.Constant), 
    679            (lsl_constants_integer_boolean,       Keyword.Constant), 
    680            (lsl_constants_rotation,              Keyword.Constant), 
    681            (lsl_constants_string,                Keyword.Constant), 
    682            (lsl_constants_vector,                Keyword.Constant), 
    683            (lsl_invalid_broken,                  Error), 
    684            (lsl_invalid_deprecated,              Error), 
    685            (lsl_invalid_illegal,                 Error), 
    686            (lsl_invalid_unimplemented,           Error), 
    687            (lsl_reserved_godmode,                Keyword.Reserved), 
    688            (lsl_reserved_log,                    Keyword.Reserved), 
    689            (r'\b([a-zA-Z_]\w*)\b',     Name.Variable), 
    690            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d*', Number.Float), 
    691            (r'(\d+\.\d*|\.\d+)',                 Number.Float), 
    692            (r'0[xX][0-9a-fA-F]+',                Number.Hex), 
    693            (r'\d+',                              Number.Integer), 
    694            (lsl_operators,                       Operator), 
    695            (r':=?',                              Error), 
    696            (r'[,;{}()\[\]]',                     Punctuation), 
    697            (r'\n+',                              Whitespace), 
    698            (r'\s+',                              Whitespace) 
    699        ], 
    700        'comment': 
    701        [ 
    702            (r'[^*/]+',                           Comment.Multiline), 
    703            (r'/\*',                              Comment.Multiline, '#push'), 
    704            (r'\*/',                              Comment.Multiline, '#pop'), 
    705            (r'[*/]',                             Comment.Multiline) 
    706        ], 
    707        'string': 
    708        [ 
    709            (r'\\([nt"\\])',                      String.Escape), 
    710            (r'"',                                String.Double, '#pop'), 
    711            (r'\\.',                              Error), 
    712            (r'[^"\\]+',                          String.Double), 
    713        ] 
    714    } 
    715 
    716 
    717class AppleScriptLexer(RegexLexer): 
    718    """ 
    719    For AppleScript source code, 
    720    including `AppleScript Studio 
    721    <http://developer.apple.com/documentation/AppleScript/ 
    722    Reference/StudioReference>`_. 
    723    Contributed by Andreas Amann <aamann@mac.com>. 
    724    """ 
    725 
    726    name = 'AppleScript' 
    727    url = 'https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html' 
    728    aliases = ['applescript'] 
    729    filenames = ['*.applescript'] 
    730    version_added = '1.0' 
    731 
    732    flags = re.MULTILINE | re.DOTALL 
    733 
    734    Identifiers = r'[a-zA-Z]\w*' 
    735 
    736    # XXX: use words() for all of these 
    737    Literals = ('AppleScript', 'current application', 'false', 'linefeed', 
    738                'missing value', 'pi', 'quote', 'result', 'return', 'space', 
    739                'tab', 'text item delimiters', 'true', 'version') 
    740    Classes = ('alias ', 'application ', 'boolean ', 'class ', 'constant ', 
    741               'date ', 'file ', 'integer ', 'list ', 'number ', 'POSIX file ', 
    742               'real ', 'record ', 'reference ', 'RGB color ', 'script ', 
    743               'text ', 'unit types', '(?:Unicode )?text', 'string') 
    744    BuiltIn = ('attachment', 'attribute run', 'character', 'day', 'month', 
    745               'paragraph', 'word', 'year') 
    746    HandlerParams = ('about', 'above', 'against', 'apart from', 'around', 
    747                     'aside from', 'at', 'below', 'beneath', 'beside', 
    748                     'between', 'for', 'given', 'instead of', 'on', 'onto', 
    749                     'out of', 'over', 'since') 
    750    Commands = ('ASCII (character|number)', 'activate', 'beep', 'choose URL', 
    751                'choose application', 'choose color', 'choose file( name)?', 
    752                'choose folder', 'choose from list', 
    753                'choose remote application', 'clipboard info', 
    754                'close( access)?', 'copy', 'count', 'current date', 'delay', 
    755                'delete', 'display (alert|dialog)', 'do shell script', 
    756                'duplicate', 'exists', 'get eof', 'get volume settings', 
    757                'info for', 'launch', 'list (disks|folder)', 'load script', 
    758                'log', 'make', 'mount volume', 'new', 'offset', 
    759                'open( (for access|location))?', 'path to', 'print', 'quit', 
    760                'random number', 'read', 'round', 'run( script)?', 
    761                'say', 'scripting components', 
    762                'set (eof|the clipboard to|volume)', 'store script', 
    763                'summarize', 'system attribute', 'system info', 
    764                'the clipboard', 'time to GMT', 'write', 'quoted form') 
    765    References = ('(in )?back of', '(in )?front of', '[0-9]+(st|nd|rd|th)', 
    766                  'first', 'second', 'third', 'fourth', 'fifth', 'sixth', 
    767                  'seventh', 'eighth', 'ninth', 'tenth', 'after', 'back', 
    768                  'before', 'behind', 'every', 'front', 'index', 'last', 
    769                  'middle', 'some', 'that', 'through', 'thru', 'where', 'whose') 
    770    Operators = ("and", "or", "is equal", "equals", "(is )?equal to", "is not", 
    771                 "isn't", "isn't equal( to)?", "is not equal( to)?", 
    772                 "doesn't equal", "does not equal", "(is )?greater than", 
    773                 "comes after", "is not less than or equal( to)?", 
    774                 "isn't less than or equal( to)?", "(is )?less than", 
    775                 "comes before", "is not greater than or equal( to)?", 
    776                 "isn't greater than or equal( to)?", 
    777                 "(is  )?greater than or equal( to)?", "is not less than", 
    778                 "isn't less than", "does not come before", 
    779                 "doesn't come before", "(is )?less than or equal( to)?", 
    780                 "is not greater than", "isn't greater than", 
    781                 "does not come after", "doesn't come after", "starts? with", 
    782                 "begins? with", "ends? with", "contains?", "does not contain", 
    783                 "doesn't contain", "is in", "is contained by", "is not in", 
    784                 "is not contained by", "isn't contained by", "div", "mod", 
    785                 "not", "(a  )?(ref( to)?|reference to)", "is", "does") 
    786    Control = ('considering', 'else', 'error', 'exit', 'from', 'if', 
    787               'ignoring', 'in', 'repeat', 'tell', 'then', 'times', 'to', 
    788               'try', 'until', 'using terms from', 'while', 'whith', 
    789               'with timeout( of)?', 'with transaction', 'by', 'continue', 
    790               'end', 'its?', 'me', 'my', 'return', 'of', 'as') 
    791    Declarations = ('global', 'local', 'prop(erty)?', 'set', 'get') 
    792    Reserved = ('but', 'put', 'returning', 'the') 
    793    StudioClasses = ('action cell', 'alert reply', 'application', 'box', 
    794                     'browser( cell)?', 'bundle', 'button( cell)?', 'cell', 
    795                     'clip view', 'color well', 'color-panel', 
    796                     'combo box( item)?', 'control', 
    797                     'data( (cell|column|item|row|source))?', 'default entry', 
    798                     'dialog reply', 'document', 'drag info', 'drawer', 
    799                     'event', 'font(-panel)?', 'formatter', 
    800                     'image( (cell|view))?', 'matrix', 'menu( item)?', 'item', 
    801                     'movie( view)?', 'open-panel', 'outline view', 'panel', 
    802                     'pasteboard', 'plugin', 'popup button', 
    803                     'progress indicator', 'responder', 'save-panel', 
    804                     'scroll view', 'secure text field( cell)?', 'slider', 
    805                     'sound', 'split view', 'stepper', 'tab view( item)?', 
    806                     'table( (column|header cell|header view|view))', 
    807                     'text( (field( cell)?|view))?', 'toolbar( item)?', 
    808                     'user-defaults', 'view', 'window') 
    809    StudioEvents = ('accept outline drop', 'accept table drop', 'action', 
    810                    'activated', 'alert ended', 'awake from nib', 'became key', 
    811                    'became main', 'begin editing', 'bounds changed', 
    812                    'cell value', 'cell value changed', 'change cell value', 
    813                    'change item value', 'changed', 'child of item', 
    814                    'choose menu item', 'clicked', 'clicked toolbar item', 
    815                    'closed', 'column clicked', 'column moved', 
    816                    'column resized', 'conclude drop', 'data representation', 
    817                    'deminiaturized', 'dialog ended', 'document nib name', 
    818                    'double clicked', 'drag( (entered|exited|updated))?', 
    819                    'drop', 'end editing', 'exposed', 'idle', 'item expandable', 
    820                    'item value', 'item value changed', 'items changed', 
    821                    'keyboard down', 'keyboard up', 'launched', 
    822                    'load data representation', 'miniaturized', 'mouse down', 
    823                    'mouse dragged', 'mouse entered', 'mouse exited', 
    824                    'mouse moved', 'mouse up', 'moved', 
    825                    'number of browser rows', 'number of items', 
    826                    'number of rows', 'open untitled', 'opened', 'panel ended', 
    827                    'parameters updated', 'plugin loaded', 'prepare drop', 
    828                    'prepare outline drag', 'prepare outline drop', 
    829                    'prepare table drag', 'prepare table drop', 
    830                    'read from file', 'resigned active', 'resigned key', 
    831                    'resigned main', 'resized( sub views)?', 
    832                    'right mouse down', 'right mouse dragged', 
    833                    'right mouse up', 'rows changed', 'scroll wheel', 
    834                    'selected tab view item', 'selection changed', 
    835                    'selection changing', 'should begin editing', 
    836                    'should close', 'should collapse item', 
    837                    'should end editing', 'should expand item', 
    838                    'should open( untitled)?', 
    839                    'should quit( after last window closed)?', 
    840                    'should select column', 'should select item', 
    841                    'should select row', 'should select tab view item', 
    842                    'should selection change', 'should zoom', 'shown', 
    843                    'update menu item', 'update parameters', 
    844                    'update toolbar item', 'was hidden', 'was miniaturized', 
    845                    'will become active', 'will close', 'will dismiss', 
    846                    'will display browser cell', 'will display cell', 
    847                    'will display item cell', 'will display outline cell', 
    848                    'will finish launching', 'will hide', 'will miniaturize', 
    849                    'will move', 'will open', 'will pop up', 'will quit', 
    850                    'will resign active', 'will resize( sub views)?', 
    851                    'will select tab view item', 'will show', 'will zoom', 
    852                    'write to file', 'zoomed') 
    853    StudioCommands = ('animate', 'append', 'call method', 'center', 
    854                      'close drawer', 'close panel', 'display', 
    855                      'display alert', 'display dialog', 'display panel', 'go', 
    856                      'hide', 'highlight', 'increment', 'item for', 
    857                      'load image', 'load movie', 'load nib', 'load panel', 
    858                      'load sound', 'localized string', 'lock focus', 'log', 
    859                      'open drawer', 'path for', 'pause', 'perform action', 
    860                      'play', 'register', 'resume', 'scroll', 'select( all)?', 
    861                      'show', 'size to fit', 'start', 'step back', 
    862                      'step forward', 'stop', 'synchronize', 'unlock focus', 
    863                      'update') 
    864    StudioProperties = ('accepts arrow key', 'action method', 'active', 
    865                        'alignment', 'allowed identifiers', 
    866                        'allows branch selection', 'allows column reordering', 
    867                        'allows column resizing', 'allows column selection', 
    868                        'allows customization', 
    869                        'allows editing text attributes', 
    870                        'allows empty selection', 'allows mixed state', 
    871                        'allows multiple selection', 'allows reordering', 
    872                        'allows undo', 'alpha( value)?', 'alternate image', 
    873                        'alternate increment value', 'alternate title', 
    874                        'animation delay', 'associated file name', 
    875                        'associated object', 'auto completes', 'auto display', 
    876                        'auto enables items', 'auto repeat', 
    877                        'auto resizes( outline column)?', 
    878                        'auto save expanded items', 'auto save name', 
    879                        'auto save table columns', 'auto saves configuration', 
    880                        'auto scroll', 'auto sizes all columns to fit', 
    881                        'auto sizes cells', 'background color', 'bezel state', 
    882                        'bezel style', 'bezeled', 'border rect', 'border type', 
    883                        'bordered', 'bounds( rotation)?', 'box type', 
    884                        'button returned', 'button type', 
    885                        'can choose directories', 'can choose files', 
    886                        'can draw', 'can hide', 
    887                        'cell( (background color|size|type))?', 'characters', 
    888                        'class', 'click count', 'clicked( data)? column', 
    889                        'clicked data item', 'clicked( data)? row', 
    890                        'closeable', 'collating', 'color( (mode|panel))', 
    891                        'command key down', 'configuration', 
    892                        'content(s| (size|view( margins)?))?', 'context', 
    893                        'continuous', 'control key down', 'control size', 
    894                        'control tint', 'control view', 
    895                        'controller visible', 'coordinate system', 
    896                        'copies( on scroll)?', 'corner view', 'current cell', 
    897                        'current column', 'current( field)?  editor', 
    898                        'current( menu)? item', 'current row', 
    899                        'current tab view item', 'data source', 
    900                        'default identifiers', 'delta (x|y|z)', 
    901                        'destination window', 'directory', 'display mode', 
    902                        'displayed cell', 'document( (edited|rect|view))?', 
    903                        'double value', 'dragged column', 'dragged distance', 
    904                        'dragged items', 'draws( cell)? background', 
    905                        'draws grid', 'dynamically scrolls', 'echos bullets', 
    906                        'edge', 'editable', 'edited( data)? column', 
    907                        'edited data item', 'edited( data)? row', 'enabled', 
    908                        'enclosing scroll view', 'ending page', 
    909                        'error handling', 'event number', 'event type', 
    910                        'excluded from windows menu', 'executable path', 
    911                        'expanded', 'fax number', 'field editor', 'file kind', 
    912                        'file name', 'file type', 'first responder', 
    913                        'first visible column', 'flipped', 'floating', 
    914                        'font( panel)?', 'formatter', 'frameworks path', 
    915                        'frontmost', 'gave up', 'grid color', 'has data items', 
    916                        'has horizontal ruler', 'has horizontal scroller', 
    917                        'has parent data item', 'has resize indicator', 
    918                        'has shadow', 'has sub menu', 'has vertical ruler', 
    919                        'has vertical scroller', 'header cell', 'header view', 
    920                        'hidden', 'hides when deactivated', 'highlights by', 
    921                        'horizontal line scroll', 'horizontal page scroll', 
    922                        'horizontal ruler view', 'horizontally resizable', 
    923                        'icon image', 'id', 'identifier', 
    924                        'ignores multiple clicks', 
    925                        'image( (alignment|dims when disabled|frame style|scaling))?', 
    926                        'imports graphics', 'increment value', 
    927                        'indentation per level', 'indeterminate', 'index', 
    928                        'integer value', 'intercell spacing', 'item height', 
    929                        'key( (code|equivalent( modifier)?|window))?', 
    930                        'knob thickness', 'label', 'last( visible)? column', 
    931                        'leading offset', 'leaf', 'level', 'line scroll', 
    932                        'loaded', 'localized sort', 'location', 'loop mode', 
    933                        'main( (bunde|menu|window))?', 'marker follows cell', 
    934                        'matrix mode', 'maximum( content)? size', 
    935                        'maximum visible columns', 
    936                        'menu( form representation)?', 'miniaturizable', 
    937                        'miniaturized', 'minimized image', 'minimized title', 
    938                        'minimum column width', 'minimum( content)? size', 
    939                        'modal', 'modified', 'mouse down state', 
    940                        'movie( (controller|file|rect))?', 'muted', 'name', 
    941                        'needs display', 'next state', 'next text', 
    942                        'number of tick marks', 'only tick mark values', 
    943                        'opaque', 'open panel', 'option key down', 
    944                        'outline table column', 'page scroll', 'pages across', 
    945                        'pages down', 'palette label', 'pane splitter', 
    946                        'parent data item', 'parent window', 'pasteboard', 
    947                        'path( (names|separator))?', 'playing', 
    948                        'plays every frame', 'plays selection only', 'position', 
    949                        'preferred edge', 'preferred type', 'pressure', 
    950                        'previous text', 'prompt', 'properties', 
    951                        'prototype cell', 'pulls down', 'rate', 
    952                        'released when closed', 'repeated', 
    953                        'requested print time', 'required file type', 
    954                        'resizable', 'resized column', 'resource path', 
    955                        'returns records', 'reuses columns', 'rich text', 
    956                        'roll over', 'row height', 'rulers visible', 
    957                        'save panel', 'scripts path', 'scrollable', 
    958                        'selectable( identifiers)?', 'selected cell', 
    959                        'selected( data)? columns?', 'selected data items?', 
    960                        'selected( data)? rows?', 'selected item identifier', 
    961                        'selection by rect', 'send action on arrow key', 
    962                        'sends action when done editing', 'separates columns', 
    963                        'separator item', 'sequence number', 'services menu', 
    964                        'shared frameworks path', 'shared support path', 
    965                        'sheet', 'shift key down', 'shows alpha', 
    966                        'shows state by', 'size( mode)?', 
    967                        'smart insert delete enabled', 'sort case sensitivity', 
    968                        'sort column', 'sort order', 'sort type', 
    969                        'sorted( data rows)?', 'sound', 'source( mask)?', 
    970                        'spell checking enabled', 'starting page', 'state', 
    971                        'string value', 'sub menu', 'super menu', 'super view', 
    972                        'tab key traverses cells', 'tab state', 'tab type', 
    973                        'tab view', 'table view', 'tag', 'target( printer)?', 
    974                        'text color', 'text container insert', 
    975                        'text container origin', 'text returned', 
    976                        'tick mark position', 'time stamp', 
    977                        'title(d| (cell|font|height|position|rect))?', 
    978                        'tool tip', 'toolbar', 'trailing offset', 'transparent', 
    979                        'treat packages as directories', 'truncated labels', 
    980                        'types', 'unmodified characters', 'update views', 
    981                        'use sort indicator', 'user defaults', 
    982                        'uses data source', 'uses ruler', 
    983                        'uses threaded animation', 
    984                        'uses title from previous column', 'value wraps', 
    985                        'version', 
    986                        'vertical( (line scroll|page scroll|ruler view))?', 
    987                        'vertically resizable', 'view', 
    988                        'visible( document rect)?', 'volume', 'width', 'window', 
    989                        'windows menu', 'wraps', 'zoomable', 'zoomed') 
    990 
    991    tokens = { 
    992        'root': [ 
    993            (r'\s+', Text), 
    994            (r'¬\n', String.Escape), 
    995            (r"'s\s+", Text),  # This is a possessive, consider moving 
    996            (r'(--|#).*?$', Comment), 
    997            (r'\(\*', Comment.Multiline, 'comment'), 
    998            (r'[(){}!,.:]', Punctuation), 
    999            (r'(«)([^»]+)(»)', 
    1000             bygroups(Text, Name.Builtin, Text)), 
    1001            (r'\b((?:considering|ignoring)\s*)' 
    1002             r'(application responses|case|diacriticals|hyphens|' 
    1003             r'numeric strings|punctuation|white space)', 
    1004             bygroups(Keyword, Name.Builtin)), 
    1005            (r'(-|\*|\+|&|≠|>=?|<=?|=|≥|≤|/|÷|\^)', Operator), 
    1006            (r"\b({})\b".format('|'.join(Operators)), Operator.Word), 
    1007            (r'^(\s*(?:on|end)\s+)' 
    1008             r'({})'.format('|'.join(StudioEvents[::-1])), 
    1009             bygroups(Keyword, Name.Function)), 
    1010            (r'^(\s*)(in|on|script|to)(\s+)', bygroups(Text, Keyword, Text)), 
    1011            (r'\b(as )({})\b'.format('|'.join(Classes)), 
    1012             bygroups(Keyword, Name.Class)), 
    1013            (r'\b({})\b'.format('|'.join(Literals)), Name.Constant), 
    1014            (r'\b({})\b'.format('|'.join(Commands)), Name.Builtin), 
    1015            (r'\b({})\b'.format('|'.join(Control)), Keyword), 
    1016            (r'\b({})\b'.format('|'.join(Declarations)), Keyword), 
    1017            (r'\b({})\b'.format('|'.join(Reserved)), Name.Builtin), 
    1018            (r'\b({})s?\b'.format('|'.join(BuiltIn)), Name.Builtin), 
    1019            (r'\b({})\b'.format('|'.join(HandlerParams)), Name.Builtin), 
    1020            (r'\b({})\b'.format('|'.join(StudioProperties)), Name.Attribute), 
    1021            (r'\b({})s?\b'.format('|'.join(StudioClasses)), Name.Builtin), 
    1022            (r'\b({})\b'.format('|'.join(StudioCommands)), Name.Builtin), 
    1023            (r'\b({})\b'.format('|'.join(References)), Name.Builtin), 
    1024            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double), 
    1025            (rf'\b({Identifiers})\b', Name.Variable), 
    1026            (r'[-+]?(\d+\.\d*|\d*\.\d+)(E[-+][0-9]+)?', Number.Float), 
    1027            (r'[-+]?\d+', Number.Integer), 
    1028        ], 
    1029        'comment': [ 
    1030            (r'\(\*', Comment.Multiline, '#push'), 
    1031            (r'\*\)', Comment.Multiline, '#pop'), 
    1032            ('[^*(]+', Comment.Multiline), 
    1033            ('[*(]', Comment.Multiline), 
    1034        ], 
    1035    } 
    1036 
    1037 
    1038class RexxLexer(RegexLexer): 
    1039    """ 
    1040    Rexx is a scripting language available for 
    1041    a wide range of different platforms with its roots found on mainframe 
    1042    systems. It is popular for I/O- and data based tasks and can act as glue 
    1043    language to bind different applications together. 
    1044    """ 
    1045    name = 'Rexx' 
    1046    url = 'http://www.rexxinfo.org/' 
    1047    aliases = ['rexx', 'arexx'] 
    1048    filenames = ['*.rexx', '*.rex', '*.rx', '*.arexx'] 
    1049    mimetypes = ['text/x-rexx'] 
    1050    version_added = '2.0' 
    1051    flags = re.IGNORECASE 
    1052 
    1053    tokens = { 
    1054        'root': [ 
    1055            (r'\s+', Whitespace), 
    1056            (r'/\*', Comment.Multiline, 'comment'), 
    1057            (r'"', String, 'string_double'), 
    1058            (r"'", String, 'string_single'), 
    1059            (r'[0-9]+(\.[0-9]+)?(e[+-]?[0-9])?', Number), 
    1060            (r'([a-z_]\w*)(\s*)(:)(\s*)(procedure)\b', 
    1061             bygroups(Name.Function, Whitespace, Operator, Whitespace, 
    1062                      Keyword.Declaration)), 
    1063            (r'([a-z_]\w*)(\s*)(:)', 
    1064             bygroups(Name.Label, Whitespace, Operator)), 
    1065            include('function'), 
    1066            include('keyword'), 
    1067            include('operator'), 
    1068            (r'[a-z_]\w*', Text), 
    1069        ], 
    1070        'function': [ 
    1071            (words(( 
    1072                'abbrev', 'abs', 'address', 'arg', 'b2x', 'bitand', 'bitor', 'bitxor', 
    1073                'c2d', 'c2x', 'center', 'charin', 'charout', 'chars', 'compare', 
    1074                'condition', 'copies', 'd2c', 'd2x', 'datatype', 'date', 'delstr', 
    1075                'delword', 'digits', 'errortext', 'form', 'format', 'fuzz', 'insert', 
    1076                'lastpos', 'left', 'length', 'linein', 'lineout', 'lines', 'max', 
    1077                'min', 'overlay', 'pos', 'queued', 'random', 'reverse', 'right', 'sign', 
    1078                'sourceline', 'space', 'stream', 'strip', 'substr', 'subword', 'symbol', 
    1079                'time', 'trace', 'translate', 'trunc', 'value', 'verify', 'word', 
    1080                'wordindex', 'wordlength', 'wordpos', 'words', 'x2b', 'x2c', 'x2d', 
    1081                'xrange'), suffix=r'(\s*)(\()'), 
    1082             bygroups(Name.Builtin, Whitespace, Operator)), 
    1083        ], 
    1084        'keyword': [ 
    1085            (r'(address|arg|by|call|do|drop|else|end|exit|for|forever|if|' 
    1086             r'interpret|iterate|leave|nop|numeric|off|on|options|parse|' 
    1087             r'pull|push|queue|return|say|select|signal|to|then|trace|until|' 
    1088             r'while)\b', Keyword.Reserved), 
    1089        ], 
    1090        'operator': [ 
    1091            (r'(-|//|/|\(|\)|\*\*|\*|\\<<|\\<|\\==|\\=|\\>>|\\>|\\|\|\||\||' 
    1092             r'&&|&|%|\+|<<=|<<|<=|<>|<|==|=|><|>=|>>=|>>|>|¬<<|¬<|¬==|¬=|' 
    1093             r'¬>>|¬>|¬|\.|,)', Operator), 
    1094        ], 
    1095        'string_double': [ 
    1096            (r'[^"\n]+', String), 
    1097            (r'""', String), 
    1098            (r'"', String, '#pop'), 
    1099            (r'\n', Text, '#pop'),  # Stray linefeed also terminates strings. 
    1100        ], 
    1101        'string_single': [ 
    1102            (r'[^\'\n]+', String), 
    1103            (r'\'\'', String), 
    1104            (r'\'', String, '#pop'), 
    1105            (r'\n', Text, '#pop'),  # Stray linefeed also terminates strings. 
    1106        ], 
    1107        'comment': [ 
    1108            (r'[^*]+', Comment.Multiline), 
    1109            (r'\*/', Comment.Multiline, '#pop'), 
    1110            (r'\*', Comment.Multiline), 
    1111        ] 
    1112    } 
    1113 
    1114    def _c(s): 
    1115        return re.compile(s, re.MULTILINE) 
    1116    _ADDRESS_COMMAND_PATTERN = _c(r'^\s*address\s+command\b') 
    1117    _ADDRESS_PATTERN = _c(r'^\s*address\s+') 
    1118    _DO_WHILE_PATTERN = _c(r'^\s*do\s+while\b') 
    1119    _IF_THEN_DO_PATTERN = _c(r'^\s*if\b.+\bthen\s+do\s*$') 
    1120    _PROCEDURE_PATTERN = _c(r'^\s*([a-z_]\w*)(\s*)(:)(\s*)(procedure)\b') 
    1121    _ELSE_DO_PATTERN = _c(r'\belse\s+do\s*$') 
    1122    _PARSE_ARG_PATTERN = _c(r'^\s*parse\s+(upper\s+)?(arg|value)\b') 
    1123    PATTERNS_AND_WEIGHTS = ( 
    1124        (_ADDRESS_COMMAND_PATTERN, 0.2), 
    1125        (_ADDRESS_PATTERN, 0.05), 
    1126        (_DO_WHILE_PATTERN, 0.1), 
    1127        (_ELSE_DO_PATTERN, 0.1), 
    1128        (_IF_THEN_DO_PATTERN, 0.1), 
    1129        (_PROCEDURE_PATTERN, 0.5), 
    1130        (_PARSE_ARG_PATTERN, 0.2), 
    1131    ) 
    1132 
    1133    def analyse_text(text): 
    1134        """ 
    1135        Check for initial comment and patterns that distinguish Rexx from other 
    1136        C-like languages. 
    1137        """ 
    1138        if re.search(r'/\*\**\s*rexx', text, re.IGNORECASE): 
    1139            # Header matches MVS Rexx requirements, this is certainly a Rexx 
    1140            # script. 
    1141            return 1.0 
    1142        elif text.startswith('/*'): 
    1143            # Header matches general Rexx requirements; the source code might 
    1144            # still be any language using C comments such as C++, C# or Java. 
    1145            lowerText = text.lower() 
    1146            result = sum(weight 
    1147                         for (pattern, weight) in RexxLexer.PATTERNS_AND_WEIGHTS 
    1148                         if pattern.search(lowerText)) + 0.01 
    1149            return min(result, 1.0) 
    1150 
    1151 
    1152class MOOCodeLexer(RegexLexer): 
    1153    """ 
    1154    For MOOCode (the MOO scripting language). 
    1155    """ 
    1156    name = 'MOOCode' 
    1157    url = 'http://www.moo.mud.org/' 
    1158    filenames = ['*.moo'] 
    1159    aliases = ['moocode', 'moo'] 
    1160    mimetypes = ['text/x-moocode'] 
    1161    version_added = '0.9' 
    1162 
    1163    tokens = { 
    1164        'root': [ 
    1165            # Numbers 
    1166            (r'(0|[1-9][0-9_]*)', Number.Integer), 
    1167            # Strings 
    1168            (r'"(\\\\|\\[^\\]|[^"\\])*"', String), 
    1169            # exceptions 
    1170            (r'(E_PERM|E_DIV)', Name.Exception), 
    1171            # db-refs 
    1172            (r'((#[-0-9]+)|(\$\w+))', Name.Entity), 
    1173            # Keywords 
    1174            (r'\b(if|else|elseif|endif|for|endfor|fork|endfork|while' 
    1175             r'|endwhile|break|continue|return|try' 
    1176             r'|except|endtry|finally|in)\b', Keyword), 
    1177            # builtins 
    1178            (r'(random|length)', Name.Builtin), 
    1179            # special variables 
    1180            (r'(player|caller|this|args)', Name.Variable.Instance), 
    1181            # skip whitespace 
    1182            (r'\s+', Text), 
    1183            (r'\n', Text), 
    1184            # other operators 
    1185            (r'([!;=,{}&|:.\[\]@()<>?]+)', Operator), 
    1186            # function call 
    1187            (r'(\w+)(\()', bygroups(Name.Function, Operator)), 
    1188            # variables 
    1189            (r'(\w+)', Text), 
    1190        ] 
    1191    } 
    1192 
    1193 
    1194class HybrisLexer(RegexLexer): 
    1195    """ 
    1196    For Hybris source code. 
    1197    """ 
    1198 
    1199    name = 'Hybris' 
    1200    aliases = ['hybris'] 
    1201    filenames = ['*.hyb'] 
    1202    mimetypes = ['text/x-hybris', 'application/x-hybris'] 
    1203    url = 'https://github.com/evilsocket/hybris' 
    1204    version_added = '1.4' 
    1205 
    1206    flags = re.MULTILINE | re.DOTALL 
    1207 
    1208    tokens = { 
    1209        'root': [ 
    1210            # method names 
    1211            (r'^(\s*(?:function|method|operator\s+)+?)' 
    1212             r'([a-zA-Z_]\w*)' 
    1213             r'(\s*)(\()', bygroups(Keyword, Name.Function, Text, Operator)), 
    1214            (r'[^\S\n]+', Text), 
    1215            (r'//.*?\n', Comment.Single), 
    1216            (r'/\*.*?\*/', Comment.Multiline), 
    1217            (r'@[a-zA-Z_][\w.]*', Name.Decorator), 
    1218            (r'(break|case|catch|next|default|do|else|finally|for|foreach|of|' 
    1219             r'unless|if|new|return|switch|me|throw|try|while)\b', Keyword), 
    1220            (r'(extends|private|protected|public|static|throws|function|method|' 
    1221             r'operator)\b', Keyword.Declaration), 
    1222            (r'(true|false|null|__FILE__|__LINE__|__VERSION__|__LIB_PATH__|' 
    1223             r'__INC_PATH__)\b', Keyword.Constant), 
    1224            (r'(class|struct)(\s+)', 
    1225             bygroups(Keyword.Declaration, Text), 'class'), 
    1226            (r'(import|include)(\s+)', 
    1227             bygroups(Keyword.Namespace, Text), 'import'), 
    1228            (words(( 
    1229                'gc_collect', 'gc_mm_items', 'gc_mm_usage', 'gc_collect_threshold', 
    1230                'urlencode', 'urldecode', 'base64encode', 'base64decode', 'sha1', 'crc32', 
    1231                'sha2', 'md5', 'md5_file', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 
    1232                'cosh', 'exp', 'fabs', 'floor', 'fmod', 'log', 'log10', 'pow', 'sin', 
    1233                'sinh', 'sqrt', 'tan', 'tanh', 'isint', 'isfloat', 'ischar', 'isstring', 
    1234                'isarray', 'ismap', 'isalias', 'typeof', 'sizeof', 'toint', 'tostring', 
    1235                'fromxml', 'toxml', 'binary', 'pack', 'load', 'eval', 'var_names', 
    1236                'var_values', 'user_functions', 'dyn_functions', 'methods', 'call', 
    1237                'call_method', 'mknod', 'mkfifo', 'mount', 'umount2', 'umount', 'ticks', 
    1238                'usleep', 'sleep', 'time', 'strtime', 'strdate', 'dllopen', 'dlllink', 
    1239                'dllcall', 'dllcall_argv', 'dllclose', 'env', 'exec', 'fork', 'getpid', 
    1240                'wait', 'popen', 'pclose', 'exit', 'kill', 'pthread_create', 
    1241                'pthread_create_argv', 'pthread_exit', 'pthread_join', 'pthread_kill', 
    1242                'smtp_send', 'http_get', 'http_post', 'http_download', 'socket', 'bind', 
    1243                'listen', 'accept', 'getsockname', 'getpeername', 'settimeout', 'connect', 
    1244                'server', 'recv', 'send', 'close', 'print', 'println', 'printf', 'input', 
    1245                'readline', 'serial_open', 'serial_fcntl', 'serial_get_attr', 
    1246                'serial_get_ispeed', 'serial_get_ospeed', 'serial_set_attr', 
    1247                'serial_set_ispeed', 'serial_set_ospeed', 'serial_write', 'serial_read', 
    1248                'serial_close', 'xml_load', 'xml_parse', 'fopen', 'fseek', 'ftell', 
    1249                'fsize', 'fread', 'fwrite', 'fgets', 'fclose', 'file', 'readdir', 
    1250                'pcre_replace', 'size', 'pop', 'unmap', 'has', 'keys', 'values', 
    1251                'length', 'find', 'substr', 'replace', 'split', 'trim', 'remove', 
    1252                'contains', 'join'), suffix=r'\b'), 
    1253             Name.Builtin), 
    1254            (words(( 
    1255                'MethodReference', 'Runner', 'Dll', 'Thread', 'Pipe', 'Process', 
    1256                'Runnable', 'CGI', 'ClientSocket', 'Socket', 'ServerSocket', 
    1257                'File', 'Console', 'Directory', 'Exception'), suffix=r'\b'), 
    1258             Keyword.Type), 
    1259            (r'"(\\\\|\\[^\\]|[^"\\])*"', String), 
    1260            (r"'\\.'|'[^\\]'|'\\u[0-9a-f]{4}'", String.Char), 
    1261            (r'(\.)([a-zA-Z_]\w*)', 
    1262             bygroups(Operator, Name.Attribute)), 
    1263            (r'[a-zA-Z_]\w*:', Name.Label), 
    1264            (r'[a-zA-Z_$]\w*', Name), 
    1265            (r'[~^*!%&\[\](){}<>|+=:;,./?\-@]+', Operator), 
    1266            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float), 
    1267            (r'0x[0-9a-f]+', Number.Hex), 
    1268            (r'[0-9]+L?', Number.Integer), 
    1269            (r'\n', Text), 
    1270        ], 
    1271        'class': [ 
    1272            (r'[a-zA-Z_]\w*', Name.Class, '#pop') 
    1273        ], 
    1274        'import': [ 
    1275            (r'[\w.]+\*?', Name.Namespace, '#pop') 
    1276        ], 
    1277    } 
    1278 
    1279    def analyse_text(text): 
    1280        """public method and private method don't seem to be quite common 
    1281        elsewhere.""" 
    1282        result = 0 
    1283        if re.search(r'\b(?:public|private)\s+method\b', text): 
    1284            result += 0.01 
    1285        return result 
    1286 
    1287 
    1288 
    1289class EasytrieveLexer(RegexLexer): 
    1290    """ 
    1291    Easytrieve Plus is a programming language for extracting, filtering and 
    1292    converting sequential data. Furthermore it can layout data for reports. 
    1293    It is mainly used on mainframe platforms and can access several of the 
    1294    mainframe's native file formats. It is somewhat comparable to awk. 
    1295    """ 
    1296    name = 'Easytrieve' 
    1297    aliases = ['easytrieve'] 
    1298    filenames = ['*.ezt', '*.mac'] 
    1299    mimetypes = ['text/x-easytrieve'] 
    1300    url = 'https://www.broadcom.com/products/mainframe/application-development/easytrieve-report-generator' 
    1301    version_added = '2.1' 
    1302    flags = 0 
    1303 
    1304    # Note: We cannot use r'\b' at the start and end of keywords because 
    1305    # Easytrieve Plus delimiter characters are: 
    1306    # 
    1307    #   * space ( ) 
    1308    #   * apostrophe (') 
    1309    #   * period (.) 
    1310    #   * comma (,) 
    1311    #   * parenthesis ( and ) 
    1312    #   * colon (:) 
    1313    # 
    1314    # Additionally words end once a '*' appears, indicatins a comment. 
    1315    _DELIMITERS = r' \'.,():\n' 
    1316    _DELIMITERS_OR_COMENT = _DELIMITERS + '*' 
    1317    _DELIMITER_PATTERN = '[' + _DELIMITERS + ']' 
    1318    _DELIMITER_PATTERN_CAPTURE = '(' + _DELIMITER_PATTERN + ')' 
    1319    _NON_DELIMITER_OR_COMMENT_PATTERN = '[^' + _DELIMITERS_OR_COMENT + ']' 
    1320    _OPERATORS_PATTERN = '[.+\\-/=\\[\\](){}<>;,&%¬]' 
    1321    _KEYWORDS = [ 
    1322        'AFTER-BREAK', 'AFTER-LINE', 'AFTER-SCREEN', 'AIM', 'AND', 'ATTR', 
    1323        'BEFORE', 'BEFORE-BREAK', 'BEFORE-LINE', 'BEFORE-SCREEN', 'BUSHU', 
    1324        'BY', 'CALL', 'CASE', 'CHECKPOINT', 'CHKP', 'CHKP-STATUS', 'CLEAR', 
    1325        'CLOSE', 'COL', 'COLOR', 'COMMIT', 'CONTROL', 'COPY', 'CURSOR', 'D', 
    1326        'DECLARE', 'DEFAULT', 'DEFINE', 'DELETE', 'DENWA', 'DISPLAY', 'DLI', 
    1327        'DO', 'DUPLICATE', 'E', 'ELSE', 'ELSE-IF', 'END', 'END-CASE', 
    1328        'END-DO', 'END-IF', 'END-PROC', 'ENDPAGE', 'ENDTABLE', 'ENTER', 'EOF', 
    1329        'EQ', 'ERROR', 'EXIT', 'EXTERNAL', 'EZLIB', 'F1', 'F10', 'F11', 'F12', 
    1330        'F13', 'F14', 'F15', 'F16', 'F17', 'F18', 'F19', 'F2', 'F20', 'F21', 
    1331        'F22', 'F23', 'F24', 'F25', 'F26', 'F27', 'F28', 'F29', 'F3', 'F30', 
    1332        'F31', 'F32', 'F33', 'F34', 'F35', 'F36', 'F4', 'F5', 'F6', 'F7', 
    1333        'F8', 'F9', 'FETCH', 'FILE-STATUS', 'FILL', 'FINAL', 'FIRST', 
    1334        'FIRST-DUP', 'FOR', 'GE', 'GET', 'GO', 'GOTO', 'GQ', 'GR', 'GT', 
    1335        'HEADING', 'HEX', 'HIGH-VALUES', 'IDD', 'IDMS', 'IF', 'IN', 'INSERT', 
    1336        'JUSTIFY', 'KANJI-DATE', 'KANJI-DATE-LONG', 'KANJI-TIME', 'KEY', 
    1337        'KEY-PRESSED', 'KOKUGO', 'KUN', 'LAST-DUP', 'LE', 'LEVEL', 'LIKE', 
    1338        'LINE', 'LINE-COUNT', 'LINE-NUMBER', 'LINK', 'LIST', 'LOW-VALUES', 
    1339        'LQ', 'LS', 'LT', 'MACRO', 'MASK', 'MATCHED', 'MEND', 'MESSAGE', 
    1340        'MOVE', 'MSTART', 'NE', 'NEWPAGE', 'NOMASK', 'NOPRINT', 'NOT', 
    1341        'NOTE', 'NOVERIFY', 'NQ', 'NULL', 'OF', 'OR', 'OTHERWISE', 'PA1', 
    1342        'PA2', 'PA3', 'PAGE-COUNT', 'PAGE-NUMBER', 'PARM-REGISTER', 
    1343        'PATH-ID', 'PATTERN', 'PERFORM', 'POINT', 'POS', 'PRIMARY', 'PRINT', 
    1344        'PROCEDURE', 'PROGRAM', 'PUT', 'READ', 'RECORD', 'RECORD-COUNT', 
    1345        'RECORD-LENGTH', 'REFRESH', 'RELEASE', 'RENUM', 'REPEAT', 'REPORT', 
    1346        'REPORT-INPUT', 'RESHOW', 'RESTART', 'RETRIEVE', 'RETURN-CODE', 
    1347        'ROLLBACK', 'ROW', 'S', 'SCREEN', 'SEARCH', 'SECONDARY', 'SELECT', 
    1348        'SEQUENCE', 'SIZE', 'SKIP', 'SOKAKU', 'SORT', 'SQL', 'STOP', 'SUM', 
    1349        'SYSDATE', 'SYSDATE-LONG', 'SYSIN', 'SYSIPT', 'SYSLST', 'SYSPRINT', 
    1350        'SYSSNAP', 'SYSTIME', 'TALLY', 'TERM-COLUMNS', 'TERM-NAME', 
    1351        'TERM-ROWS', 'TERMINATION', 'TITLE', 'TO', 'TRANSFER', 'TRC', 
    1352        'UNIQUE', 'UNTIL', 'UPDATE', 'UPPERCASE', 'USER', 'USERID', 'VALUE', 
    1353        'VERIFY', 'W', 'WHEN', 'WHILE', 'WORK', 'WRITE', 'X', 'XDM', 'XRST' 
    1354    ] 
    1355 
    1356    tokens = { 
    1357        'root': [ 
    1358            (r'\*.*\n', Comment.Single), 
    1359            (r'\n+', Whitespace), 
    1360            # Macro argument 
    1361            (r'&' + _NON_DELIMITER_OR_COMMENT_PATTERN + r'+\.', Name.Variable, 
    1362             'after_macro_argument'), 
    1363            # Macro call 
    1364            (r'%' + _NON_DELIMITER_OR_COMMENT_PATTERN + r'+', Name.Variable), 
    1365            (r'(FILE|MACRO|REPORT)(\s+)', 
    1366             bygroups(Keyword.Declaration, Whitespace), 'after_declaration'), 
    1367            (r'(JOB|PARM)' + r'(' + _DELIMITER_PATTERN + r')', 
    1368             bygroups(Keyword.Declaration, Operator)), 
    1369            (words(_KEYWORDS, suffix=_DELIMITER_PATTERN_CAPTURE), 
    1370             bygroups(Keyword.Reserved, Operator)), 
    1371            (_OPERATORS_PATTERN, Operator), 
    1372            # Procedure declaration 
    1373            (r'(' + _NON_DELIMITER_OR_COMMENT_PATTERN + r'+)(\s*)(\.?)(\s*)(PROC)(\s*\n)', 
    1374             bygroups(Name.Function, Whitespace, Operator, Whitespace, 
    1375                      Keyword.Declaration, Whitespace)), 
    1376            (r'[0-9]+\.[0-9]*', Number.Float), 
    1377            (r'[0-9]+', Number.Integer), 
    1378            (r"'(''|[^'])*'", String), 
    1379            (r'\s+', Whitespace), 
    1380            # Everything else just belongs to a name 
    1381            (_NON_DELIMITER_OR_COMMENT_PATTERN + r'+', Name), 
    1382         ], 
    1383        'after_declaration': [ 
    1384            (_NON_DELIMITER_OR_COMMENT_PATTERN + r'+', Name.Function), 
    1385            default('#pop'), 
    1386        ], 
    1387        'after_macro_argument': [ 
    1388            (r'\*.*\n', Comment.Single, '#pop'), 
    1389            (r'\s+', Whitespace, '#pop'), 
    1390            (_OPERATORS_PATTERN, Operator, '#pop'), 
    1391            (r"'(''|[^'])*'", String, '#pop'), 
    1392            # Everything else just belongs to a name 
    1393            (_NON_DELIMITER_OR_COMMENT_PATTERN + r'+', Name), 
    1394        ], 
    1395    } 
    1396    _COMMENT_LINE_REGEX = re.compile(r'^\s*\*') 
    1397    _MACRO_HEADER_REGEX = re.compile(r'^\s*MACRO') 
    1398 
    1399    def analyse_text(text): 
    1400        """ 
    1401        Perform a structural analysis for basic Easytrieve constructs. 
    1402        """ 
    1403        result = 0.0 
    1404        lines = text.split('\n') 
    1405        hasEndProc = False 
    1406        hasHeaderComment = False 
    1407        hasFile = False 
    1408        hasJob = False 
    1409        hasProc = False 
    1410        hasParm = False 
    1411        hasReport = False 
    1412 
    1413        def isCommentLine(line): 
    1414            return EasytrieveLexer._COMMENT_LINE_REGEX.match(lines[0]) is not None 
    1415 
    1416        def isEmptyLine(line): 
    1417            return not bool(line.strip()) 
    1418 
    1419        # Remove possible empty lines and header comments. 
    1420        while lines and (isEmptyLine(lines[0]) or isCommentLine(lines[0])): 
    1421            if not isEmptyLine(lines[0]): 
    1422                hasHeaderComment = True 
    1423            del lines[0] 
    1424 
    1425        if EasytrieveLexer._MACRO_HEADER_REGEX.match(lines[0]): 
    1426            # Looks like an Easytrieve macro. 
    1427            result = 0.4 
    1428            if hasHeaderComment: 
    1429                result += 0.4 
    1430        else: 
    1431            # Scan the source for lines starting with indicators. 
    1432            for line in lines: 
    1433                words = line.split() 
    1434                if (len(words) >= 2): 
    1435                    firstWord = words[0] 
    1436                    if not hasReport: 
    1437                        if not hasJob: 
    1438                            if not hasFile: 
    1439                                if not hasParm: 
    1440                                    if firstWord == 'PARM': 
    1441                                        hasParm = True 
    1442                                if firstWord == 'FILE': 
    1443                                    hasFile = True 
    1444                            if firstWord == 'JOB': 
    1445                                hasJob = True 
    1446                        elif firstWord == 'PROC': 
    1447                            hasProc = True 
    1448                        elif firstWord == 'END-PROC': 
    1449                            hasEndProc = True 
    1450                        elif firstWord == 'REPORT': 
    1451                            hasReport = True 
    1452 
    1453            # Weight the findings. 
    1454            if hasJob and (hasProc == hasEndProc): 
    1455                if hasHeaderComment: 
    1456                    result += 0.1 
    1457                if hasParm: 
    1458                    if hasProc: 
    1459                        # Found PARM, JOB and PROC/END-PROC: 
    1460                        # pretty sure this is Easytrieve. 
    1461                        result += 0.8 
    1462                    else: 
    1463                        # Found PARAM and  JOB: probably this is Easytrieve 
    1464                        result += 0.5 
    1465                else: 
    1466                    # Found JOB and possibly other keywords: might be Easytrieve 
    1467                    result += 0.11 
    1468                    if hasParm: 
    1469                        # Note: PARAM is not a proper English word, so this is 
    1470                        # regarded a much better indicator for Easytrieve than 
    1471                        # the other words. 
    1472                        result += 0.2 
    1473                    if hasFile: 
    1474                        result += 0.01 
    1475                    if hasReport: 
    1476                        result += 0.01 
    1477        assert 0.0 <= result <= 1.0 
    1478        return result 
    1479 
    1480 
    1481class JclLexer(RegexLexer): 
    1482    """ 
    1483    Job Control Language (JCL) 
    1484    is a scripting language used on mainframe platforms to instruct the system 
    1485    on how to run a batch job or start a subsystem. It is somewhat 
    1486    comparable to MS DOS batch and Unix shell scripts. 
    1487    """ 
    1488    name = 'JCL' 
    1489    aliases = ['jcl'] 
    1490    filenames = ['*.jcl'] 
    1491    mimetypes = ['text/x-jcl'] 
    1492    url = 'https://en.wikipedia.org/wiki/Job_Control_Language' 
    1493    version_added = '2.1' 
    1494 
    1495    flags = re.IGNORECASE 
    1496 
    1497    tokens = { 
    1498        'root': [ 
    1499            (r'//\*.*\n', Comment.Single), 
    1500            (r'//', Keyword.Pseudo, 'statement'), 
    1501            (r'/\*', Keyword.Pseudo, 'jes2_statement'), 
    1502            # TODO: JES3 statement 
    1503            (r'.*\n', Other)  # Input text or inline code in any language. 
    1504        ], 
    1505        'statement': [ 
    1506            (r'\s*\n', Whitespace, '#pop'), 
    1507            (r'([a-z]\w*)(\s+)(exec|job)(\s*)', 
    1508             bygroups(Name.Label, Whitespace, Keyword.Reserved, Whitespace), 
    1509             'option'), 
    1510            (r'[a-z]\w*', Name.Variable, 'statement_command'), 
    1511            (r'\s+', Whitespace, 'statement_command'), 
    1512        ], 
    1513        'statement_command': [ 
    1514            (r'\s+(command|cntl|dd|endctl|endif|else|include|jcllib|' 
    1515             r'output|pend|proc|set|then|xmit)\s+', Keyword.Reserved, 'option'), 
    1516            include('option') 
    1517        ], 
    1518        'jes2_statement': [ 
    1519            (r'\s*\n', Whitespace, '#pop'), 
    1520            (r'\$', Keyword, 'option'), 
    1521            (r'\b(jobparam|message|netacct|notify|output|priority|route|' 
    1522             r'setup|signoff|xeq|xmit)\b', Keyword, 'option'), 
    1523        ], 
    1524        'option': [ 
    1525            # (r'\n', Text, 'root'), 
    1526            (r'\*', Name.Builtin), 
    1527            (r'[\[\](){}<>;,]', Punctuation), 
    1528            (r'[-+*/=&%]', Operator), 
    1529            (r'[a-z_]\w*', Name), 
    1530            (r'\d+\.\d*', Number.Float), 
    1531            (r'\.\d+', Number.Float), 
    1532            (r'\d+', Number.Integer), 
    1533            (r"'", String, 'option_string'), 
    1534            (r'[ \t]+', Whitespace, 'option_comment'), 
    1535            (r'\.', Punctuation), 
    1536        ], 
    1537        'option_string': [ 
    1538            (r"(\n)(//)", bygroups(Text, Keyword.Pseudo)), 
    1539            (r"''", String), 
    1540            (r"[^']", String), 
    1541            (r"'", String, '#pop'), 
    1542        ], 
    1543        'option_comment': [ 
    1544            # (r'\n', Text, 'root'), 
    1545            (r'.+', Comment.Single), 
    1546        ] 
    1547    } 
    1548 
    1549    _JOB_HEADER_PATTERN = re.compile(r'^//[a-z#$@][a-z0-9#$@]{0,7}\s+job(\s+.*)?$', 
    1550                                     re.IGNORECASE) 
    1551 
    1552    def analyse_text(text): 
    1553        """ 
    1554        Recognize JCL job by header. 
    1555        """ 
    1556        result = 0.0 
    1557        lines = text.split('\n') 
    1558        if len(lines) > 0: 
    1559            if JclLexer._JOB_HEADER_PATTERN.match(lines[0]): 
    1560                result = 1.0 
    1561        assert 0.0 <= result <= 1.0 
    1562        return result 
    1563 
    1564 
    1565class MiniScriptLexer(RegexLexer): 
    1566    """ 
    1567    For MiniScript source code. 
    1568    """ 
    1569 
    1570    name = 'MiniScript' 
    1571    url = 'https://miniscript.org' 
    1572    aliases = ['miniscript', 'ms'] 
    1573    filenames = ['*.ms'] 
    1574    mimetypes = ['text/x-minicript', 'application/x-miniscript'] 
    1575    version_added = '2.6' 
    1576 
    1577    tokens = { 
    1578        'root': [ 
    1579            (r'#!(.*?)$', Comment.Preproc), 
    1580            default('base'), 
    1581        ], 
    1582        'base': [ 
    1583            ('//.*$', Comment.Single), 
    1584            (r'(?i)(\d*\.\d+|\d+\.\d*)(e[+-]?\d+)?', Number), 
    1585            (r'(?i)\d+e[+-]?\d+', Number), 
    1586            (r'\d+', Number), 
    1587            (r'\n', Text), 
    1588            (r'[^\S\n]+', Text), 
    1589            (r'"', String, 'string_double'), 
    1590            (r'(==|!=|<=|>=|[=+\-*/%^<>.:])', Operator), 
    1591            (r'[;,\[\]{}()]', Punctuation), 
    1592            (words(( 
    1593                'break', 'continue', 'else', 'end', 'for', 'function', 'if', 
    1594                'in', 'isa', 'then', 'repeat', 'return', 'while'), suffix=r'\b'), 
    1595             Keyword), 
    1596            (words(( 
    1597                'abs', 'acos', 'asin', 'atan', 'ceil', 'char', 'cos', 'floor', 
    1598                'log', 'round', 'rnd', 'pi', 'sign', 'sin', 'sqrt', 'str', 'tan', 
    1599                'hasIndex', 'indexOf', 'len', 'val', 'code', 'remove', 'lower', 
    1600                'upper', 'replace', 'split', 'indexes', 'values', 'join', 'sum', 
    1601                'sort', 'shuffle', 'push', 'pop', 'pull', 'range', 
    1602                'print', 'input', 'time', 'wait', 'locals', 'globals', 'outer', 
    1603                'yield'), suffix=r'\b'), 
    1604             Name.Builtin), 
    1605            (r'(true|false|null)\b', Keyword.Constant), 
    1606            (r'(and|or|not|new)\b', Operator.Word), 
    1607            (r'(self|super|__isa)\b', Name.Builtin.Pseudo), 
    1608            (r'[a-zA-Z_]\w*', Name.Variable) 
    1609        ], 
    1610        'string_double': [ 
    1611            (r'[^"\n]+', String), 
    1612            (r'""', String), 
    1613            (r'"', String, '#pop'), 
    1614            (r'\n', Text, '#pop'),  # Stray linefeed also terminates strings. 
    1615        ] 
    1616    }