diff options
Diffstat (limited to 'pygments/lexers/nimrod.py')
-rw-r--r-- | pygments/lexers/nimrod.py | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/pygments/lexers/nimrod.py b/pygments/lexers/nimrod.py new file mode 100644 index 0000000..bf5c948 --- /dev/null +++ b/pygments/lexers/nimrod.py @@ -0,0 +1,200 @@ +""" + pygments.lexers.nimrod + ~~~~~~~~~~~~~~~~~~~~~~ + + Lexer for the Nim language (formerly known as Nimrod). + + :copyright: Copyright 2006-2022 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import re + +from pygments.lexer import RegexLexer, include, default, bygroups +from pygments.token import Text, Comment, Operator, Keyword, Name, String, \ + Number, Punctuation, Error + +__all__ = ['NimrodLexer'] + + +class NimrodLexer(RegexLexer): + """ + For Nim source code. + + .. versionadded:: 1.5 + """ + + name = 'Nimrod' + url = 'http://nim-lang.org/' + aliases = ['nimrod', 'nim'] + filenames = ['*.nim', '*.nimrod'] + mimetypes = ['text/x-nim'] + + flags = re.MULTILINE | re.IGNORECASE + + def underscorize(words): + newWords = [] + new = [] + for word in words: + for ch in word: + new.append(ch) + new.append("_?") + newWords.append(''.join(new)) + new = [] + return "|".join(newWords) + + keywords = [ + 'addr', 'and', 'as', 'asm', 'bind', 'block', 'break', 'case', + 'cast', 'concept', 'const', 'continue', 'converter', 'defer', 'discard', + 'distinct', 'div', 'do', 'elif', 'else', 'end', 'enum', 'except', + 'export', 'finally', 'for', 'if', 'in', 'yield', 'interface', + 'is', 'isnot', 'iterator', 'let', 'mixin', 'mod', + 'not', 'notin', 'object', 'of', 'or', 'out', 'ptr', 'raise', + 'ref', 'return', 'shl', 'shr', 'static', 'try', + 'tuple', 'type', 'using', 'when', 'while', 'xor' + ] + + keywordsPseudo = [ + 'nil', 'true', 'false' + ] + + opWords = [ + 'and', 'or', 'not', 'xor', 'shl', 'shr', 'div', 'mod', 'in', + 'notin', 'is', 'isnot' + ] + + types = [ + 'int', 'int8', 'int16', 'int32', 'int64', 'float', 'float32', 'float64', + 'bool', 'char', 'range', 'array', 'seq', 'set', 'string' + ] + + tokens = { + 'root': [ + # Comments + (r'##\[', String.Doc, 'doccomment'), + (r'##.*$', String.Doc), + (r'#\[', Comment.Multiline, 'comment'), + (r'#.*$', Comment), + + # Pragmas + (r'\{\.', String.Other, 'pragma'), + + # Operators + (r'[*=><+\-/@$~&%!?|\\\[\]]', Operator), + (r'\.\.|\.|,|\[\.|\.\]|\{\.|\.\}|\(\.|\.\)|\{|\}|\(|\)|:|\^|`|;', + Punctuation), + + # Case statement branch + (r'(\n\s*)(of)(\s)', bygroups(Text.Whitespace, Keyword, + Text.Whitespace), 'casebranch'), + + # Strings + (r'(?:[\w]+)"', String, 'rdqs'), + (r'"""', String.Double, 'tdqs'), + ('"', String, 'dqs'), + + # Char + ("'", String.Char, 'chars'), + + # Keywords + (r'(%s)\b' % underscorize(opWords), Operator.Word), + (r'(proc|func|method|macro|template)(\s)(?![(\[\]])', + bygroups(Keyword, Text.Whitespace), 'funcname'), + (r'(%s)\b' % underscorize(keywords), Keyword), + (r'(%s)\b' % underscorize(['from', 'import', 'include', 'export']), + Keyword.Namespace), + (r'(v_?a_?r)\b', Keyword.Declaration), + (r'(%s)\b' % underscorize(types), Name.Builtin), + (r'(%s)\b' % underscorize(keywordsPseudo), Keyword.Pseudo), + + # Identifiers + (r'\b((?![_\d])\w)(((?!_)\w)|(_(?!_)\w))*', Name), + + # Numbers + (r'[0-9][0-9_]*(?=([e.]|\'f(32|64)))', + Number.Float, ('float-suffix', 'float-number')), + (r'0x[a-f0-9][a-f0-9_]*', Number.Hex, 'int-suffix'), + (r'0b[01][01_]*', Number.Bin, 'int-suffix'), + (r'0o[0-7][0-7_]*', Number.Oct, 'int-suffix'), + (r'[0-9][0-9_]*', Number.Integer, 'int-suffix'), + + # Whitespace + (r'\s+', Text.Whitespace), + (r'.+$', Error), + ], + 'chars': [ + (r'\\([\\abcefnrtvl"\']|x[a-f0-9]{2}|[0-9]{1,3})', String.Escape), + (r"'", String.Char, '#pop'), + (r".", String.Char) + ], + 'strings': [ + (r'(?<!\$)\$(\d+|#|\w+)+', String.Interpol), + (r'[^\\\'"$\n]+', String), + # quotes, dollars and backslashes must be parsed one at a time + (r'[\'"\\]', String), + # unhandled string formatting sign + (r'\$', String) + # newlines are an error (use "nl" state) + ], + 'doccomment': [ + (r'[^\]#]+', String.Doc), + (r'##\[', String.Doc, '#push'), + (r'\]##', String.Doc, '#pop'), + (r'[\]#]', String.Doc), + ], + 'comment': [ + (r'[^\]#]+', Comment.Multiline), + (r'#\[', Comment.Multiline, '#push'), + (r'\]#', Comment.Multiline, '#pop'), + (r'[\]#]', Comment.Multiline), + ], + 'dqs': [ + (r'\\([\\abcefnrtvl"\']|\n|x[a-f0-9]{2}|[0-9]{1,3})', + String.Escape), + (r'"', String, '#pop'), + include('strings') + ], + 'rdqs': [ + (r'"(?!")', String, '#pop'), + (r'""', String.Escape), + include('strings') + ], + 'tdqs': [ + (r'"""', String.Double, '#pop'), + include('strings'), + (r'\n', String.Double) + ], + 'funcname': [ + (r'((?![\d_])\w)(((?!_)\w)|(_(?!_)\w))*', Name.Function, '#pop'), + (r'`.+`', Name.Function, '#pop') + ], + 'nl': [ + (r'\n', String) + ], + 'float-number': [ + (r'\.(?!\.)[0-9_]*[f]*', Number.Float), + (r'e[+-]?[0-9][0-9_]*', Number.Float), + default('#pop') + ], + 'float-suffix': [ + (r'\'f(32|64)', Number.Float), + default('#pop') + ], + 'int-suffix': [ + (r'\'i(32|64)', Number.Integer.Long), + (r'\'i(8|16)', Number.Integer), + default('#pop') + ], + 'casebranch': [ + (r',', Punctuation), + (r'[\n ]+', Text.Whitespace), + (r':', Operator, '#pop'), + (r'\w+|[^:]', Name.Label), + ], + 'pragma': [ + (r'[:,]', Text), + (r'[\n ]+', Text.Whitespace), + (r'\.\}', String.Other, '#pop'), + (r'\w+|\W+|[^.}]', String.Other), + ], + } |