1010 existing_atoms_only = false
1111}).
1212
13- -define (container2 (T1 , T2 ),
13+ -define (container (T1 , T2 ),
1414 T1 == ${ , T2 == $} ;
1515 T1 == $[ , T2 == $]
1616).
1717
18- -define (op3 (T1 , T2 , T3 ),
19- T1 == $^ , T2 == $^ , T3 == $^
20- ).
21-
2218-define (op2 (T1 , T2 ),
2319 T1 == $< , T2 == $> ;
2420 T1 == $+ , T2 == $+ ;
5046-define (unary_op3 (T1 , T2 , T3 ),
5147 T1 == $~ , T2 == $~ , T3 == $~ ).
5248
49+ -define (pin_op3 (T1 , T2 , T3 ),
50+ T1 == $^ , T2 == $^ , T3 == $^
51+ ).
52+
53+ -define (mult_op (T ),
54+ T == $* orelse T == $/ ).
55+
5356-define (dual_op (T ),
5457 T == $+ orelse T == $- ).
5558
8891 T1 == $< , T2 == $- ;
8992 T1 == $| , T2 == $> ).
9093
94+ -define (range_op (T1 , T2 ),
95+ T1 == $. , T2 == $. ).
96+
9197tokenize (String , Line , Opts ) ->
9298 File = case lists :keyfind (file , 1 , Opts ) of
9399 { file , V1 } -> V1 ;
@@ -230,29 +236,27 @@ tokenize([$.,T|Tail], Line, Scope, Tokens) when ?is_space(T) ->
230236tokenize (" .<<>>" ++ Rest , Line , Scope , Tokens ) ->
231237 handle_call_identifier (Rest , Line , '<<>>' , Scope , Tokens );
232238
233- tokenize ([$. ,T1 ,T2 |Rest ], Line , Scope , Tokens ) when ? container2 (T1 , T2 ) ->
239+ tokenize ([$. ,T1 ,T2 |Rest ], Line , Scope , Tokens ) when ? container (T1 , T2 ) ->
234240 handle_call_identifier (Rest , Line , list_to_atom ([T1 , T2 ]), Scope , Tokens );
235241
236242% ## Three Token Operators
237243tokenize ([$. ,T1 ,T2 ,T3 |Rest ], Line , Scope , Tokens ) when
238244 ? 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 ) ->
243246 handle_call_identifier (Rest , Line , list_to_atom ([T1 , T2 , T3 ]), Scope , Tokens );
244247
245248% ## Two Token Operators
246249tokenize ([$. ,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 ) ->
248252 handle_call_identifier (Rest , Line , list_to_atom ([T1 , T2 ]), Scope , Tokens );
249253
250254tokenize ([$. ,T1 ,T2 |Rest ], Line , Scope , Tokens ) when ? op2 (T1 , T2 ) ->
251255 handle_call_identifier (Rest , Line , list_to_atom ([T1 , T2 ]), Scope , Tokens );
252256
253257% ## Single Token Operators
254258tokenize ([$. ,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 ) ->
256260 handle_call_identifier (Rest , Line , list_to_atom ([T ]), Scope , Tokens );
257261
258262tokenize ([$. ,T |Rest ], Line , Scope , Tokens ) when ? op1 (T ); T == $& ->
@@ -316,29 +320,27 @@ tokenize(":..." ++ Rest, Line, Scope, Tokens) ->
316320tokenize (" :<<>>" ++ Rest , Line , Scope , Tokens ) ->
317321 tokenize (Rest , Line , Scope , [{ atom , Line , '<<>>' }|Tokens ]);
318322
319- tokenize ([$: ,T1 ,T2 |Rest ], Line , Scope , Tokens ) when ? container2 (T1 , T2 ) ->
323+ tokenize ([$: ,T1 ,T2 |Rest ], Line , Scope , Tokens ) when ? container (T1 , T2 ) ->
320324 tokenize (Rest , Line , Scope , [{ atom , Line , list_to_atom ([T1 ,T2 ]) }|Tokens ]);
321325
322326% ## Three Token Operators
323327tokenize ([$: ,T1 ,T2 ,T3 |Rest ], Line , Scope , Tokens ) when
324328 ? 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 ) ->
329330 tokenize (Rest , Line , Scope , [{ atom , Line , list_to_atom ([T1 ,T2 ,T3 ]) }|Tokens ]);
330331
331332% ## Two Token Operators
332333tokenize ([$: ,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 ) ->
334336 tokenize (Rest , Line , Scope , [{ atom , Line , list_to_atom ([T1 ,T2 ]) }|Tokens ]);
335337
336338tokenize ([$: ,T1 ,T2 |Rest ], Line , Scope , Tokens ) when ? op2 (T1 , T2 ) ->
337339 tokenize (Rest , Line , Scope , [{ atom , Line , list_to_atom ([T1 ,T2 ]) }|Tokens ]);
338340
339341% ## Single Token Operators
340342tokenize ([$: ,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 ) ->
342344 tokenize (Rest , Line , Scope , [{ atom , Line , list_to_atom ([T ]) }|Tokens ]);
343345
344346tokenize ([$: ,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) ->
386388tokenize ([T1 ,T2 ,T3 |Rest ], Line , Scope , Tokens ) when ? arrow_op3 (T1 , T2 , T3 ) ->
387389 handle_op (Rest , Line , arrow_op , list_to_atom ([T1 ,T2 ,T3 ]), Scope , Tokens );
388390
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 );
391393
392394% ## Containers + punctuation tokens
393395tokenize ([T ,T |Rest ], Line , Scope , Tokens ) when T == $< ; T == $> ->
@@ -400,6 +402,9 @@ tokenize([T|Rest], Line, Scope, Tokens) when T == $(;
400402 handle_terminator (Rest , Line , Scope , Token , Tokens );
401403
402404% ## 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+
403408tokenize ([T1 ,T2 |Rest ], Line , Scope , Tokens ) when ? arrow_op (T1 , T2 ) ->
404409 handle_op (Rest , Line , arrow_op , list_to_atom ([T1 , T2 ]), Scope , Tokens );
405410
@@ -428,6 +433,9 @@ tokenize([T|Rest], Line, Scope, Tokens) when ?comp_op(T) ->
428433tokenize ([T |Rest ], Line , Scope , Tokens ) when ? dual_op (T ) ->
429434 handle_unary_op (Rest , Line , dual_op , list_to_atom ([T ]), Scope , Tokens );
430435
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+
431439tokenize ([T |Rest ], Line , Scope , Tokens ) when ? op1 (T ) ->
432440 handle_op (Rest , Line , list_to_atom ([T ]), Scope , Tokens );
433441
@@ -886,7 +894,6 @@ check_keyword(Line, Identifier, Atom, Tokens) when
886894 true -> { ok , [{ Atom , Line }|Tokens ] };
887895 block -> { ok , [{ block_identifier , Line , Atom }|Tokens ] };
888896 unary_op -> { ok , [{ unary_op , Line , Atom }|Tokens ] };
889- op -> { ok , add_token_with_nl ({ Atom , Line }, Tokens ) };
890897 Kind -> { ok , add_token_with_nl ({ Kind , Line , Atom }, Tokens ) }
891898 end ;
892899
@@ -911,10 +918,10 @@ keyword('not') -> unary_op;
911918keyword ('and' ) -> and_op ;
912919keyword ('or' ) -> or_op ;
913920keyword ('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 ;
918925
919926% Block keywords
920927keyword ('after' ) -> block ;
0 commit comments