1"""
2 pygments.lexers.iolang
3 ~~~~~~~~~~~~~~~~~~~~~~
4
5 Lexers for the Io language.
6
7 :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
8 :license: BSD, see LICENSE for details.
9"""
10
11from pygments.lexer import RegexLexer
12from pygments.token import Comment, Operator, Keyword, Name, String, Number, \
13 Whitespace
14
15__all__ = ['IoLexer']
16
17
18class IoLexer(RegexLexer):
19 """
20 For Io (a small, prototype-based programming language) source.
21 """
22 name = 'Io'
23 url = 'http://iolanguage.com/'
24 filenames = ['*.io']
25 aliases = ['io']
26 mimetypes = ['text/x-iosrc']
27 version_added = '0.10'
28 tokens = {
29 'root': [
30 (r'\n', Whitespace),
31 (r'\s+', Whitespace),
32 # Comments
33 (r'//(.*?)$', Comment.Single),
34 (r'#(.*?)$', Comment.Single),
35 (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
36 (r'/\+', Comment.Multiline, 'nestedcomment'),
37 # DoubleQuotedString
38 (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
39 # Operators
40 (r'::=|:=|=|\(|\)|;|,|\*|-|\+|>|<|@|!|/|\||\^|\.|%|&|\[|\]|\{|\}',
41 Operator),
42 # keywords
43 (r'(clone|do|doFile|doString|method|for|if|else|elseif|then)\b',
44 Keyword),
45 # constants
46 (r'(nil|false|true)\b', Name.Constant),
47 # names
48 (r'(Object|list|List|Map|args|Sequence|Coroutine|File)\b',
49 Name.Builtin),
50 (r'[a-zA-Z_]\w*', Name),
51 # numbers
52 (r'(\d+\.?\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float),
53 (r'\d+', Number.Integer)
54 ],
55 'nestedcomment': [
56 (r'[^+/]+', Comment.Multiline),
57 (r'/\+', Comment.Multiline, '#push'),
58 (r'\+/', Comment.Multiline, '#pop'),
59 (r'[+/]', Comment.Multiline),
60 ]
61 }