10
10
existing_atoms_only = false
11
11
}).
12
12
13
- -define (container2 (T1 , T2 ),
13
+ -define (container (T1 , T2 ),
14
14
T1 == ${ , T2 == $} ;
15
15
T1 == $[ , T2 == $]
16
16
).
17
17
18
- -define (op3 (T1 , T2 , T3 ),
19
- T1 == $^ , T2 == $^ , T3 == $^
20
- ).
21
-
22
18
-define (op2 (T1 , T2 ),
23
19
T1 == $< , T2 == $> ;
24
20
T1 == $+ , T2 == $+ ;
50
46
-define (unary_op3 (T1 , T2 , T3 ),
51
47
T1 == $~ , T2 == $~ , T3 == $~ ).
52
48
49
+ -define (pin_op3 (T1 , T2 , T3 ),
50
+ T1 == $^ , T2 == $^ , T3 == $^
51
+ ).
52
+
53
+ -define (mult_op (T ),
54
+ T == $* orelse T == $/ ).
55
+
53
56
-define (dual_op (T ),
54
57
T == $+ orelse T == $- ).
55
58
88
91
T1 == $< , T2 == $- ;
89
92
T1 == $| , T2 == $> ).
90
93
94
+ -define (range_op (T1 , T2 ),
95
+ T1 == $. , T2 == $. ).
96
+
91
97
tokenize (String , Line , Opts ) ->
92
98
File = case lists :keyfind (file , 1 , Opts ) of
93
99
{ file , V1 } -> V1 ;
@@ -230,29 +236,27 @@ tokenize([$.,T|Tail], Line, Scope, Tokens) when ?is_space(T) ->
230
236
tokenize (" .<<>>" ++ Rest , Line , Scope , Tokens ) ->
231
237
handle_call_identifier (Rest , Line , '<<>>' , Scope , Tokens );
232
238
233
- tokenize ([$. ,T1 ,T2 |Rest ], Line , Scope , Tokens ) when ? container2 (T1 , T2 ) ->
239
+ tokenize ([$. ,T1 ,T2 |Rest ], Line , Scope , Tokens ) when ? container (T1 , T2 ) ->
234
240
handle_call_identifier (Rest , Line , list_to_atom ([T1 , T2 ]), Scope , Tokens );
235
241
236
242
% ## Three Token Operators
237
243
tokenize ([$. ,T1 ,T2 ,T3 |Rest ], Line , Scope , Tokens ) when
238
244
? unary_op3 (T1 , T2 , T3 ); ? comp_op3 (T1 , T2 , T3 ); ? and_op3 (T1 , T2 , T3 ); ? or_op3 (T1 , T2 , T3 );
239
- ? arrow_op3 (T1 , T2 , T3 ) ->
240
- handle_call_identifier (Rest , Line , list_to_atom ([T1 , T2 , T3 ]), Scope , Tokens );
241
-
242
- tokenize ([$. ,T1 ,T2 ,T3 |Rest ], Line , Scope , Tokens ) when ? op3 (T1 , T2 , T3 ) ->
245
+ ? arrow_op3 (T1 , T2 , T3 ); ? pin_op3 (T1 , T2 , T3 ) ->
243
246
handle_call_identifier (Rest , Line , list_to_atom ([T1 , T2 , T3 ]), Scope , Tokens );
244
247
245
248
% ## Two Token Operators
246
249
tokenize ([$. ,T1 ,T2 |Rest ], Line , Scope , Tokens ) when
247
- ? comp_op2 (T1 , T2 ); ? and_op (T1 , T2 ); ? or_op (T1 , T2 ); ? arrow_op (T1 , T2 ) ->
250
+ ? comp_op2 (T1 , T2 ); ? and_op (T1 , T2 ); ? or_op (T1 , T2 ); ? arrow_op (T1 , T2 );
251
+ ? range_op (T1 , T2 ) ->
248
252
handle_call_identifier (Rest , Line , list_to_atom ([T1 , T2 ]), Scope , Tokens );
249
253
250
254
tokenize ([$. ,T1 ,T2 |Rest ], Line , Scope , Tokens ) when ? op2 (T1 , T2 ) ->
251
255
handle_call_identifier (Rest , Line , list_to_atom ([T1 , T2 ]), Scope , Tokens );
252
256
253
257
% ## Single Token Operators
254
258
tokenize ([$. ,T |Rest ], Line , Scope , Tokens ) when
255
- ? at_op (T ); ? unary_op (T ); ? dual_op (T ); ? comp_op (T ) ->
259
+ ? at_op (T ); ? unary_op (T ); ? dual_op (T ); ? mult_op ( T ); ? comp_op (T ) ->
256
260
handle_call_identifier (Rest , Line , list_to_atom ([T ]), Scope , Tokens );
257
261
258
262
tokenize ([$. ,T |Rest ], Line , Scope , Tokens ) when ? op1 (T ); T == $& ->
@@ -316,29 +320,27 @@ tokenize(":..." ++ Rest, Line, Scope, Tokens) ->
316
320
tokenize (" :<<>>" ++ Rest , Line , Scope , Tokens ) ->
317
321
tokenize (Rest , Line , Scope , [{ atom , Line , '<<>>' }|Tokens ]);
318
322
319
- tokenize ([$: ,T1 ,T2 |Rest ], Line , Scope , Tokens ) when ? container2 (T1 , T2 ) ->
323
+ tokenize ([$: ,T1 ,T2 |Rest ], Line , Scope , Tokens ) when ? container (T1 , T2 ) ->
320
324
tokenize (Rest , Line , Scope , [{ atom , Line , list_to_atom ([T1 ,T2 ]) }|Tokens ]);
321
325
322
326
% ## Three Token Operators
323
327
tokenize ([$: ,T1 ,T2 ,T3 |Rest ], Line , Scope , Tokens ) when
324
328
? unary_op3 (T1 , T2 , T3 ); ? comp_op3 (T1 , T2 , T3 ); ? and_op3 (T1 , T2 , T3 ); ? or_op3 (T1 , T2 , T3 );
325
- ? arrow_op3 (T1 , T2 , T3 ) ->
326
- tokenize (Rest , Line , Scope , [{ atom , Line , list_to_atom ([T1 ,T2 ,T3 ]) }|Tokens ]);
327
-
328
- tokenize ([$: ,T1 ,T2 ,T3 |Rest ], Line , Scope , Tokens ) when ? op3 (T1 , T2 , T3 ) ->
329
+ ? arrow_op3 (T1 , T2 , T3 ); ? pin_op3 (T1 , T2 , T3 ) ->
329
330
tokenize (Rest , Line , Scope , [{ atom , Line , list_to_atom ([T1 ,T2 ,T3 ]) }|Tokens ]);
330
331
331
332
% ## Two Token Operators
332
333
tokenize ([$: ,T1 ,T2 |Rest ], Line , Scope , Tokens ) when
333
- ? comp_op2 (T1 , T2 ); ? and_op (T1 , T2 ); ? or_op (T1 , T2 ); ? arrow_op (T1 , T2 ) ->
334
+ ? comp_op2 (T1 , T2 ); ? and_op (T1 , T2 ); ? or_op (T1 , T2 ); ? arrow_op (T1 , T2 );
335
+ ? range_op (T1 , T2 ) ->
334
336
tokenize (Rest , Line , Scope , [{ atom , Line , list_to_atom ([T1 ,T2 ]) }|Tokens ]);
335
337
336
338
tokenize ([$: ,T1 ,T2 |Rest ], Line , Scope , Tokens ) when ? op2 (T1 , T2 ) ->
337
339
tokenize (Rest , Line , Scope , [{ atom , Line , list_to_atom ([T1 ,T2 ]) }|Tokens ]);
338
340
339
341
% ## Single Token Operators
340
342
tokenize ([$: ,T |Rest ], Line , Scope , Tokens ) when
341
- ? at_op (T ); ? unary_op (T ); ? dual_op (T ); ? comp_op (T ) ->
343
+ ? at_op (T ); ? unary_op (T ); ? dual_op (T ); ? mult_op ( T ); ? comp_op (T ) ->
342
344
tokenize (Rest , Line , Scope , [{ atom , Line , list_to_atom ([T ]) }|Tokens ]);
343
345
344
346
tokenize ([$: ,T |Rest ], Line , Scope , Tokens ) when ? op1 (T ); T == $& ; T == $. ->
@@ -386,8 +388,8 @@ tokenize([T1,T2,T3|Rest], Line, Scope, Tokens) when ?or_op3(T1, T2, T3) ->
386
388
tokenize ([T1 ,T2 ,T3 |Rest ], Line , Scope , Tokens ) when ? arrow_op3 (T1 , T2 , T3 ) ->
387
389
handle_op (Rest , Line , arrow_op , list_to_atom ([T1 ,T2 ,T3 ]), Scope , Tokens );
388
390
389
- tokenize ([T1 ,T2 ,T3 |Rest ], Line , Scope , Tokens ) when ? op3 (T1 , T2 , T3 ) ->
390
- handle_op (Rest , Line , list_to_atom ([T1 ,T2 ,T3 ]), Scope , Tokens );
391
+ tokenize ([T1 ,T2 ,T3 |Rest ], Line , Scope , Tokens ) when ? pin_op3 (T1 , T2 , T3 ) ->
392
+ handle_op (Rest , Line , pin_op , list_to_atom ([T1 ,T2 ,T3 ]), Scope , Tokens );
391
393
392
394
% ## Containers + punctuation tokens
393
395
tokenize ([T ,T |Rest ], Line , Scope , Tokens ) when T == $< ; T == $> ->
@@ -400,6 +402,9 @@ tokenize([T|Rest], Line, Scope, Tokens) when T == $(;
400
402
handle_terminator (Rest , Line , Scope , Token , Tokens );
401
403
402
404
% ## Two Token Operators
405
+ tokenize ([T1 ,T2 |Rest ], Line , Scope , Tokens ) when ? range_op (T1 , T2 ) ->
406
+ handle_op (Rest , Line , range_op , list_to_atom ([T1 , T2 ]), Scope , Tokens );
407
+
403
408
tokenize ([T1 ,T2 |Rest ], Line , Scope , Tokens ) when ? arrow_op (T1 , T2 ) ->
404
409
handle_op (Rest , Line , arrow_op , list_to_atom ([T1 , T2 ]), Scope , Tokens );
405
410
@@ -428,6 +433,9 @@ tokenize([T|Rest], Line, Scope, Tokens) when ?comp_op(T) ->
428
433
tokenize ([T |Rest ], Line , Scope , Tokens ) when ? dual_op (T ) ->
429
434
handle_unary_op (Rest , Line , dual_op , list_to_atom ([T ]), Scope , Tokens );
430
435
436
+ tokenize ([T |Rest ], Line , Scope , Tokens ) when ? mult_op (T ) ->
437
+ handle_op (Rest , Line , mult_op , list_to_atom ([T ]), Scope , Tokens );
438
+
431
439
tokenize ([T |Rest ], Line , Scope , Tokens ) when ? op1 (T ) ->
432
440
handle_op (Rest , Line , list_to_atom ([T ]), Scope , Tokens );
433
441
@@ -886,7 +894,6 @@ check_keyword(Line, Identifier, Atom, Tokens) when
886
894
true -> { ok , [{ Atom , Line }|Tokens ] };
887
895
block -> { ok , [{ block_identifier , Line , Atom }|Tokens ] };
888
896
unary_op -> { ok , [{ unary_op , Line , Atom }|Tokens ] };
889
- op -> { ok , add_token_with_nl ({ Atom , Line }, Tokens ) };
890
897
Kind -> { ok , add_token_with_nl ({ Kind , Line , Atom }, Tokens ) }
891
898
end ;
892
899
@@ -911,10 +918,10 @@ keyword('not') -> unary_op;
911
918
keyword ('and' ) -> and_op ;
912
919
keyword ('or' ) -> or_op ;
913
920
keyword ('xor' ) -> or_op ;
914
- keyword ('when' ) -> op ;
915
- keyword ('in' ) -> op ;
916
- keyword ('inlist' ) -> op ;
917
- keyword ('inbits' ) -> op ;
921
+ keyword ('when' ) -> when_op ;
922
+ keyword ('in' ) -> in_op ;
923
+ keyword ('inlist' ) -> inc_op ;
924
+ keyword ('inbits' ) -> inc_op ;
918
925
919
926
% Block keywords
920
927
keyword ('after' ) -> block ;
0 commit comments