131 lines
4.5 KiB
Python
131 lines
4.5 KiB
Python
|
"""
|
||
|
pygments.lexers.mips
|
||
|
~~~~~~~~~~~~~~~~~~~~
|
||
|
|
||
|
Lexers for MIPS assembly.
|
||
|
|
||
|
:copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS.
|
||
|
:license: BSD, see LICENSE for details.
|
||
|
"""
|
||
|
|
||
|
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']
|
||
|
version_added = ''
|
||
|
# 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']
|
||
|
url = 'https://mips.com'
|
||
|
|
||
|
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),
|
||
|
],
|
||
|
}
|