summaryrefslogtreecommitdiff
path: root/pygments/lexers
diff options
context:
space:
mode:
authordavisrichard437 <85075437+davisrichard437@users.noreply.github.com>2022-09-21 06:03:56 -0400
committerGitHub <noreply@github.com>2022-09-21 12:03:56 +0200
commit3fe62d2869677f8d0c12f0922d37982cbf819a5e (patch)
tree8b761682156836708458730f5226151dcd28b5b4 /pygments/lexers
parentfd632c046fb23c9d139549b0991c488eab233ba2 (diff)
downloadpygments-git-3fe62d2869677f8d0c12f0922d37982cbf819a5e.tar.gz
Adding MIPS Lexer (#2228)
Diffstat (limited to 'pygments/lexers')
-rw-r--r--pygments/lexers/_mapping.py1
-rw-r--r--pygments/lexers/mips.py126
2 files changed, 127 insertions, 0 deletions
diff --git a/pygments/lexers/_mapping.py b/pygments/lexers/_mapping.py
index 89a286f9..22c70738 100644
--- a/pygments/lexers/_mapping.py
+++ b/pygments/lexers/_mapping.py
@@ -274,6 +274,7 @@ LEXERS = {
'LuaLexer': ('pygments.lexers.scripting', 'Lua', ('lua',), ('*.lua', '*.wlua'), ('text/x-lua', 'application/x-lua')),
'MCFunctionLexer': ('pygments.lexers.mcfunction', 'MCFunction', ('mcfunction', 'mcf'), ('*.mcfunction',), ('text/mcfunction',)),
'MIMELexer': ('pygments.lexers.mime', 'MIME', ('mime',), (), ('multipart/mixed', 'multipart/related', 'multipart/alternative')),
+ 'MIPSLexer': ('pygments.lexers.mips', 'MIPS', ('mips',), ('*.mips', '*.MIPS'), ()),
'MOOCodeLexer': ('pygments.lexers.scripting', 'MOOCode', ('moocode', 'moo'), ('*.moo',), ('text/x-moocode',)),
'MSDOSSessionLexer': ('pygments.lexers.shell', 'MSDOS Session', ('doscon',), (), ()),
'Macaulay2Lexer': ('pygments.lexers.macaulay2', 'Macaulay2', ('macaulay2',), ('*.m2',), ()),
diff --git a/pygments/lexers/mips.py b/pygments/lexers/mips.py
new file mode 100644
index 00000000..7b737d7b
--- /dev/null
+++ b/pygments/lexers/mips.py
@@ -0,0 +1,126 @@
+"""
+ pygments.lexers.mips
+ ~~~~~~~~~~~~~~~~~~~~
+ Lexers for MIPS assembly.
+ :copyright: Copyright 2006-2022 by the Pygments team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+import re
+from pygments.lexer import RegexLexer, words
+from pygments.token import Whitespace, Comment, String, Keyword, Name, Text
+
+__all__ = ["MIPSLexer"]
+
+
+class MIPSLexer(RegexLexer):
+ """
+ A MIPS Assembly Lexer.
+
+ Based on the Emacs major mode by hlissner:
+ https://github.com/hlissner/emacs-mips-mode
+ """
+
+ name = 'MIPS'
+ aliases = ['mips']
+ # TODO: add '*.s' and '*.asm', which will require designing an analyse_text
+ # method for this lexer and refactoring those from Gas and Nasm in order to
+ # have relatively reliable detection
+ filenames = ['*.mips', '*.MIPS']
+
+ keywords = [
+ # Arithmetic insturctions
+ "add", "sub", "subu", "addi", "subi", "addu", "addiu",
+ # Multiplication/division
+ "mul", "mult", "multu", "mulu", "madd", "maddu", "msub", "msubu", "div", "divu",
+ # Bitwise operations
+ "and", "or", "nor", "xor", "andi", "ori", "xori", "clo", "clz",
+ # Shifts
+ "sll", "srl", "sllv", "srlv", "sra", "srav",
+ # Comparisons
+ "slt", "sltu", "slti", "sltiu",
+ # Move data
+ "mfhi", "mthi", "mflo", "mtlo", "movn", "movz", "movf", "movt",
+ # Jump
+ "j", "jal", "jalr", "jr",
+ # branch
+ "bc1f", "bc1t", "beq", "bgez", "bgezal", "bgtz", "blez", "bltzal", "bltz", "bne",
+ # Load
+ "lui", "lb", "lbu", "lh", "lhu", "lw", "lwcl", "lwl", "lwr",
+ # Store
+ "sb", "sh", "sw", "swl", "swr", # coproc: swc1 sdc1
+ # Concurrent load/store
+ "ll", "sc",
+ # Trap handling
+ "teq", "teqi", "tne", "tneqi", "tge", "tgeu", "tgei", "tgeiu", "tlt", "tltu", "tlti",
+ "tltiu",
+ # Exception / Interrupt
+ "eret", "break", "bop", "syscall",
+ #--- Floats -----------------------------------------------------
+ # Arithmetic
+ "add.s", "add.d", "sub.s", "sub.d", "mul.s", "mul.d", "div.s", "div.d", "neg.d",
+ "neg.s",
+ # Comparison
+ "c.e.d", "c.e.s", "c.le.d", "c.le.s", "c.lt.s", "c.lt.d", # "c.gt.s", "c.gt.d",
+ "madd.s", "madd.d", "msub.s", "msub.d",
+ # Move Floats
+ "mov.d", "move.s", "movf.d", "movf.s", "movt.d", "movt.s", "movn.d", "movn.s",
+ "movnzd", "movz.s", "movz.d",
+ # Conversion
+ "cvt.d.s", "cvt.d.w", "cvt.s.d", "cvt.s.w", "cvt.w.d", "cvt.w.s", "trunc.w.d",
+ "trunc.w.s",
+ # Math
+ "abs.s", "abs.d", "sqrt.s", "sqrt.d", "ceil.w.d", "ceil.w.s", "floor.w.d",
+ "floor.w.s", "round.w.d", "round.w.s",
+ ]
+
+ pseudoinstructions = [
+ # Arithmetic & logical
+ "rem", "remu", "mulo", "mulou", "abs", "neg", "negu", "not", "rol", "ror",
+ # branches
+ "b", "beqz", "bge", "bgeu", "bgt", "bgtu", "ble", "bleu", "blt", "bltu", "bnez",
+ # loads
+ "la", "li", "ld", "ulh", "ulhu", "ulw",
+ # Store
+ "sd", "ush", "usw",
+ # move
+ "move", # coproc: "mfc1.d",
+ # comparisons
+ "sgt", "sgtu", "sge", "sgeu", "sle", "sleu", "sne", "seq",
+ #--- Floats -----------------------------------------------------
+ # load-store
+ "l.d", "l.s", "s.d", "s.s",
+ ]
+
+ directives = [
+ ".align", ".ascii", ".asciiz", ".byte", ".data", ".double", ".extern", ".float",
+ ".globl", ".half", ".kdata", ".ktext", ".space", ".text", ".word",
+ ]
+
+ deprecated = [
+ "beql", "bnel", "bgtzl", "bgezl", "bltzl", "blezl", "bltzall", "bgezall",
+ ]
+
+ tokens = {
+ 'root': [
+ (r'\s+', Whitespace),
+ (r'#.*', Comment),
+ (r'"', String, 'string'),
+ (r'-?[0-9]+?', Keyword.Constant),
+ (r'\w*:', Name.Function),
+ (words(deprecated, suffix=r'\b'), Keyword.Pseudo), # need warning face
+ (words(pseudoinstructions, suffix=r'\b'), Name.Variable),
+ (words(keywords, suffix=r'\b'), Keyword),
+ (r'[slm][ftwd]c[0-9]([.]d)?', Keyword),
+ (r'\$(f?[0-2][0-9]|f?3[01]|[ft]?[0-9]|[vk][01]|a[0-3]|s[0-7]|[gsf]p|ra|at|zero)', Keyword.Type),
+ (words(directives, suffix=r'\b'), Name.Entity), # Preprocessor?
+ (r':|,|;|\{|\}|=>|@|\$|=', Name.Builtin),
+ (r'\w+', Text),
+ (r'.', Text),
+ ],
+ 'string': [
+ (r'\\.', String.Escape),
+ (r'"', String, '#pop'),
+ (r'[^\\"]+', String),
+ ],
+ }