hscolour-1.6: docs/hscolour/Language/Haskell/HsColour/Classify.html
<pre><u><font color=Green>module</font></u> Language<font color=Cyan>.</font>Haskell<font color=Cyan>.</font>HsColour<font color=Cyan>.</font>Classify
<font color=Cyan>(</font> TokenType<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>
<font color=Cyan>,</font> tokenise
<font color=Cyan>)</font> <u><font color=Green>where</font></u>
<u><font color=Green>import</font></u> Char
<u><font color=Green>import</font></u> List
<font color=Blue>-- Lex Haskell source code into an annotated token stream, without</font>
<font color=Blue>-- discarding any characters or layout.</font>
tokenise <font color=Red>::</font> String <font color=Red>-></font> <font color=Red>[</font><font color=Cyan>(</font>TokenType<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font>
<a name="tokenise"></a>tokenise <font color=Red>=</font> map <font color=Cyan>(</font><font color=Red>\</font>s<font color=Red>-></font> <font color=Cyan>(</font>classify s<font color=Cyan>,</font>s<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>.</font> glue <font color=Cyan>.</font> chunk
<font color=Blue>-- Basic Haskell lexing, except we keep whitespace.</font>
chunk <font color=Red>::</font> String <font color=Red>-></font> <font color=Red>[</font>String<font color=Red>]</font>
<a name="chunk"></a>chunk <font color=Red>[</font><font color=Red>]</font> <font color=Red>=</font> <font color=Red>[</font><font color=Red>]</font>
chunk <font color=Cyan>(</font><font color=Magenta>'\r'</font><b><font color=Red>:</font></b>s<font color=Cyan>)</font> <font color=Red>=</font> chunk s <font color=Blue>-- get rid of DOS newline stuff</font>
chunk <font color=Cyan>(</font><font color=Magenta>'\n'</font><b><font color=Red>:</font></b>s<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"\n"</font><b><font color=Red>:</font></b> chunk s
chunk <font color=Cyan>(</font>c<b><font color=Red>:</font></b>s<font color=Cyan>)</font> <font color=Red>|</font> isLinearSpace c
<font color=Red>=</font> <font color=Cyan>(</font>c<b><font color=Red>:</font></b>ss<font color=Cyan>)</font><b><font color=Red>:</font></b> chunk rest <u><font color=Green>where</font></u> <font color=Cyan>(</font>ss<font color=Cyan>,</font>rest<font color=Cyan>)</font> <font color=Red>=</font> span isLinearSpace s
chunk <font color=Cyan>(</font><font color=Magenta>'{'</font><b><font color=Red>:</font></b><font color=Magenta>'-'</font><b><font color=Red>:</font></b>s<font color=Cyan>)</font> <font color=Red>=</font> <u><font color=Green>let</font></u> <font color=Cyan>(</font>com<font color=Cyan>,</font>s'<font color=Cyan>)</font> <font color=Red>=</font> nestcomment <font color=Magenta>0</font> s
<u><font color=Green>in</font></u> <font color=Cyan>(</font><font color=Magenta>'{'</font><b><font color=Red>:</font></b><font color=Magenta>'-'</font><b><font color=Red>:</font></b>com<font color=Cyan>)</font> <b><font color=Red>:</font></b> chunk s'
chunk s <font color=Red>=</font> <u><font color=Green>case</font></u> Prelude<font color=Cyan>.</font>lex s <u><font color=Green>of</font></u>
<font color=Red>[</font><font color=Red>]</font> <font color=Red>-></font> <font color=Red>[</font>head s<font color=Red>]</font><b><font color=Red>:</font></b> chunk <font color=Cyan>(</font>tail s<font color=Cyan>)</font> <font color=Blue>-- e.g. inside comment</font>
<font color=Cyan>(</font><font color=Cyan>(</font>tok<font color=Red>@</font><font color=Cyan>(</font><font color=Magenta>'-'</font><b><font color=Red>:</font></b><font color=Magenta>'-'</font><b><font color=Red>:</font></b><u><font color=Green>_</font></u><font color=Cyan>)</font><font color=Cyan>,</font>rest<font color=Cyan>)</font><b><font color=Red>:</font></b><u><font color=Green>_</font></u><font color=Cyan>)</font>
<font color=Red>|</font> all <font color=Cyan>(</font><font color=Cyan>==</font><font color=Magenta>'-'</font><font color=Cyan>)</font> tok <font color=Red>-></font> <font color=Cyan>(</font>tok<font color=Cyan>++</font>com<font color=Cyan>)</font><b><font color=Red>:</font></b> chunk s'
<u><font color=Green>where</font></u> <font color=Cyan>(</font>com<font color=Cyan>,</font>s'<font color=Cyan>)</font> <font color=Red>=</font> eolcomment rest
<font color=Cyan>(</font><font color=Cyan>(</font>tok<font color=Cyan>,</font>rest<font color=Cyan>)</font><b><font color=Red>:</font></b><u><font color=Green>_</font></u><font color=Cyan>)</font> <font color=Red>-></font> tok<b><font color=Red>:</font></b> chunk rest
<a name="isLinearSpace"></a>isLinearSpace c <font color=Red>=</font> c <font color=Cyan>`elem`</font> <font color=Magenta>" \t"</font> <font color=Blue>-- " \t\xa0"</font>
<font color=Blue>-- Glue sequences of tokens into more useful blobs</font>
<font color=Blue>--glue (q:".":n:rest) | Char.isUpper (head q) -- qualified names</font>
<font color=Blue>-- = glue ((q++"."++n): rest)</font>
<a name="glue"></a>glue <font color=Cyan>(</font><font color=Magenta>"`"</font><b><font color=Red>:</font></b>rest<font color=Cyan>)</font> <font color=Red>=</font> <font color=Blue>-- `varid` -> varop</font>
<u><font color=Green>case</font></u> glue rest <u><font color=Green>of</font></u>
<font color=Cyan>(</font>qn<b><font color=Red>:</font></b><font color=Magenta>"`"</font><b><font color=Red>:</font></b>rest<font color=Cyan>)</font> <font color=Red>-></font> <font color=Cyan>(</font><font color=Magenta>"`"</font><font color=Cyan>++</font>qn<font color=Cyan>++</font><font color=Magenta>"`"</font><font color=Cyan>)</font><b><font color=Red>:</font></b> glue rest
<u><font color=Green>_</font></u> <font color=Red>-></font> <font color=Cyan>(</font><font color=Magenta>"`"</font><b><font color=Red>:</font></b> rest<font color=Cyan>)</font>
glue <font color=Cyan>(</font>s<b><font color=Red>:</font></b>ss<font color=Cyan>)</font> <font color=Red>|</font> all <font color=Cyan>(</font><font color=Cyan>==</font><font color=Magenta>'-'</font><font color=Cyan>)</font> s <font color=Cyan>&&</font> length s <font color=Cyan>>=</font><font color=Magenta>2</font> <font color=Blue>-- eol comment</font>
<font color=Red>=</font> <font color=Cyan>(</font>s<font color=Cyan>++</font>concat c<font color=Cyan>)</font><b><font color=Red>:</font></b> glue rest
<u><font color=Green>where</font></u> <font color=Cyan>(</font>c<font color=Cyan>,</font>rest<font color=Cyan>)</font> <font color=Red>=</font> break <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Cyan>`elem`</font><font color=Cyan>)</font> ss
<font color=Blue>--glue ("{":"-":ss) = ("{-"++c): glue rest -- nested comment</font>
<font color=Blue>-- where (c,rest) = nestcomment 0 ss</font>
glue <font color=Cyan>(</font>s<b><font color=Red>:</font></b>ss<font color=Cyan>)</font> <font color=Red>=</font> s<b><font color=Red>:</font></b> glue ss
glue <font color=Red>[</font><font color=Red>]</font> <font color=Red>=</font> <font color=Red>[</font><font color=Red>]</font>
<font color=Blue>-- Deal with comments.</font>
nestcomment <font color=Red>::</font> Int <font color=Red>-></font> String <font color=Red>-></font> <font color=Cyan>(</font>String<font color=Cyan>,</font>String<font color=Cyan>)</font>
<a name="nestcomment"></a>nestcomment n <font color=Cyan>(</font><font color=Magenta>'{'</font><b><font color=Red>:</font></b><font color=Magenta>'-'</font><b><font color=Red>:</font></b>ss<font color=Cyan>)</font> <font color=Red>|</font> n<font color=Cyan>>=</font><font color=Magenta>0</font> <font color=Red>=</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"{-"</font><font color=Cyan>++</font>cs<font color=Cyan>)</font><font color=Cyan>,</font>rm<font color=Cyan>)</font>
<u><font color=Green>where</font></u> <font color=Cyan>(</font>cs<font color=Cyan>,</font>rm<font color=Cyan>)</font> <font color=Red>=</font> nestcomment <font color=Cyan>(</font>n<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font> ss
nestcomment n <font color=Cyan>(</font><font color=Magenta>'-'</font><b><font color=Red>:</font></b><font color=Magenta>'}'</font><b><font color=Red>:</font></b>ss<font color=Cyan>)</font> <font color=Red>|</font> n<font color=Cyan>></font><font color=Magenta>0</font> <font color=Red>=</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"-}"</font><font color=Cyan>++</font>cs<font color=Cyan>)</font><font color=Cyan>,</font>rm<font color=Cyan>)</font>
<u><font color=Green>where</font></u> <font color=Cyan>(</font>cs<font color=Cyan>,</font>rm<font color=Cyan>)</font> <font color=Red>=</font> nestcomment <font color=Cyan>(</font>n<font color=Blue>-</font><font color=Magenta>1</font><font color=Cyan>)</font> ss
nestcomment n <font color=Cyan>(</font><font color=Magenta>'-'</font><b><font color=Red>:</font></b><font color=Magenta>'}'</font><b><font color=Red>:</font></b>ss<font color=Cyan>)</font> <font color=Red>|</font> n<font color=Cyan>==</font><font color=Magenta>0</font> <font color=Red>=</font> <font color=Cyan>(</font><font color=Magenta>"-}"</font><font color=Cyan>,</font>ss<font color=Cyan>)</font>
nestcomment n <font color=Cyan>(</font>s<b><font color=Red>:</font></b>ss<font color=Cyan>)</font> <font color=Red>|</font> n<font color=Cyan>>=</font><font color=Magenta>0</font> <font color=Red>=</font> <font color=Cyan>(</font><font color=Cyan>(</font>s<b><font color=Red>:</font></b>cs<font color=Cyan>)</font><font color=Cyan>,</font>rm<font color=Cyan>)</font>
<u><font color=Green>where</font></u> <font color=Cyan>(</font>cs<font color=Cyan>,</font>rm<font color=Cyan>)</font> <font color=Red>=</font> nestcomment n ss
nestcomment n <font color=Red>[</font><font color=Red>]</font> <font color=Red>=</font> <font color=Cyan>(</font><font color=Red>[</font><font color=Red>]</font><font color=Cyan>,</font><font color=Red>[</font><font color=Red>]</font><font color=Cyan>)</font>
eolcomment <font color=Red>::</font> String <font color=Red>-></font> <font color=Cyan>(</font>String<font color=Cyan>,</font>String<font color=Cyan>)</font>
<a name="eolcomment"></a>eolcomment s<font color=Red>@</font><font color=Cyan>(</font><font color=Magenta>'\n'</font><b><font color=Red>:</font></b><u><font color=Green>_</font></u><font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font><font color=Red>[</font><font color=Red>]</font><font color=Cyan>,</font> s<font color=Cyan>)</font>
eolcomment <font color=Cyan>(</font>c<b><font color=Red>:</font></b>s<font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font>c<b><font color=Red>:</font></b>cs<font color=Cyan>,</font> s'<font color=Cyan>)</font> <u><font color=Green>where</font></u> <font color=Cyan>(</font>cs<font color=Cyan>,</font>s'<font color=Cyan>)</font> <font color=Red>=</font> eolcomment s
eolcomment <font color=Red>[</font><font color=Red>]</font> <font color=Red>=</font> <font color=Cyan>(</font><font color=Red>[</font><font color=Red>]</font><font color=Cyan>,</font><font color=Red>[</font><font color=Red>]</font><font color=Cyan>)</font>
<font color=Blue>-- Classify tokens</font>
<a name="TokenType"></a><u><font color=Green>data</font></u> TokenType <font color=Red>=</font>
Space <font color=Red>|</font> Keyword <font color=Red>|</font> Keyglyph <font color=Red>|</font> Layout <font color=Red>|</font> Comment <font color=Red>|</font> Conid <font color=Red>|</font> Varid <font color=Red>|</font>
Conop <font color=Red>|</font> Varop <font color=Red>|</font> String <font color=Red>|</font> Char <font color=Red>|</font> Number <font color=Red>|</font> Error
<u><font color=Green>deriving</font></u> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>
classify <font color=Red>::</font> String <font color=Red>-></font> TokenType
<a name="classify"></a>classify s<font color=Red>@</font><font color=Cyan>(</font>h<b><font color=Red>:</font></b><u><font color=Green>_</font></u><font color=Cyan>)</font>
<font color=Red>|</font> isSpace h <font color=Red>=</font> Space
<font color=Red>|</font> all <font color=Cyan>(</font><font color=Cyan>==</font><font color=Magenta>'-'</font><font color=Cyan>)</font> s <font color=Red>=</font> Comment
<font color=Red>|</font> <font color=Magenta>"--"</font> <font color=Cyan>`isPrefixOf`</font> s
<font color=Cyan>&&</font> any isSpace s <font color=Red>=</font> Comment <font color=Blue>-- not fully correct</font>
<font color=Red>|</font> <font color=Magenta>"{-"</font> <font color=Cyan>`isPrefixOf`</font> s <font color=Red>=</font> Comment
<font color=Red>|</font> s <font color=Cyan>`elem`</font> keywords <font color=Red>=</font> Keyword
<font color=Red>|</font> s <font color=Cyan>`elem`</font> keyglyphs <font color=Red>=</font> Keyglyph
<font color=Red>|</font> s <font color=Cyan>`elem`</font> layoutchars <font color=Red>=</font> Layout
<font color=Red>|</font> isUpper h <font color=Red>=</font> Conid
<font color=Red>|</font> isLower h <font color=Red>=</font> Varid
<font color=Red>|</font> h <font color=Cyan>`elem`</font> symbols <font color=Red>=</font> Varop
<font color=Red>|</font> h<font color=Cyan>==</font><font color=Magenta>':'</font> <font color=Red>=</font> Conop
<font color=Red>|</font> h<font color=Cyan>==</font><font color=Magenta>'`'</font> <font color=Red>=</font> Varop
<font color=Red>|</font> h<font color=Cyan>==</font><font color=Magenta>'"'</font> <font color=Red>=</font> String
<font color=Red>|</font> h<font color=Cyan>==</font><font color=Magenta>'\''</font> <font color=Red>=</font> Char
<font color=Red>|</font> isDigit h <font color=Red>=</font> Number
<font color=Red>|</font> otherwise <font color=Red>=</font> Error
<font color=Blue>-- Haskell keywords</font>
<a name="keywords"></a>keywords <font color=Red>=</font>
<font color=Red>[</font><font color=Magenta>"case"</font><font color=Cyan>,</font><font color=Magenta>"class"</font><font color=Cyan>,</font><font color=Magenta>"data"</font><font color=Cyan>,</font><font color=Magenta>"default"</font><font color=Cyan>,</font><font color=Magenta>"deriving"</font><font color=Cyan>,</font><font color=Magenta>"do"</font><font color=Cyan>,</font><font color=Magenta>"else"</font>
<font color=Cyan>,</font><font color=Magenta>"if"</font><font color=Cyan>,</font><font color=Magenta>"import"</font><font color=Cyan>,</font><font color=Magenta>"in"</font><font color=Cyan>,</font><font color=Magenta>"infix"</font><font color=Cyan>,</font><font color=Magenta>"infixl"</font><font color=Cyan>,</font><font color=Magenta>"infixr"</font><font color=Cyan>,</font><font color=Magenta>"instance"</font><font color=Cyan>,</font><font color=Magenta>"let"</font><font color=Cyan>,</font><font color=Magenta>"module"</font>
<font color=Cyan>,</font><font color=Magenta>"newtype"</font><font color=Cyan>,</font><font color=Magenta>"of"</font><font color=Cyan>,</font><font color=Magenta>"then"</font><font color=Cyan>,</font><font color=Magenta>"type"</font><font color=Cyan>,</font><font color=Magenta>"where"</font><font color=Cyan>,</font><font color=Magenta>"_"</font><font color=Cyan>,</font><font color=Magenta>"foreign"</font><font color=Cyan>,</font><font color=Magenta>"ccall"</font><font color=Cyan>,</font><font color=Magenta>"as"</font><font color=Red>]</font>
<a name="keyglyphs"></a>keyglyphs <font color=Red>=</font>
<font color=Red>[</font><font color=Magenta>".."</font><font color=Cyan>,</font><font color=Magenta>"::"</font><font color=Cyan>,</font><font color=Magenta>"="</font><font color=Cyan>,</font><font color=Magenta>"\\"</font><font color=Cyan>,</font><font color=Magenta>"|"</font><font color=Cyan>,</font><font color=Magenta>"<-"</font><font color=Cyan>,</font><font color=Magenta>"->"</font><font color=Cyan>,</font><font color=Magenta>"@"</font><font color=Cyan>,</font><font color=Magenta>"~"</font><font color=Cyan>,</font><font color=Magenta>"=>"</font><font color=Cyan>,</font><font color=Magenta>"["</font><font color=Cyan>,</font><font color=Magenta>"]"</font><font color=Red>]</font>
<a name="layoutchars"></a>layoutchars <font color=Red>=</font>
map <font color=Cyan>(</font><b><font color=Red>:</font></b><font color=Red>[</font><font color=Red>]</font><font color=Cyan>)</font> <font color=Magenta>";{}(),"</font>
<a name="symbols"></a>symbols <font color=Red>=</font>
<font color=Magenta>"!#$%&*+./<=>?@\\^|-~"</font>
</pre>