73 lines
1.8 KiB
Go
73 lines
1.8 KiB
Go
|
package a
|
||
|
|
||
|
import (
|
||
|
. "github.com/alecthomas/chroma" // nolint
|
||
|
"github.com/alecthomas/chroma/lexers/internal"
|
||
|
)
|
||
|
|
||
|
var ArmAsm = internal.Register(MustNewLazyLexer(
|
||
|
&Config{
|
||
|
Name: "ArmAsm",
|
||
|
Aliases: []string{"armasm"},
|
||
|
EnsureNL: true,
|
||
|
Filenames: []string{"*.s", "*.S"},
|
||
|
MimeTypes: []string{"text/x-armasm", "text/x-asm"},
|
||
|
},
|
||
|
armasmRules,
|
||
|
))
|
||
|
|
||
|
func armasmRules() Rules {
|
||
|
return Rules{
|
||
|
"commentsandwhitespace": {
|
||
|
{`\s+`, Text, nil},
|
||
|
{`[@;].*?\n`, CommentSingle, nil},
|
||
|
{`/\*.*?\*/`, CommentMultiline, nil},
|
||
|
},
|
||
|
"literal": {
|
||
|
// Binary
|
||
|
{`0b[01]+`, NumberBin, Pop(1)},
|
||
|
// Hex
|
||
|
{`0x\w{1,8}`, NumberHex, Pop(1)},
|
||
|
// Octal
|
||
|
{`0\d+`, NumberOct, Pop(1)},
|
||
|
// Float
|
||
|
{`\d+?\.\d+?`, NumberFloat, Pop(1)},
|
||
|
// Integer
|
||
|
{`\d+`, NumberInteger, Pop(1)},
|
||
|
// String
|
||
|
{`(")(.+)(")`, ByGroups(Punctuation, StringDouble, Punctuation), Pop(1)},
|
||
|
// Char
|
||
|
{`(')(.{1}|\\.{1})(')`, ByGroups(Punctuation, StringChar, Punctuation), Pop(1)},
|
||
|
},
|
||
|
"opcode": {
|
||
|
// Escape at line end
|
||
|
{`\n`, Text, Pop(1)},
|
||
|
// Comment
|
||
|
{`(@|;).*\n`, CommentSingle, Pop(1)},
|
||
|
// Whitespace
|
||
|
{`(\s+|,)`, Text, nil},
|
||
|
// Register by number
|
||
|
{`[rapcfxwbhsdqv]\d{1,2}`, NameClass, nil},
|
||
|
// Address by hex
|
||
|
{`=0x\w+`, ByGroups(Text, NameLabel), nil},
|
||
|
// Pseudo address by label
|
||
|
{`(=)(\w+)`, ByGroups(Text, NameLabel), nil},
|
||
|
// Immediate
|
||
|
{`#`, Text, Push("literal")},
|
||
|
},
|
||
|
"root": {
|
||
|
Include("commentsandwhitespace"),
|
||
|
// Directive with optional param
|
||
|
{`(\.\w+)([ \t]+\w+\s+?)?`, ByGroups(KeywordNamespace, NameLabel), nil},
|
||
|
// Label with data
|
||
|
{`(\w+)(:)(\s+\.\w+\s+)`, ByGroups(NameLabel, Punctuation, KeywordNamespace), Push("literal")},
|
||
|
// Label
|
||
|
{`(\w+)(:)`, ByGroups(NameLabel, Punctuation), nil},
|
||
|
// Syscall Op
|
||
|
{`svc\s+\w+`, NameNamespace, nil},
|
||
|
// Opcode
|
||
|
{`[a-zA-Z]+`, Text, Push("opcode")},
|
||
|
},
|
||
|
}
|
||
|
}
|