codekingpro/portable-devtools
114k
1"""2 pygments.lexers.pascal3 ~~~~~~~~~~~~~~~~~~~~~~4 5 Lexers for Pascal family languages.6 7 :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS.8 :license: BSD, see LICENSE for details.9"""10 11import re12 13from pygments.lexer import Lexer14from pygments.util import get_bool_opt, get_list_opt15from pygments.token import Comment, Operator, Keyword, Name, String, \16 Number, Punctuation, Error, Whitespace17from pygments.scanner import Scanner18 19# compatibility import20from pygments.lexers.modula2 import Modula2Lexer # noqa: F40121 22__all__ = ['DelphiLexer', 'PortugolLexer']23 24 25class PortugolLexer(Lexer):26 """For Portugol, a Pascal dialect with keywords in Portuguese."""27 name = 'Portugol'28 aliases = ['portugol']29 filenames = ['*.alg', '*.portugol']30 mimetypes = []31 url = "https://www.apoioinformatica.inf.br/produtos/visualg/linguagem"32 version_added = ''33 34 def __init__(self, **options):35 Lexer.__init__(self, **options)36 self.lexer = DelphiLexer(**options, portugol=True)37 38 def get_tokens_unprocessed(self, text):39 return self.lexer.get_tokens_unprocessed(text)40 41 42class DelphiLexer(Lexer):43 """44 For Delphi (Borland Object Pascal),45 Turbo Pascal and Free Pascal source code.46 47 Additional options accepted:48 49 `turbopascal`50 Highlight Turbo Pascal specific keywords (default: ``True``).51 `delphi`52 Highlight Borland Delphi specific keywords (default: ``True``).53 `freepascal`54 Highlight Free Pascal specific keywords (default: ``True``).55 `units`56 A list of units that should be considered builtin, supported are57 ``System``, ``SysUtils``, ``Classes`` and ``Math``.58 Default is to consider all of them builtin.59 """60 name = 'Delphi'61 aliases = ['delphi', 'pas', 'pascal', 'objectpascal']62 filenames = ['*.pas', '*.dpr']63 mimetypes = ['text/x-pascal']64 url = 'https://www.embarcadero.com/products/delphi'65 version_added = ''66 67 TURBO_PASCAL_KEYWORDS = (68 'absolute', 'and', 'array', 'asm', 'begin', 'break', 'case',69 'const', 'constructor', 'continue', 'destructor', 'div', 'do',70 'downto', 'else', 'end', 'file', 'for', 'function', 'goto',71 'if', 'implementation', 'in', 'inherited', 'inline', 'interface',72 'label', 'mod', 'nil', 'not', 'object', 'of', 'on', 'operator',73 'or', 'packed', 'procedure', 'program', 'record', 'reintroduce',74 'repeat', 'self', 'set', 'shl', 'shr', 'string', 'then', 'to',75 'type', 'unit', 'until', 'uses', 'var', 'while', 'with', 'xor'76 )77 78 DELPHI_KEYWORDS = (79 'as', 'class', 'except', 'exports', 'finalization', 'finally',80 'initialization', 'is', 'library', 'on', 'property', 'raise',81 'threadvar', 'try'82 )83 84 FREE_PASCAL_KEYWORDS = (85 'dispose', 'exit', 'false', 'new', 'true'86 )87 88 BLOCK_KEYWORDS = {89 'begin', 'class', 'const', 'constructor', 'destructor', 'end',90 'finalization', 'function', 'implementation', 'initialization',91 'label', 'library', 'operator', 'procedure', 'program', 'property',92 'record', 'threadvar', 'type', 'unit', 'uses', 'var'93 }94 95 FUNCTION_MODIFIERS = {96 'alias', 'cdecl', 'export', 'inline', 'interrupt', 'nostackframe',97 'pascal', 'register', 'safecall', 'softfloat', 'stdcall',98 'varargs', 'name', 'dynamic', 'near', 'virtual', 'external',99 'override', 'assembler'100 }101 102 # XXX: those aren't global. but currently we know no way for defining103 # them just for the type context.104 DIRECTIVES = {105 'absolute', 'abstract', 'assembler', 'cppdecl', 'default', 'far',106 'far16', 'forward', 'index', 'oldfpccall', 'private', 'protected',107 'published', 'public'108 }109 110 BUILTIN_TYPES = {111 'ansichar', 'ansistring', 'bool', 'boolean', 'byte', 'bytebool',112 'cardinal', 'char', 'comp', 'currency', 'double', 'dword',113 'extended', 'int64', 'integer', 'iunknown', 'longbool', 'longint',114 'longword', 'pansichar', 'pansistring', 'pbool', 'pboolean',115 'pbyte', 'pbytearray', 'pcardinal', 'pchar', 'pcomp', 'pcurrency',116 'pdate', 'pdatetime', 'pdouble', 'pdword', 'pextended', 'phandle',117 'pint64', 'pinteger', 'plongint', 'plongword', 'pointer',118 'ppointer', 'pshortint', 'pshortstring', 'psingle', 'psmallint',119 'pstring', 'pvariant', 'pwidechar', 'pwidestring', 'pword',120 'pwordarray', 'pwordbool', 'real', 'real48', 'shortint',121 'shortstring', 'single', 'smallint', 'string', 'tclass', 'tdate',122 'tdatetime', 'textfile', 'thandle', 'tobject', 'ttime', 'variant',123 'widechar', 'widestring', 'word', 'wordbool'124 }125 126 BUILTIN_UNITS = {127 'System': (128 'abs', 'acquireexceptionobject', 'addr', 'ansitoutf8',129 'append', 'arctan', 'assert', 'assigned', 'assignfile',130 'beginthread', 'blockread', 'blockwrite', 'break', 'chdir',131 'chr', 'close', 'closefile', 'comptocurrency', 'comptodouble',132 'concat', 'continue', 'copy', 'cos', 'dec', 'delete',133 'dispose', 'doubletocomp', 'endthread', 'enummodules',134 'enumresourcemodules', 'eof', 'eoln', 'erase', 'exceptaddr',135 'exceptobject', 'exclude', 'exit', 'exp', 'filepos', 'filesize',136 'fillchar', 'finalize', 'findclasshinstance', 'findhinstance',137 'findresourcehinstance', 'flush', 'frac', 'freemem',138 'get8087cw', 'getdir', 'getlasterror', 'getmem',139 'getmemorymanager', 'getmodulefilename', 'getvariantmanager',140 'halt', 'hi', 'high', 'inc', 'include', 'initialize', 'insert',141 'int', 'ioresult', 'ismemorymanagerset', 'isvariantmanagerset',142 'length', 'ln', 'lo', 'low', 'mkdir', 'move', 'new', 'odd',143 'olestrtostring', 'olestrtostrvar', 'ord', 'paramcount',144 'paramstr', 'pi', 'pos', 'pred', 'ptr', 'pucs4chars', 'random',145 'randomize', 'read', 'readln', 'reallocmem',146 'releaseexceptionobject', 'rename', 'reset', 'rewrite', 'rmdir',147 'round', 'runerror', 'seek', 'seekeof', 'seekeoln',148 'set8087cw', 'setlength', 'setlinebreakstyle',149 'setmemorymanager', 'setstring', 'settextbuf',150 'setvariantmanager', 'sin', 'sizeof', 'slice', 'sqr', 'sqrt',151 'str', 'stringofchar', 'stringtoolestr', 'stringtowidechar',152 'succ', 'swap', 'trunc', 'truncate', 'typeinfo',153 'ucs4stringtowidestring', 'unicodetoutf8', 'uniquestring',154 'upcase', 'utf8decode', 'utf8encode', 'utf8toansi',155 'utf8tounicode', 'val', 'vararrayredim', 'varclear',156 'widecharlentostring', 'widecharlentostrvar',157 'widechartostring', 'widechartostrvar',158 'widestringtoucs4string', 'write', 'writeln'159 ),160 'SysUtils': (161 'abort', 'addexitproc', 'addterminateproc', 'adjustlinebreaks',162 'allocmem', 'ansicomparefilename', 'ansicomparestr',163 'ansicomparetext', 'ansidequotedstr', 'ansiextractquotedstr',164 'ansilastchar', 'ansilowercase', 'ansilowercasefilename',165 'ansipos', 'ansiquotedstr', 'ansisamestr', 'ansisametext',166 'ansistrcomp', 'ansistricomp', 'ansistrlastchar', 'ansistrlcomp',167 'ansistrlicomp', 'ansistrlower', 'ansistrpos', 'ansistrrscan',168 'ansistrscan', 'ansistrupper', 'ansiuppercase',169 'ansiuppercasefilename', 'appendstr', 'assignstr', 'beep',170 'booltostr', 'bytetocharindex', 'bytetocharlen', 'bytetype',171 'callterminateprocs', 'changefileext', 'charlength',172 'chartobyteindex', 'chartobytelen', 'comparemem', 'comparestr',173 'comparetext', 'createdir', 'createguid', 'currentyear',174 'currtostr', 'currtostrf', 'date', 'datetimetofiledate',175 'datetimetostr', 'datetimetostring', 'datetimetosystemtime',176 'datetimetotimestamp', 'datetostr', 'dayofweek', 'decodedate',177 'decodedatefully', 'decodetime', 'deletefile', 'directoryexists',178 'diskfree', 'disksize', 'disposestr', 'encodedate', 'encodetime',179 'exceptionerrormessage', 'excludetrailingbackslash',180 'excludetrailingpathdelimiter', 'expandfilename',181 'expandfilenamecase', 'expanduncfilename', 'extractfiledir',182 'extractfiledrive', 'extractfileext', 'extractfilename',183 'extractfilepath', 'extractrelativepath', 'extractshortpathname',184 'fileage', 'fileclose', 'filecreate', 'filedatetodatetime',185 'fileexists', 'filegetattr', 'filegetdate', 'fileisreadonly',186 'fileopen', 'fileread', 'filesearch', 'fileseek', 'filesetattr',187 'filesetdate', 'filesetreadonly', 'filewrite', 'finalizepackage',188 'findclose', 'findcmdlineswitch', 'findfirst', 'findnext',189 'floattocurr', 'floattodatetime', 'floattodecimal', 'floattostr',190 'floattostrf', 'floattotext', 'floattotextfmt', 'fmtloadstr',191 'fmtstr', 'forcedirectories', 'format', 'formatbuf', 'formatcurr',192 'formatdatetime', 'formatfloat', 'freeandnil', 'getcurrentdir',193 'getenvironmentvariable', 'getfileversion', 'getformatsettings',194 'getlocaleformatsettings', 'getmodulename', 'getpackagedescription',195 'getpackageinfo', 'gettime', 'guidtostring', 'incamonth',196 'includetrailingbackslash', 'includetrailingpathdelimiter',197 'incmonth', 'initializepackage', 'interlockeddecrement',198 'interlockedexchange', 'interlockedexchangeadd',199 'interlockedincrement', 'inttohex', 'inttostr', 'isdelimiter',200 'isequalguid', 'isleapyear', 'ispathdelimiter', 'isvalidident',201 'languages', 'lastdelimiter', 'loadpackage', 'loadstr',202 'lowercase', 'msecstotimestamp', 'newstr', 'nextcharindex', 'now',203 'outofmemoryerror', 'quotedstr', 'raiselastoserror',204 'raiselastwin32error', 'removedir', 'renamefile', 'replacedate',205 'replacetime', 'safeloadlibrary', 'samefilename', 'sametext',206 'setcurrentdir', 'showexception', 'sleep', 'stralloc', 'strbufsize',207 'strbytetype', 'strcat', 'strcharlength', 'strcomp', 'strcopy',208 'strdispose', 'strecopy', 'strend', 'strfmt', 'stricomp',209 'stringreplace', 'stringtoguid', 'strlcat', 'strlcomp', 'strlcopy',210 'strlen', 'strlfmt', 'strlicomp', 'strlower', 'strmove', 'strnew',211 'strnextchar', 'strpas', 'strpcopy', 'strplcopy', 'strpos',212 'strrscan', 'strscan', 'strtobool', 'strtobooldef', 'strtocurr',213 'strtocurrdef', 'strtodate', 'strtodatedef', 'strtodatetime',214 'strtodatetimedef', 'strtofloat', 'strtofloatdef', 'strtoint',215 'strtoint64', 'strtoint64def', 'strtointdef', 'strtotime',216 'strtotimedef', 'strupper', 'supports', 'syserrormessage',217 'systemtimetodatetime', 'texttofloat', 'time', 'timestamptodatetime',218 'timestamptomsecs', 'timetostr', 'trim', 'trimleft', 'trimright',219 'tryencodedate', 'tryencodetime', 'tryfloattocurr', 'tryfloattodatetime',220 'trystrtobool', 'trystrtocurr', 'trystrtodate', 'trystrtodatetime',221 'trystrtofloat', 'trystrtoint', 'trystrtoint64', 'trystrtotime',222 'unloadpackage', 'uppercase', 'widecomparestr', 'widecomparetext',223 'widefmtstr', 'wideformat', 'wideformatbuf', 'widelowercase',224 'widesamestr', 'widesametext', 'wideuppercase', 'win32check',225 'wraptext'226 ),227 'Classes': (228 'activateclassgroup', 'allocatehwnd', 'bintohex', 'checksynchronize',229 'collectionsequal', 'countgenerations', 'deallocatehwnd', 'equalrect',230 'extractstrings', 'findclass', 'findglobalcomponent', 'getclass',231 'groupdescendantswith', 'hextobin', 'identtoint',232 'initinheritedcomponent', 'inttoident', 'invalidpoint',233 'isuniqueglobalcomponentname', 'linestart', 'objectbinarytotext',234 'objectresourcetotext', 'objecttexttobinary', 'objecttexttoresource',235 'pointsequal', 'readcomponentres', 'readcomponentresex',236 'readcomponentresfile', 'rect', 'registerclass', 'registerclassalias',237 'registerclasses', 'registercomponents', 'registerintegerconsts',238 'registernoicon', 'registernonactivex', 'smallpoint', 'startclassgroup',239 'teststreamformat', 'unregisterclass', 'unregisterclasses',240 'unregisterintegerconsts', 'unregistermoduleclasses',241 'writecomponentresfile'242 ),243 'Math': (244 'arccos', 'arccosh', 'arccot', 'arccoth', 'arccsc', 'arccsch', 'arcsec',245 'arcsech', 'arcsin', 'arcsinh', 'arctan2', 'arctanh', 'ceil',246 'comparevalue', 'cosecant', 'cosh', 'cot', 'cotan', 'coth', 'csc',247 'csch', 'cycletodeg', 'cycletograd', 'cycletorad', 'degtocycle',248 'degtograd', 'degtorad', 'divmod', 'doubledecliningbalance',249 'ensurerange', 'floor', 'frexp', 'futurevalue', 'getexceptionmask',250 'getprecisionmode', 'getroundmode', 'gradtocycle', 'gradtodeg',251 'gradtorad', 'hypot', 'inrange', 'interestpayment', 'interestrate',252 'internalrateofreturn', 'intpower', 'isinfinite', 'isnan', 'iszero',253 'ldexp', 'lnxp1', 'log10', 'log2', 'logn', 'max', 'maxintvalue',254 'maxvalue', 'mean', 'meanandstddev', 'min', 'minintvalue', 'minvalue',255 'momentskewkurtosis', 'netpresentvalue', 'norm', 'numberofperiods',256 'payment', 'periodpayment', 'poly', 'popnstddev', 'popnvariance',257 'power', 'presentvalue', 'radtocycle', 'radtodeg', 'radtograd',258 'randg', 'randomrange', 'roundto', 'samevalue', 'sec', 'secant',259 'sech', 'setexceptionmask', 'setprecisionmode', 'setroundmode',260 'sign', 'simpleroundto', 'sincos', 'sinh', 'slndepreciation', 'stddev',261 'sum', 'sumint', 'sumofsquares', 'sumsandsquares', 'syddepreciation',262 'tan', 'tanh', 'totalvariance', 'variance'263 )264 }265 266 ASM_REGISTERS = {267 'ah', 'al', 'ax', 'bh', 'bl', 'bp', 'bx', 'ch', 'cl', 'cr0',268 'cr1', 'cr2', 'cr3', 'cr4', 'cs', 'cx', 'dh', 'di', 'dl', 'dr0',269 'dr1', 'dr2', 'dr3', 'dr4', 'dr5', 'dr6', 'dr7', 'ds', 'dx',270 'eax', 'ebp', 'ebx', 'ecx', 'edi', 'edx', 'es', 'esi', 'esp',271 'fs', 'gs', 'mm0', 'mm1', 'mm2', 'mm3', 'mm4', 'mm5', 'mm6',272 'mm7', 'si', 'sp', 'ss', 'st0', 'st1', 'st2', 'st3', 'st4', 'st5',273 'st6', 'st7', 'xmm0', 'xmm1', 'xmm2', 'xmm3', 'xmm4', 'xmm5',274 'xmm6', 'xmm7'275 }276 277 ASM_INSTRUCTIONS = {278 'aaa', 'aad', 'aam', 'aas', 'adc', 'add', 'and', 'arpl', 'bound',279 'bsf', 'bsr', 'bswap', 'bt', 'btc', 'btr', 'bts', 'call', 'cbw',280 'cdq', 'clc', 'cld', 'cli', 'clts', 'cmc', 'cmova', 'cmovae',281 'cmovb', 'cmovbe', 'cmovc', 'cmovcxz', 'cmove', 'cmovg',282 'cmovge', 'cmovl', 'cmovle', 'cmovna', 'cmovnae', 'cmovnb',283 'cmovnbe', 'cmovnc', 'cmovne', 'cmovng', 'cmovnge', 'cmovnl',284 'cmovnle', 'cmovno', 'cmovnp', 'cmovns', 'cmovnz', 'cmovo',285 'cmovp', 'cmovpe', 'cmovpo', 'cmovs', 'cmovz', 'cmp', 'cmpsb',286 'cmpsd', 'cmpsw', 'cmpxchg', 'cmpxchg486', 'cmpxchg8b', 'cpuid',287 'cwd', 'cwde', 'daa', 'das', 'dec', 'div', 'emms', 'enter', 'hlt',288 'ibts', 'icebp', 'idiv', 'imul', 'in', 'inc', 'insb', 'insd',289 'insw', 'int', 'int01', 'int03', 'int1', 'int3', 'into', 'invd',290 'invlpg', 'iret', 'iretd', 'iretw', 'ja', 'jae', 'jb', 'jbe',291 'jc', 'jcxz', 'jcxz', 'je', 'jecxz', 'jg', 'jge', 'jl', 'jle',292 'jmp', 'jna', 'jnae', 'jnb', 'jnbe', 'jnc', 'jne', 'jng', 'jnge',293 'jnl', 'jnle', 'jno', 'jnp', 'jns', 'jnz', 'jo', 'jp', 'jpe',294 'jpo', 'js', 'jz', 'lahf', 'lar', 'lcall', 'lds', 'lea', 'leave',295 'les', 'lfs', 'lgdt', 'lgs', 'lidt', 'ljmp', 'lldt', 'lmsw',296 'loadall', 'loadall286', 'lock', 'lodsb', 'lodsd', 'lodsw',297 'loop', 'loope', 'loopne', 'loopnz', 'loopz', 'lsl', 'lss', 'ltr',298 'mov', 'movd', 'movq', 'movsb', 'movsd', 'movsw', 'movsx',299 'movzx', 'mul', 'neg', 'nop', 'not', 'or', 'out', 'outsb', 'outsd',300 'outsw', 'pop', 'popa', 'popad', 'popaw', 'popf', 'popfd', 'popfw',301 'push', 'pusha', 'pushad', 'pushaw', 'pushf', 'pushfd', 'pushfw',302 'rcl', 'rcr', 'rdmsr', 'rdpmc', 'rdshr', 'rdtsc', 'rep', 'repe',303 'repne', 'repnz', 'repz', 'ret', 'retf', 'retn', 'rol', 'ror',304 'rsdc', 'rsldt', 'rsm', 'sahf', 'sal', 'salc', 'sar', 'sbb',305 'scasb', 'scasd', 'scasw', 'seta', 'setae', 'setb', 'setbe',306 'setc', 'setcxz', 'sete', 'setg', 'setge', 'setl', 'setle',307 'setna', 'setnae', 'setnb', 'setnbe', 'setnc', 'setne', 'setng',308 'setnge', 'setnl', 'setnle', 'setno', 'setnp', 'setns', 'setnz',309 'seto', 'setp', 'setpe', 'setpo', 'sets', 'setz', 'sgdt', 'shl',310 'shld', 'shr', 'shrd', 'sidt', 'sldt', 'smi', 'smint', 'smintold',311 'smsw', 'stc', 'std', 'sti', 'stosb', 'stosd', 'stosw', 'str',312 'sub', 'svdc', 'svldt', 'svts', 'syscall', 'sysenter', 'sysexit',313 'sysret', 'test', 'ud1', 'ud2', 'umov', 'verr', 'verw', 'wait',314 'wbinvd', 'wrmsr', 'wrshr', 'xadd', 'xbts', 'xchg', 'xlat',315 'xlatb', 'xor'316 }317 318 PORTUGOL_KEYWORDS = (319 'aleatorio',320 'algoritmo',321 'arquivo',322 'ate',323 'caso',324 'cronometro',325 'debug',326 'e',327 'eco',328 'enquanto',329 'entao',330 'escolha',331 'escreva',332 'escreval',333 'faca',334 'falso',335 'fimalgoritmo',336 'fimenquanto',337 'fimescolha',338 'fimfuncao',339 'fimpara',340 'fimprocedimento',341 'fimrepita',342 'fimse',343 'funcao',344 'inicio',345 'int',346 'interrompa',347 'leia',348 'limpatela',349 'mod',350 'nao',351 'ou',352 'outrocaso',353 'para',354 'passo',355 'pausa',356 'procedimento',357 'repita',358 'retorne',359 'se',360 'senao',361 'timer',362 'var',363 'vetor',364 'verdadeiro',365 'xou',366 'div',367 'mod',368 'abs',369 'arccos',370 'arcsen',371 'arctan',372 'cos',373 'cotan',374 'Exp',375 'grauprad',376 'int',377 'log',378 'logn',379 'pi',380 'quad',381 'radpgrau',382 'raizq',383 'rand',384 'randi',385 'sen',386 'Tan',387 'asc',388 'carac',389 'caracpnum',390 'compr',391 'copia',392 'maiusc',393 'minusc',394 'numpcarac',395 'pos',396 )397 398 PORTUGOL_BUILTIN_TYPES = {399 'inteiro', 'real', 'caractere', 'logico'400 }401 402 def __init__(self, **options):403 Lexer.__init__(self, **options)404 self.keywords = set()405 self.builtins = set()406 if get_bool_opt(options, 'portugol', False):407 self.keywords.update(self.PORTUGOL_KEYWORDS)408 self.builtins.update(self.PORTUGOL_BUILTIN_TYPES)409 self.is_portugol = True410 else:411 self.is_portugol = False412 413 if get_bool_opt(options, 'turbopascal', True):414 self.keywords.update(self.TURBO_PASCAL_KEYWORDS)415 if get_bool_opt(options, 'delphi', True):416 self.keywords.update(self.DELPHI_KEYWORDS)417 if get_bool_opt(options, 'freepascal', True):418 self.keywords.update(self.FREE_PASCAL_KEYWORDS)419 for unit in get_list_opt(options, 'units', list(self.BUILTIN_UNITS)):420 self.builtins.update(self.BUILTIN_UNITS[unit])421 422 def get_tokens_unprocessed(self, text):423 scanner = Scanner(text, re.DOTALL | re.MULTILINE | re.IGNORECASE)424 stack = ['initial']425 in_function_block = False426 in_property_block = False427 was_dot = False428 next_token_is_function = False429 next_token_is_property = False430 collect_labels = False431 block_labels = set()432 brace_balance = [0, 0]433 434 while not scanner.eos:435 token = Error436 437 if stack[-1] == 'initial':438 if scanner.scan(r'\s+'):439 token = Whitespace440 elif not self.is_portugol and scanner.scan(r'\{.*?\}|\(\*.*?\*\)'):441 if scanner.match.startswith('$'):442 token = Comment.Preproc443 else:444 token = Comment.Multiline445 elif scanner.scan(r'//.*?$'):446 token = Comment.Single447 elif self.is_portugol and scanner.scan(r'(<\-)|(>=)|(<=)|%|<|>|-|\+|\*|\=|(<>)|\/|\.|:|,'):448 token = Operator449 elif not self.is_portugol and scanner.scan(r'[-+*\/=<>:;,.@\^]'):450 token = Operator451 # stop label highlighting on next ";"452 if collect_labels and scanner.match == ';':453 collect_labels = False454 elif scanner.scan(r'[\(\)\[\]]+'):455 token = Punctuation456 # abort function naming ``foo = Function(...)``457 next_token_is_function = False458 # if we are in a function block we count the open459 # braces because ootherwise it's impossible to460 # determine the end of the modifier context461 if in_function_block or in_property_block:462 if scanner.match == '(':463 brace_balance[0] += 1464 elif scanner.match == ')':465 brace_balance[0] -= 1466 elif scanner.match == '[':467 brace_balance[1] += 1468 elif scanner.match == ']':469 brace_balance[1] -= 1470 elif scanner.scan(r'[A-Za-z_][A-Za-z_0-9]*'):471 lowercase_name = scanner.match.lower()472 if lowercase_name == 'result':473 token = Name.Builtin.Pseudo474 elif lowercase_name in self.keywords:475 token = Keyword476 # if we are in a special block and a477 # block ending keyword occurs (and the parenthesis478 # is balanced) we end the current block context479 if self.is_portugol:480 if lowercase_name in ('funcao', 'procedimento'):481 in_function_block = True482 next_token_is_function = True483 else:484 if (in_function_block or in_property_block) and \485 lowercase_name in self.BLOCK_KEYWORDS and \486 brace_balance[0] <= 0 and \487 brace_balance[1] <= 0:488 in_function_block = False489 in_property_block = False490 brace_balance = [0, 0]491 block_labels = set()492 if lowercase_name in ('label', 'goto'):493 collect_labels = True494 elif lowercase_name == 'asm':495 stack.append('asm')496 elif lowercase_name == 'property':497 in_property_block = True498 next_token_is_property = True499 elif lowercase_name in ('procedure', 'operator',500 'function', 'constructor',501 'destructor'):502 in_function_block = True503 next_token_is_function = True504 # we are in a function block and the current name505 # is in the set of registered modifiers. highlight506 # it as pseudo keyword507 elif not self.is_portugol and in_function_block and \508 lowercase_name in self.FUNCTION_MODIFIERS:509 token = Keyword.Pseudo510 # if we are in a property highlight some more511 # modifiers512 elif not self.is_portugol and in_property_block and \513 lowercase_name in ('read', 'write'):514 token = Keyword.Pseudo515 next_token_is_function = True516 # if the last iteration set next_token_is_function517 # to true we now want this name highlighted as518 # function. so do that and reset the state519 elif next_token_is_function:520 # Look if the next token is a dot. If yes it's521 # not a function, but a class name and the522 # part after the dot a function name523 if not self.is_portugol and scanner.test(r'\s*\.\s*'):524 token = Name.Class525 # it's not a dot, our job is done526 else:527 token = Name.Function528 next_token_is_function = False529 530 if self.is_portugol:531 block_labels.add(scanner.match.lower())532 533 # same for properties534 elif not self.is_portugol and next_token_is_property:535 token = Name.Property536 next_token_is_property = False537 # Highlight this token as label and add it538 # to the list of known labels539 elif not self.is_portugol and collect_labels:540 token = Name.Label541 block_labels.add(scanner.match.lower())542 # name is in list of known labels543 elif lowercase_name in block_labels:544 token = Name.Label545 elif self.is_portugol and lowercase_name in self.PORTUGOL_BUILTIN_TYPES:546 token = Keyword.Type547 elif not self.is_portugol and lowercase_name in self.BUILTIN_TYPES:548 token = Keyword.Type549 elif not self.is_portugol and lowercase_name in self.DIRECTIVES:550 token = Keyword.Pseudo551 # builtins are just builtins if the token552 # before isn't a dot553 elif not self.is_portugol and not was_dot and lowercase_name in self.builtins:554 token = Name.Builtin555 else:556 token = Name557 elif self.is_portugol and scanner.scan(r"\""):558 token = String559 stack.append('string')560 elif not self.is_portugol and scanner.scan(r"'"):561 token = String562 stack.append('string')563 elif not self.is_portugol and scanner.scan(r'\#(\d+|\$[0-9A-Fa-f]+)'):564 token = String.Char565 elif not self.is_portugol and scanner.scan(r'\$[0-9A-Fa-f]+'):566 token = Number.Hex567 elif scanner.scan(r'\d+(?![eE]|\.[^.])'):568 token = Number.Integer569 elif scanner.scan(r'\d+(\.\d+([eE][+-]?\d+)?|[eE][+-]?\d+)'):570 token = Number.Float571 else:572 # if the stack depth is deeper than once, pop573 if len(stack) > 1:574 stack.pop()575 scanner.get_char()576 577 elif stack[-1] == 'string':578 if self.is_portugol:579 if scanner.scan(r"''"):580 token = String.Escape581 elif scanner.scan(r"\""):582 token = String583 stack.pop()584 elif scanner.scan(r"[^\"]*"):585 token = String586 else:587 scanner.get_char()588 stack.pop()589 else:590 if scanner.scan(r"''"):591 token = String.Escape592 elif scanner.scan(r"'"):593 token = String594 stack.pop()595 elif scanner.scan(r"[^']*"):596 token = String597 else:598 scanner.get_char()599 stack.pop()600 elif not self.is_portugol and stack[-1] == 'asm':601 if scanner.scan(r'\s+'):602 token = Whitespace603 elif scanner.scan(r'end'):604 token = Keyword605 stack.pop()606 elif scanner.scan(r'\{.*?\}|\(\*.*?\*\)'):607 if scanner.match.startswith('$'):608 token = Comment.Preproc609 else:610 token = Comment.Multiline611 elif scanner.scan(r'//.*?$'):612 token = Comment.Single613 elif scanner.scan(r"'"):614 token = String615 stack.append('string')616 elif scanner.scan(r'@@[A-Za-z_][A-Za-z_0-9]*'):617 token = Name.Label618 elif scanner.scan(r'[A-Za-z_][A-Za-z_0-9]*'):619 lowercase_name = scanner.match.lower()620 if lowercase_name in self.ASM_INSTRUCTIONS:621 token = Keyword622 elif lowercase_name in self.ASM_REGISTERS:623 token = Name.Builtin624 else:625 token = Name626 elif scanner.scan(r'[-+*\/=<>:;,.@\^]+'):627 token = Operator628 elif scanner.scan(r'[\(\)\[\]]+'):629 token = Punctuation630 elif scanner.scan(r'\$[0-9A-Fa-f]+'):631 token = Number.Hex632 elif scanner.scan(r'\d+(?![eE]|\.[^.])'):633 token = Number.Integer634 elif scanner.scan(r'\d+(\.\d+([eE][+-]?\d+)?|[eE][+-]?\d+)'):635 token = Number.Float636 else:637 scanner.get_char()638 stack.pop()639 640 # save the dot!!!11641 if not self.is_portugol and scanner.match.strip():642 was_dot = scanner.match == '.'643 644 yield scanner.start_pos, token, scanner.match or ''645 