7070-define (at_op (T ),
7171 T == $@ ).
7272
73- -define (dual_op (T ),
74- T == $+ orelse T == $- ).
75-
7673-define (unary_op (T ),
7774 % T == $&;
7875 T == $! ;
7976 T == $^
8077).
8178
79+ -define (unary_op3 (T1 , T2 , T3 ),
80+ T1 == $~ , T2 == $~ , T3 == $~ ).
81+
82+ -define (dual_op (T ),
83+ T == $+ orelse T == $- ).
84+
8285tokenize (String , Line , Opts ) ->
8386 File = case lists :keyfind (file , 1 , Opts ) of
8487 { file , V1 } -> V1 ;
@@ -227,6 +230,9 @@ tokenize([$.,T1,T2|Rest], Line, Scope, Tokens) when ?container2(T1, T2) ->
227230 handle_call_identifier (Rest , Line , list_to_atom ([T1 , T2 ]), Scope , Tokens );
228231
229232% ## 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+
230236tokenize ([$. ,T1 ,T2 ,T3 |Rest ], Line , Scope , Tokens ) when ? comp3 (T1 , T2 , T3 ); ? op3 (T1 , T2 , T3 ) ->
231237 handle_call_identifier (Rest , Line , list_to_atom ([T1 , T2 , T3 ]), Scope , Tokens );
232238
@@ -303,6 +309,9 @@ tokenize([$:,T1,T2|Rest], Line, Scope, Tokens) when ?container2(T1, T2) ->
303309 tokenize (Rest , Line , Scope , [{ atom , Line , list_to_atom ([T1 ,T2 ]) }|Tokens ]);
304310
305311% ## 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+
306315tokenize ([$: ,T1 ,T2 ,T3 |Rest ], Line , Scope , Tokens ) when ? comp3 (T1 , T2 , T3 ); ? op3 (T1 , T2 , T3 ) ->
307316 tokenize (Rest , Line , Scope , [{ atom , Line , list_to_atom ([T1 ,T2 ,T3 ]) }|Tokens ]);
308317
@@ -349,6 +358,9 @@ tokenize([T1,T2,T3|Rest], Line, Scope, Tokens) when ?comp3(T1, T2, T3) ->
349358 handle_comp_op (Rest , Line , list_to_atom ([T1 ,T2 ,T3 ]), Scope , Tokens );
350359
351360% ## 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+
352364tokenize ([T1 ,T2 ,T3 |Rest ], Line , Scope , Tokens ) when ? op3 (T1 , T2 , T3 ) ->
353365 handle_op (Rest , Line , list_to_atom ([T1 ,T2 ,T3 ]), Scope , Tokens );
354366
@@ -847,7 +859,8 @@ check_keyword(Line, Identifier, Atom, Tokens) when
847859 true -> { ok , [{ Atom , Line }|Tokens ] };
848860 false -> { error , " do" }
849861 end ;
850- false -> nomatch
862+ false -> nomatch ;
863+ unary_op -> { ok , [{ unary_op , Line , Atom }|Tokens ] }
851864 end ;
852865
853866check_keyword (_ , _ , _ , _ ) -> nomatch .
@@ -862,12 +875,12 @@ keyword('end') -> true;
862875keyword ('true' ) -> true ;
863876keyword ('false' ) -> true ;
864877keyword ('nil' ) -> true ;
865- keyword ('not' ) -> true ;
866878
867879% Special handling for do
868880keyword ('do' ) -> do ;
869881
870- % Bin operator keywords
882+ % Operators keywords
883+ keyword ('not' ) -> unary_op ;
871884keyword ('and' ) -> op ;
872885keyword ('or' ) -> op ;
873886keyword ('xor' ) -> op ;
0 commit comments