/usr/lib/ruby/vendor_ruby/rugments/lexers/haskell.rb is in ruby-rugments 1.0.0~beta8-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 | module Rugments
module Lexers
class Haskell < RegexLexer
title 'Haskell'
desc 'The Haskell programming language (haskell.org)'
tag 'haskell'
aliases 'hs'
filenames '*.hs'
mimetypes 'text/x-haskell'
def self.analyze_text(text)
return 1 if text.shebang?('runhaskell')
end
reserved = %w(
_ case class data default deriving do else if in
infix[lr]? instance let newtype of then type where
)
ascii = %w(
NUL SOH [SE]TX EOT ENQ ACK BEL BS HT LF VT FF CR S[OI] DLE
DC[1-4] NAK SYN ETB CAN EM SUB ESC [FGRU]S SP DEL
)
state :basic do
rule /\s+/m, Text
rule /{-#/, Comment::Preproc, :comment_preproc
rule /{-/, Comment::Multiline, :comment
rule /^--\s+\|.*?$/, Comment::Doc
# this is complicated in order to support custom symbols
# like -->
rule /--(?![!#\$\%&*+.\/<=>?@\^\|_~]).*?$/, Comment::Single
end
# nested commenting
state :comment do
rule /-}/, Comment::Multiline, :pop!
rule /{-/, Comment::Multiline, :comment
rule /[^-{}]+/, Comment::Multiline
rule /[-{}]/, Comment::Multiline
end
state :comment_preproc do
rule /-}/, Comment::Preproc, :pop!
rule /{-/, Comment::Preproc, :comment
rule /[^-{}]+/, Comment::Preproc
rule /[-{}]/, Comment::Preproc
end
state :root do
mixin :basic
rule /\bimport\b/, Keyword::Reserved, :import
rule /\bmodule\b/, Keyword::Reserved, :module
rule /\berror\b/, Name::Exception
rule /\b(?:#{reserved.join('|')})\b/, Keyword::Reserved
# not sure why, but ^ doesn't work here
# rule /^[_a-z][\w']*/, Name::Function
rule /[_a-z][\w']*/, Name
rule /[A-Z][\w']*/, Keyword::Type
# lambda operator
rule %r{\\(?![:!#\$\%&*+.\\/<=>?@^\|~-]+)}, Name::Function
# special operators
rule %r{(<-|::|->|=>|=)(?![:!#\$\%&*+.\\/<=>?@^\|~-]+)}, Operator
# constructor/type operators
rule %r{:[:!#\$\%&*+.\\/<=>?@^\|~-]*}, Operator
# other operators
rule %r{[:!#\$\%&*+.\\/<=>?@^\|~-]+}, Operator
rule /\d+e[+-]?\d+/i, Num::Float
rule /\d+\.\d+(e[+-]?\d+)?/i, Num::Float
rule /0o[0-7]+/i, Num::Oct
rule /0x[\da-f]+/i, Num::Hex
rule /\d+/, Num::Integer
rule /'/, Str::Char, :character
rule /"/, Str, :string
rule /\[\s*\]/, Keyword::Type
rule /\(\s*\)/, Name::Builtin
rule /[\[\](),;`{}]/, Punctuation
end
state :import do
rule /\s+/, Text
rule /"/, Str, :string
rule /\bqualified\b/, Keyword
# import X as Y
rule /([A-Z][\w.]*)(\s+)(as)(\s+)([A-Z][a-zA-Z0-9_.]*)/ do
groups(
Name::Namespace, # X
Text, Keyword, # as
Text, Name # Y
)
pop!
end
# import X hiding (functions)
rule /([A-Z][\w.]*)(\s+)(hiding)(\s+)(\()/ do
groups(
Name::Namespace, # X
Text, Keyword, # hiding
Text, Punctuation # (
)
goto :funclist
end
# import X (functions)
rule /([A-Z][\w.]*)(\s+)(\()/ do
groups(
Name::Namespace, # X
Text,
Punctuation # (
)
goto :funclist
end
rule /[\w.]+/, Name::Namespace, :pop!
end
state :module do
rule /\s+/, Text
# module Foo (functions)
rule /([A-Z][\w.]*)(\s+)(\()/ do
groups Name::Namespace, Text, Punctuation
push :funclist
end
rule /\bwhere\b/, Keyword::Reserved, :pop!
rule /[A-Z][a-zA-Z0-9_.]*/, Name::Namespace, :pop!
end
state :funclist do
mixin :basic
rule /[A-Z]\w*/, Keyword::Type
rule /(_[\w\']+|[a-z][\w\']*)/, Name::Function
rule /,/, Punctuation
rule /[:!#\$\%&*+.\\\/<=>?@^\|~-]+/, Operator
rule /\(/, Punctuation, :funclist
rule /\)/, Punctuation, :pop!
end
state :character do
rule /\\/ do
token Str::Escape
push :character_end
push :escape
end
rule /./ do
token Str::Char
goto :character_end
end
end
state :character_end do
rule /'/, Str::Char, :pop!
rule /./, Error, :pop!
end
state :string do
rule /"/, Str, :pop!
rule /\\/, Str::Escape, :escape
rule /[^\\"]+/, Str
end
state :escape do
rule /[abfnrtv"'&\\]/, Str::Escape, :pop!
rule /\^[\]\[A-Z@\^_]/, Str::Escape, :pop!
rule /#{ascii.join('|')}/, Str::Escape, :pop!
rule /o[0-7]+/i, Str::Escape, :pop!
rule /x[\da-f]/i, Str::Escape, :pop!
rule /\d+/, Str::Escape, :pop!
rule /\s+\\/, Str::Escape, :pop!
end
end
end
end
|