<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE language SYSTEM "language.dtd">

<!-- *******************************************************************
	Assembly language definition for MIPS assembly.

	2018-08-13	Jashank Jeremy	<jashankj@cse.unsw.edu.au>
	2018-08-15	Jashank Jeremy	<jashankj@cse.unsw.edu.au>
		* Add `.globl' keyword.
		* Fix up register keywords.
	2022-09-17	Dylan Brotherston	<d.brotherston@unsw.edu.au>
		* migrate to "Language Definition v2.0" for "GtkSourceView v4"

*******************************************************************  -->

<language id="assembler" name="Assembler (MIPS)" version="2.0" _section="Sources">
	<metadata>
		<property name="mimetypes">text/x-asm;text/x-assembler</property>
		<property name="globs">*.s</property>
	</metadata>

	<styles>
		<style id="preprocessor" name="Preprocessor" map-to="def:preprocessor"/>
		<style id="keyword" name="Keyword" map-to="def:keyword"/>
		<style id="comment" name="Comment" map-to="def:comment"/>
		<style id="operator" name="Operator" map-to="def:operator"/>
		<style id="string" name="String" map-to="def:string"/>
		<style id="escaped-character" name="Escaped Character" map-to="def:special-char"/>
		<style id="character" name="Character" map-to="def:character"/>
		<style id="type" name="Data Type" map-to="def:type"/>
		<style id="decimal" name="Data Type" map-to="def:decimal"/>
	</styles>

	<definitions>
		<context id="assembler">
			<include>

				<context id="comment" style-ref="comment">
					<start>#</start>
					<end>$</end>
				</context>

				<context id="operator" style-ref="operator">
					<match>[-+:*(){}\[\]\/\\]</match>
				</context>

				<context id="label" style-ref="preprocessor">
					<match>^[A-Za-z_][A-Za-z_0-9.]*:</match>
				</context>

				<context id="string" end-at-line-end="true" style-ref="string">
					<start>"</start>
					<end>"</end>
					<include>
						<context id="escape" style-ref="escaped-character">
							<match>\\.</match>
						</context>
					</include>
				</context>
				<context id="character" end-at-line-end="true" style-ref="character">
					<start>'</start>
					<end>'</end>
					<include>
						<context ref="escape"/>
					</include>
				</context>

				<context id="commands" style-ref="preprocessor">
					<prefix>\.</prefix>
					<keyword>ascii</keyword>
					<keyword>asciiz</keyword>
					<keyword>byte</keyword>
					<keyword>half</keyword>
					<keyword>word</keyword>
					<keyword>float</keyword>
					<keyword>double</keyword>
					<keyword>align</keyword>
					<keyword>space</keyword>
					<keyword>globl</keyword>
					<keyword>text</keyword>
					<keyword>data</keyword>
					<keyword>ktext</keyword>
					<keyword>kdata</keyword>
				</context>

				<context id="instructions" style-ref="keyword">
					<keyword>sll</keyword>
					<keyword>srl</keyword>
					<keyword>rotr</keyword>
					<keyword>sra</keyword>
					<keyword>sllv</keyword>
					<keyword>srlv</keyword>
					<keyword>rotrv</keyword>
					<keyword>srav</keyword>
					<keyword>jr</keyword>
					<keyword>jalr</keyword>
					<keyword>movz</keyword>
					<keyword>movn</keyword>
					<keyword>syscall</keyword>
					<keyword>break</keyword>
					<keyword>mfhi</keyword>
					<keyword>clz</keyword>
					<keyword>mthi</keyword>
					<keyword>clo</keyword>
					<keyword>mflo</keyword>
					<keyword>mtlo</keyword>
					<keyword>mult</keyword>
					<keyword>multu</keyword>
					<keyword>div</keyword>
					<keyword>divu</keyword>
					<keyword>tge</keyword>
					<keyword>tgeu</keyword>
					<keyword>tlt</keyword>
					<keyword>tltu</keyword>
					<keyword>teq</keyword>
					<keyword>tne</keyword>
					<keyword>madd</keyword>
					<keyword>maddu</keyword>
					<keyword>msub</keyword>
					<keyword>msubu</keyword>
					<keyword>wsbh</keyword>
					<keyword>seb</keyword>
					<keyword>seh</keyword>
					<keyword>add</keyword>
					<keyword>addu</keyword>
					<keyword>sub</keyword>
					<keyword>subu</keyword>
					<keyword>and</keyword>
					<keyword>or</keyword>
					<keyword>xor</keyword>
					<keyword>nor</keyword>
					<keyword>slt</keyword>
					<keyword>sltu</keyword>
					<keyword>bltz</keyword>
					<keyword>bgez</keyword>
					<keyword>tgei</keyword>
					<keyword>tgeiu</keyword>
					<keyword>tlti</keyword>
					<keyword>tltiu</keyword>
					<keyword>teqi</keyword>
					<keyword>tnei</keyword>
					<keyword>bltzal</keyword>
					<keyword>bgezal</keyword>
					<keyword>beq</keyword>
					<keyword>bne</keyword>
					<keyword>blez</keyword>
					<keyword>bgtz</keyword>
					<keyword>addi</keyword>
					<keyword>addiu</keyword>
					<keyword>slti</keyword>
					<keyword>sltiu</keyword>
					<keyword>andi</keyword>
					<keyword>ori</keyword>
					<keyword>xori</keyword>
					<keyword>lui</keyword>
					<keyword>lb</keyword>
					<keyword>lh</keyword>
					<keyword>lwl</keyword>
					<keyword>lw</keyword>
					<keyword>lbu</keyword>
					<keyword>lhu</keyword>
					<keyword>lwr</keyword>
					<keyword>sb</keyword>
					<keyword>sh</keyword>
					<keyword>sw</keyword>
					<keyword>lwc</keyword>
					<keyword>swc</keyword>
					<keyword>j</keyword>
					<keyword>jal</keyword>
					<keyword>sll</keyword>
					<keyword>srl</keyword>
					<keyword>rotr</keyword>
					<keyword>sra</keyword>
					<keyword>sllv</keyword>
					<keyword>srlv</keyword>
					<keyword>rotrv</keyword>
					<keyword>srav</keyword>
					<keyword>jr</keyword>
					<keyword>jalr</keyword>
					<keyword>jalr</keyword>
					<keyword>movz</keyword>
					<keyword>movn</keyword>
					<keyword>syscall</keyword>
					<keyword>break</keyword>
					<keyword>mfhi</keyword>
					<keyword>clz</keyword>
					<keyword>mthi</keyword>
					<keyword>clo</keyword>
					<keyword>mflo</keyword>
					<keyword>mtlo</keyword>
					<keyword>mult</keyword>
					<keyword>multu</keyword>
					<keyword>div</keyword>
					<keyword>divu</keyword>
					<keyword>tge</keyword>
					<keyword>tgeu</keyword>
					<keyword>tlt</keyword>
					<keyword>tltu</keyword>
					<keyword>teq</keyword>
					<keyword>tne</keyword>
					<keyword>madd</keyword>
					<keyword>maddu</keyword>
					<keyword>msub</keyword>
					<keyword>msubu</keyword>
					<keyword>wsbh</keyword>
					<keyword>seb</keyword>
					<keyword>seh</keyword>
					<keyword>add</keyword>
					<keyword>addu</keyword>
					<keyword>incr</keyword>
					<keyword>decr</keyword>
					<keyword>sub</keyword>
					<keyword>subu</keyword>
					<keyword>and</keyword>
					<keyword>or</keyword>
					<keyword>xor</keyword>
					<keyword>nor</keyword>
					<keyword>slt</keyword>
					<keyword>sltu</keyword>
					<keyword>sle</keyword>
					<keyword>sleu</keyword>
					<keyword>sgt</keyword>
					<keyword>sgtu</keyword>
					<keyword>sge</keyword>
					<keyword>sgeu</keyword>
					<keyword>seq</keyword>
					<keyword>sne</keyword>
					<keyword>bltz</keyword>
					<keyword>bgez</keyword>
					<keyword>tgei</keyword>
					<keyword>tgei</keyword>
					<keyword>tgeiu</keyword>
					<keyword>tgeiu</keyword>
					<keyword>tlti</keyword>
					<keyword>tlti</keyword>
					<keyword>tltiu</keyword>
					<keyword>tltiu</keyword>
					<keyword>teqi</keyword>
					<keyword>teqi</keyword>
					<keyword>tnei</keyword>
					<keyword>tnei</keyword>
					<keyword>beq</keyword>
					<keyword>bne</keyword>
					<keyword>blez</keyword>
					<keyword>bgtz</keyword>
					<keyword>bltzal</keyword>
					<keyword>bgezal</keyword>
					<keyword>addi</keyword>
					<keyword>addi</keyword>
					<keyword>addiu</keyword>
					<keyword>addiu</keyword>
					<keyword>slti</keyword>
					<keyword>slti</keyword>
					<keyword>sltiu</keyword>
					<keyword>sltiu</keyword>
					<keyword>andi</keyword>
					<keyword>andi</keyword>
					<keyword>ori</keyword>
					<keyword>ori</keyword>
					<keyword>xori</keyword>
					<keyword>xori</keyword>
					<keyword>lui</keyword>
					<keyword>lb</keyword>
					<keyword>lb</keyword>
					<keyword>lh</keyword>
					<keyword>lh</keyword>
					<keyword>lw</keyword>
					<keyword>lw</keyword>
					<keyword>lbu</keyword>
					<keyword>lbu</keyword>
					<keyword>lhu</keyword>
					<keyword>lhu</keyword>
					<keyword>sb</keyword>
					<keyword>sb</keyword>
					<keyword>sh</keyword>
					<keyword>sh</keyword>
					<keyword>sw</keyword>
					<keyword>sw</keyword>
					<keyword>lwc</keyword>
					<keyword>swc</keyword>
					<keyword>j</keyword>
					<keyword>jal</keyword>
					<keyword>li</keyword>
					<keyword>la</keyword>
					<keyword>la</keyword>
					<keyword>la</keyword>
					<keyword>nop</keyword>
					<keyword>move</keyword>
					<keyword>copy</keyword>
					<keyword>neg</keyword>
					<keyword>negu</keyword>
					<keyword>not</keyword>
					<keyword>mul</keyword>
					<keyword>div</keyword>
					<keyword>rem</keyword>
					<keyword>remu</keyword>
					<keyword>mod</keyword>
					<keyword>modu</keyword>
					<keyword>abs</keyword>
					<keyword>push</keyword>
					<keyword>pop</keyword>
					<keyword>begin</keyword>
					<keyword>end</keyword>
					<keyword>rol</keyword>
					<keyword>rol</keyword>
					<keyword>ror</keyword>
					<keyword>ror</keyword>
					<keyword>zeb</keyword>
					<keyword>zeh</keyword>
					<keyword>b</keyword>
					<keyword>bal</keyword>
					<keyword>beqz</keyword>
					<keyword>bnez</keyword>
					<keyword>bge</keyword>
					<keyword>bgeu</keyword>
					<keyword>blt</keyword>
					<keyword>bltu</keyword>
					<keyword>ble</keyword>
					<keyword>bleu</keyword>
					<keyword>bgt</keyword>
					<keyword>bgtu</keyword>
				</context>

				<context id="registers" style-ref="type">
					<prefix>\$</prefix>
					<keyword>zero</keyword>
					<keyword>at</keyword>
					<keyword>v0</keyword>
					<keyword>v1</keyword>
					<keyword>a0</keyword>
					<keyword>a1</keyword>
					<keyword>a2</keyword>
					<keyword>a3</keyword>
					<keyword>t0</keyword>
					<keyword>t1</keyword>
					<keyword>t2</keyword>
					<keyword>t3</keyword>
					<keyword>t4</keyword>
					<keyword>t5</keyword>
					<keyword>t6</keyword>
					<keyword>t7</keyword>
					<keyword>s0</keyword>
					<keyword>s1</keyword>
					<keyword>s2</keyword>
					<keyword>s3</keyword>
					<keyword>s4</keyword>
					<keyword>s5</keyword>
					<keyword>s6</keyword>
					<keyword>s7</keyword>
					<keyword>t8</keyword>
					<keyword>t9</keyword>
					<keyword>k0</keyword>
					<keyword>k1</keyword>
					<keyword>gp</keyword>
					<keyword>sp</keyword>
					<keyword>fp</keyword>
					<keyword>ra</keyword>
					<keyword>f0</keyword>
					<keyword>f1</keyword>
					<keyword>f2</keyword>
					<keyword>f3</keyword>
					<keyword>f4</keyword>
					<keyword>f5</keyword>
					<keyword>f6</keyword>
					<keyword>f7</keyword>
					<keyword>f8</keyword>
					<keyword>f9</keyword>
					<keyword>f10</keyword>
					<keyword>f11</keyword>
					<keyword>f12</keyword>
					<keyword>f13</keyword>
					<keyword>f14</keyword>
					<keyword>f15</keyword>
					<keyword>f16</keyword>
					<keyword>f17</keyword>
					<keyword>f18</keyword>
					<keyword>f19</keyword>
					<keyword>f20</keyword>
					<keyword>f21</keyword>
					<keyword>f22</keyword>
					<keyword>f23</keyword>
					<keyword>f24</keyword>
					<keyword>f25</keyword>
					<keyword>f26</keyword>
					<keyword>f27</keyword>
					<keyword>f28</keyword>
					<keyword>f29</keyword>
					<keyword>f30</keyword>
					<keyword>f31</keyword>
					<keyword>0</keyword>
					<keyword>1</keyword>
					<keyword>2</keyword>
					<keyword>3</keyword>
					<keyword>4</keyword>
					<keyword>5</keyword>
					<keyword>6</keyword>
					<keyword>7</keyword>
					<keyword>8</keyword>
					<keyword>9</keyword>
					<keyword>10</keyword>
					<keyword>11</keyword>
					<keyword>12</keyword>
					<keyword>13</keyword>
					<keyword>14</keyword>
					<keyword>15</keyword>
					<keyword>16</keyword>
					<keyword>17</keyword>
					<keyword>18</keyword>
					<keyword>19</keyword>
					<keyword>20</keyword>
					<keyword>21</keyword>
					<keyword>22</keyword>
					<keyword>23</keyword>
					<keyword>24</keyword>
					<keyword>25</keyword>
					<keyword>26</keyword>
					<keyword>27</keyword>
					<keyword>28</keyword>
					<keyword>29</keyword>
					<keyword>30</keyword>
					<keyword>31</keyword>
				</context>

				<context id="decimal" style-ref="decimal">
					<match>\b([1-9][0-9]*|0)\b</match>
				</context>
				<context id="float" style-ref="decimal">
					<match>\b([0-9]+[Ee][-]?[0-9]+|([0-9]*\.[0-9]+|[0-9]+\.)([Ee][-]?[0-9]+)?)</match>
				</context>
				<context id="hex" style-ref="decimal">
					<match>\b0[xX][0-9a-fA-F]+\b</match>
				</context>
				<context id="oct" style-ref="decimal">
					<match>\b0[oO]?[0-7]+\b</match>
				</context>
				<context id="bin" style-ref="decimal">
					<match>\b0[bB][01]+\b</match>
				</context>

				<!--
					!! MUST BE LAST !!
					Matches anything that looks like a label that hasn't already been highlighted
					This is was higher then instructions and registers would be highlighted as labels
				-->
				<context id="label-ref" style-ref="preprocessor">
					<match>[A-Za-z_][A-Za-z_0-9.]*</match>
				</context>
			</include>
		</context>
	</definitions>
</language>
