Defined a QuoteMacro token with an initial setup for words{foo bar baz} => {'foo...
[cslatevm.git] / src / syntax / token.slate
blob0dd22fcaf91db4f1aee3519b922d10cab7ce0b02
1 ensureNamespace: #tokens &delegate: True.
3 tokens define: #Token &parents: {Cloneable}.
5 _ nextFrom: _@(tokens Token traits) [Nil].
7 _ nextLiteralFrom: _@(tokens Token traits) [Nil].
9 t@(tokens Token traits) signifier
10 "Answer a String representing the punctuation/lexical beginning."
11 [t printName].
13 tokens define: #TokenWithValue &parents: {tokens Token} &slots: {#value}.
15 node@(tokens TokenWithValue traits) for: obj
16 [node new `setting: #{#value} to: {obj}].
18 t@(tokens TokenWithValue traits) signifier
20   resend ; ':' ; (t value as: '')
23 tokens define: #LiteralToken &parents: {tokens TokenWithValue}.
25 _ nextLiteralFrom: token@(tokens LiteralToken traits) [token value].
27 _ nextFrom: token@(tokens LiteralToken traits)
28 [nodes Literal for: token value].
30 tokens define: #Comment &parents: {tokens TokenWithValue}.
32 _@(tokens Comment traits) signifier ['"'].
34 tokens define: #Whitespace &parents: {tokens TokenWithValue}.
36 _@(tokens Whitespace traits) signifier [' '].
38 tokens define: #Selector &parents: {tokens TokenWithValue}.
40 tokens define: #QuoteMacro &parents: {tokens TokenWithValue}.
42 "Parser optimization"
43 _@(tokens Selector traits) is: _@(tokens Selector traits) [True].
44 _@(tokens Token traits) is: _@(tokens Selector traits) [False].
46 ns@Syntax isUnarySelector: sel@(tokens Selector traits)
47 [ns isUnarySelector: sel value].
49 ns@Syntax isBinarySelector: sel@(tokens Selector traits)
50 [ns isBinarySelector: sel value].
52 ns@Syntax isKeywordSelector: sel@(tokens Selector traits)
53 [ns isKeywordSelector: sel value].
55 ns@Syntax isOptionalSelector: sel@(tokens Selector traits)
56 [ns isOptionalSelector: sel value].
58 ns@Syntax isReturnSelector: sel@(tokens Selector traits)
59 [ns isReturnSelector: sel value].
61 ns@Syntax isUnarySelector: sel@(tokens Token traits) [False].
62 ns@Syntax isBinarySelector: sel@(tokens Token traits) [False].
63 ns@Syntax isKeywordSelector: sel@(tokens Token traits) [False].
64 ns@Syntax isOptionalSelector: sel@(tokens Token traits) [False].
65 ns@Syntax isReturnSelector: sel@(tokens Token traits) [False].
67 _ nextLiteralFrom: token@(tokens Selector traits) [token value].
69 parser nextFrom: token@(tokens Selector traits)
71   (Syntax isUnarySelector: token)
72     ifTrue:
73       [(parser currentScope findVariable: token value)
74          ifNil:
75            [token value =~ #resend
76               ifTrue: [nodes Resend clone]
77               ifFalse: [nodes UnaryMessage
78                           sending: token value to: {nodes ImplicitArgument}]]
79          ifNotNilDo: #load `er]
82 s@(tokens Selector traits) messageType
83 [nodes Message].
85 tokens define: #MacroSelector &parents: {tokens Selector}.
87 _ nextFrom: token@(tokens MacroSelector traits)
89   (Syntax isUnarySelector: token) ifTrue:
90     [nodes UnaryMacro sending: token value to: {nodes ImplicitArgument}]
93 s@(tokens MacroSelector traits) messageType
94 [nodes Macro].
96 tokens define: #DeferredSelector &parents: {tokens Selector}.
98 _ nextFrom: token@(tokens DeferredSelector traits)
100   (Syntax isUnarySelector: token) ifTrue:
101     [nodes UnaryDeferred
102        sending: token value to: {nodes ImplicitArgument}]
105 s@(tokens DeferredSelector traits) messageType
106 [nodes Deferred].
108 tokens define: #Control &parents: {tokens Token}.
110 tokens define: #BeginParenthesis &parents: {tokens Control}.
112 parser nextLiteralFrom: _@(tokens BeginParenthesis traits)
113 [parser nextLiteralFrom: tokens BeginLiteralParenthesis].
115 parser nextFrom: _@(tokens BeginParenthesis traits)
117   parser nonInteractivelyDo:
118     [([| :statements token |
119        statements nextPut: parser nextAsStatement.
120        [(token := parser nextToken) isSameAs: tokens EndParenthesis]
121           whileFalse:
122             [parser check: token is: parser EndParenthesisStatementTokens.
123              statements nextPut: parser nextAsStatement]]
124        writingAs: #{}) as: nodes Parenthesis]
127 _@(tokens BeginParenthesis traits) signifier ['('].
129 tokens define: #EndParenthesis &parents: {tokens Control}.
131 _@(tokens EndParenthesis traits) signifier [')'].
133 tokens define: #BeginArray &parents: {tokens Control}.
135 parser nextLiteralFrom: token@(tokens BeginArray traits)
136 [(parser nextFrom: token) evaluate].
138 parser nextFrom: _@(tokens BeginArray traits)
140   parser nonInteractivelyDo:
141     [([| :statements token |
142        [(token := parser peekToken) isSameAs: tokens EndArray]
143           whileFalse:
144             [statements nextPut: parser nextAsStatement.
145              parser check: (token := parser peekToken) is: parser EndArrayStatementTokens.
146              (token isSameAs: tokens EndStatement) ifTrue: [parser nextToken]].
147        parser nextToken] writingAs: #{}) as: nodes Array]
150 _@(tokens BeginArray traits) signifier ['{'].
152 tokens define: #EndArray &parents: {tokens Control}.
154 _@(tokens EndArray traits) signifier ['}'].
156 tokens define: #BeginLiteral &parents: {tokens Control}.
158 parser nextFrom: token@(tokens BeginLiteral traits)
160   parser inScope: parser currentScope topLevel do:
161     [nodes Literal for: (parser nextLiteralFrom: token)]
164 tokens define: #BeginLiteralArray &parents: {tokens BeginLiteral}.
166 parser nextLiteralFrom: _@(tokens BeginLiteralArray traits)
168   parser nextLiteralFrom: tokens BeginArray
171 _@(tokens BeginLiteralArray traits) signifier ['#{'].
173 tokens define: #BeginLiteralParenthesis &parents: {tokens BeginLiteral}.
175 parser nextLiteralFrom: _@(tokens BeginLiteralParenthesis traits)
177   parser nonInteractivelyDo:
178     [[| :elements token |
179       [(token := parser peekToken) isSameAs: tokens EndParenthesis]
180          whileFalse: [elements nextPut: parser nextLiteral].
181       parser nextToken] writingAs: #{}]
184 _@(tokens BeginLiteralParenthesis traits) signifier ['##('].
186 tokens define: #BeginPattern &parents: {tokens Control}.
188 parser nextFrom: _@(tokens BeginPattern traits)
189 [| statements |
190   parser nonInteractivelyDo:
191     [statements :=
192        [| :statements token |
193         statements nextPut: parser nextAsStatement.
194         [(token := parser nextToken) isSameAs: tokens EndParenthesis]
195           whileFalse:
196             [parser check: token is: parser EndParenthesisStatementTokens.
197              statements nextPut:
198                (token == tokens At
199                   ifTrue:
200                     [parser nextMessage &after:
201                        (parser recordDeclaredTypeOf: parser nextSignature)]
202                   ifFalse:
203                     [parser nextAsStatement])]]
204        writingAs: #{}.
205      statements infect:
206        [| :statement |
207         statement transformBy: [| :node | node as: nodes Placeholder].
208         nodes Pattern for: statement]].
209   statements parenthesize
212 _@(tokens BeginPattern traits) signifier ['#('].
214 tokens define: #BeginLiteralBlock &parents: {tokens BeginLiteral}.
216 parser nextLiteralFrom: _@(tokens BeginLiteralBlock traits)
218   (parser nextLiteralFrom: tokens BeginBlock) do
221 _@(tokens BeginLiteralBlock traits) signifier ['#['].
223 tokens define: #BeginBlock &parents: {tokens Control}.
225 parser nextLiteralFrom: token@(tokens BeginBlock traits)
227   (parser nextFrom: token) evaluate
230 parser nextFrom: _@(tokens BeginBlock traits)
232   parser nextBlock
235 _@(tokens BeginBlock traits) signifier ['['].
237 tokens define: #EndBlock &parents: {tokens Control}.
239 _@(tokens EndBlock traits) signifier [']'].
241 tokens define: #CommentStart &parents: {tokens Control}.
243 _@(tokens CommentStart traits) signifier ['"'].
245 tokens define: #CommentEnd &parents: {tokens Control}.
247 _@(tokens CommentEnd traits) signifier ['"'].
249 tokens define: #At &parents: {tokens Control}.
251 _ nextLiteralFrom: _@(tokens At traits) [#'@'].
253 _@(tokens At traits) signifier ['@'].
255 tokens define: #EndStatement &parents: {tokens Control}.
257 _ nextLiteralFrom: _@(tokens EndStatement traits) [#'.'].
259 _@(tokens EndStatement traits) signifier ['.'].
261 tokens define: #Comma &parents: {tokens Control}.
263 _ nextLiteralFrom: _@(tokens Comma traits) [#','].
265 _@(tokens Comma traits) signifier [','].
267 tokens define: #BeginVariables &parents: {tokens Control}.
269 _ nextLiteralFrom: _@(tokens BeginVariables traits) [#'|'].
271 _@(tokens BeginVariables traits) signifier ['|'].
273 tokens define: #EndVariables &builder: [tokens BeginVariables].
275 tokens define: #EndStream &parents: {tokens Control}.
276 "The end of the input Stream."
278 tokens define: #EndLine &parents: {tokens Control}.
279 "The end of a line of input."
281 tokens define: #Type &parents: {tokens Control}.
282 "A type annotation token."
284 _@(tokens Type traits) signifier ['!'].
286 tokens define: #Quote &parents: {tokens Control}.
287 "Begins a quoted atom, or non-selector syntax prefixed by `."
289 parser nextFrom: token@(tokens Quote traits)
291   nodes UnaryMacro sending: #quote to: {parser nextAtom}
294 _@(tokens Quote traits) signifier ['`'].
296 tokens define: #Eventually &parents: {tokens Control}.
297 "Begins an eventual atom, or non-selector syntax prefixed by %."
299 parser nextFrom: token@(tokens Eventually traits)
301   nodes UnaryMessage sending: #eventually to:
302     {(nodes Block newFor: parser nextAtom) `>>
303       [parentScope := parser currentScope. recordPositionFrom: parser]}
306 _ nextLiteralFrom: _@(tokens Eventually traits) [#'%'].
308 _@(tokens Eventually traits) signifier ['%'].