diff options
Diffstat (limited to 'pygments/lexers/dotnet.py')
-rw-r--r-- | pygments/lexers/dotnet.py | 165 |
1 files changed, 139 insertions, 26 deletions
diff --git a/pygments/lexers/dotnet.py b/pygments/lexers/dotnet.py index d9926294..7c13e8a4 100644 --- a/pygments/lexers/dotnet.py +++ b/pygments/lexers/dotnet.py @@ -10,7 +10,8 @@ """ import re -from pygments.lexer import RegexLexer, DelegatingLexer, bygroups, using, this +from pygments.lexer import RegexLexer, DelegatingLexer, bygroups, include, \ + using, this from pygments.token import Punctuation, \ Text, Comment, Operator, Keyword, Name, String, Number, Literal, Other from pygments.util import get_choice_opt @@ -18,8 +19,8 @@ from pygments import unistring as uni from pygments.lexers.web import XmlLexer -__all__ = ['CSharpLexer', 'NemerleLexer', 'BooLexer', 'VbNetLexer', 'CSharpAspxLexer', - 'VbNetAspxLexer'] +__all__ = ['CSharpLexer', 'NemerleLexer', 'BooLexer', 'VbNetLexer', + 'CSharpAspxLexer', 'VbNetAspxLexer', 'FSharpLexer'] def _escape(st): @@ -137,10 +138,10 @@ class CSharpLexer(RegexLexer): RegexLexer.__init__(self, **options) + class NemerleLexer(RegexLexer): """ - For `Nemerle <http://nemerle.org>`_ - source code. + For `Nemerle <http://nemerle.org>`_ source code. Additional options accepted: @@ -158,7 +159,7 @@ class NemerleLexer(RegexLexer): The default value is ``basic``. - *New in Pygments 1.4.* + *New in Pygments 1.5.* """ name = 'Nemerle' @@ -224,22 +225,27 @@ class NemerleLexer(RegexLexer): (r'\b(extern)(\s+)(alias)\b', bygroups(Keyword, Text, Keyword)), (r'(abstract|and|as|base|catch|def|delegate|' - r'enum|event|extern|false|finally|' - r'fun|implements|interface|internal|' - r'is|macro|match|matches|mutable|new|' - r'null|out|override|params|partial|private|' - r'protected|public|ref|sealed|static|' - r'syntax|this|throw|true|try|type|typeof|' - r'virtual|volatile|when|where|with|' - r'assert|assert2|async|break|checked|continue|do|else|' - r'ensures|for|foreach|if|late|lock|new|nolate|' - r'otherwise|regexp|repeat|requires|return|surroundwith|' - r'unchecked|unless|using|while|yield)\b', Keyword), + r'enum|event|extern|false|finally|' + r'fun|implements|interface|internal|' + r'is|macro|match|matches|module|mutable|new|' + r'null|out|override|params|partial|private|' + r'protected|public|ref|sealed|static|' + r'syntax|this|throw|true|try|type|typeof|' + r'virtual|volatile|when|where|with|' + r'assert|assert2|async|break|checked|continue|do|else|' + r'ensures|for|foreach|if|late|lock|new|nolate|' + r'otherwise|regexp|repeat|requires|return|surroundwith|' + r'unchecked|unless|using|while|yield)\b', Keyword), + (r'(global)(::)', bygroups(Keyword, Punctuation)), (r'(bool|byte|char|decimal|double|float|int|long|object|sbyte|' - r'short|string|uint|ulong|ushort|void|array|list)\b\??', Keyword.Type), - (r'(:>?)\s*(' + cs_ident + r'\??)', bygroups(Punctuation, Keyword.Type)), - (r'(class|struct|variant|module)(\s+)', bygroups(Keyword, Text), 'class'), - (r'(namespace|using)(\s+)', bygroups(Keyword, Text), 'namespace'), + r'short|string|uint|ulong|ushort|void|array|list)\b\??', + Keyword.Type), + (r'(:>?)\s*(' + cs_ident + r'\??)', + bygroups(Punctuation, Keyword.Type)), + (r'(class|struct|variant|module)(\s+)', + bygroups(Keyword, Text), 'class'), + (r'(namespace|using)(\s+)', bygroups(Keyword, Text), + 'namespace'), (cs_ident, Name), ], 'class': [ @@ -252,24 +258,26 @@ class NemerleLexer(RegexLexer): 'splice-string': [ (r'[^"$]', String), (r'\$' + cs_ident, Name), - (r'(\$)(\()', bygroups(Name, Punctuation), 'splice-string-content'), + (r'(\$)(\()', bygroups(Name, Punctuation), + 'splice-string-content'), (r'\\"', String), (r'"', String, '#pop') ], 'splice-string2': [ (r'[^#<>$]', String), (r'\$' + cs_ident, Name), - (r'(\$)(\()', bygroups(Name, Punctuation), 'splice-string-content'), + (r'(\$)(\()', bygroups(Name, Punctuation), + 'splice-string-content'), (r'<#', String, '#push'), (r'#>', String, '#pop') ], 'recursive-string': [ - (r'[^#<>]', String), + (r'[^#<>]', String), (r'<#', String, '#push'), (r'#>', String, '#pop') ], 'splice-string-content': [ - (r'if|match', Keyword), + (r'if|match', Keyword), (r'[~!%^&*+=|\[\]:;,.<>/?-]', Punctuation), (cs_ident, Name), (r'\(', Punctuation, '#push'), @@ -278,7 +286,8 @@ class NemerleLexer(RegexLexer): } def __init__(self, **options): - level = get_choice_opt(options, 'unicodelevel', self.tokens.keys(), 'basic') + level = get_choice_opt(options, 'unicodelevel', self.tokens.keys(), + 'basic') if level not in self._all_tokens: # compile the regexes now self._tokens = self.__class__.process_tokendef(level) @@ -515,3 +524,107 @@ class VbNetAspxLexer(DelegatingLexer): return 0.2 elif re.search(r'script[^>]+language=["\']vb', text, re.I) is not None: return 0.15 + + +# Very close to functional.OcamlLexer +class FSharpLexer(RegexLexer): + """ + For the F# language. + + *New in Pygments 1.5.* + """ + + name = 'FSharp' + aliases = ['fsharp'] + filenames = ['*.fs', '*.fsi'] + mimetypes = ['text/x-fsharp'] + + keywords = [ + 'abstract', 'and', 'as', 'assert', 'base', 'begin', 'class', + 'default', 'delegate', 'do', 'do!', 'done', 'downcast', + 'downto', 'elif', 'else', 'end', 'exception', 'extern', + 'false', 'finally', 'for', 'fun', 'function', 'global', 'if', + 'in', 'inherit', 'inline', 'interface', 'internal', 'lazy', + 'let', 'let!', 'match', 'member', 'module', 'mutable', + 'namespace', 'new', 'null', 'of', 'open', 'or', 'override', + 'private', 'public', 'rec', 'return', 'return!', 'sig', + 'static', 'struct', 'then', 'to', 'true', 'try', 'type', + 'upcast', 'use', 'use!', 'val', 'void', 'when', 'while', + 'with', 'yield', 'yield!' + ] + keyopts = [ + '!=','#','&','&&','\(','\)','\*','\+',',','-', + '-\.','->','\.','\.\.',':','::',':=',':>',';',';;','<', + '<-','>','>]','\?','\?\?','\[','\[<','\[>','\[\|', + ']','_','`','{','\|','\|]','}','~','<@','=','@>' + ] + + operators = r'[!$%&*+\./:<=>?@^|~-]' + word_operators = ['and', 'asr', 'land', 'lor', 'lsl', 'lxor', 'mod', 'not', 'or'] + prefix_syms = r'[!?~]' + infix_syms = r'[=<>@^|&+\*/$%-]' + primitives = ['unit', 'int', 'float', 'bool', 'string', 'char', 'list', 'array', + 'byte', 'sbyte', 'int16', 'uint16', 'uint32', 'int64', 'uint64' + 'nativeint', 'unativeint', 'decimal', 'void', 'float32', 'single', + 'double'] + + tokens = { + 'escape-sequence': [ + (r'\\[\\\"\'ntbr]', String.Escape), + (r'\\[0-9]{3}', String.Escape), + (r'\\x[0-9a-fA-F]{2}', String.Escape), + ], + 'root': [ + (r'\s+', Text), + (r'false|true|\(\)|\[\]', Name.Builtin.Pseudo), + (r'\b([A-Z][A-Za-z0-9_\']*)(?=\s*\.)', + Name.Namespace, 'dotted'), + (r'\b([A-Z][A-Za-z0-9_\']*)', Name.Class), + (r'//.*?\n', Comment.Single), + (r'\(\*', Comment, 'comment'), + (r'\b(%s)\b' % '|'.join(keywords), Keyword), + (r'(%s)' % '|'.join(keyopts), Operator), + (r'(%s|%s)?%s' % (infix_syms, prefix_syms, operators), Operator), + (r'\b(%s)\b' % '|'.join(word_operators), Operator.Word), + (r'\b(%s)\b' % '|'.join(primitives), Keyword.Type), + + (r'#[ \t]*(if|endif|else|line|nowarn|light)\b.*?\n', + Comment.Preproc), + + (r"[^\W\d][\w']*", Name), + + (r'\d[\d_]*', Number.Integer), + (r'0[xX][\da-fA-F][\da-fA-F_]*', Number.Hex), + (r'0[oO][0-7][0-7_]*', Number.Oct), + (r'0[bB][01][01_]*', Number.Binary), + (r'-?\d[\d_]*(.[\d_]*)?([eE][+\-]?\d[\d_]*)', Number.Float), + + (r"'(?:(\\[\\\"'ntbr ])|(\\[0-9]{3})|(\\x[0-9a-fA-F]{2}))'", + String.Char), + (r"'.'", String.Char), + (r"'", Keyword), # a stray quote is another syntax element + + (r'"', String.Double, 'string'), + + (r'[~?][a-z][\w\']*:', Name.Variable), + ], + 'comment': [ + (r'[^(*)]+', Comment), + (r'\(\*', Comment, '#push'), + (r'\*\)', Comment, '#pop'), + (r'[(*)]', Comment), + ], + 'string': [ + (r'[^\\"]+', String.Double), + include('escape-sequence'), + (r'\\\n', String.Double), + (r'"', String.Double, '#pop'), + ], + 'dotted': [ + (r'\s+', Text), + (r'\.', Punctuation), + (r'[A-Z][A-Za-z0-9_\']*(?=\s*\.)', Name.Namespace), + (r'[A-Z][A-Za-z0-9_\']*', Name.Class, '#pop'), + (r'[a-z_][A-Za-z0-9_\']*', Name, '#pop'), + ], + } |