1. <lexer>
    
  2.   <config>
    
  3.     <name>SAS</name>
    
  4.     <alias>sas</alias>
    
  5.     <filename>*.SAS</filename>
    
  6.     <filename>*.sas</filename>
    
  7.     <mime_type>text/x-sas</mime_type>
    
  8.     <mime_type>text/sas</mime_type>
    
  9.     <mime_type>application/x-sas</mime_type>
    
  10.     <case_insensitive>true</case_insensitive>
    
  11.   </config>
    
  12.   <rules>
    
  13.     <state name="validvar">
    
  14.       <rule pattern="[a-z_]\w{0,31}\.?">
    
  15.         <token type="NameVariable"/>
    
  16.         <pop depth="1"/>
    
  17.       </rule>
    
  18.     </state>
    
  19.     <state name="cards-datalines">
    
  20.       <rule pattern="^\s*(datalines|cards)\s*;\s*$">
    
  21.         <token type="Keyword"/>
    
  22.         <push state="data"/>
    
  23.       </rule>
    
  24.     </state>
    
  25.     <state name="proc-data">
    
  26.       <rule pattern="(^|;)\s*(proc \w+|data|run|quit)[\s;]">
    
  27.         <token type="KeywordReserved"/>
    
  28.       </rule>
    
  29.     </state>
    
  30.     <state name="string_dquote">
    
  31.       <rule pattern="&#34;">
    
  32.         <token type="LiteralString"/>
    
  33.         <pop depth="1"/>
    
  34.       </rule>
    
  35.       <rule pattern="\\\\|\\&#34;|\\\n">
    
  36.         <token type="LiteralStringEscape"/>
    
  37.       </rule>
    
  38.       <rule pattern="&amp;">
    
  39.         <token type="NameVariable"/>
    
  40.         <push state="validvar"/>
    
  41.       </rule>
    
  42.       <rule pattern="[^$&amp;&#34;\\]+">
    
  43.         <token type="LiteralString"/>
    
  44.       </rule>
    
  45.       <rule pattern="[$&#34;\\]">
    
  46.         <token type="LiteralString"/>
    
  47.       </rule>
    
  48.     </state>
    
  49.     <state name="general">
    
  50.       <rule>
    
  51.         <include state="keywords"/>
    
  52.       </rule>
    
  53.       <rule>
    
  54.         <include state="vars-strings"/>
    
  55.       </rule>
    
  56.       <rule>
    
  57.         <include state="special"/>
    
  58.       </rule>
    
  59.       <rule>
    
  60.         <include state="numbers"/>
    
  61.       </rule>
    
  62.     </state>
    
  63.     <state name="vars-strings">
    
  64.       <rule pattern="&amp;[a-z_]\w{0,31}\.?">
    
  65.         <token type="NameVariable"/>
    
  66.       </rule>
    
  67.       <rule pattern="%[a-z_]\w{0,31}">
    
  68.         <token type="NameFunction"/>
    
  69.       </rule>
    
  70.       <rule pattern="\&#39;">
    
  71.         <token type="LiteralString"/>
    
  72.         <push state="string_squote"/>
    
  73.       </rule>
    
  74.       <rule pattern="&#34;">
    
  75.         <token type="LiteralString"/>
    
  76.         <push state="string_dquote"/>
    
  77.       </rule>
    
  78.     </state>
    
  79.     <state name="root">
    
  80.       <rule>
    
  81.         <include state="comments"/>
    
  82.       </rule>
    
  83.       <rule>
    
  84.         <include state="proc-data"/>
    
  85.       </rule>
    
  86.       <rule>
    
  87.         <include state="cards-datalines"/>
    
  88.       </rule>
    
  89.       <rule>
    
  90.         <include state="logs"/>
    
  91.       </rule>
    
  92.       <rule>
    
  93.         <include state="general"/>
    
  94.       </rule>
    
  95.       <rule pattern=".">
    
  96.         <token type="Text"/>
    
  97.       </rule>
    
  98.       <rule pattern="\\\n">
    
  99.         <token type="Text"/>
    
  100.       </rule>
    
  101.       <rule pattern="\n">
    
  102.         <token type="Text"/>
    
  103.       </rule>
    
  104.     </state>
    
  105.     <state name="data">
    
  106.       <rule pattern="(.|\n)*^\s*;\s*$">
    
  107.         <token type="Other"/>
    
  108.         <pop depth="1"/>
    
  109.       </rule>
    
  110.     </state>
    
  111.     <state name="logs">
    
  112.       <rule pattern="\n?^\s*%?put ">
    
  113.         <token type="Keyword"/>
    
  114.         <push state="log-messages"/>
    
  115.       </rule>
    
  116.     </state>
    
  117.     <state name="keywords">
    
  118.       <rule pattern="\b(datalines4|datalines|delimiter|startsas|redirect|lostcard|continue|informat|filename|footnote|catname|options|libname|systask|display|waitsas|missing|replace|delete|window|endsas|update|format|attrib|length|infile|select|return|retain|rename|remove|output|cards4|modify|leave|title|merge|delim|input|cards|abort|where|label|array|error|call|page|stop|keep|file|drop|link|skip|list|goto|put|out|set|by|dm|in|x)\b">
    
  119.         <token type="Keyword"/>
    
  120.       </rule>
    
  121.       <rule pattern="\b(references|distinct|describe|validate|restrict|cascade|msgtype|message|primary|foreign|delete|update|create|unique|having|modify|insert|select|group|check|table|alter|order|reset|index|where|into|from|view|null|like|drop|add|not|key|and|set|on|in|or|as)\b">
    
  122.         <token type="Keyword"/>
    
  123.       </rule>
    
  124.       <rule pattern="\b(while|until|then|else|end|if|do)\b">
    
  125.         <token type="Keyword"/>
    
  126.       </rule>
    
  127.       <rule pattern="%(sysevalf|nrbquote|qsysfunc|qlowcase|compstor|nrquote|display|qupcase|datatyp|qcmpres|unquote|syscall|sysfunc|sysrput|sysprod|syslput|sysexec|lowcase|qsubstr|sysget|length|keydef|global|superq|substr|verify|bquote|cmpres|upcase|window|label|qleft|while|qtrim|quote|nrstr|until|sysrc|input|macro|local|qscan|index|else|scan|mend|eval|trim|then|goto|left|put|let|end|str|do|to|if)\b">
    
  128.         <token type="NameBuiltin"/>
    
  129.       </rule>
    
  130.       <rule pattern="\b(vinformatnx|vinformatwx|vinformatdx|vinformatw|vinformatd|vinformatx|vinformatn|vinformat|translate|vinarrayx|vformatwx|vformatnx|vformatdx|getoption|fileexist|fetchobs|vlengthx|filename|fipstate|kurtosis|vinarray|vformatx|pathname|foptname|compound|compress|vformatw|hosthelp|vformatn|zipnamel|vformatd|probbeta|daccdbsl|zipstate|trigamma|probbnml|probhypr|probnegb|probnorm|datepart|datetime|varlabel|varinfmt|dropnote|skewness|doptname|timepart|fipnamel|dequote|tranwrd|sysprod|digamma|stnamel|soundex|depdbsl|reverse|daccsyd|doptnum|resolve|uniform|datejul|varname|varrayx|probgam|probchi|fappend|dacctab|vformat|poisson|collate|brshift|ordinal|fdelete|blshift|betainv|fileref|lowcase|libname|fipname|vlabelx|vlength|weekday|juldate|jbessel|ibessel|zipfips|foptnum|zipname|getvarn|getvarc|frewind|vartype|depsyd|stderr|stfips|fwrite|gaminv|second|substr|vtypex|symget|hbound|vnamex|fpoint|saving|fnonct|rewind|indexc|indexw|repeat|inputc|inputn|ranuni|stname|rantbl|ranpoi|rannor|sysget|rangam|ranexp|vlabel|lbound|cexist|length|lgamma|rancau|libref|cnonct|ranbin|compbl|logpdf|logpmf|logsdf|sysmsg|curobs|daccdb|verify|daccsl|minute|system|tnonct|dsname|varray|varnum|probit|spedis|normal|varlen|dclose|varfmt|fexist|deptab|upcase|rantri|fclose|nmiss|point|trimn|depsl|trunc|peekc|depdb|probf|exist|fetch|netpv|today|mopen|probt|month|dairy|sysrc|finfo|quote|log10|close|floor|dinfo|range|fnote|attrn|intrr|intnx|intck|attrc|input|dread|dopen|index|right|round|vname|vtype|fread|gamma|arsin|arcos|fopen|frlen|fget|sinh|sqrt|addr|airy|sign|fsep|year|fuzz|dnum|scan|rank|fput|fpos|putn|putc|hour|tanh|atan|dhms|tinv|band|bnot|erfc|fcol|poke|trim|byte|ceil|peek|left|cinv|finv|open|log2|mean|note|date|cosh|mort|time|bxor|bor|mdy|std|max|css|sin|cos|npv|log|var|uss|pdf|pmf|cdf|abs|hms|day|erf|put|lag|irr|int|sum|tan|min|dif|qtr|sdf|dim|yyq|exp|mod|cv|n)\(">
    
  131.         <token type="NameBuiltin"/>
    
  132.       </rule>
    
  133.     </state>
    
  134.     <state name="numbers">
    
  135.       <rule pattern="\b[+-]?([0-9]+(\.[0-9]+)?|\.[0-9]+|\.)(E[+-]?[0-9]+)?i?\b">
    
  136.         <token type="LiteralNumber"/>
    
  137.       </rule>
    
  138.     </state>
    
  139.     <state name="special">
    
  140.       <rule pattern="(null|missing|_all_|_automatic_|_character_|_n_|_infile_|_name_|_null_|_numeric_|_user_|_webout_)">
    
  141.         <token type="KeywordConstant"/>
    
  142.       </rule>
    
  143.     </state>
    
  144.     <state name="log-messages">
    
  145.       <rule pattern="NOTE(:|-).*">
    
  146.         <token type="Generic"/>
    
  147.         <pop depth="1"/>
    
  148.       </rule>
    
  149.       <rule pattern="WARNING(:|-).*">
    
  150.         <token type="GenericEmph"/>
    
  151.         <pop depth="1"/>
    
  152.       </rule>
    
  153.       <rule pattern="ERROR(:|-).*">
    
  154.         <token type="GenericError"/>
    
  155.         <pop depth="1"/>
    
  156.       </rule>
    
  157.       <rule>
    
  158.         <include state="general"/>
    
  159.       </rule>
    
  160.     </state>
    
  161.     <state name="comments">
    
  162.       <rule pattern="^\s*\*.*?;">
    
  163.         <token type="Comment"/>
    
  164.       </rule>
    
  165.       <rule pattern="/\*.*?\*/">
    
  166.         <token type="Comment"/>
    
  167.       </rule>
    
  168.       <rule pattern="^\s*\*(.|\n)*?;">
    
  169.         <token type="CommentMultiline"/>
    
  170.       </rule>
    
  171.       <rule pattern="/[*](.|\n)*?[*]/">
    
  172.         <token type="CommentMultiline"/>
    
  173.       </rule>
    
  174.     </state>
    
  175.     <state name="string_squote">
    
  176.       <rule pattern="&#39;">
    
  177.         <token type="LiteralString"/>
    
  178.         <pop depth="1"/>
    
  179.       </rule>
    
  180.       <rule pattern="\\\\|\\&#34;|\\\n">
    
  181.         <token type="LiteralStringEscape"/>
    
  182.       </rule>
    
  183.       <rule pattern="[^$\&#39;\\]+">
    
  184.         <token type="LiteralString"/>
    
  185.       </rule>
    
  186.       <rule pattern="[$\&#39;\\]">
    
  187.         <token type="LiteralString"/>
    
  188.       </rule>
    
  189.     </state>
    
  190.   </rules>
    
  191. </lexer>