<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "language.dtd">
<!-- author ik Iztok Kobal (iztok.kobal@siol.net) -->
<!-- followed CM3 documentation (http://www.elegosoft.com/cm3/doc/reference/index.html , chapter Syntax) -->
<!-- 03.03.2005 ik mailed version 1.00 to Dominik Haumann <dhdev@gmx.de> of kate team -->
<!-- 04.03.2005 ik mailed version 1.01 with fixed/implemented nested comments to Dominik -->
<!-- known bug: notation Regexp( [0-9]*\. ) should be not interpreted as neither Integer neither Real -->
<!-- known bug: notation Regexp ( "  \" " ) is not properly interpreted -->
<language name="Modula-3" version="1.01" kateversion="2.1" section="Sources" extensions="*.m3;*.i3;*.ig;*.mg;" mimetype="text/x-modula-3" license="LGPL">
  <highlighting>
    <list name="keywords">
<!--      <item> AND </item> -->
      <item> ANY </item>
      <item> ARRAY </item>
      <item> AS </item>
      <item> BEGIN </item>
      <item> BITS </item>
      <item> BRANDED </item>
      <item> BY </item>
      <item> CASE </item>
      <item> CONST </item>
<!--      <item> DIV </item> -->
      <item> DO </item>
      <item> ELSE </item>
      <item> ELSIF </item>
      <item> END </item>
      <item> EVAL </item>
      <item> EXCEPT </item>
      <item> EXCEPTION </item>
      <item> EXIT </item>
      <item> EXPORTS </item>
      <item> FINALLY </item>
      <item> FOR </item>
      <item> FROM </item>
      <item> GENERIC </item>
      <item> IF </item>
      <item> IMPORT </item>
<!--      <item> IN </item> -->
      <item> INTERFACE </item>
      <item> LOCK </item>
      <item> LOOP </item>
      <item> METHODS </item>
<!--      <item> MOD </item> -->
      <item> MODULE </item>
<!--      <item> NOT </item> -->
      <item> OBJECT </item>
      <item> OF </item>
<!--      <item> OR </item> -->
      <item> OVERRIDES </item>
      <item> PROCEDURE </item>
      <item> RAISE </item>
      <item> RAISES </item>
      <item> READONLY </item>
      <item> RECORD </item>
      <item> REF </item>
      <item> REPEAT </item>
      <item> RETURN </item>
      <item> REVEAL </item>
      <item> ROOT </item>
      <item> SET </item>
      <item> THEN </item>
      <item> TO </item>
      <item> TRY </item>
      <item> TYPE </item>
      <item> TYPECASE </item>
      <item> UNSAFE </item>
      <item> UNTIL </item>
      <item> UNTRACED </item>
      <item> VALUE </item>
      <item> VAR </item>
      <item> WHILE </item>
      <item> WITH </item>
    </list>
    <list name="operators">
      <item> AND </item> 
      <item> DIV </item> 
      <item> IN </item> 
      <item> MOD </item>
      <item> NOT </item>
      <item> OR </item>
      <item> + </item>
      <item> &lt; </item>
      <item> # </item>
      <item> = </item>
      <item> ; </item>
      <item> .. </item>
      <item> : </item>
      <item> - </item>
      <item> &gt; </item>
      <item> { </item>
      <item> } </item>
      <item> | </item>
      <item> := </item>
      <item> &lt;: </item>
      <item> * </item>
      <item> &lt;= </item>
      <item> ( </item>
      <item> ) </item>
      <item> ^ </item>
      <item> , </item>
      <item> =&gt; </item>
      <item> / </item>
      <item> &gt;= </item>
      <item> [ </item>
      <item> ] </item>
      <item> . </item>
      <item> &amp; </item>
    </list>
    <list name="types">
      <item> ADDRESS </item>
      <item> BOOLEAN </item>
      <item> CARDINAL </item>
      <item> CHAR </item>
      <item> EXTENDED </item>
      <item> INTEGER </item>
      <item> LONGREAL </item>
      <item> MUTEX </item>
      <item> NULL </item>
      <item> REAL </item>
      <item> REFANY </item>
      <item> T </item>
      <item> TEXT </item>
    </list>
    <list name="constants">
      <item> FALSE </item>
      <item> NIL </item>
      <item> TRUE </item>
    </list>
    <list name="pervasives">
      <item> ABS </item>
      <item> ADR </item>
      <item> ADRSIZE </item>
      <item> BITSIZE </item>
      <item> BYTESIZE </item>
      <item> CEILING </item>
      <item> DEC </item>
      <item> DISPOSE </item>
      <item> FIRST </item>
      <item> FLOAT </item>
      <item> FLOOR </item>
      <item> INC </item>
      <item> ISTYPE </item>
      <item> LAST </item>
      <item> LOOPHOLE </item>
      <item> MAX </item>
      <item> MIN </item>
      <item> NARROW </item>
      <item> NEW </item>
      <item> NUMBER </item>
      <item> ORD </item>
      <item> ROUND </item>
      <item> SUBARRAY </item>
      <item> TRUNC </item>
      <item> TYPECODE </item>
      <item> VAL </item>
    </list>
    <list name="stdlibs">
      <item> Text </item>
      <item> Text.Length </item>
      <item> Text.Empty </item>
      <item> Text.Equal </item>
      <item> Text.Compare </item>
      <item> Text.Cat </item>
      <item> Text.Sub </item>
      <item> Text.Hash </item>
      <item> Text.HasWideChar </item>
      <item> Text.GetChar </item>
      <item> Text.GetWideChar </item>
      <item> Text.SetChars </item>
      <item> Text.SetWideChars </item>
      <item> Text.FromChars </item>
      <item> Text.FromWideChars </item>
      <item> Text.FindChar </item>
      <item> Text.FindWideChar </item>
      <item> Text.FindCharR </item>
      <item> Text.FindWideCharR </item>
      <item> Fmt </item>
      <item> Fmt.Bool </item>
      <item> Fmt.Char </item>
      <item> Fmt.Int </item>
      <item> Fmt.Unsigned </item>
      <item> Fmt.Real </item>
      <item> Fmt.LongReal </item>
      <item> Fmt.Extended </item>
      <item> Fmt.Pad </item>
      <item> Fmt.F </item>
      <item> Fmt.FN </item>
      <item> Scan </item>
      <item> Scan.Bool </item>
      <item> Scan.Int </item>
      <item> Scan.Unsigned </item>
      <item> Scan.Real </item>
      <item> Scan.LongReal </item>
      <item> Scan.Extended </item>
      <item> IO </item>
      <item> IO.Put </item>
      <item> IO.PutChar </item>
      <item> IO.PutWideChar </item>
      <item> IO.PutInt </item>
      <item> IO.PutReal </item>
      <item> IO.EOF </item>
      <item> IO.GetLine </item>
      <item> IO.GetChar </item>
      <item> IO.GetWideChar </item>
      <item> IO.GetInt </item>
      <item> IO.GetReal </item>
      <item> IO.OpenRead </item>
      <item> IO.OpenWrite </item>
      <item> Rd </item>
      <item> Rd.GetChar </item>
      <item> Rd.GetWideChar </item>
      <item> Rd.EOF </item>
      <item> Rd.UnGetChar </item>
      <item> Rd.CharsReady </item>
      <item> Rd.GetSub </item>
      <item> Rd.GetWideSub </item>
      <item> Rd.GetSubLine </item>
      <item> Rd.GetWideSubLine </item>
      <item> Rd.GetText </item>
      <item> Rd.GetWideText </item>
      <item> Rd.GetLine </item>
      <item> Rd.GetWideLine </item>
      <item> Rd.Seek </item>
      <item> Rd.Close </item>
      <item> Rd.Index </item>
      <item> Rd.Length </item>
      <item> Rd.Intermittend </item>
      <item> Rd.Seekable </item>
      <item> Rd.Closed </item>
      <item> Wr </item>
      <item> Wr.PutChar </item>
      <item> Wr.PutWideChar </item>
      <item> Wr.PutText </item>
      <item> Wr.PutWideText </item>
      <item> Wr.PutString </item>
      <item> Wr.PutWideString </item>
      <item> Wr.Seek </item>
      <item> Wr.Flush </item>
      <item> Wr.Close </item>
      <item> Wr.Length </item>
      <item> Wr.Index </item>
      <item> Wr.Seekable </item>
      <item> Wr.Closed </item>
      <item> Wr.Buffered </item>
      <item> Lex </item>
      <item> Lex.Scan </item>
      <item> Lex.Skip </item>
      <item> Lex.Match </item>
      <item> Lex.Bool </item>
      <item> Lex.Int </item>
      <item> Lex.Unsigned </item>
      <item> Lex.Real </item>
      <item> Lex.LongReal </item>
      <item> Lex.Extended </item>
      <item> Params </item>
      <item> Params.Count </item>
      <item> Params.Get </item>
      <item> Env </item>
      <item> Env.Count </item>
      <item> Env.Get </item>
      <item> Env.GetNth </item>
    </list>
    <contexts>
      <context attribute="Normal Text" lineEndContext="#stay" name="Normal">
        <RegExpr attribute="Keyword" context="#stay" String="PROCEDURE[\s].*\(" beginRegion="Proc"/>
        <RegExpr attribute="Keyword" context="#stay" String="END\s*[A-Za-z][A-Za-z0-9_]*\;" endRegion="Proc"/>
        <RegExpr attribute="Keyword" context="#stay" String="\b(RECORD|OBJECT|TRY|WHILE|FOR|REPEAT|LOOP|IF|CASE|WITH)\b" beginRegion="Block"/>
        <RegExpr attribute="Keyword" context="#stay" String="\b(END;|END)\b" endRegion="Block"/>
        <keyword attribute="Keyword" context="#stay" String="keywords"/>
        <keyword attribute="Operator" context="#stay" String="operators"/>
        <keyword attribute="Type" context="#stay" String="types"/>
        <keyword attribute="Constant" context="#stay" String="constants"/>
        <keyword attribute="Pervasive" context="#stay" String="pervasives"/>
        <keyword attribute="StdLib" context="#stay" String="stdlibs"/>
        <RegExpr attribute="Real" context="#stay" String="\b[\+|\-]{0,1}[0-9]{1,}\.[0-9]{1,}([E|e|D|d|X|x][\+|\-]{0,1}[0-9]{1,}){0,1}\b"/>
        <RegExpr attribute="Integer" context="#stay" String="\b([\+|\-]{0,1}[0-9]{1,}|([2-9]|1[0-6])\_[0-9A-Fa-f]{1,})\b"/>
        <DetectChar attribute="String" context="String1" char="&quot;"/>
        <RegExpr attribute="Char" context="#stay" String="\'(.|\\[ntrf\\'&quot;]|\\[0-7]{3})\'"/>
        <Detect2Chars attribute="Pragma" context="Prep1" char="&lt;" char1="*"/>
        <Detect2Chars attribute="Comment" context="Comment2" char="(" char1="*" beginRegion="Comment"/>
      </context>
      <context attribute="String" lineEndContext="#pop" name="String1">
        <DetectChar attribute="String" context="#pop" char="&quot;"/>
      </context>
      <context attribute="Comment" lineEndContext="#stay" name="Comment2">
        <Detect2Chars attribute="Comment" context="Comment2" char="(" char1="*" beginRegion="Comment"/>
        <Detect2Chars attribute="Comment" context="#pop" char="*" char1=")" endRegion="Comment"/>
      </context>
      <context attribute="Pragma" lineEndContext="#stay" name="Prep1">
        <Detect2Chars attribute="Pragma" context="#pop" char="*" char1="&gt;"/>
      </context>
    </contexts>
    <itemDatas>
      <itemData name="Normal Text" defStyleNum="dsNormal"/>
      <itemData name="Keyword" defStyleNum="dsKeyword"/>
      <itemData name="Operator" defStyleNum="dsKeyword"/>
      <itemData name="Type" defStyleNum="dsDataType"/>
      <itemData name="Integer" defStyleNum="dsBaseN"/>
      <itemData name="Real" defStyleNum="dsFloat"/>
      <itemData name="Constant" defStyleNum="dsDecVal"/>
      <itemData name="String" defStyleNum="dsString"/>
      <itemData name="Char" defStyleNum="dsChar"/>
      <itemData name="Pervasive" defStyleNum="dsFunction"/>
      <itemData name="StdLib" defStyleNum="dsFunction"/>
      <itemData name="Comment" defStyleNum="dsComment" bold="0" italic="1"/>
      <itemData name="Pragma" defStyleNum="dsOthers" bold="0" italic="1"/>
    </itemDatas>
  </highlighting>
  <general>
    <keywords casesensitive="1" weakDeliminator="."/>
    <comments>
      <comment name="multiLine" start="(*" end="*)"/>
    </comments>
  </general>
</language>
