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."
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}.
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)
73 [(parser currentScope findVariable: token value)
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
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
96 tokens define: #DeferredSelector &parents: {tokens Selector}.
98 _ nextFrom: token@(tokens DeferredSelector traits)
100 (Syntax isUnarySelector: token) ifTrue:
102 sending: token value to: {nodes ImplicitArgument}]
105 s@(tokens DeferredSelector traits) messageType
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]
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]
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)
190 parser nonInteractivelyDo:
192 [| :statements token |
193 statements nextPut: parser nextAsStatement.
194 [(token := parser nextToken) isSameAs: tokens EndParenthesis]
196 [parser check: token is: parser EndParenthesisStatementTokens.
200 [parser nextMessage &after:
201 (parser recordDeclaredTypeOf: parser nextSignature)]
203 [parser nextAsStatement])]]
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)
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 ['%'].