codekingpro/portable-devtools
114k
1"""2 pygments.lexers.dotnet3 ~~~~~~~~~~~~~~~~~~~~~~4 5 Lexers for .net languages.6 7 :copyright: Copyright 2006-present by the Pygments team, see AUTHORS.8 :license: BSD, see LICENSE for details.9"""10import re11 12from pygments.lexer import RegexLexer, DelegatingLexer, bygroups, include, \13 using, this, default, words14from pygments.token import Punctuation, Text, Comment, Operator, Keyword, \15 Name, String, Number, Literal, Other, Whitespace16from pygments.util import get_choice_opt17from pygments import unistring as uni18 19from pygments.lexers.html import XmlLexer20 21__all__ = ['CSharpLexer', 'NemerleLexer', 'BooLexer', 'VbNetLexer',22 'CSharpAspxLexer', 'VbNetAspxLexer', 'FSharpLexer', 'XppLexer']23 24 25class CSharpLexer(RegexLexer):26 """27 For C# source code.28 29 Additional options accepted:30 31 `unicodelevel`32 Determines which Unicode characters this lexer allows for identifiers.33 The possible values are:34 35 * ``none`` -- only the ASCII letters and numbers are allowed. This36 is the fastest selection.37 * ``basic`` -- all Unicode characters from the specification except38 category ``Lo`` are allowed.39 * ``full`` -- all Unicode characters as specified in the C# specs40 are allowed. Note that this means a considerable slowdown since the41 ``Lo`` category has more than 40,000 characters in it!42 43 The default value is ``basic``.44 45 .. versionadded:: 0.846 """47 48 name = 'C#'49 url = 'https://docs.microsoft.com/en-us/dotnet/csharp/'50 aliases = ['csharp', 'c#', 'cs']51 filenames = ['*.cs']52 mimetypes = ['text/x-csharp'] # inferred53 version_added = ''54 55 flags = re.MULTILINE | re.DOTALL56 57 # for the range of allowed unicode characters in identifiers, see58 # http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf59 60 levels = {61 'none': r'@?[_a-zA-Z]\w*',62 'basic': ('@?[_' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Nl') + ']' +63 '[' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Nl', 'Nd', 'Pc',64 'Cf', 'Mn', 'Mc') + ']*'),65 'full': ('@?(?:_|[^' +66 uni.allexcept('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl') + '])' +67 '[^' + uni.allexcept('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl',68 'Nd', 'Pc', 'Cf', 'Mn', 'Mc') + ']*'),69 }70 71 tokens = {}72 token_variants = True73 74 for levelname, cs_ident in levels.items():75 tokens[levelname] = {76 'root': [77 include('numbers'),78 # method names79 (r'^([ \t]*)((?:' + cs_ident + r'(?:\[\])?\s+)+?)' # return type80 r'(' + cs_ident + ')' # method name81 r'(\s*)(\()', # signature start82 bygroups(Whitespace, using(this), Name.Function, Whitespace,83 Punctuation)),84 (r'^(\s*)(\[.*?\])', bygroups(Whitespace, Name.Attribute)),85 (r'[^\S\n]+', Whitespace),86 (r'(\\)(\n)', bygroups(Text, Whitespace)), # line continuation87 (r'//.*?\n', Comment.Single),88 (r'/[*].*?[*]/', Comment.Multiline),89 (r'\n', Whitespace),90 (words((91 '>>>=', '>>=', '<<=', '<=', '>=', '+=', '-=', '*=', '/=',92 '%=', '&=', '|=', '^=', '??=', '=>', '??', '?.', '!=', '==',93 '&&', '||', '>>>', '>>', '<<', '++', '--', '+', '-', '*',94 '/', '%', '&', '|', '^', '<', '>', '?', '!', '~', '=',95 )), Operator),96 (r'=~|!=|==|<<|>>|[-+/*%=<>&^|]', Operator),97 (r'[()\[\];:,.]', Punctuation),98 (r'[{}]', Punctuation),99 (r'@"(""|[^"])*"', String),100 (r'\$?"(\\\\|\\[^\\]|[^"\\\n])*["\n]', String),101 (r"'\\.'|'[^\\]'", String.Char),102 (r"[0-9]+(\.[0-9]*)?([eE][+-][0-9]+)?"103 r"[flFLdD]?|0[xX][0-9a-fA-F]+[Ll]?", Number),104 (r'(#)([ \t]*)(if|endif|else|elif|define|undef|'105 r'line|error|warning|region|endregion|pragma)\b(.*?)(\n)',106 bygroups(Comment.Preproc, Whitespace, Comment.Preproc,107 Comment.Preproc, Whitespace)),108 (r'\b(extern)(\s+)(alias)\b', bygroups(Keyword, Whitespace,109 Keyword)),110 (words((111 'abstract', 'as', 'async', 'await', 'base', 'break', 'by',112 'case', 'catch', 'checked', 'const', 'continue', 'default',113 'delegate', 'do', 'else', 'enum', 'event', 'explicit',114 'extern', 'false', 'finally', 'fixed', 'for', 'foreach',115 'goto', 'if', 'implicit', 'in', 'interface', 'internal',116 'is', 'let', 'lock', 'new', 'null', 'on', 'operator',117 'out', 'override', 'params', 'private', 'protected',118 'public', 'readonly', 'ref', 'return', 'sealed', 'sizeof',119 'stackalloc', 'static', 'switch', 'this', 'throw', 'true',120 'try', 'typeof', 'unchecked', 'unsafe', 'virtual', 'void',121 'while', 'get', 'set', 'new', 'partial', 'yield', 'add',122 'remove', 'value', 'alias', 'ascending', 'descending',123 'from', 'group', 'into', 'orderby', 'select', 'thenby',124 'where', 'join', 'equals', 'record', 'allows',125 'and', 'init', 'managed', 'nameof', 'nint', 'not',126 'notnull', 'nuint', 'or', 'scoped', 'unmanaged', 'when',127 'with'128 ), suffix=r'\b'), Keyword),129 # version 1: assumes that 'file' is the only contextual keyword130 # that is a class modifier131 (r'(file)(\s+)(record|class|abstract|enum|new|sealed|static)\b',132 bygroups(Keyword, Whitespace, Keyword)),133 (r'(global)(::)', bygroups(Keyword, Punctuation)),134 (r'(bool|byte|char|decimal|double|dynamic|float|int|long|object|'135 r'sbyte|short|string|uint|ulong|ushort|var)\b\??', Keyword.Type),136 (r'(class|struct)(\s+)', bygroups(Keyword, Whitespace), 'class'),137 (r'(namespace|using)(\s+)', bygroups(Keyword, Whitespace), 'namespace'),138 (cs_ident, Name),139 ],140 'numbers_int': [141 (r"0[xX][0-9a-fA-F]+(([uU][lL]?)|[lL][uU]?)?", Number.Hex),142 (r"0[bB][01]+(([uU][lL]?)|[lL][uU]?)?", Number.Bin),143 (r"[0-9]+(([uU][lL]?)|[lL][uU]?)?", Number.Integer),144 ],145 'numbers_float': [146 (r"([0-9]+\.[0-9]+([eE][+-]?[0-9]+)?[fFdDmM]?)|"147 r"(\.[0-9]+([eE][+-]?[0-9]+)?[fFdDmM]?)|"148 r"([0-9]+([eE][+-]?[0-9]+)[fFdDmM]?)|"149 r"([0-9]+[fFdDmM])", Number.Float),150 ],151 'numbers': [152 include('numbers_float'),153 include('numbers_int'),154 ],155 'class': [156 (cs_ident, Name.Class, '#pop'),157 default('#pop'),158 ],159 'namespace': [160 (r'(?=\()', Text, '#pop'), # using (resource)161 ('(' + cs_ident + r'|\.)+', Name.Namespace, '#pop'),162 ]163 }164 165 def __init__(self, **options):166 level = get_choice_opt(options, 'unicodelevel', list(self.tokens), 'basic')167 if level not in self._all_tokens:168 # compile the regexes now169 self._tokens = self.__class__.process_tokendef(level)170 else:171 self._tokens = self._all_tokens[level]172 173 RegexLexer.__init__(self, **options)174 175 176class NemerleLexer(RegexLexer):177 """178 For Nemerle source code.179 180 Additional options accepted:181 182 `unicodelevel`183 Determines which Unicode characters this lexer allows for identifiers.184 The possible values are:185 186 * ``none`` -- only the ASCII letters and numbers are allowed. This187 is the fastest selection.188 * ``basic`` -- all Unicode characters from the specification except189 category ``Lo`` are allowed.190 * ``full`` -- all Unicode characters as specified in the C# specs191 are allowed. Note that this means a considerable slowdown since the192 ``Lo`` category has more than 40,000 characters in it!193 194 The default value is ``basic``.195 """196 197 name = 'Nemerle'198 url = 'http://nemerle.org'199 aliases = ['nemerle']200 filenames = ['*.n']201 mimetypes = ['text/x-nemerle'] # inferred202 version_added = '1.5'203 204 flags = re.MULTILINE | re.DOTALL205 206 # for the range of allowed unicode characters in identifiers, see207 # http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf208 209 levels = {210 'none': r'@?[_a-zA-Z]\w*',211 'basic': ('@?[_' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Nl') + ']' +212 '[' + uni.combine('Lu', 'Ll', 'Lt', 'Lm', 'Nl', 'Nd', 'Pc',213 'Cf', 'Mn', 'Mc') + ']*'),214 'full': ('@?(?:_|[^' +215 uni.allexcept('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl') + '])' +216 '[^' + uni.allexcept('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl',217 'Nd', 'Pc', 'Cf', 'Mn', 'Mc') + ']*'),218 }219 220 tokens = {}221 token_variants = True222 223 for levelname, cs_ident in levels.items():224 tokens[levelname] = {225 'root': [226 # method names227 (r'^([ \t]*)((?:' + cs_ident + r'(?:\[\])?\s+)+?)' # return type228 r'(' + cs_ident + ')' # method name229 r'(\s*)(\()', # signature start230 bygroups(Whitespace, using(this), Name.Function, Whitespace, \231 Punctuation)),232 (r'^(\s*)(\[.*?\])', bygroups(Whitespace, Name.Attribute)),233 (r'[^\S\n]+', Whitespace),234 (r'(\\)(\n)', bygroups(Text, Whitespace)), # line continuation235 (r'//.*?\n', Comment.Single),236 (r'/[*].*?[*]/', Comment.Multiline),237 (r'\n', Whitespace),238 (r'(\$)(\s*)(")', bygroups(String, Whitespace, String),239 'splice-string'),240 (r'(\$)(\s*)(<#)', bygroups(String, Whitespace, String),241 'splice-string2'),242 (r'<#', String, 'recursive-string'),243 244 (r'(<\[)(\s*)(' + cs_ident + ':)?',245 bygroups(Keyword, Whitespace, Keyword)),246 (r'\]\>', Keyword),247 248 # quasiquotation only249 (r'\$' + cs_ident, Name),250 (r'(\$)(\()', bygroups(Name, Punctuation),251 'splice-string-content'),252 253 (r'[~!%^&*()+=|\[\]:;,.<>/?-]', Punctuation),254 (r'[{}]', Punctuation),255 (r'@"(""|[^"])*"', String),256 (r'"(\\\\|\\[^\\]|[^"\\\n])*["\n]', String),257 (r"'\\.'|'[^\\]'", String.Char),258 (r"0[xX][0-9a-fA-F]+[Ll]?", Number),259 (r"[0-9](\.[0-9]*)?([eE][+-][0-9]+)?[flFLdD]?", Number),260 (r'(#)([ \t]*)(if|endif|else|elif|define|undef|'261 r'line|error|warning|region|endregion|pragma)\b',262 bygroups(Comment.Preproc, Whitespace, Comment.Preproc), 'preproc'),263 (r'\b(extern)(\s+)(alias)\b', bygroups(Keyword, Whitespace, Keyword)),264 (r'(abstract|and|as|base|catch|def|delegate|'265 r'enum|event|extern|false|finally|'266 r'fun|implements|interface|internal|'267 r'is|macro|match|matches|module|mutable|new|'268 r'null|out|override|params|partial|private|'269 r'protected|public|ref|sealed|static|'270 r'syntax|this|throw|true|try|type|typeof|'271 r'virtual|volatile|when|where|with|'272 r'assert|assert2|async|break|checked|continue|do|else|'273 r'ensures|for|foreach|if|late|lock|new|nolate|'274 r'otherwise|regexp|repeat|requires|return|surroundwith|'275 r'unchecked|unless|using|while|yield)\b', Keyword),276 (r'(global)(::)', bygroups(Keyword, Punctuation)),277 (r'(bool|byte|char|decimal|double|float|int|long|object|sbyte|'278 r'short|string|uint|ulong|ushort|void|array|list)\b\??',279 Keyword.Type),280 (r'(:>?)(\s*)(' + cs_ident + r'\??)',281 bygroups(Punctuation, Whitespace, Keyword.Type)),282 (r'(class|struct|variant|module)(\s+)',283 bygroups(Keyword, Whitespace), 'class'),284 (r'(namespace|using)(\s+)', bygroups(Keyword, Whitespace),285 'namespace'),286 (cs_ident, Name),287 ],288 'class': [289 (cs_ident, Name.Class, '#pop')290 ],291 'preproc': [292 (r'\w+', Comment.Preproc),293 (r'[ \t]+', Whitespace),294 (r'\n', Whitespace, '#pop')295 ],296 'namespace': [297 (r'(?=\()', Text, '#pop'), # using (resource)298 ('(' + cs_ident + r'|\.)+', Name.Namespace, '#pop')299 ],300 'splice-string': [301 (r'[^"$]', String),302 (r'\$' + cs_ident, Name),303 (r'(\$)(\()', bygroups(Name, Punctuation),304 'splice-string-content'),305 (r'\\"', String),306 (r'"', String, '#pop')307 ],308 'splice-string2': [309 (r'[^#<>$]', String),310 (r'\$' + cs_ident, Name),311 (r'(\$)(\()', bygroups(Name, Punctuation),312 'splice-string-content'),313 (r'<#', String, '#push'),314 (r'#>', String, '#pop')315 ],316 'recursive-string': [317 (r'[^#<>]', String),318 (r'<#', String, '#push'),319 (r'#>', String, '#pop')320 ],321 'splice-string-content': [322 (r'if|match', Keyword),323 (r'[~!%^&*+=|\[\]:;,.<>/?-\\"$ ]', Punctuation),324 (cs_ident, Name),325 (r'\d+', Number),326 (r'\(', Punctuation, '#push'),327 (r'\)', Punctuation, '#pop')328 ]329 }330 331 def __init__(self, **options):332 level = get_choice_opt(options, 'unicodelevel', list(self.tokens),333 'basic')334 if level not in self._all_tokens:335 # compile the regexes now336 self._tokens = self.__class__.process_tokendef(level)337 else:338 self._tokens = self._all_tokens[level]339 340 RegexLexer.__init__(self, **options)341 342 def analyse_text(text):343 """Nemerle is quite similar to Python, but @if is relatively uncommon344 elsewhere."""345 result = 0346 347 if '@if' in text:348 result += 0.1349 350 return result351 352 353class BooLexer(RegexLexer):354 """355 For Boo source code.356 """357 358 name = 'Boo'359 url = 'https://github.com/boo-lang/boo'360 aliases = ['boo']361 filenames = ['*.boo']362 mimetypes = ['text/x-boo']363 version_added = ''364 365 tokens = {366 'root': [367 (r'\s+', Whitespace),368 (r'(#|//).*$', Comment.Single),369 (r'/[*]', Comment.Multiline, 'comment'),370 (r'[]{}:(),.;[]', Punctuation),371 (r'(\\)(\n)', bygroups(Text, Whitespace)),372 (r'\\', Text),373 (r'(in|is|and|or|not)\b', Operator.Word),374 (r'/(\\\\|\\[^\\]|[^/\\\s])/', String.Regex),375 (r'@/(\\\\|\\[^\\]|[^/\\])*/', String.Regex),376 (r'=~|!=|==|<<|>>|[-+/*%=<>&^|]', Operator),377 (r'(as|abstract|callable|constructor|destructor|do|import|'378 r'enum|event|final|get|interface|internal|of|override|'379 r'partial|private|protected|public|return|set|static|'380 r'struct|transient|virtual|yield|super|and|break|cast|'381 r'continue|elif|else|ensure|except|for|given|goto|if|in|'382 r'is|isa|not|or|otherwise|pass|raise|ref|try|unless|when|'383 r'while|from|as)\b', Keyword),384 (r'def(?=\s+\(.*?\))', Keyword),385 (r'(def)(\s+)', bygroups(Keyword, Whitespace), 'funcname'),386 (r'(class)(\s+)', bygroups(Keyword, Whitespace), 'classname'),387 (r'(namespace)(\s+)', bygroups(Keyword, Whitespace), 'namespace'),388 (r'(?<!\.)(true|false|null|self|__eval__|__switch__|array|'389 r'assert|checked|enumerate|filter|getter|len|lock|map|'390 r'matrix|max|min|normalArrayIndexing|print|property|range|'391 r'rawArrayIndexing|required|typeof|unchecked|using|'392 r'yieldAll|zip)\b', Name.Builtin),393 (r'"""(\\\\|\\"|.*?)"""', String.Double),394 (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),395 (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),396 (r'[a-zA-Z_]\w*', Name),397 (r'(\d+\.\d*|\d*\.\d+)([fF][+-]?[0-9]+)?', Number.Float),398 (r'[0-9][0-9.]*(ms?|d|h|s)', Number),399 (r'0\d+', Number.Oct),400 (r'0x[a-fA-F0-9]+', Number.Hex),401 (r'\d+L', Number.Integer.Long),402 (r'\d+', Number.Integer),403 ],404 'comment': [405 ('/[*]', Comment.Multiline, '#push'),406 ('[*]/', Comment.Multiline, '#pop'),407 ('[^/*]', Comment.Multiline),408 ('[*/]', Comment.Multiline)409 ],410 'funcname': [411 (r'[a-zA-Z_]\w*', Name.Function, '#pop')412 ],413 'classname': [414 (r'[a-zA-Z_]\w*', Name.Class, '#pop')415 ],416 'namespace': [417 (r'[a-zA-Z_][\w.]*', Name.Namespace, '#pop')418 ]419 }420 421 422class VbNetLexer(RegexLexer):423 """424 For Visual Basic.NET source code.425 Also LibreOffice Basic, OpenOffice Basic, and StarOffice Basic.426 """427 428 name = 'VB.net'429 url = 'https://docs.microsoft.com/en-us/dotnet/visual-basic/'430 aliases = ['vb.net', 'vbnet', 'lobas', 'oobas', 'sobas', 'visual-basic', 'visualbasic']431 filenames = ['*.vb', '*.bas']432 mimetypes = ['text/x-vbnet', 'text/x-vba'] # (?)433 version_added = ''434 435 uni_name = '[_' + uni.combine('Ll', 'Lt', 'Lm', 'Nl') + ']' + \436 '[' + uni.combine('Ll', 'Lt', 'Lm', 'Nl', 'Nd', 'Pc',437 'Cf', 'Mn', 'Mc') + ']*'438 439 flags = re.MULTILINE | re.IGNORECASE440 tokens = {441 'root': [442 (r'^\s*<.*?>', Name.Attribute),443 (r'\s+', Whitespace),444 (r'\n', Whitespace),445 (r'(rem\b.*?)(\n)', bygroups(Comment, Whitespace)),446 (r"('.*?)(\n)", bygroups(Comment, Whitespace)),447 (r'#If\s.*?\sThen|#ElseIf\s.*?\sThen|#Else|#End\s+If|#Const|'448 r'#ExternalSource.*?\n|#End\s+ExternalSource|'449 r'#Region.*?\n|#End\s+Region|#ExternalChecksum',450 Comment.Preproc),451 (r'[(){}!#,.:]', Punctuation),452 (r'(Option)(\s+)(Strict|Explicit|Compare)(\s+)'453 r'(On|Off|Binary|Text)',454 bygroups(Keyword.Declaration, Whitespace, Keyword.Declaration,455 Whitespace, Keyword.Declaration)),456 (words((457 'AddHandler', 'Alias', 'ByRef', 'ByVal', 'Call', 'Case',458 'Catch', 'CBool', 'CByte', 'CChar', 'CDate', 'CDec', 'CDbl',459 'CInt', 'CLng', 'CObj', 'Continue', 'CSByte', 'CShort', 'CSng',460 'CStr', 'CType', 'CUInt', 'CULng', 'CUShort', 'Declare',461 'Default', 'Delegate', 'DirectCast', 'Do', 'Each', 'Else',462 'ElseIf', 'EndIf', 'Erase', 'Error', 'Event', 'Exit', 'False',463 'Finally', 'For', 'Friend', 'Get', 'Global', 'GoSub', 'GoTo',464 'Handles', 'If', 'Implements', 'Inherits', 'Interface', 'Let',465 'Lib', 'Loop', 'Me', 'MustInherit', 'MustOverride', 'MyBase',466 'MyClass', 'Narrowing', 'New', 'Next', 'Not', 'Nothing',467 'NotInheritable', 'NotOverridable', 'Of', 'On', 'Operator',468 'Option', 'Optional', 'Overloads', 'Overridable', 'Overrides',469 'ParamArray', 'Partial', 'Private', 'Protected', 'Public',470 'RaiseEvent', 'ReadOnly', 'ReDim', 'RemoveHandler', 'Resume',471 'Return', 'Select', 'Set', 'Shadows', 'Shared', 'Single',472 'Static', 'Step', 'Stop', 'SyncLock', 'Then', 'Throw', 'To',473 'True', 'Try', 'TryCast', 'Wend', 'Using', 'When', 'While',474 'Widening', 'With', 'WithEvents', 'WriteOnly'),475 prefix=r'(?<!\.)', suffix=r'\b'), Keyword),476 (r'(?<!\.)End\b', Keyword, 'end'),477 (r'(?<!\.)(Dim|Const)\b', Keyword, 'dim'),478 (r'(?<!\.)(Function|Sub|Property)(\s+)',479 bygroups(Keyword, Whitespace), 'funcname'),480 (r'(?<!\.)(Class|Structure|Enum)(\s+)',481 bygroups(Keyword, Whitespace), 'classname'),482 (r'(?<!\.)(Module|Namespace|Imports)(\s+)',483 bygroups(Keyword, Whitespace), 'namespace'),484 (r'(?<!\.)(Boolean|Byte|Char|Date|Decimal|Double|Integer|Long|'485 r'Object|SByte|Short|Single|String|Variant|UInteger|ULong|'486 r'UShort)\b', Keyword.Type),487 (r'(?<!\.)(AddressOf|And|AndAlso|As|GetType|In|Is|IsNot|Like|Mod|'488 r'Or|OrElse|TypeOf|Xor)\b', Operator.Word),489 (r'&=|[*]=|/=|\\=|\^=|\+=|-=|<<=|>>=|<<|>>|:=|'490 r'<=|>=|<>|[-&*/\\^+=<>\[\]]',491 Operator),492 ('"', String, 'string'),493 (r'(_)(\n)', bygroups(Text, Whitespace)), # Line continuation (must be before Name)494 (uni_name + '[%&@!#$]?', Name),495 ('#.*?#', Literal.Date),496 (r'(\d+\.\d*|\d*\.\d+)(F[+-]?[0-9]+)?', Number.Float),497 (r'\d+([SILDFR]|US|UI|UL)?', Number.Integer),498 (r'&H[0-9a-f]+([SILDFR]|US|UI|UL)?', Number.Integer),499 (r'&O[0-7]+([SILDFR]|US|UI|UL)?', Number.Integer),500 ],501 'string': [502 (r'""', String),503 (r'"C?', String, '#pop'),504 (r'[^"]+', String),505 ],506 'dim': [507 (uni_name, Name.Variable, '#pop'),508 default('#pop'), # any other syntax509 ],510 'funcname': [511 (uni_name, Name.Function, '#pop'),512 ],513 'classname': [514 (uni_name, Name.Class, '#pop'),515 ],516 'namespace': [517 (uni_name, Name.Namespace),518 (r'\.', Name.Namespace),519 default('#pop'),520 ],521 'end': [522 (r'\s+', Whitespace),523 (r'(Function|Sub|Property|Class|Structure|Enum|Module|Namespace)\b',524 Keyword, '#pop'),525 default('#pop'),526 ]527 }528 529 def analyse_text(text):530 if re.search(r'^\s*(#If|Module|Namespace)', text, re.MULTILINE):531 return 0.5532 533 534class GenericAspxLexer(RegexLexer):535 """536 Lexer for ASP.NET pages.537 """538 539 name = 'aspx-gen'540 filenames = []541 mimetypes = []542 url = 'https://dotnet.microsoft.com/en-us/apps/aspnet'543 544 flags = re.DOTALL545 546 tokens = {547 'root': [548 (r'(<%[@=#]?)(.*?)(%>)', bygroups(Name.Tag, Other, Name.Tag)),549 (r'(<script.*?>)(.*?)(</script>)', bygroups(using(XmlLexer),550 Other,551 using(XmlLexer))),552 (r'(.+?)(?=<)', using(XmlLexer)),553 (r'.+', using(XmlLexer)),554 ],555 }556 557 558# TODO support multiple languages within the same source file559class CSharpAspxLexer(DelegatingLexer):560 """561 Lexer for highlighting C# within ASP.NET pages.562 """563 564 name = 'aspx-cs'565 aliases = ['aspx-cs']566 filenames = ['*.aspx', '*.asax', '*.ascx', '*.ashx', '*.asmx', '*.axd']567 mimetypes = []568 url = 'https://dotnet.microsoft.com/en-us/apps/aspnet'569 version_added = ''570 571 def __init__(self, **options):572 super().__init__(CSharpLexer, GenericAspxLexer, **options)573 574 def analyse_text(text):575 if re.search(r'Page\s*Language="C#"', text, re.I) is not None:576 return 0.2577 elif re.search(r'script[^>]+language=["\']C#', text, re.I) is not None:578 return 0.15579 580 581class VbNetAspxLexer(DelegatingLexer):582 """583 Lexer for highlighting Visual Basic.net within ASP.NET pages.584 """585 586 name = 'aspx-vb'587 aliases = ['aspx-vb']588 filenames = ['*.aspx', '*.asax', '*.ascx', '*.ashx', '*.asmx', '*.axd']589 mimetypes = []590 url = 'https://dotnet.microsoft.com/en-us/apps/aspnet'591 version_added = ''592 593 def __init__(self, **options):594 super().__init__(VbNetLexer, GenericAspxLexer, **options)595 596 def analyse_text(text):597 if re.search(r'Page\s*Language="Vb"', text, re.I) is not None:598 return 0.2599 elif re.search(r'script[^>]+language=["\']vb', text, re.I) is not None:600 return 0.15601 602 603# Very close to functional.OcamlLexer604class FSharpLexer(RegexLexer):605 """606 For the F# language (version 3.0).607 """608 609 name = 'F#'610 url = 'https://fsharp.org/'611 aliases = ['fsharp', 'f#']612 filenames = ['*.fs', '*.fsi', '*.fsx']613 mimetypes = ['text/x-fsharp']614 version_added = '1.5'615 616 keywords = [617 'abstract', 'as', 'assert', 'base', 'begin', 'class', 'default',618 'delegate', 'do!', 'do', 'done', 'downcast', 'downto', 'elif', 'else',619 'end', 'exception', 'extern', 'false', 'finally', 'for', 'function',620 'fun', 'global', 'if', 'inherit', 'inline', 'interface', 'internal',621 'in', 'lazy', 'let!', 'let', 'match', 'member', 'module', 'mutable',622 'namespace', 'new', 'null', 'of', 'open', 'override', 'private', 'public',623 'rec', 'return!', 'return', 'select', 'static', 'struct', 'then', 'to',624 'true', 'try', 'type', 'upcast', 'use!', 'use', 'val', 'void', 'when',625 'while', 'with', 'yield!', 'yield',626 ]627 # Reserved words; cannot hurt to color them as keywords too.628 keywords += [629 'atomic', 'break', 'checked', 'component', 'const', 'constraint',630 'constructor', 'continue', 'eager', 'event', 'external', 'fixed',631 'functor', 'include', 'method', 'mixin', 'object', 'parallel',632 'process', 'protected', 'pure', 'sealed', 'tailcall', 'trait',633 'virtual', 'volatile',634 ]635 keyopts = [636 '!=', '#', '&&', '&', r'\(', r'\)', r'\*', r'\+', ',', r'-\.',637 '->', '-', r'\.\.', r'\.', '::', ':=', ':>', ':', ';;', ';', '<-',638 r'<\]', '<', r'>\]', '>', r'\?\?', r'\?', r'\[<', r'\[\|', r'\[', r'\]',639 '_', '`', r'\{', r'\|\]', r'\|', r'\}', '~', '<@@', '<@', '=', '@>', '@@>',640 ]641 642 operators = r'[!$%&*+\./:<=>?@^|~-]'643 word_operators = ['and', 'or', 'not']644 prefix_syms = r'[!?~]'645 infix_syms = r'[=<>@^|&+\*/$%-]'646 primitives = [647 'sbyte', 'byte', 'char', 'nativeint', 'unativeint', 'float32', 'single',648 'float', 'double', 'int8', 'uint8', 'int16', 'uint16', 'int32',649 'uint32', 'int64', 'uint64', 'decimal', 'unit', 'bool', 'string',650 'list', 'exn', 'obj', 'enum',651 ]652 653 # See http://msdn.microsoft.com/en-us/library/dd233181.aspx and/or654 # http://fsharp.org/about/files/spec.pdf for reference. Good luck.655 656 tokens = {657 'escape-sequence': [658 (r'\\[\\"\'ntbrafv]', String.Escape),659 (r'\\[0-9]{3}', String.Escape),660 (r'\\u[0-9a-fA-F]{4}', String.Escape),661 (r'\\U[0-9a-fA-F]{8}', String.Escape),662 ],663 'root': [664 (r'\s+', Whitespace),665 (r'\(\)|\[\]', Name.Builtin.Pseudo),666 (r'\b(?<!\.)([A-Z][\w\']*)(?=\s*\.)',667 Name.Namespace, 'dotted'),668 (r'\b([A-Z][\w\']*)', Name),669 (r'(///.*?)(\n)', bygroups(String.Doc, Whitespace)),670 (r'(//.*?)(\n)', bygroups(Comment.Single, Whitespace)),671 (r'\(\*(?!\))', Comment, 'comment'),672 673 (r'@"', String, 'lstring'),674 (r'"""', String, 'tqs'),675 (r'"', String, 'string'),676 677 (r'\b(open|module)(\s+)([\w.]+)',678 bygroups(Keyword, Whitespace, Name.Namespace)),679 (r'\b(let!?)(\s+)(\w+)',680 bygroups(Keyword, Whitespace, Name.Variable)),681 (r'\b(type)(\s+)(\w+)',682 bygroups(Keyword, Whitespace, Name.Class)),683 (r'\b(member|override)(\s+)(\w+)(\.)(\w+)',684 bygroups(Keyword, Whitespace, Name, Punctuation, Name.Function)),685 (r'\b({})\b'.format('|'.join(keywords)), Keyword),686 (r'``([^`\n\r\t]|`[^`\n\r\t])+``', Name),687 (r'({})'.format('|'.join(keyopts)), Operator),688 (rf'({infix_syms}|{prefix_syms})?{operators}', Operator),689 (r'\b({})\b'.format('|'.join(word_operators)), Operator.Word),690 (r'\b({})\b'.format('|'.join(primitives)), Keyword.Type),691 (r'(#)([ \t]*)(if|endif|else|line|nowarn|light|\d+)\b(.*?)(\n)',692 bygroups(Comment.Preproc, Whitespace, Comment.Preproc,693 Comment.Preproc, Whitespace)),694 695 (r"[^\W\d][\w']*", Name),696 697 (r'\d[\d_]*[uU]?[yslLnQRZINGmM]?', Number.Integer),698 (r'0[xX][\da-fA-F][\da-fA-F_]*[uU]?[yslLn]?[fF]?', Number.Hex),699 (r'0[oO][0-7][0-7_]*[uU]?[yslLn]?', Number.Oct),700 (r'0[bB][01][01_]*[uU]?[yslLn]?', Number.Bin),701 (r'-?\d[\d_]*(.[\d_]*)?([eE][+\-]?\d[\d_]*)[fFmM]?',702 Number.Float),703 704 (r"'(?:(\\[\\\"'ntbr ])|(\\[0-9]{3})|(\\x[0-9a-fA-F]{2}))'B?",705 String.Char),706 (r"'.'", String.Char),707 (r"'", Keyword), # a stray quote is another syntax element708 709 (r'@?"', String.Double, 'string'),710 711 (r'[~?][a-z][\w\']*:', Name.Variable),712 ],713 'dotted': [714 (r'\s+', Whitespace),715 (r'\.', Punctuation),716 (r'[A-Z][\w\']*(?=\s*\.)', Name.Namespace),717 (r'[A-Z][\w\']*', Name, '#pop'),718 (r'[a-z_][\w\']*', Name, '#pop'),719 # e.g. dictionary index access720 default('#pop'),721 ],722 'comment': [723 (r'[^(*)@"]+', Comment),724 (r'\(\*', Comment, '#push'),725 (r'\*\)', Comment, '#pop'),726 # comments cannot be closed within strings in comments727 (r'@"', String, 'lstring'),728 (r'"""', String, 'tqs'),729 (r'"', String, 'string'),730 (r'[(*)@]', Comment),731 ],732 'string': [733 (r'[^\\"]+', String),734 include('escape-sequence'),735 (r'\\\n', String),736 (r'\n', String), # newlines are allowed in any string737 (r'"B?', String, '#pop'),738 ],739 'lstring': [740 (r'[^"]+', String),741 (r'\n', String),742 (r'""', String),743 (r'"B?', String, '#pop'),744 ],745 'tqs': [746 (r'[^"]+', String),747 (r'\n', String),748 (r'"""B?', String, '#pop'),749 (r'"', String),750 ],751 }752 753 def analyse_text(text):754 """F# doesn't have that many unique features -- |> and <| are weak755 indicators."""756 result = 0757 if '|>' in text:758 result += 0.05759 if '<|' in text:760 result += 0.05761 762 return result763 764 765class XppLexer(RegexLexer):766 767 """768 For X++ source code. This is based loosely on the CSharpLexer769 """770 771 name = 'X++'772 url = 'https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/dev-ref/xpp-language-reference'773 aliases = ['xpp', 'x++']774 filenames = ['*.xpp']775 version_added = '2.15'776 777 flags = re.MULTILINE778 779 XPP_CHARS = ('@?(?:_|[^' +780 uni.allexcept('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl') + '])' +781 '[^' + uni.allexcept('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl',782 'Nd', 'Pc', 'Cf', 'Mn', 'Mc') + ']*')783 # Temporary, see784 # https://github.com/thatch/regexlint/pull/49785 XPP_CHARS = XPP_CHARS.replace('\x00', '\x01')786 787 OPERATORS = (788 '<=', '>=', '+=', '-=', '*=', '/=', '!=', '==',789 '&&', '||', '>>', '<<', '++', '--', '+', '-', '*',790 '/', '%', '&', '|', '^', '<', '>', '?', '!', '~', '=',791 )792 KEYWORDS = ('abstract','anytype','as','async','asc','at','avg','break','breakpoint','by','byref','case','catch',793 'changecompany','client','container','continue','count','crosscompany','default','delegate',794 'delete_from','desc','display','div','do','edit','else','element','eventhandler','exists','false','final',795 'firstfast','firstonly','firstonly10','firstonly100','firstonly1000','flush','for','forceliterals',796 'forcenestedloop','forceplaceholders','forceselectorder','forupdate','from','group','if','insert_recordset',797 'interface','is','join','like','maxof','minof','mod','new','next','nofetch','notexists','null','optimisticlock','order',798 'outer','pause','pessimisticlock','print','private','protected','public','repeatableread','retry','return',799 'reverse','select','server','setting','static','sum','super','switch','tablelock','this','throw','true','try','ttsabort','ttsbegin',800 'ttscommit','update_recordset','validtimestate','void','where','while','window')801 RUNTIME_FUNCTIONS = ('_duration','abs','acos','any2Date','any2Enum','any2Guid','any2Int','any2Int64','any2Real','any2Str','anytodate',802 'anytoenum','anytoguid','anytoint','anytoint64','anytoreal','anytostr','asin','atan','beep','cTerm','char2Num','classIdGet',803 'corrFlagGet','corrFlagSet','cos','cosh','curExt','curUserId','date2Num','date2Str','datetime2Str','dayName','dayOfMth',804 'dayOfWk','dayOfYr','ddb','decRound','dg','dimOf','endMth','enum2str','exp','exp10','fV','fieldId2Name','fieldId2PName',805 'fieldName2Id','frac','funcName','getCurrentPartition','getCurrentPartitionRecId','getPrefix','guid2Str','idg','indexId2Name',806 'indexName2Id','int2Str','int642Str','intvMax','intvName','intvNo','intvNorm','log10','logN','match','max','min','mkDate','mthName',807 'mthOfYr','newGuid','nextMth','nextQtr','nextYr','num2Char','num2Date','num2Str','pmt','power','prevMth','prevQtr','prevYr',808 'prmIsDefault','pt','pv','rate','refPrintAll','round','runAs','sessionId','setPrefix','sin','sinh','sleep','sln','str2Date',809 'str2Datetime','str2Enum','str2Guid','str2Int','str2Int64','str2Num','str2Time','strAlpha','strCmp','strColSeq','strDel',810 'strFind','strFmt','strIns','strKeep','strLTrim','strLen','strLine','strLwr','strNFind','strPoke','strPrompt','strRTrim',811 'strRem','strRep','strScan','strUpr','subStr','syd','systemDateGet','systemDateSet','tableId2Name',812 'tableId2PName','tableName2Id','tan','tanh','term','time2Str','timeNow','today','trunc','typeOf','uint2Str','wkOfYr','year')813 COMPILE_FUNCTIONS = ('attributeStr','classNum','classStr','configurationKeyNum','configurationKeyStr','dataEntityDataSourceStr','delegateStr',814 'dimensionHierarchyLevelStr','dimensionHierarchyStr','dimensionReferenceStr','dutyStr','enumCnt','enumLiteralStr','enumNum','enumStr',815 'extendedTypeNum','extendedTypeStr','fieldNum','fieldPName','fieldStr','formControlStr','formDataFieldStr','formDataSourceStr',816 'formMethodStr','formStr','identifierStr','indexNum','indexStr','licenseCodeNum','licenseCodeStr','literalStr','maxDate','maxInt',817 'measureStr','measurementStr','menuItemActionStr','menuItemDisplayStr','menuItemOutputStr','menuStr','methodStr','minInt','privilegeStr',818 'queryDatasourceStr','queryMethodStr','queryStr','reportStr','resourceStr','roleStr','ssrsReportStr','staticDelegateStr','staticMethodStr',819 'tableCollectionStr','tableFieldGroupStr','tableMethodStr','tableNum','tablePName','tableStaticMethodStr','tableStr','tileStr','varStr',820 'webActionItemStr','webDisplayContentItemStr','webFormStr','webMenuStr','webOutputContentItemStr','webReportStr','webSiteTempStr',821 'webStaticFileStr','webUrlItemStr','webWebPartStr','webletItemStr','webpageDefStr','websiteDefStr','workflowApprovalStr',822 'workflowCategoryStr','workflowTaskStr','workflowTypeStr')823 824 tokens = {}825 826 tokens = {827 'root': [828 # method names829 (r'(\s*)\b(else|if)\b([^\n])', bygroups(Whitespace, Keyword, using(this))), # ensure that if is not treated like a function830 (r'^([ \t]*)((?:' + XPP_CHARS + r'(?:\[\])?\s+)+?)' # return type831 r'(' + XPP_CHARS + ')' # method name832 r'(\s*)(\()', # signature start833 bygroups(Whitespace, using(this), Name.Function, Whitespace,834 Punctuation)),835 (r'^(\s*)(\[)([^\n]*?)(\])', bygroups(Whitespace, Name.Attribute, Name.Variable.Class, Name.Attribute)),836 (r'[^\S\n]+', Whitespace),837 (r'(\\)(\n)', bygroups(Text, Whitespace)), # line continuation838 (r'//[^\n]*?\n', Comment.Single),839 (r'/[*][^\n]*?[*]/', Comment.Multiline),840 (r'\n', Whitespace),841 (words(OPERATORS), Operator),842 (r'=~|!=|==|<<|>>|[-+/*%=<>&^|]', Operator),843 (r'[()\[\];:,.#@]', Punctuation),844 (r'[{}]', Punctuation),845 (r'@"(""|[^"])*"', String),846 (r'\$?"(\\\\|\\[^\\]|[^"\\\n])*["\n]', String),847 (r"'\\.'|'[^\\]'", String.Char),848 (r"[0-9]+(\.[0-9]*)?([eE][+-][0-9]+)?"849 r"[flFLdD]?|0[xX][0-9a-fA-F]+[Ll]?", Number),850 (words(KEYWORDS, suffix=r'\b'), Keyword),851 (r'(boolean|int|int64|str|real|guid|date)\b\??', Keyword.Type),852 (r'(class|struct|extends|implements)(\s+)', bygroups(Keyword, Whitespace), 'class'),853 (r'('+XPP_CHARS+')(::)', bygroups(Name.Variable.Class, Punctuation)),854 (r'(\s*)(\w+)(\s+\w+(,|=)?[^\n]*;)', bygroups(Whitespace, Name.Variable.Class, using(this))), # declaration855 # x++ specific function to get field should highlight the classname856 (r'(fieldNum\()('+XPP_CHARS+r')(\s*,\s*)('+XPP_CHARS+r')(\s*\))',857 bygroups(using(this), Name.Variable.Class, using(this), Name.Property, using(this))),858 # x++ specific function to get table should highlight the classname859 (r'(tableNum\()('+XPP_CHARS+r')(\s*\))',860 bygroups(using(this), Name.Variable.Class, using(this))),861 (words(RUNTIME_FUNCTIONS, suffix=r'(?=\()'), Name.Function.Magic),862 (words(COMPILE_FUNCTIONS, suffix=r'(?=\()'), Name.Function.Magic),863 (XPP_CHARS, Name),864 ],865 'class': [866 (XPP_CHARS, Name.Class, '#pop'),867 default('#pop'),868 ],869 'namespace': [870 (r'(?=\()', Text, '#pop'), # using (resource)871 ('(' + XPP_CHARS + r'|\.)+', Name.Namespace, '#pop'),872 ]873 }874 