highlighter-0.2: src/Text/Highlighter/Lexers/Nasm.hs
module Text.Highlighter.Lexers.Nasm (lexer) where
import Text.Regex.PCRE.Light
import Text.Highlighter.Types
lexer :: Lexer
lexer = Lexer
{ lName = "NASM"
, lAliases = ["nasm"]
, lExtensions = [".asm", ".ASM"]
, lMimetypes = ["text/x-nasm"]
, lStart = root'
, lFlags = [caseless, multiline]
}
preproc' :: TokenMatcher
preproc' =
[ tok "[^;\\n]+" (Arbitrary "Comment" :. Arbitrary "Preproc")
, tokNext ";.*?\\n" (Arbitrary "Comment" :. Arbitrary "Single") Pop
, tokNext "\\n" (Arbitrary "Comment" :. Arbitrary "Preproc") Pop
]
punctuation' :: TokenMatcher
punctuation' =
[ tok "[,():\\[\\]]+" (Arbitrary "Punctuation")
, tok "[&|^<>+*/%\126-]+" (Arbitrary "Operator")
, tok "[$]+" (Arbitrary "Keyword" :. Arbitrary "Constant")
, tok "seg|wrt|strict" (Arbitrary "Operator" :. Arbitrary "Word")
, tok "byte|[dq]?word" (Arbitrary "Keyword" :. Arbitrary "Type")
]
root' :: TokenMatcher
root' =
[ anyOf whitespace'
, tokNext "^\\s*%" (Arbitrary "Comment" :. Arbitrary "Preproc") (GoTo preproc')
, tok "[a-zA-Z$._?][a-zA-Z0-9$._?#@\126]*:" (Arbitrary "Name" :. Arbitrary "Label")
, tokNext "([a-zA-Z$._?][a-zA-Z0-9$._?#@\126]*)(\\s+)(equ)" (ByGroups [(Arbitrary "Name" :. Arbitrary "Constant"), (Arbitrary "Keyword" :. Arbitrary "Declaration"), (Arbitrary "Keyword" :. Arbitrary "Declaration")]) (GoTo instructionArgs')
, tokNext "BITS|USE16|USE32|SECTION|SEGMENT|ABSOLUTE|EXTERN|GLOBAL|ORG|ALIGN|STRUC|ENDSTRUC|COMMON|CPU|GROUP|UPPERCASE|IMPORT|EXPORT|LIBRARY|MODULE" (Arbitrary "Keyword") (GoTo instructionArgs')
, tokNext "(?:res|d)[bwdqt]|times" (Arbitrary "Keyword" :. Arbitrary "Declaration") (GoTo instructionArgs')
, tokNext "[a-zA-Z$._?][a-zA-Z0-9$._?#@\126]*" (Arbitrary "Name" :. Arbitrary "Function") (GoTo instructionArgs')
, tok "[\\r\\n]+" (Arbitrary "Text")
]
whitespace' :: TokenMatcher
whitespace' =
[ tok "\\n" (Arbitrary "Text")
, tok "[ \\t]+" (Arbitrary "Text")
, tok ";.*" (Arbitrary "Comment" :. Arbitrary "Single")
]
instructionArgs' :: TokenMatcher
instructionArgs' =
[ tok "\"(\\\\\"|[^\"])*\"|'(\\\\'|[^'])*'" (Arbitrary "Literal" :. Arbitrary "String")
, tok "(?:0[xX][0-9a-fA-F]+|$0[0-9a-fA-F]*|[0-9]+[0-9a-fA-F]*h)" (Arbitrary "Literal" :. Arbitrary "Number" :. Arbitrary "Hex")
, tok "[0-7]+q" (Arbitrary "Literal" :. Arbitrary "Number" :. Arbitrary "Oct")
, tok "[01]+b" (Arbitrary "Literal" :. Arbitrary "Number")
, tok "[0-9]+\\.e?[0-9]+" (Arbitrary "Literal" :. Arbitrary "Number" :. Arbitrary "Float")
, tok "[0-9]+" (Arbitrary "Literal" :. Arbitrary "Number" :. Arbitrary "Integer")
, anyOf punctuation'
, tok "[a-d][lh]|e?[a-d]x|e?[sb]p|e?[sd]i|[c-gs]s|st[0-7]|mm[0-7]|cr[0-4]|dr[0-367]|tr[3-7]" (Arbitrary "Name" :. Arbitrary "Builtin")
, tok "[a-zA-Z$._?][a-zA-Z0-9$._?#@\126]*" (Arbitrary "Name" :. Arbitrary "Variable")
, tokNext "[\\r\\n]+" (Arbitrary "Text") Pop
, anyOf whitespace'
]