highlighter-0.2: src/Text/Highlighter/Lexers/Ada.hs
module Text.Highlighter.Lexers.Ada (lexer) where
import Text.Regex.PCRE.Light
import Text.Highlighter.Types
lexer :: Lexer
lexer = Lexer
{ lName = "Ada"
, lAliases = ["ada", "ada95ada2005"]
, lExtensions = [".adb", ".ads", ".ada"]
, lMimetypes = ["text/x-ada"]
, lStart = root'
, lFlags = [caseless, multiline]
}
package_instantiation' :: TokenMatcher
package_instantiation' =
[ tok "(\"[^\"]+\"|[a-z0-9_]+)(\\s+)(=>)" (ByGroups [(Arbitrary "Name" :. Arbitrary "Variable"), (Arbitrary "Text"), (Arbitrary "Punctuation")])
, tok "[a-z0-9._\\'\"]" (Arbitrary "Text")
, tokNext "\\)" (Arbitrary "Punctuation") Pop
, anyOf root'
]
formal_part' :: TokenMatcher
formal_part' =
[ tokNext "\\)" (Arbitrary "Punctuation") Pop
, tok "([a-z0-9_]+)(\\s*)(,|:[^=])" (ByGroups [(Arbitrary "Name" :. Arbitrary "Variable"), (Arbitrary "Text"), (Arbitrary "Punctuation")])
, tok "(in|not|null|out|access)\\b" (Arbitrary "Keyword" :. Arbitrary "Reserved")
, anyOf root'
]
attribute' :: TokenMatcher
attribute' =
[ tok "(')([a-zA-Z0-9_]+)" (ByGroups [(Arbitrary "Punctuation"), (Arbitrary "Name" :. Arbitrary "Attribute")])
]
subprogram' :: TokenMatcher
subprogram' =
[ tokNext "\\(" (Arbitrary "Punctuation") (DoAll [Pop, (GoTo formal_part')])
, tokNext ";" (Arbitrary "Punctuation") Pop
, tokNext "is\\b" (Arbitrary "Keyword" :. Arbitrary "Reserved") Pop
, tok "\"[^\"]+\"|[a-z0-9_]+" (Arbitrary "Name" :. Arbitrary "Function")
, anyOf root'
]
numbers' :: TokenMatcher
numbers' =
[ tok "[0-9_]+#[0-9a-f]+#" (Arbitrary "Literal" :. Arbitrary "Number" :. Arbitrary "Hex")
, tok "[0-9_]+\\.[0-9_]*" (Arbitrary "Literal" :. Arbitrary "Number" :. Arbitrary "Float")
, tok "[0-9_]+" (Arbitrary "Literal" :. Arbitrary "Number" :. Arbitrary "Integer")
]
type_def' :: TokenMatcher
type_def' =
[ tokNext ";" (Arbitrary "Punctuation") Pop
, tokNext "\\(" (Arbitrary "Punctuation") (GoTo formal_part')
, tok "with|and|use" (Arbitrary "Keyword" :. Arbitrary "Reserved")
, tokNext "array\\b" (Arbitrary "Keyword" :. Arbitrary "Reserved") (DoAll [Pop, (GoTo array_def')])
, tokNext "record\\b" (Arbitrary "Keyword" :. Arbitrary "Reserved") (GoTo formal_part')
, anyOf root'
]
end' :: TokenMatcher
end' =
[ tok "(if|case|record|loop|select)" (Arbitrary "Keyword" :. Arbitrary "Reserved")
, tok "\"[^\"]+\"|[a-zA-Z0-9_]+" (Arbitrary "Name" :. Arbitrary "Function")
, tok "[\10\\s]+" (Arbitrary "Text")
, tokNext ";" (Arbitrary "Punctuation") Pop
]
array_def' :: TokenMatcher
array_def' =
[ tokNext ";" (Arbitrary "Punctuation") Pop
, tok "([a-z0-9_]+)(\\s+)(range)" (ByGroups [(Arbitrary "Keyword" :. Arbitrary "Type"), (Arbitrary "Text"), (Arbitrary "Keyword" :. Arbitrary "Reserved")])
, anyOf root'
]
package' :: TokenMatcher
package' =
[ tok "body" (Arbitrary "Keyword" :. Arbitrary "Declaration")
, tok "is\\s+new|renames" (Arbitrary "Keyword" :. Arbitrary "Reserved")
, tokNext "is" (Arbitrary "Keyword" :. Arbitrary "Reserved") Pop
, tokNext ";" (Arbitrary "Punctuation") Pop
, tokNext "\\(" (Arbitrary "Punctuation") (GoTo package_instantiation')
, tok "([a-zA-Z0-9_.]+)" (Arbitrary "Name" :. Arbitrary "Class")
, anyOf root'
]
import' :: TokenMatcher
import' =
[ tokNext "[a-z0-9_.]+" (Arbitrary "Name" :. Arbitrary "Namespace") Pop
]
root' :: TokenMatcher
root' =
[ tok "[^\\S\\n]+" (Arbitrary "Text")
, tok "--.*?\\n" (Arbitrary "Comment" :. Arbitrary "Single")
, tok "[^\\S\\n]+" (Arbitrary "Text")
, tokNext "function|procedure|entry" (Arbitrary "Keyword" :. Arbitrary "Declaration") (GoTo subprogram')
, tokNext "(subtype|type)(\\s+)([a-z0-9_]+)" (ByGroups [(Arbitrary "Keyword" :. Arbitrary "Declaration"), (Arbitrary "Text"), (Arbitrary "Keyword" :. Arbitrary "Type")]) (GoTo type_def')
, tok "task|protected" (Arbitrary "Keyword" :. Arbitrary "Declaration")
, tok "(subtype)(\\s+)" (ByGroups [(Arbitrary "Keyword" :. Arbitrary "Declaration"), (Arbitrary "Text")])
, tokNext "(end)(\\s+)" (ByGroups [(Arbitrary "Keyword" :. Arbitrary "Reserved"), (Arbitrary "Text")]) (GoTo end')
, tok "(pragma)(\\s+)([a-zA-Z0-9_]+)" (ByGroups [(Arbitrary "Keyword" :. Arbitrary "Reserved"), (Arbitrary "Text"), (Arbitrary "Comment" :. Arbitrary "Preproc")])
, tok "(true|false|null)\\b" (Arbitrary "Keyword" :. Arbitrary "Constant")
, tok "(Byte|Character|Float|Integer|Long_Float|Long_Integer|Long_Long_Float|Long_Long_Integer|Natural|Positive|Short_Float|Short_Integer|Short_Short_Float|Short_Short_Integer|String|Wide_String|Duration)\\b" (Arbitrary "Keyword" :. Arbitrary "Type")
, tok "(and(\\s+then)?|in|mod|not|or(\\s+else)|rem)\\b" (Arbitrary "Operator" :. Arbitrary "Word")
, tok "generic|private" (Arbitrary "Keyword" :. Arbitrary "Declaration")
, tokNext "package" (Arbitrary "Keyword" :. Arbitrary "Declaration") (GoTo package')
, tokNext "array\\b" (Arbitrary "Keyword" :. Arbitrary "Reserved") (GoTo array_def')
, tokNext "(with|use)(\\s+)" (ByGroups [(Arbitrary "Keyword" :. Arbitrary "Namespace"), (Arbitrary "Text")]) (GoTo import')
, tok "([a-z0-9_]+)(\\s*)(:)(\\s*)(constant)" (ByGroups [(Arbitrary "Name" :. Arbitrary "Constant"), (Arbitrary "Text"), (Arbitrary "Punctuation"), (Arbitrary "Text"), (Arbitrary "Keyword" :. Arbitrary "Reserved")])
, tok "<<[a-z0-9_]+>>" (Arbitrary "Name" :. Arbitrary "Label")
, tok "([a-z0-9_]+)(\\s*)(:)(\\s*)(declare|begin|loop|for|while)" (ByGroups [(Arbitrary "Name" :. Arbitrary "Label"), (Arbitrary "Text"), (Arbitrary "Punctuation"), (Arbitrary "Text"), (Arbitrary "Keyword" :. Arbitrary "Reserved")])
, tok "\\b(abort|abs|abstract|accept|access|aliased|all|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|elsif|end|entry|exception|exit|interface|for|goto|if|is|limited|loop|new|null|of|or|others|out|overriding|pragma|protected|raise|range|record|renames|requeue|return|reverse|select|separate|subtype|synchronized|task|tagged|terminate|then|type|until|when|while|xor)\\b" (Arbitrary "Keyword" :. Arbitrary "Reserved")
, tok "\"[^\"]*\"" (Arbitrary "Literal" :. Arbitrary "String")
, anyOf attribute'
, anyOf numbers'
, tok "'[^']'" (Arbitrary "Literal" :. Arbitrary "String" :. Arbitrary "Character")
, tok "([a-z0-9_]+)(\\s*|[(,])" (ByGroups [(Arbitrary "Name"), (Using lexer)])
, tok "(<>|=>|:=|[\\(\\)\\|:;,.'])" (Arbitrary "Punctuation")
, tok "[*<>+=/&-]" (Arbitrary "Operator")
, tok "\\n+" (Arbitrary "Text")
]