1. <lexer>
    
  2.   <config>
    
  3.     <name>QBasic</name>
    
  4.     <alias>qbasic</alias>
    
  5.     <alias>basic</alias>
    
  6.     <filename>*.BAS</filename>
    
  7.     <filename>*.bas</filename>
    
  8.     <mime_type>text/basic</mime_type>
    
  9.   </config>
    
  10.   <rules>
    
  11.     <state name="root">
    
  12.       <rule pattern="\n+">
    
  13.         <token type="Text"/>
    
  14.       </rule>
    
  15.       <rule pattern="\s+">
    
  16.         <token type="TextWhitespace"/>
    
  17.       </rule>
    
  18.       <rule pattern="^(\s*)(\d*)(\s*)(REM .*)$">
    
  19.         <bygroups>
    
  20.           <token type="TextWhitespace"/>
    
  21.           <token type="NameLabel"/>
    
  22.           <token type="TextWhitespace"/>
    
  23.           <token type="CommentSingle"/>
    
  24.         </bygroups>
    
  25.       </rule>
    
  26.       <rule pattern="^(\s*)(\d+)(\s*)">
    
  27.         <bygroups>
    
  28.           <token type="TextWhitespace"/>
    
  29.           <token type="NameLabel"/>
    
  30.           <token type="TextWhitespace"/>
    
  31.         </bygroups>
    
  32.       </rule>
    
  33.       <rule pattern="(?=[\s]*)(\w+)(?=[\s]*=)">
    
  34.         <token type="NameVariableGlobal"/>
    
  35.       </rule>
    
  36.       <rule pattern="(?=[^&#34;]*)\&#39;.*$">
    
  37.         <token type="CommentSingle"/>
    
  38.       </rule>
    
  39.       <rule pattern="&#34;[^\n&#34;]*&#34;">
    
  40.         <token type="LiteralStringDouble"/>
    
  41.       </rule>
    
  42.       <rule pattern="(END)(\s+)(FUNCTION|IF|SELECT|SUB)">
    
  43.         <bygroups>
    
  44.           <token type="KeywordReserved"/>
    
  45.           <token type="TextWhitespace"/>
    
  46.           <token type="KeywordReserved"/>
    
  47.         </bygroups>
    
  48.       </rule>
    
  49.       <rule pattern="(DECLARE)(\s+)([A-Z]+)(\s+)(\S+)">
    
  50.         <bygroups>
    
  51.           <token type="KeywordDeclaration"/>
    
  52.           <token type="TextWhitespace"/>
    
  53.           <token type="NameVariable"/>
    
  54.           <token type="TextWhitespace"/>
    
  55.           <token type="Name"/>
    
  56.         </bygroups>
    
  57.       </rule>
    
  58.       <rule pattern="(DIM)(\s+)(SHARED)(\s+)([^\s(]+)">
    
  59.         <bygroups>
    
  60.           <token type="KeywordDeclaration"/>
    
  61.           <token type="TextWhitespace"/>
    
  62.           <token type="NameVariable"/>
    
  63.           <token type="TextWhitespace"/>
    
  64.           <token type="NameVariableGlobal"/>
    
  65.         </bygroups>
    
  66.       </rule>
    
  67.       <rule pattern="(DIM)(\s+)([^\s(]+)">
    
  68.         <bygroups>
    
  69.           <token type="KeywordDeclaration"/>
    
  70.           <token type="TextWhitespace"/>
    
  71.           <token type="NameVariableGlobal"/>
    
  72.         </bygroups>
    
  73.       </rule>
    
  74.       <rule pattern="^(\s*)([a-zA-Z_]+)(\s*)(\=)">
    
  75.         <bygroups>
    
  76.           <token type="TextWhitespace"/>
    
  77.           <token type="NameVariableGlobal"/>
    
  78.           <token type="TextWhitespace"/>
    
  79.           <token type="Operator"/>
    
  80.         </bygroups>
    
  81.       </rule>
    
  82.       <rule pattern="(GOTO|GOSUB)(\s+)(\w+\:?)">
    
  83.         <bygroups>
    
  84.           <token type="KeywordReserved"/>
    
  85.           <token type="TextWhitespace"/>
    
  86.           <token type="NameLabel"/>
    
  87.         </bygroups>
    
  88.       </rule>
    
  89.       <rule pattern="(SUB)(\s+)(\w+\:?)">
    
  90.         <bygroups>
    
  91.           <token type="KeywordReserved"/>
    
  92.           <token type="TextWhitespace"/>
    
  93.           <token type="NameLabel"/>
    
  94.         </bygroups>
    
  95.       </rule>
    
  96.       <rule>
    
  97.         <include state="declarations"/>
    
  98.       </rule>
    
  99.       <rule>
    
  100.         <include state="functions"/>
    
  101.       </rule>
    
  102.       <rule>
    
  103.         <include state="metacommands"/>
    
  104.       </rule>
    
  105.       <rule>
    
  106.         <include state="operators"/>
    
  107.       </rule>
    
  108.       <rule>
    
  109.         <include state="statements"/>
    
  110.       </rule>
    
  111.       <rule>
    
  112.         <include state="keywords"/>
    
  113.       </rule>
    
  114.       <rule pattern="[a-zA-Z_]\w*[$@#&amp;!]">
    
  115.         <token type="NameVariableGlobal"/>
    
  116.       </rule>
    
  117.       <rule pattern="[a-zA-Z_]\w*\:">
    
  118.         <token type="NameLabel"/>
    
  119.       </rule>
    
  120.       <rule pattern="\-?\d*\.\d+[@|#]?">
    
  121.         <token type="LiteralNumberFloat"/>
    
  122.       </rule>
    
  123.       <rule pattern="\-?\d+[@|#]">
    
  124.         <token type="LiteralNumberFloat"/>
    
  125.       </rule>
    
  126.       <rule pattern="\-?\d+#?">
    
  127.         <token type="LiteralNumberIntegerLong"/>
    
  128.       </rule>
    
  129.       <rule pattern="\-?\d+#?">
    
  130.         <token type="LiteralNumberInteger"/>
    
  131.       </rule>
    
  132.       <rule pattern="!=|==|:=|\.=|&lt;&lt;|&gt;&gt;|[-~+/\\*%=&lt;&gt;&amp;^|?:!.]">
    
  133.         <token type="Operator"/>
    
  134.       </rule>
    
  135.       <rule pattern="[\[\]{}(),;]">
    
  136.         <token type="Punctuation"/>
    
  137.       </rule>
    
  138.       <rule pattern="[\w]+">
    
  139.         <token type="NameVariableGlobal"/>
    
  140.       </rule>
    
  141.     </state>
    
  142.     <state name="declarations">
    
  143.       <rule pattern="\b(DATA|LET)(?=\(|\b)">
    
  144.         <token type="KeywordDeclaration"/>
    
  145.       </rule>
    
  146.     </state>
    
  147.     <state name="functions">
    
  148.       <rule pattern="\b(ABS|ASC|ATN|CDBL|CHR\$|CINT|CLNG|COMMAND\$|COS|CSNG|CSRLIN|CVD|CVDMBF|CVI|CVL|CVS|CVSMBF|DATE\$|ENVIRON\$|EOF|ERDEV|ERDEV\$|ERL|ERR|EXP|FILEATTR|FIX|FRE|FREEFILE|HEX\$|INKEY\$|INP|INPUT\$|INSTR|INT|IOCTL\$|LBOUND|LCASE\$|LEFT\$|LEN|LOC|LOF|LOG|LPOS|LTRIM\$|MID\$|MKD\$|MKDMBF\$|MKI\$|MKL\$|MKS\$|MKSMBF\$|OCT\$|PEEK|PEN|PLAY|PMAP|POINT|POS|RIGHT\$|RND|RTRIM\$|SADD|SCREEN|SEEK|SETMEM|SGN|SIN|SPACE\$|SPC|SQR|STICK|STR\$|STRIG|STRING\$|TAB|TAN|TIME\$|TIMER|UBOUND|UCASE\$|VAL|VARPTR|VARPTR\$|VARSEG)(?=\(|\b)">
    
  149.         <token type="KeywordReserved"/>
    
  150.       </rule>
    
  151.     </state>
    
  152.     <state name="metacommands">
    
  153.       <rule pattern="\b(\$DYNAMIC|\$INCLUDE|\$STATIC)(?=\(|\b)">
    
  154.         <token type="KeywordConstant"/>
    
  155.       </rule>
    
  156.     </state>
    
  157.     <state name="operators">
    
  158.       <rule pattern="\b(AND|EQV|IMP|NOT|OR|XOR)(?=\(|\b)">
    
  159.         <token type="OperatorWord"/>
    
  160.       </rule>
    
  161.     </state>
    
  162.     <state name="statements">
    
  163.       <rule pattern="\b(BEEP|BLOAD|BSAVE|CALL|CALL\ ABSOLUTE|CALL\ INTERRUPT|CALLS|CHAIN|CHDIR|CIRCLE|CLEAR|CLOSE|CLS|COLOR|COM|COMMON|CONST|DATA|DATE\$|DECLARE|DEF\ FN|DEF\ SEG|DEFDBL|DEFINT|DEFLNG|DEFSNG|DEFSTR|DEF|DIM|DO|LOOP|DRAW|END|ENVIRON|ERASE|ERROR|EXIT|FIELD|FILES|FOR|NEXT|FUNCTION|GET|GOSUB|GOTO|IF|THEN|INPUT|INPUT\ \#|IOCTL|KEY|KEY|KILL|LET|LINE|LINE\ INPUT|LINE\ INPUT\ \#|LOCATE|LOCK|UNLOCK|LPRINT|LSET|MID\$|MKDIR|NAME|ON\ COM|ON\ ERROR|ON\ KEY|ON\ PEN|ON\ PLAY|ON\ STRIG|ON\ TIMER|ON\ UEVENT|ON|OPEN|OPEN\ COM|OPTION\ BASE|OUT|PAINT|PALETTE|PCOPY|PEN|PLAY|POKE|PRESET|PRINT|PRINT\ \#|PRINT\ USING|PSET|PUT|PUT|RANDOMIZE|READ|REDIM|REM|RESET|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SCREEN|SEEK|SELECT\ CASE|SHARED|SHELL|SLEEP|SOUND|STATIC|STOP|STRIG|SUB|SWAP|SYSTEM|TIME\$|TIMER|TROFF|TRON|TYPE|UEVENT|UNLOCK|VIEW|WAIT|WHILE|WEND|WIDTH|WINDOW|WRITE)\b">
    
  164.         <token type="KeywordReserved"/>
    
  165.       </rule>
    
  166.     </state>
    
  167.     <state name="keywords">
    
  168.       <rule pattern="\b(ACCESS|ALIAS|ANY|APPEND|AS|BASE|BINARY|BYVAL|CASE|CDECL|DOUBLE|ELSE|ELSEIF|ENDIF|INTEGER|IS|LIST|LOCAL|LONG|LOOP|MOD|NEXT|OFF|ON|OUTPUT|RANDOM|SIGNAL|SINGLE|STEP|STRING|THEN|TO|UNTIL|USING|WEND)\b">
    
  169.         <token type="Keyword"/>
    
  170.       </rule>
    
  171.     </state>
    
  172.   </rules>
    
  173. </lexer>