1. <lexer>
    
  2.   <config>
    
  3.     <name>Natural</name>
    
  4.     <alias>natural</alias>
    
  5.     <filename>*.NSN</filename>
    
  6.     <filename>*.NSP</filename>
    
  7.     <filename>*.NSS</filename>
    
  8.     <filename>*.NSH</filename>
    
  9.     <filename>*.NSG</filename>
    
  10.     <filename>*.NSL</filename>
    
  11.     <filename>*.NSA</filename>
    
  12.     <filename>*.NSM</filename>
    
  13.     <filename>*.NSC</filename>
    
  14.     <filename>*.NS7</filename>
    
  15.     <mime_type>text/x-natural</mime_type>
    
  16.     <case_insensitive>true</case_insensitive>
    
  17.   </config>
    
  18.   <rules>
    
  19.     <state name="common">
    
  20.       <rule pattern="\s+">
    
  21.         <token type="Text"/>
    
  22.       </rule>
    
  23.       <rule pattern="^\*.*$">
    
  24.         <token type="CommentSingle"/>
    
  25.       </rule>
    
  26.       <rule pattern="/\*.*$">
    
  27.         <token type="CommentSingle"/>
    
  28.       </rule>
    
  29.     </state>
    
  30.     <state name="variable-names">
    
  31.       <rule pattern="[#+]?[\w\-\d]+">
    
  32.         <token type="NameVariable"/>
    
  33.       </rule>
    
  34.       <rule pattern="\([a-zA-z]\d*\)">
    
  35.         <token type="Other"/>
    
  36.       </rule>
    
  37.     </state>
    
  38.     <state name="root">
    
  39.       <rule>
    
  40.         <include state="common"/>
    
  41.       </rule>
    
  42.       <rule pattern="(?:END-DEFINE|END-IF|END-FOR|END-SUBROUTINE|END-ERROR|END|IGNORE)\b">
    
  43.         <token type="Keyword"/>
    
  44.       </rule>
    
  45.       <rule pattern="(?:INIT|CONST)\s*&lt;\b">
    
  46.         <token type="Keyword"/>
    
  47.       </rule>
    
  48.       <rule pattern="(FORM)(\s+)(\w+)">
    
  49.         <bygroups>
    
  50.           <token type="Keyword"/>
    
  51.           <token type="Text"/>
    
  52.           <token type="NameFunction"/>
    
  53.         </bygroups>
    
  54.       </rule>
    
  55.       <rule pattern="(DEFINE)(\s+)(SUBROUTINE)(\s+)([#+]?[\w\-\d]+)">
    
  56.         <bygroups>
    
  57.           <token type="Keyword"/>
    
  58.           <token type="Text"/>
    
  59.           <token type="Keyword"/>
    
  60.           <token type="Text"/>
    
  61.           <token type="NameFunction"/>
    
  62.         </bygroups>
    
  63.       </rule>
    
  64.       <rule pattern="(PERFORM)(\s+)([#+]?[\w\-\d]+)">
    
  65.         <bygroups>
    
  66.           <token type="Keyword"/>
    
  67.           <token type="Text"/>
    
  68.           <token type="NameFunction"/>
    
  69.         </bygroups>
    
  70.       </rule>
    
  71.       <rule pattern="(METHOD)(\s+)([\w~]+)">
    
  72.         <bygroups>
    
  73.           <token type="Keyword"/>
    
  74.           <token type="Text"/>
    
  75.           <token type="NameFunction"/>
    
  76.         </bygroups>
    
  77.       </rule>
    
  78.       <rule pattern="(\s+)([\w\-]+)([=\-]&gt;)([\w\-~]+)">
    
  79.         <bygroups>
    
  80.           <token type="Text"/>
    
  81.           <token type="NameVariable"/>
    
  82.           <token type="Operator"/>
    
  83.           <token type="NameFunction"/>
    
  84.         </bygroups>
    
  85.       </rule>
    
  86.       <rule pattern="(?&lt;=(=|-)&gt;)([\w\-~]+)(?=\()">
    
  87.         <token type="NameFunction"/>
    
  88.       </rule>
    
  89.       <rule pattern="(TEXT)(-)(\d{3})">
    
  90.         <bygroups>
    
  91.           <token type="Keyword"/>
    
  92.           <token type="Punctuation"/>
    
  93.           <token type="LiteralNumberInteger"/>
    
  94.         </bygroups>
    
  95.       </rule>
    
  96.       <rule pattern="(TEXT)(-)(\w{3})">
    
  97.         <bygroups>
    
  98.           <token type="Keyword"/>
    
  99.           <token type="Punctuation"/>
    
  100.           <token type="NameVariable"/>
    
  101.         </bygroups>
    
  102.       </rule>
    
  103.       <rule pattern="(?i)\b(?&lt;!-)(?&lt;!#)(ENTIRE|BY|NAME|ARRAY|SPECIFIED|VIEW|MODULE|FUNCTION|RETURNS|AND|NUMERIC|OPTIONAL|END-PARSE|TRUE|END-RESULT|LEAVING|NOT|CONDITION|NUMBER|NO|EXP|FULL|REPLACE|INSERT|DOEND|LOG|ABS|ANY|REPEAT|SET|DLOGOFF|DOWNLOAD|BREAK|VALUES|DIVIDE|COMPRESS|UPDATE|SORTKEY|OR|END-FIND|END-ENDPAGE|REDUCE|IGNORE|MIN|WASTE|END-DEFINE|SUBSTR|END|FIND|ADD|INVESTIGATE|DNATIVE|CONST|COS|ENDHOC|SGN|COPY|REDEFINE|DEFINE|MULTIPLY|ASSIGN|LE|VALUE|COMPOSE|FALSE|POS|CALL|TAN|ERROR|CLOSE|PARSE|LT|WITH_CTE|END-SORT|EJECT|RESET|SHOW|LOCAL|PERFORM|TERMINATE|VAL|BACKOUT|END-LOOP|REJECT|SUM|CREATE|SORT|RETURN|AT|SIN|SETTIME|INT|NE|GLOBAL|END-SELECT|ELSE|DELETE|TOP|INCLUDE|END-ENDDATA|LOOP|OLD|SUSPEND|SKIP|SQRT|RULEVAR|NMIN|AVER|PROCESS|SELECT|MAP|USING|END-HISTOGRAM|MAX|NEWPAGE|ON|OFF|KEY|NAMED|CONTROL|PF1|PF2|PF3|PF4|PF5|PF6|PF7|PF8|PF9|INITIAL|WRITE|STORE|FETCH|ATN|RET|END-WORK|RESTORE|GET|LIMIT|END-ERROR|SEND|OPEN|ESCAPE|COMPUTE|COUNT|TRANSFER|RELEASE|DO|DYNAMIC|ROLLBACK|END-READ|DISPLAY|UPLOAD|END-DATA|NULL-HANDLE|NCOUNT|RESIZE|END-PROCESS|REQUEST|READ|SEPARATE|EQ|INPUT|DATA|END-START|STACK|REINPUT|INCDIC|INCCONT|END-IF|WHEN|END-BEFORE|WHILE|END-ENDFILE|END-TOPPAGE|INCDIR|PARAMETER|OBTAIN|CALLDBPROC|END-BROWSE|MOVE|SUBTRACT|DLOGON|EXAMINE|SUBSTRING|BEFORE|STOP|RUN|END-BREAK|EXPORT|END-SUBROUTINE|FOR|GE|PRINT|BROWSE|IMPORT|EXPAND|ALL|PASSW|FORMAT|GT|END-NOREC|END-DECIDE|END-FOR|CALLNAT|END-ALL|OPTIONS|RETRY|NONE|INCMAC|END-FILE|DECIDE|INIT|HISTOGRAM|NAVER|START|ACCEPT|COMMIT|TOTAL|IF|FRAC|END-REPEAT|UNTIL|TO|INTO|WITH|DELIMITER|FIRST|OF|INTO|SUBROUTINE|GIVING|POSITION)\b(?!-)">
    
  104.         <token type="Keyword"/>
    
  105.       </rule>
    
  106.       <rule pattern="[0-9]+">
    
  107.         <token type="LiteralNumberInteger"/>
    
  108.       </rule>
    
  109.       <rule pattern="(?&lt;=(\s|.))(AND|OR|NOT|EQUAL|NE|EQ|GT|GE|LT|LE)\b">
    
  110.         <token type="OperatorWord"/>
    
  111.       </rule>
    
  112.       <rule>
    
  113.         <include state="variable-names"/>
    
  114.       </rule>
    
  115.       <rule pattern="[?*&lt;&gt;=\-+&amp;]">
    
  116.         <token type="Operator"/>
    
  117.       </rule>
    
  118.       <rule pattern="(?:(ESCAPE)(\s+)(MODULE|ROUTINE|BOTTOM|TOP))">
    
  119.         <bygroups>
    
  120.           <token type="Keyword"/>
    
  121.           <token type="Text"/>
    
  122.           <token type="Keyword"/>
    
  123.         </bygroups>
    
  124.       </rule>
    
  125.       <rule pattern="&#39;(&#39;&#39;|[^&#39;])*&#39;">
    
  126.         <token type="LiteralStringSingle"/>
    
  127.       </rule>
    
  128.       <rule pattern="`([^`])*`">
    
  129.         <token type="LiteralStringSingle"/>
    
  130.       </rule>
    
  131.       <rule pattern="([|}])([^{}|]*?)([|{])">
    
  132.         <bygroups>
    
  133.           <token type="Punctuation"/>
    
  134.           <token type="LiteralStringSingle"/>
    
  135.           <token type="Punctuation"/>
    
  136.         </bygroups>
    
  137.       </rule>
    
  138.       <rule pattern="[/;:()\[\],.]">
    
  139.         <token type="Punctuation"/>
    
  140.       </rule>
    
  141.     </state>
    
  142.   </rules>
    
  143. </lexer>