]> gitweb.factorcode.org Git - factor.git/blobdiff - basis/xmode/modes/haskell.xml
xmode.modes: updating with recent xmode files
[factor.git] / basis / xmode / modes / haskell.xml
index b38b42db87bb746fe472ba4644ff8cbda67eed47..ff36920c6d96ea6af4dc341cf7a4dabab0da7c4c 100644 (file)
-<?xml version="1.0"?>\r
-\r
-<!DOCTYPE MODE SYSTEM "xmode.dtd">\r
-\r
-<!--\r
-       Haskell mode by Kristian Ovaska (kristian.ovaska@helsinki.fi)\r
-       Based on Haskell 98\r
--->\r
-\r
-<MODE>\r
-\r
-       <PROPS>\r
-               <PROPERTY NAME="commentStart" VALUE="{-" />\r
-               <PROPERTY NAME="commentEnd" VALUE="-}" />\r
-               <PROPERTY NAME="lineComment" VALUE="--" />\r
-               <!-- apparently, this is required... -->\r
-               <PROPERTY NAME="tabSize" VALUE="8" />\r
-               <PROPERTY NAME="indentSize" VALUE="8" />\r
-       </PROPS>\r
-\r
-       <RULES IGNORE_CASE="FALSE" HIGHLIGHT_DIGITS="TRUE" ESCAPE="\">\r
-               <!-- Pragmas. -->\r
-               <SPAN TYPE="COMMENT2">\r
-                       <BEGIN>{-#</BEGIN>\r
-                       <END>#-}</END>\r
-               </SPAN>\r
-\r
-               <SPAN TYPE="COMMENT1">\r
-                       <BEGIN>{-</BEGIN>\r
-                       <END>-}</END>\r
-               </SPAN>\r
-\r
-               <EOL_SPAN TYPE="COMMENT1">--</EOL_SPAN>\r
-\r
-               <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">\r
-                       <BEGIN>"</BEGIN>\r
-                       <END>"</END>\r
-               </SPAN>\r
-\r
-               <!-- ' causes problems because not all ' are character\r
-               definitions. I implemented an ugly and partial workaround. -->\r
-               <SEQ TYPE="LITERAL1">' '</SEQ>\r
-               <SEQ TYPE="LITERAL1">'!'</SEQ>\r
-               <SEQ TYPE="LITERAL1">'"'</SEQ>\r
-               <SEQ TYPE="LITERAL1">'$'</SEQ>\r
-               <SEQ TYPE="LITERAL1">'%'</SEQ>\r
-               <SEQ TYPE="LITERAL1">'/'</SEQ>\r
-               <SEQ TYPE="LITERAL1">'('</SEQ>\r
-               <SEQ TYPE="LITERAL1">')'</SEQ>\r
-               <SEQ TYPE="LITERAL1">'['</SEQ>\r
-               <SEQ TYPE="LITERAL1">']'</SEQ>\r
-               <SEQ TYPE="LITERAL1">'+'</SEQ>\r
-               <SEQ TYPE="LITERAL1">'-'</SEQ>\r
-               <SEQ TYPE="LITERAL1">'*'</SEQ>\r
-               <SEQ TYPE="LITERAL1">'='</SEQ>\r
-               <SEQ TYPE="LITERAL1">'/'</SEQ>\r
-               <SEQ TYPE="LITERAL1">'^'</SEQ>\r
-               <SEQ TYPE="LITERAL1">'.'</SEQ>\r
-               <SEQ TYPE="LITERAL1">','</SEQ>\r
-               <SEQ TYPE="LITERAL1">':'</SEQ>\r
-               <SEQ TYPE="LITERAL1">';'</SEQ>\r
-               <SEQ TYPE="LITERAL1">'&lt;'</SEQ>\r
-               <SEQ TYPE="LITERAL1">'&gt;'</SEQ>\r
-               <SEQ TYPE="LITERAL1">'|'</SEQ>\r
-               <SEQ TYPE="LITERAL1">'@'</SEQ>\r
-\r
-               <SPAN TYPE="LITERAL1" NO_WORD_BREAK="TRUE">\r
-                       <BEGIN>'</BEGIN>\r
-                       <END>'</END>\r
-               </SPAN>\r
-\r
-               <SEQ TYPE="OPERATOR">..</SEQ>\r
-               <SEQ TYPE="OPERATOR">&amp;&amp;</SEQ>\r
-               <SEQ TYPE="OPERATOR">::</SEQ>\r
-\r
-               <SEQ TYPE="OPERATOR">&lt;</SEQ>\r
-               <SEQ TYPE="OPERATOR">&gt;</SEQ>\r
-               <SEQ TYPE="OPERATOR">+</SEQ>\r
-               <SEQ TYPE="OPERATOR">-</SEQ>\r
-               <SEQ TYPE="OPERATOR">*</SEQ>\r
-               <SEQ TYPE="OPERATOR">/</SEQ>\r
-               <SEQ TYPE="OPERATOR">%</SEQ>\r
-               <SEQ TYPE="OPERATOR">^</SEQ>\r
-               <SEQ TYPE="OPERATOR">=</SEQ>\r
-               <SEQ TYPE="OPERATOR">|</SEQ>\r
-               <SEQ TYPE="OPERATOR">@</SEQ>\r
-               <SEQ TYPE="OPERATOR">~</SEQ>\r
-               <SEQ TYPE="OPERATOR">!</SEQ>\r
-               <SEQ TYPE="OPERATOR">$</SEQ>\r
-\r
-               <!-- Defining this as OPERATOR causes float numbers not to be\r
-               highlighted... Which is more important? -->\r
-               <!-- <SEQ TYPE="NULL">.</SEQ> -->\r
-\r
-               <KEYWORDS>\r
-                       <!-- Reserved words. -->\r
-                       <KEYWORD1>case</KEYWORD1>\r
-                       <KEYWORD1>class</KEYWORD1>\r
-                       <KEYWORD1>data</KEYWORD1>\r
-                       <KEYWORD1>default</KEYWORD1>\r
-                       <KEYWORD1>deriving</KEYWORD1>\r
-                       <KEYWORD1>do</KEYWORD1>\r
-                       <KEYWORD1>else</KEYWORD1>\r
-                       <KEYWORD1>if</KEYWORD1>\r
-                       <KEYWORD1>import</KEYWORD1>\r
-                       <KEYWORD1>in</KEYWORD1>\r
-                       <KEYWORD1>infix</KEYWORD1>\r
-                       <KEYWORD1>infixl</KEYWORD1>\r
-                       <KEYWORD1>infixr</KEYWORD1>\r
-                       <KEYWORD1>instance</KEYWORD1>\r
-                       <KEYWORD1>let</KEYWORD1>\r
-                       <KEYWORD1>module</KEYWORD1>\r
-                       <KEYWORD1>newtype</KEYWORD1>\r
-                       <KEYWORD1>of</KEYWORD1>\r
-                       <KEYWORD1>then</KEYWORD1>\r
-                       <KEYWORD1>type</KEYWORD1>\r
-                       <KEYWORD1>where</KEYWORD1>\r
-                       <KEYWORD1>_</KEYWORD1>\r
-                       <KEYWORD1>as</KEYWORD1>\r
-                       <KEYWORD1>qualified</KEYWORD1>\r
-                       <KEYWORD1>hiding</KEYWORD1>\r
-\r
-                       <KEYWORD3>Addr</KEYWORD3>\r
-                       <KEYWORD3>Bool</KEYWORD3>\r
-                       <KEYWORD3>Bounded</KEYWORD3>\r
-                       <KEYWORD3>Char</KEYWORD3>\r
-                       <KEYWORD3>Double</KEYWORD3>\r
-                       <KEYWORD3>Either</KEYWORD3>\r
-                       <KEYWORD3>Enum</KEYWORD3>\r
-                       <KEYWORD3>Eq</KEYWORD3>\r
-                       <KEYWORD3>FilePath</KEYWORD3>\r
-                       <KEYWORD3>Float</KEYWORD3>\r
-                       <KEYWORD3>Floating</KEYWORD3>\r
-                       <KEYWORD3>Fractional</KEYWORD3>\r
-                       <KEYWORD3>Functor</KEYWORD3>\r
-                       <KEYWORD3>IO</KEYWORD3>\r
-                       <KEYWORD3>IOError</KEYWORD3>\r
-                       <KEYWORD3>IOResult</KEYWORD3>\r
-                       <KEYWORD3>Int</KEYWORD3>\r
-                       <KEYWORD3>Integer</KEYWORD3>\r
-                       <KEYWORD3>Integral</KEYWORD3>\r
-                       <KEYWORD3>Ix</KEYWORD3>\r
-                       <KEYWORD3>Maybe</KEYWORD3>\r
-                       <KEYWORD3>Monad</KEYWORD3>\r
-                       <KEYWORD3>Num</KEYWORD3>\r
-                       <KEYWORD3>Ord</KEYWORD3>\r
-                       <KEYWORD3>Ordering</KEYWORD3>\r
-                       <KEYWORD3>Ratio</KEYWORD3>\r
-                       <KEYWORD3>Rational</KEYWORD3>\r
-                       <KEYWORD3>Read</KEYWORD3>\r
-                       <KEYWORD3>ReadS</KEYWORD3>\r
-                       <KEYWORD3>Real</KEYWORD3>\r
-                       <KEYWORD3>RealFloat</KEYWORD3>\r
-                       <KEYWORD3>RealFrac</KEYWORD3>\r
-                       <KEYWORD3>Show</KEYWORD3>\r
-                       <KEYWORD3>ShowS</KEYWORD3>\r
-                       <KEYWORD3>String</KEYWORD3>\r
-\r
-                       <LITERAL2>:</LITERAL2>\r
-                       <LITERAL2>EQ</LITERAL2>\r
-                       <LITERAL2>False</LITERAL2>\r
-                       <LITERAL2>GT</LITERAL2>\r
-                       <LITERAL2>Just</LITERAL2>\r
-                       <LITERAL2>LT</LITERAL2>\r
-                       <LITERAL2>Left</LITERAL2>\r
-                       <LITERAL2>Nothing</LITERAL2>\r
-                       <LITERAL2>Right</LITERAL2>\r
-                       <LITERAL2>True</LITERAL2>\r
-\r
-                       <OPERATOR>quot</OPERATOR>\r
-                       <OPERATOR>rem</OPERATOR>\r
-                       <OPERATOR>div</OPERATOR>\r
-                       <OPERATOR>mod</OPERATOR>\r
-                       <OPERATOR>elem</OPERATOR>\r
-                       <OPERATOR>notElem</OPERATOR>\r
-                       <OPERATOR>seq</OPERATOR>\r
-               </KEYWORDS>\r
-       </RULES>\r
-\r
-</MODE>\r
+<?xml version="1.0"?>
+
+<!DOCTYPE MODE SYSTEM "xmode.dtd">
+
+<!--
+       Haskell mode by Stephen Blackheath
+-->
+
+<MODE>
+
+       <PROPS>
+               <PROPERTY NAME="commentStart" VALUE="{-" />
+               <PROPERTY NAME="commentEnd" VALUE="-}" />
+               <PROPERTY NAME="lineComment" VALUE="--" />
+       </PROPS>
+
+       <RULES IGNORE_CASE="FALSE" HIGHLIGHT_DIGITS="FALSE">
+               <!-- Pragmas. -->
+               <SPAN TYPE="COMMENT2">
+                       <BEGIN>{-#</BEGIN>
+                       <END>#-}</END>
+               </SPAN>
+
+               <SPAN TYPE="COMMENT1">
+                       <BEGIN>{-</BEGIN>
+                       <END>-}</END>
+               </SPAN>
+
+               <EOL_SPAN TYPE="COMMENT1">--</EOL_SPAN>
+
+               <SPAN TYPE="LITERAL1" ESCAPE="\" NO_LINE_BREAK="TRUE">
+                       <BEGIN>"</BEGIN>
+                       <END>"</END>
+               </SPAN>
+
+               <SPAN TYPE="LITERAL2" NO_WORD_BREAK="TRUE">
+                       <BEGIN>'</BEGIN>
+                       <END>'</END>
+               </SPAN>
+
+                <!-- Reserved words. -->
+                <SEQ_REGEXP TYPE="KEYWORD1">case(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">class(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">data(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">default(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">deriving(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">do(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">else(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">if(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">import(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">in(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">infix(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">infixl(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">infixr(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">instance(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">let(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">module(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">newtype(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">of(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">then(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">type(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">where(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">_(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">as(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">qualified(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">hiding(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <!-- Non-Haskell-98 keywords -->
+                <SEQ_REGEXP TYPE="KEYWORD1">foreign(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">family(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <!-- GHC extension keywords -->
+                <SEQ_REGEXP TYPE="KEYWORD1">proc(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">rec(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD1">mdo(?![a-z_A-Z0-9'])</SEQ_REGEXP>
+
+                <SEQ_REGEXP TYPE="DIGIT">0[xXoO][0-9a-fA-F]+</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="DIGIT">[0-9]+(\.[0-9]+)?([eE][+-]?[0-9]+)?</SEQ_REGEXP>
+                
+                <!-- Reserved operators -->
+                <SEQ_REGEXP TYPE="KEYWORD4">\.\.(?![!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~:])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD4">:(?![!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~:])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD4">::(?![!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~:])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD4">=(?![!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~:])</SEQ_REGEXP>
+                <SEQ TYPE="KEYWORD4">\</SEQ>
+                <SEQ_REGEXP TYPE="KEYWORD4">\|(?![!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~:])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD4">&lt;-(?![!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~:])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD4">-&gt;(?![!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~:])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD4">@(?![!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~:])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD4">~(?![!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~:])</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="KEYWORD4">=&gt;(?![!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~:])</SEQ_REGEXP>
+
+                <!-- GHC extension reserved operators -->
+                <SEQ_REGEXP TYPE="KEYWORD4">-(&lt;{1,2})(?![!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~:])</SEQ_REGEXP>
+
+                <!-- Normal operators, backquoted operators -->
+                <SEQ_REGEXP TYPE="OPERATOR">([A-Z][a-z_A-Z0-9']*\.)*[!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~][!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~:]*</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="OPERATOR">`([A-Z][a-z_A-Z0-9']*\.)*[a-z_][a-z_A-Z0-9']*`</SEQ_REGEXP>
+
+                <!-- variable/function (qualified or not) -->
+                <SEQ_REGEXP TYPE="NULL">([A-Z][a-z_A-Z0-9']*\.)*[a-z_][a-z_A-Z0-9']*</SEQ_REGEXP>
+                <!-- contructor/type (qualified or not) -->
+                <SEQ_REGEXP TYPE="KEYWORD2">[A-Z][a-z_A-Z0-9']*(\.[A-Z][a-z_A-Z0-9']*)*</SEQ_REGEXP>
+
+                <!-- Operators in parentheses appear like functions, but this
+                    doesn't match the special case of (..) used for imports -->
+                <SEQ_REGEXP TYPE="NULL">\(\s*([A-Z][a-z_A-Z0-9']*\.)*[!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~]\s*\)</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="NULL">\(\s*([A-Z][a-z_A-Z0-9']*\.)*[!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~][!#$%&amp;\*+/&lt;=&gt;?@\\\^\|\-~:][!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~:]*\s*\)</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="NULL">\(\s*([A-Z][a-z_A-Z0-9']*\.)*[!#$%&amp;\*+/&lt;=&gt;?@\\\^\|\-~][!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~:][!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~:]*\s*\)</SEQ_REGEXP>
+                <SEQ_REGEXP TYPE="NULL">\(\s*([A-Z][a-z_A-Z0-9']*\.)*[!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~][!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~:]{2,}\)</SEQ_REGEXP>
+
+                <!-- Infix constructors -->
+                <SEQ_REGEXP TYPE="KEYWORD2">([A-Z][a-z_A-Z0-9']*\.)*:[!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~:]*</SEQ_REGEXP>
+                <!-- Infix constructors in parentheses -->
+                <SEQ_REGEXP TYPE="KEYWORD2">\(\s*([A-Z][a-z_A-Z0-9']*\.)*:[!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~:]*\s*\)</SEQ_REGEXP>
+
+                <!-- (, including the specific case of (..) but excluding all other cases
+                    where it's an operator in parentheses -->
+                <SEQ_REGEXP TYPE="KEYWORD3">\((?!\s*([!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~]\s*\)|[!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~][!#$%&amp;\*+/&lt;=&gt;?@\\\^\|\-~:][!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~:]*\s*\)|[!#$%&amp;\*+/&lt;=&gt;?@\\\^\|\-~][!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~:][!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~:]*\s*\)|[!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~][!#$%&amp;\*+\./&lt;=&gt;?@\\\^\|\-~:]{2,}\s*\)))</SEQ_REGEXP>
+                <SEQ TYPE="KEYWORD3">)</SEQ>
+                <SEQ TYPE="KEYWORD3">,</SEQ>
+                <SEQ TYPE="KEYWORD3">[</SEQ>
+                <SEQ TYPE="KEYWORD3">]</SEQ>
+       </RULES>
+
+</MODE>