rf-web/vendor/bundle/gems/rouge-3.12.0/lib/rouge/lexers/m68k.rb
2019-10-21 10:18:17 +02:00

144 lines
3.9 KiB
Ruby

# -*- coding: utf-8 -*- #
# frozen_string_literal: true
module Rouge
module Lexers
class M68k < RegexLexer
tag 'm68k'
title "M68k"
desc "Motorola 68k Assembler"
id = /[a-zA-Z_][a-zA-Z0-9_]*/
def self.keywords
@keywords ||= Set.new %w(
abcd add adda addi addq addx and andi asl asr
bcc bcs beq bge bgt bhi ble bls blt bmi bne bpl bvc bvs bhs blo
bchg bclr bfchg bfclr bfests bfextu bfffo bfins bfset bftst bkpt bra bse bsr btst
callm cas cas2 chk chk2 clr cmp cmpa cmpi cmpm cmp2
dbcc dbcs dbeq dbge dbgt dbhi dble dbls dblt dbmi dbne dbpl dbvc dbvs dbhs dblo
dbra dbf dbt divs divsl divu divul
eor eori exg ext extb
illegal jmp jsr lea link lsl lsr
move movea move16 movem movep moveq muls mulu
nbcd neg negx nop not or ori
pack pea rol ror roxl roxr rtd rtm rtr rts
sbcd
seq sne spl smi svc svs st sf sge sgt sle slt scc shi sls scs shs slo
sub suba subi subq subx swap
tas trap trapcc TODO trapv tst
unlk unpk eori
)
end
def self.keywords_type
@keywords_type ||= Set.new %w(
dc ds dcb
)
end
def self.reserved
@reserved ||= Set.new %w(
include incdir incbin end endf endfunc endmain endproc fpu func machine main mmu opword proc set opt section
rept endr
ifeq ifne ifgt ifge iflt ifle iif ifd ifnd ifc ifnc elseif else endc
even cnop fail machine
output radix __G2 __LK
list nolist plen llen ttl subttl spc page listchar format
equ equenv equr set reg
rsreset rsset offset
cargs
fequ.s fequ.d fequ.x fequ.p fequ.w fequ.l fopt
macro endm mexit narg
)
end
def self.builtins
@builtins ||=Set.new %w(
d0 d1 d2 d3 d4 d5 d6 d7
a0 a1 a2 a3 a4 a5 a6 a7 a7'
pc usp ssp ccr
)
end
start { push :expr_bol }
state :expr_bol do
mixin :inline_whitespace
rule(//) { pop! }
end
state :inline_whitespace do
rule %r/\s+/, Text
end
state :whitespace do
rule %r/\n+/m, Text, :expr_bol
rule %r(^\*(\\.|.)*?\n), Comment::Single, :expr_bol
rule %r(;(\\.|.)*?\n), Comment::Single, :expr_bol
mixin :inline_whitespace
end
state :root do
rule(//) { push :statements }
end
state :statements do
mixin :whitespace
rule %r/"/, Str, :string
rule %r/#/, Name::Decorator
rule %r/^\.?[a-zA-Z0-9_]+:?/, Name::Label
rule %r/\.[bswl]\s/i, Name::Decorator
rule %r('(\\.|\\[0-7]{1,3}|\\x[a-f0-9]{1,2}|[^\\'\n])')i, Str::Char
rule %r/\$[0-9a-f]+/i, Num::Hex
rule %r/@[0-8]+/i, Num::Oct
rule %r/%[01]+/i, Num::Bin
rule %r/\d+/i, Num::Integer
rule %r([*~&+=\|?:<>/-]), Operator
rule %r/\\./, Comment::Preproc
rule %r/[(),.]/, Punctuation
rule %r/\[[a-zA-Z0-9]*\]/, Punctuation
rule id do |m|
name = m[0]
if self.class.keywords.include? name.downcase
token Keyword
elsif self.class.keywords_type.include? name.downcase
token Keyword::Type
elsif self.class.reserved.include? name.downcase
token Keyword::Reserved
elsif self.class.builtins.include? name.downcase
token Name::Builtin
elsif name =~ /[a-zA-Z0-9]+/
token Name::Variable
else
token Name
end
end
end
state :string do
rule %r/"/, Str, :pop!
rule %r/\\([\\abfnrtv"']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})/, Str::Escape
rule %r/[^\\"\n]+/, Str
rule %r/\\\n/, Str
rule %r/\\/, Str # stray backslash
end
end
end
end