70
70
-define (at_op (T ),
71
71
T == $@ ).
72
72
73
- -define (dual_op (T ),
74
- T == $+ orelse T == $- ).
75
-
76
73
-define (unary_op (T ),
77
74
% T == $&;
78
75
T == $! ;
79
76
T == $^
80
77
).
81
78
79
+ -define (unary_op3 (T1 , T2 , T3 ),
80
+ T1 == $~ , T2 == $~ , T3 == $~ ).
81
+
82
+ -define (dual_op (T ),
83
+ T == $+ orelse T == $- ).
84
+
82
85
tokenize (String , Line , Opts ) ->
83
86
File = case lists :keyfind (file , 1 , Opts ) of
84
87
{ file , V1 } -> V1 ;
@@ -227,6 +230,9 @@ tokenize([$.,T1,T2|Rest], Line, Scope, Tokens) when ?container2(T1, T2) ->
227
230
handle_call_identifier (Rest , Line , list_to_atom ([T1 , T2 ]), Scope , Tokens );
228
231
229
232
% ## Three Token Operators
233
+ tokenize ([$. ,T1 ,T2 ,T3 |Rest ], Line , Scope , Tokens ) when ? unary_op3 (T1 , T2 , T3 ) ->
234
+ handle_call_identifier (Rest , Line , list_to_atom ([T1 , T2 , T3 ]), Scope , Tokens );
235
+
230
236
tokenize ([$. ,T1 ,T2 ,T3 |Rest ], Line , Scope , Tokens ) when ? comp3 (T1 , T2 , T3 ); ? op3 (T1 , T2 , T3 ) ->
231
237
handle_call_identifier (Rest , Line , list_to_atom ([T1 , T2 , T3 ]), Scope , Tokens );
232
238
@@ -303,6 +309,9 @@ tokenize([$:,T1,T2|Rest], Line, Scope, Tokens) when ?container2(T1, T2) ->
303
309
tokenize (Rest , Line , Scope , [{ atom , Line , list_to_atom ([T1 ,T2 ]) }|Tokens ]);
304
310
305
311
% ## Three Token Operators
312
+ tokenize ([$: ,T1 ,T2 ,T3 |Rest ], Line , Scope , Tokens ) when ? unary_op3 (T1 , T2 , T3 ) ->
313
+ tokenize (Rest , Line , Scope , [{ atom , Line , list_to_atom ([T1 ,T2 ,T3 ]) }|Tokens ]);
314
+
306
315
tokenize ([$: ,T1 ,T2 ,T3 |Rest ], Line , Scope , Tokens ) when ? comp3 (T1 , T2 , T3 ); ? op3 (T1 , T2 , T3 ) ->
307
316
tokenize (Rest , Line , Scope , [{ atom , Line , list_to_atom ([T1 ,T2 ,T3 ]) }|Tokens ]);
308
317
@@ -349,6 +358,9 @@ tokenize([T1,T2,T3|Rest], Line, Scope, Tokens) when ?comp3(T1, T2, T3) ->
349
358
handle_comp_op (Rest , Line , list_to_atom ([T1 ,T2 ,T3 ]), Scope , Tokens );
350
359
351
360
% ## Three token operators
361
+ tokenize ([T1 ,T2 ,T3 |Rest ], Line , Scope , Tokens ) when ? unary_op3 (T1 , T2 , T3 ) ->
362
+ handle_unary_op (Rest , Line , unary_op , list_to_atom ([T1 ,T2 ,T3 ]), Scope , Tokens );
363
+
352
364
tokenize ([T1 ,T2 ,T3 |Rest ], Line , Scope , Tokens ) when ? op3 (T1 , T2 , T3 ) ->
353
365
handle_op (Rest , Line , list_to_atom ([T1 ,T2 ,T3 ]), Scope , Tokens );
354
366
@@ -847,7 +859,8 @@ check_keyword(Line, Identifier, Atom, Tokens) when
847
859
true -> { ok , [{ Atom , Line }|Tokens ] };
848
860
false -> { error , " do" }
849
861
end ;
850
- false -> nomatch
862
+ false -> nomatch ;
863
+ unary_op -> { ok , [{ unary_op , Line , Atom }|Tokens ] }
851
864
end ;
852
865
853
866
check_keyword (_ , _ , _ , _ ) -> nomatch .
@@ -862,12 +875,12 @@ keyword('end') -> true;
862
875
keyword ('true' ) -> true ;
863
876
keyword ('false' ) -> true ;
864
877
keyword ('nil' ) -> true ;
865
- keyword ('not' ) -> true ;
866
878
867
879
% Special handling for do
868
880
keyword ('do' ) -> do ;
869
881
870
- % Bin operator keywords
882
+ % Operators keywords
883
+ keyword ('not' ) -> unary_op ;
871
884
keyword ('and' ) -> op ;
872
885
keyword ('or' ) -> op ;
873
886
keyword ('xor' ) -> op ;
0 commit comments