1. <lexer>
    
  2.   <config>
    
  3.     <name>Smalltalk</name>
    
  4.     <alias>smalltalk</alias>
    
  5.     <alias>squeak</alias>
    
  6.     <alias>st</alias>
    
  7.     <filename>*.st</filename>
    
  8.     <mime_type>text/x-smalltalk</mime_type>
    
  9.   </config>
    
  10.   <rules>
    
  11.     <state name="inner_parenth">
    
  12.       <rule pattern="\)">
    
  13.         <token type="LiteralStringSymbol"/>
    
  14.         <pop depth="1"/>
    
  15.       </rule>
    
  16.       <rule>
    
  17.         <include state="_parenth_helper"/>
    
  18.       </rule>
    
  19.     </state>
    
  20.     <state name="objects">
    
  21.       <rule pattern="\[">
    
  22.         <token type="Text"/>
    
  23.         <push state="blockvariables"/>
    
  24.       </rule>
    
  25.       <rule pattern="\]">
    
  26.         <token type="Text"/>
    
  27.         <push state="afterobject"/>
    
  28.       </rule>
    
  29.       <rule pattern="\b(self|super|true|false|nil|thisContext)\b">
    
  30.         <token type="NameBuiltinPseudo"/>
    
  31.         <push state="afterobject"/>
    
  32.       </rule>
    
  33.       <rule pattern="\b[A-Z]\w*(?!:)\b">
    
  34.         <token type="NameClass"/>
    
  35.         <push state="afterobject"/>
    
  36.       </rule>
    
  37.       <rule pattern="\b[a-z]\w*(?!:)\b">
    
  38.         <token type="NameVariable"/>
    
  39.         <push state="afterobject"/>
    
  40.       </rule>
    
  41.       <rule pattern="#(&#34;(&#34;&#34;|[^&#34;])*&#34;|[-+*/\\~&lt;&gt;=|&amp;!?,@%]+|[\w:]+)">
    
  42.         <token type="LiteralStringSymbol"/>
    
  43.         <push state="afterobject"/>
    
  44.       </rule>
    
  45.       <rule>
    
  46.         <include state="literals"/>
    
  47.       </rule>
    
  48.     </state>
    
  49.     <state name="afterobject">
    
  50.       <rule pattern="! !$">
    
  51.         <token type="Keyword"/>
    
  52.         <pop depth="1"/>
    
  53.       </rule>
    
  54.       <rule>
    
  55.         <include state="whitespaces"/>
    
  56.       </rule>
    
  57.       <rule pattern="\b(ifTrue:|ifFalse:|whileTrue:|whileFalse:|timesRepeat:)">
    
  58.         <token type="NameBuiltin"/>
    
  59.         <pop depth="1"/>
    
  60.       </rule>
    
  61.       <rule pattern="\b(new\b(?!:))">
    
  62.         <token type="NameBuiltin"/>
    
  63.       </rule>
    
  64.       <rule pattern=":=|_">
    
  65.         <token type="Operator"/>
    
  66.         <pop depth="1"/>
    
  67.       </rule>
    
  68.       <rule pattern="\b[a-zA-Z]+\w*:">
    
  69.         <token type="NameFunction"/>
    
  70.         <pop depth="1"/>
    
  71.       </rule>
    
  72.       <rule pattern="\b[a-zA-Z]+\w*">
    
  73.         <token type="NameFunction"/>
    
  74.       </rule>
    
  75.       <rule pattern="\w+:?|[-+*/\\~&lt;&gt;=|&amp;!?,@%]+">
    
  76.         <token type="NameFunction"/>
    
  77.         <pop depth="1"/>
    
  78.       </rule>
    
  79.       <rule pattern="\.">
    
  80.         <token type="Punctuation"/>
    
  81.         <pop depth="1"/>
    
  82.       </rule>
    
  83.       <rule pattern=";">
    
  84.         <token type="Punctuation"/>
    
  85.       </rule>
    
  86.       <rule pattern="[\])}]">
    
  87.         <token type="Text"/>
    
  88.       </rule>
    
  89.       <rule pattern="[\[({]">
    
  90.         <token type="Text"/>
    
  91.         <pop depth="1"/>
    
  92.       </rule>
    
  93.     </state>
    
  94.     <state name="literals">
    
  95.       <rule pattern="&#39;(&#39;&#39;|[^&#39;])*&#39;">
    
  96.         <token type="LiteralString"/>
    
  97.         <push state="afterobject"/>
    
  98.       </rule>
    
  99.       <rule pattern="\$.">
    
  100.         <token type="LiteralStringChar"/>
    
  101.         <push state="afterobject"/>
    
  102.       </rule>
    
  103.       <rule pattern="#\(">
    
  104.         <token type="LiteralStringSymbol"/>
    
  105.         <push state="parenth"/>
    
  106.       </rule>
    
  107.       <rule pattern="\)">
    
  108.         <token type="Text"/>
    
  109.         <push state="afterobject"/>
    
  110.       </rule>
    
  111.       <rule pattern="(\d+r)?-?\d+(\.\d+)?(e-?\d+)?">
    
  112.         <token type="LiteralNumber"/>
    
  113.         <push state="afterobject"/>
    
  114.       </rule>
    
  115.     </state>
    
  116.     <state name="root">
    
  117.       <rule pattern="(&lt;)(\w+:)(.*?)(&gt;)">
    
  118.         <bygroups>
    
  119.           <token type="Text"/>
    
  120.           <token type="Keyword"/>
    
  121.           <token type="Text"/>
    
  122.           <token type="Text"/>
    
  123.         </bygroups>
    
  124.       </rule>
    
  125.       <rule>
    
  126.         <include state="squeak fileout"/>
    
  127.       </rule>
    
  128.       <rule>
    
  129.         <include state="whitespaces"/>
    
  130.       </rule>
    
  131.       <rule>
    
  132.         <include state="method definition"/>
    
  133.       </rule>
    
  134.       <rule pattern="(\|)([\w\s]*)(\|)">
    
  135.         <bygroups>
    
  136.           <token type="Operator"/>
    
  137.           <token type="NameVariable"/>
    
  138.           <token type="Operator"/>
    
  139.         </bygroups>
    
  140.       </rule>
    
  141.       <rule>
    
  142.         <include state="objects"/>
    
  143.       </rule>
    
  144.       <rule pattern="\^|:=|_">
    
  145.         <token type="Operator"/>
    
  146.       </rule>
    
  147.       <rule pattern="[\]({}.;!]">
    
  148.         <token type="Text"/>
    
  149.       </rule>
    
  150.     </state>
    
  151.     <state name="_parenth_helper">
    
  152.       <rule>
    
  153.         <include state="whitespaces"/>
    
  154.       </rule>
    
  155.       <rule pattern="(\d+r)?-?\d+(\.\d+)?(e-?\d+)?">
    
  156.         <token type="LiteralNumber"/>
    
  157.       </rule>
    
  158.       <rule pattern="[-+*/\\~&lt;&gt;=|&amp;#!?,@%\w:]+">
    
  159.         <token type="LiteralStringSymbol"/>
    
  160.       </rule>
    
  161.       <rule pattern="&#39;(&#39;&#39;|[^&#39;])*&#39;">
    
  162.         <token type="LiteralString"/>
    
  163.       </rule>
    
  164.       <rule pattern="\$.">
    
  165.         <token type="LiteralStringChar"/>
    
  166.       </rule>
    
  167.       <rule pattern="#*\(">
    
  168.         <token type="LiteralStringSymbol"/>
    
  169.         <push state="inner_parenth"/>
    
  170.       </rule>
    
  171.     </state>
    
  172.     <state name="parenth">
    
  173.       <rule pattern="\)">
    
  174.         <token type="LiteralStringSymbol"/>
    
  175.         <push state="root" state="afterobject"/>
    
  176.       </rule>
    
  177.       <rule>
    
  178.         <include state="_parenth_helper"/>
    
  179.       </rule>
    
  180.     </state>
    
  181.     <state name="whitespaces">
    
  182.       <rule pattern="\s+">
    
  183.         <token type="Text"/>
    
  184.       </rule>
    
  185.       <rule pattern="&#34;(&#34;&#34;|[^&#34;])*&#34;">
    
  186.         <token type="Comment"/>
    
  187.       </rule>
    
  188.     </state>
    
  189.     <state name="squeak fileout">
    
  190.       <rule pattern="^&#34;(&#34;&#34;|[^&#34;])*&#34;!">
    
  191.         <token type="Keyword"/>
    
  192.       </rule>
    
  193.       <rule pattern="^&#39;(&#39;&#39;|[^&#39;])*&#39;!">
    
  194.         <token type="Keyword"/>
    
  195.       </rule>
    
  196.       <rule pattern="^(!)(\w+)( commentStamp: )(.*?)( prior: .*?!\n)(.*?)(!)">
    
  197.         <bygroups>
    
  198.           <token type="Keyword"/>
    
  199.           <token type="NameClass"/>
    
  200.           <token type="Keyword"/>
    
  201.           <token type="LiteralString"/>
    
  202.           <token type="Keyword"/>
    
  203.           <token type="Text"/>
    
  204.           <token type="Keyword"/>
    
  205.         </bygroups>
    
  206.       </rule>
    
  207.       <rule pattern="^(!)(\w+(?: class)?)( methodsFor: )(&#39;(?:&#39;&#39;|[^&#39;])*&#39;)(.*?!)">
    
  208.         <bygroups>
    
  209.           <token type="Keyword"/>
    
  210.           <token type="NameClass"/>
    
  211.           <token type="Keyword"/>
    
  212.           <token type="LiteralString"/>
    
  213.           <token type="Keyword"/>
    
  214.         </bygroups>
    
  215.       </rule>
    
  216.       <rule pattern="^(\w+)( subclass: )(#\w+)(\s+instanceVariableNames: )(.*?)(\s+classVariableNames: )(.*?)(\s+poolDictionaries: )(.*?)(\s+category: )(.*?)(!)">
    
  217.         <bygroups>
    
  218.           <token type="NameClass"/>
    
  219.           <token type="Keyword"/>
    
  220.           <token type="LiteralStringSymbol"/>
    
  221.           <token type="Keyword"/>
    
  222.           <token type="LiteralString"/>
    
  223.           <token type="Keyword"/>
    
  224.           <token type="LiteralString"/>
    
  225.           <token type="Keyword"/>
    
  226.           <token type="LiteralString"/>
    
  227.           <token type="Keyword"/>
    
  228.           <token type="LiteralString"/>
    
  229.           <token type="Keyword"/>
    
  230.         </bygroups>
    
  231.       </rule>
    
  232.       <rule pattern="^(\w+(?: class)?)(\s+instanceVariableNames: )(.*?)(!)">
    
  233.         <bygroups>
    
  234.           <token type="NameClass"/>
    
  235.           <token type="Keyword"/>
    
  236.           <token type="LiteralString"/>
    
  237.           <token type="Keyword"/>
    
  238.         </bygroups>
    
  239.       </rule>
    
  240.       <rule pattern="(!\n)(\].*)(! !)$">
    
  241.         <bygroups>
    
  242.           <token type="Keyword"/>
    
  243.           <token type="Text"/>
    
  244.           <token type="Keyword"/>
    
  245.         </bygroups>
    
  246.       </rule>
    
  247.       <rule pattern="! !$">
    
  248.         <token type="Keyword"/>
    
  249.       </rule>
    
  250.     </state>
    
  251.     <state name="method definition">
    
  252.       <rule pattern="([a-zA-Z]+\w*:)(\s*)(\w+)">
    
  253.         <bygroups>
    
  254.           <token type="NameFunction"/>
    
  255.           <token type="Text"/>
    
  256.           <token type="NameVariable"/>
    
  257.         </bygroups>
    
  258.       </rule>
    
  259.       <rule pattern="^(\b[a-zA-Z]+\w*\b)(\s*)$">
    
  260.         <bygroups>
    
  261.           <token type="NameFunction"/>
    
  262.           <token type="Text"/>
    
  263.         </bygroups>
    
  264.       </rule>
    
  265.       <rule pattern="^([-+*/\\~&lt;&gt;=|&amp;!?,@%]+)(\s*)(\w+)(\s*)$">
    
  266.         <bygroups>
    
  267.           <token type="NameFunction"/>
    
  268.           <token type="Text"/>
    
  269.           <token type="NameVariable"/>
    
  270.           <token type="Text"/>
    
  271.         </bygroups>
    
  272.       </rule>
    
  273.     </state>
    
  274.     <state name="blockvariables">
    
  275.       <rule>
    
  276.         <include state="whitespaces"/>
    
  277.       </rule>
    
  278.       <rule pattern="(:)(\s*)(\w+)">
    
  279.         <bygroups>
    
  280.           <token type="Operator"/>
    
  281.           <token type="Text"/>
    
  282.           <token type="NameVariable"/>
    
  283.         </bygroups>
    
  284.       </rule>
    
  285.       <rule pattern="\|">
    
  286.         <token type="Operator"/>
    
  287.         <pop depth="1"/>
    
  288.       </rule>
    
  289.       <rule>
    
  290.         <pop depth="1"/>
    
  291.       </rule>
    
  292.     </state>
    
  293.   </rules>
    
  294. </lexer>