291 lines
7.8 KiB
Python
291 lines
7.8 KiB
Python
"""
|
|
pygments.lexers.maple
|
|
~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Lexers for Maple.
|
|
|
|
:copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
|
|
:license: BSD, see LICENSE for details.
|
|
"""
|
|
|
|
from pygments.lexer import words, bygroups, ExtendedRegexLexer
|
|
from pygments.token import Comment, Name, String, Whitespace, Operator, Punctuation, Number, Keyword
|
|
|
|
__all__ = ['MapleLexer']
|
|
|
|
|
|
class MapleLexer(ExtendedRegexLexer):
|
|
"""
|
|
Lexer for Maple.
|
|
"""
|
|
|
|
name = 'Maple'
|
|
aliases = ['maple']
|
|
filenames = ['*.mpl', '*.mi', '*.mm']
|
|
mimetypes = ['text/x-maple']
|
|
url = 'https://www.maplesoft.com/products/Maple/'
|
|
version_added = '2.19'
|
|
|
|
keywords = ('and',
|
|
'assuming',
|
|
'break',
|
|
'by',
|
|
'catch',
|
|
'description',
|
|
'do',
|
|
'done',
|
|
'elif',
|
|
'else',
|
|
'end',
|
|
'error',
|
|
'export',
|
|
'fi',
|
|
'finally',
|
|
'for',
|
|
'from',
|
|
'global',
|
|
'if',
|
|
'implies',
|
|
'in',
|
|
'intersect',
|
|
'local',
|
|
'minus',
|
|
'mod',
|
|
'module',
|
|
'next',
|
|
'not',
|
|
'od',
|
|
'option',
|
|
'options',
|
|
'or',
|
|
'proc',
|
|
'quit',
|
|
'read',
|
|
'return',
|
|
'save',
|
|
'stop',
|
|
'subset',
|
|
'then',
|
|
'to',
|
|
'try',
|
|
'union',
|
|
'use',
|
|
'uses',
|
|
'while',
|
|
'xor')
|
|
|
|
builtins = ('abs',
|
|
'add',
|
|
'addressof',
|
|
'anames',
|
|
'and',
|
|
'andmap',
|
|
'andseq',
|
|
'appendto',
|
|
'Array',
|
|
'array',
|
|
'ArrayOptions',
|
|
'assemble',
|
|
'ASSERT',
|
|
'assign',
|
|
'assigned',
|
|
'attributes',
|
|
'cat',
|
|
'ceil',
|
|
'coeff',
|
|
'coeffs',
|
|
'conjugate',
|
|
'convert',
|
|
'CopySign',
|
|
'DEBUG',
|
|
'debugopts',
|
|
'Default0',
|
|
'DefaultOverflow',
|
|
'DefaultUnderflow',
|
|
'degree',
|
|
'denom',
|
|
'diff',
|
|
'disassemble',
|
|
'divide',
|
|
'done',
|
|
'entries',
|
|
'EqualEntries',
|
|
'eval',
|
|
'evalb',
|
|
'evalf',
|
|
'evalhf',
|
|
'evalindets',
|
|
'evaln',
|
|
'expand',
|
|
'exports',
|
|
'factorial',
|
|
'floor',
|
|
'frac',
|
|
'frem',
|
|
'FromInert',
|
|
'frontend',
|
|
'gc',
|
|
'genpoly',
|
|
'has',
|
|
'hastype',
|
|
'hfarray',
|
|
'icontent',
|
|
'igcd',
|
|
'ilcm',
|
|
'ilog10',
|
|
'Im',
|
|
'implies',
|
|
'indets',
|
|
'indices',
|
|
'intersect',
|
|
'iolib',
|
|
'iquo',
|
|
'irem',
|
|
'iroot',
|
|
'iroot',
|
|
'isqrt',
|
|
'kernelopts',
|
|
'lcoeff',
|
|
'ldegree',
|
|
'length',
|
|
'lexorder',
|
|
'lhs',
|
|
'lowerbound',
|
|
'lprint',
|
|
'macro',
|
|
'map',
|
|
'max',
|
|
'maxnorm',
|
|
'member',
|
|
'membertype',
|
|
'min',
|
|
'minus',
|
|
'mod',
|
|
'modp',
|
|
'modp1',
|
|
'modp2',
|
|
'mods',
|
|
'mul',
|
|
'NextAfter',
|
|
'nops',
|
|
'normal',
|
|
'not',
|
|
'numboccur',
|
|
'numelems',
|
|
'numer',
|
|
'NumericClass',
|
|
'NumericEvent',
|
|
'NumericEventHandler',
|
|
'NumericStatus',
|
|
'op',
|
|
'or',
|
|
'order',
|
|
'OrderedNE',
|
|
'ormap',
|
|
'orseq',
|
|
'parse',
|
|
'piecewise',
|
|
'pointto',
|
|
'print',
|
|
'quit',
|
|
'Re',
|
|
'readlib',
|
|
'Record',
|
|
'remove',
|
|
'rhs',
|
|
'round',
|
|
'rtable',
|
|
'rtable_elems',
|
|
'rtable_eval',
|
|
'rtable_indfns',
|
|
'rtable_num_elems',
|
|
'rtable_options',
|
|
'rtable_redim',
|
|
'rtable_scanblock',
|
|
'rtable_set_indfn',
|
|
'rtable_split_unit',
|
|
'savelib',
|
|
'Scale10',
|
|
'Scale2',
|
|
'SDMPolynom',
|
|
'searchtext',
|
|
'SearchText',
|
|
'select',
|
|
'selectremove',
|
|
'seq',
|
|
'series',
|
|
'setattribute',
|
|
'SFloatExponent',
|
|
'SFloatMantissa',
|
|
'sign',
|
|
'sort',
|
|
'ssystem',
|
|
'stop',
|
|
'String',
|
|
'subs',
|
|
'subset',
|
|
'subsindets',
|
|
'subsop',
|
|
'substring',
|
|
'system',
|
|
'table',
|
|
'taylor',
|
|
'tcoeff',
|
|
'time',
|
|
'timelimit',
|
|
'ToInert',
|
|
'traperror',
|
|
'trunc',
|
|
'type',
|
|
'typematch',
|
|
'unames',
|
|
'unassign',
|
|
'union',
|
|
'Unordered',
|
|
'upperbound',
|
|
'userinfo',
|
|
'writeto',
|
|
'xor',
|
|
'xormap',
|
|
'xorseq')
|
|
|
|
def delayed_callback(self, match, ctx):
|
|
yield match.start(1), Punctuation, match.group(1) # quote
|
|
|
|
ctx.pos = match.start(2)
|
|
orig_end = ctx.end
|
|
ctx.end = match.end(2)
|
|
|
|
yield from self.get_tokens_unprocessed(context=ctx)
|
|
yield match.end(2), Punctuation, match.group(1) # quote
|
|
|
|
ctx.pos = match.end()
|
|
ctx.end = orig_end
|
|
|
|
tokens = {
|
|
'root': [
|
|
(r'#.*\n', Comment.Single),
|
|
(r'\(\*', Comment.Multiline, 'comment'),
|
|
(r'"(\\.|.|\s)*?"', String),
|
|
(r"('+)((.|\n)*?)\1", delayed_callback),
|
|
(r'`(\\`|.)*?`', Name),
|
|
(words(keywords, prefix=r'\b', suffix=r'\b'), Keyword),
|
|
(words(builtins, prefix=r'\b', suffix=r'\b'), Name.Builtin),
|
|
(r'[a-zA-Z_][a-zA-Z0-9_]*', Name),
|
|
(r'(:=|\*\*|@@|<=|>=|<>|->|::|\.\.|&\+|[\+\-\*\.\^\$/@&,:=<>%~])', Operator),
|
|
(r'[;^!@$\(\)\[\]{}|_\\#?]+', Punctuation),
|
|
(r'(\d+)(\.\.)', bygroups(Number.Integer, Punctuation)),
|
|
(r'(\d*\.\d+|\d+\.\d*)([eE][+-]?\d+)?', Number.Float),
|
|
(r'\d+', Number.Integer),
|
|
(r'\s+', Whitespace),
|
|
],
|
|
'comment': [
|
|
(r'.*\(\*', Comment.Multiline, '#push'),
|
|
(r'.*\*\)', Comment.Multiline, '#pop'),
|
|
(r'.*\n', Comment.Multiline),
|
|
]
|
|
}
|
|
|
|
def analyse_text(text):
|
|
if ':=' in text:
|
|
return 0.1 |