highlighter-0.2: src/Text/Highlighter/Lexers/Antlr.hs
module Text.Highlighter.Lexers.Antlr (lexer) where
import Text.Regex.PCRE.Light
import Text.Highlighter.Types
lexer :: Lexer
lexer = Lexer
{ lName = "ANTLR"
, lAliases = ["antlr"]
, lExtensions = []
, lMimetypes = []
, lStart = root'
, lFlags = [multiline]
}
tokens' :: TokenMatcher
tokens' =
[ anyOf whitespace'
, anyOf comments'
, tok "{" (Arbitrary "Punctuation")
, tok "([A-Z][A-Za-z_0-9]*)(\\s*)(=)?(\\s*)(\\'(?:\\\\\\\\|\\\\\\'|[^\\']*)\\')?(\\s*)(;)" (ByGroups [(Arbitrary "Name" :. Arbitrary "Label"), (Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Punctuation"), (Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Literal" :. Arbitrary "String"), (Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Punctuation")])
, tokNext "}" (Arbitrary "Punctuation") Pop
]
exception' :: TokenMatcher
exception' =
[ tokNext "\\n" (Arbitrary "Text" :. Arbitrary "Whitespace") Pop
, tok "\\s" (Arbitrary "Text" :. Arbitrary "Whitespace")
, anyOf comments'
, tokNext "\\[" (Arbitrary "Punctuation") (GoTo nestedArgAction')
, tokNext "\\{" (Arbitrary "Punctuation") (GoTo action')
]
whitespace' :: TokenMatcher
whitespace' =
[ tok "\\s+" (Arbitrary "Text" :. Arbitrary "Whitespace")
]
action' :: TokenMatcher
action' =
[ tok "([^\\${}\\'\"/\\\\]+|\"(\\\\\\\\|\\\\\"|[^\"])*\"|'(\\\\\\\\|\\\\'|[^'])*'|//.*$\\n?|/\\*(.|\\n)*?\\*/|/(?!\\*)(\\\\\\\\|\\\\/|[^/])*/|\\\\(?!%)|/)+" (Arbitrary "Other")
, tok "(\\\\)(%)" (ByGroups [(Arbitrary "Punctuation"), (Arbitrary "Other")])
, tok "(\\$[a-zA-Z]+)(\\.?)(text|value)?" (ByGroups [(Arbitrary "Name" :. Arbitrary "Variable"), (Arbitrary "Punctuation"), (Arbitrary "Name" :. Arbitrary "Property")])
, tokNext "{" (Arbitrary "Punctuation") Push
, tokNext "}" (Arbitrary "Punctuation") Pop
]
nestedArgAction' :: TokenMatcher
nestedArgAction' =
[ tok "([^\\$\\[\\]\\'\"/]+|\"(\\\\\\\\|\\\\\"|[^\"])*\"|'(\\\\\\\\|\\\\'|[^'])*'|//.*$\\n?|/\\*(.|\\n)*?\\*/|/(?!\\*)(\\\\\\\\|\\\\/|[^/])*/|/)+" (Arbitrary "Other")
, tokNext "\\[" (Arbitrary "Punctuation") Push
, tokNext "\\]" (Arbitrary "Punctuation") Pop
, tok "(\\$[a-zA-Z]+)(\\.?)(text|value)?" (ByGroups [(Arbitrary "Name" :. Arbitrary "Variable"), (Arbitrary "Punctuation"), (Arbitrary "Name" :. Arbitrary "Property")])
, tok "(\\\\\\\\|\\\\\\]|\\\\\\[|[^\\[\\]])+" (Arbitrary "Other")
]
rulePrelims' :: TokenMatcher
rulePrelims' =
[ anyOf whitespace'
, anyOf comments'
, tok "returns\\b" (Arbitrary "Keyword")
, tokNext "\\[" (Arbitrary "Punctuation") (GoTo nestedArgAction')
, tokNext "\\{" (Arbitrary "Punctuation") (GoTo action')
, tok "(throws)(\\s+)([A-Za-z][A-Za-z_0-9]*)" (ByGroups [(Arbitrary "Keyword"), (Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Name" :. Arbitrary "Label")])
, tok "(?:(,)(\\s*)([A-Za-z][A-Za-z_0-9]*))+" (ByGroups [(Arbitrary "Punctuation"), (Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Name" :. Arbitrary "Label")])
, tokNext "options\\b" (Arbitrary "Keyword") (GoTo options')
, tokNext "(scope)(\\s+)({)" (ByGroups [(Arbitrary "Keyword"), (Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Punctuation")]) (GoTo action')
, tok "(scope)(\\s+)([A-Za-z][A-Za-z_0-9]*)(\\s*)(;)" (ByGroups [(Arbitrary "Keyword"), (Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Name" :. Arbitrary "Label"), (Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Punctuation")])
, tokNext "(@[A-Za-z][A-Za-z_0-9]*)(\\s*)({)" (ByGroups [(Arbitrary "Name" :. Arbitrary "Label"), (Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Punctuation")]) (GoTo action')
, tokNext ":" (Arbitrary "Punctuation") Pop
]
root' :: TokenMatcher
root' =
[ anyOf whitespace'
, anyOf comments'
, tok "(lexer|parser|tree)?(\\s*)(grammar\\b)(\\s*)([A-Za-z][A-Za-z_0-9]*)(;)" (ByGroups [(Arbitrary "Keyword"), (Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Keyword"), (Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Name" :. Arbitrary "Class"), (Arbitrary "Punctuation")])
, tokNext "options\\b" (Arbitrary "Keyword") (GoTo options')
, tokNext "tokens\\b" (Arbitrary "Keyword") (GoTo tokens')
, tokNext "(scope)(\\s*)([A-Za-z][A-Za-z_0-9]*)(\\s*)({)" (ByGroups [(Arbitrary "Keyword"), (Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Name" :. Arbitrary "Variable"), (Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Punctuation")]) (GoTo action')
, tokNext "(catch|finally)\\b" (Arbitrary "Keyword") (GoTo exception')
, tokNext "(@[A-Za-z][A-Za-z_0-9]*)(\\s*)(::)?(\\s*)([A-Za-z][A-Za-z_0-9]*)(\\s*)({)" (ByGroups [(Arbitrary "Name" :. Arbitrary "Label"), (Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Punctuation"), (Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Name" :. Arbitrary "Label"), (Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Punctuation")]) (GoTo action')
, tokNext "((?:protected|private|public|fragment)\\b)?(\\s*)([A-Za-z][A-Za-z_0-9]*)(!)?" (ByGroups [(Arbitrary "Keyword"), (Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Name" :. Arbitrary "Label"), (Arbitrary "Punctuation")]) (DoAll [(GoTo ruleAlts'), (GoTo rulePrelims')])
]
ruleAlts' :: TokenMatcher
ruleAlts' =
[ anyOf whitespace'
, anyOf comments'
, tokNext "options\\b" (Arbitrary "Keyword") (GoTo options')
, tok ":" (Arbitrary "Punctuation")
, tok "'(\\\\\\\\|\\\\'|[^'])*'" (Arbitrary "Literal" :. Arbitrary "String")
, tok "\"(\\\\\\\\|\\\\\"|[^\"])*\"" (Arbitrary "Literal" :. Arbitrary "String")
, tok "<<([^>]|>[^>])>>" (Arbitrary "Literal" :. Arbitrary "String")
, tok "\\$?[A-Z_][A-Za-z_0-9]*" (Arbitrary "Name" :. Arbitrary "Constant")
, tok "\\$?[a-z_][A-Za-z_0-9]*" (Arbitrary "Name" :. Arbitrary "Variable")
, tok "(\\+|\\||->|=>|=|\\(|\\)|\\.\\.|\\.|\\?|\\*|\\^|!|\\#|\126)" (Arbitrary "Operator")
, tok "," (Arbitrary "Punctuation")
, tokNext "\\[" (Arbitrary "Punctuation") (GoTo nestedArgAction')
, tokNext "\\{" (Arbitrary "Punctuation") (GoTo action')
, tokNext ";" (Arbitrary "Punctuation") Pop
]
comments' :: TokenMatcher
comments' =
[ tok "//.*$" (Arbitrary "Comment")
, tok "/\\*(.|\\n)*?\\*/" (Arbitrary "Comment")
]
options' :: TokenMatcher
options' =
[ anyOf whitespace'
, anyOf comments'
, tok "{" (Arbitrary "Punctuation")
, tok "([A-Za-z][A-Za-z_0-9]*)(\\s*)(=)(\\s*)([A-Za-z][A-Za-z_0-9]*|\\'(?:\\\\\\\\|\\\\\\'|[^\\']*)\\'|[0-9]+|\\*)(\\s*)(;)" (ByGroups [(Arbitrary "Name" :. Arbitrary "Variable"), (Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Punctuation"), (Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Text"), (Arbitrary "Text" :. Arbitrary "Whitespace"), (Arbitrary "Punctuation")])
, tokNext "}" (Arbitrary "Punctuation") Pop
]