smalltalk.xml

  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>