@@ -25,7 +25,6 @@ impl ToString for Token {
2525}
2626
2727pub enum CommandToken {
28- Command ( char ) ,
2928 CommandOrAlias ( String ) ,
3029 ListOpenBracket ,
3130 ListCloseBracket ,
@@ -36,7 +35,6 @@ pub enum CommandToken {
3635impl ToString for CommandToken {
3736 fn to_string ( & self ) -> String {
3837 match self {
39- Self :: Command ( char) => String :: from ( * char) ,
4038 Self :: CommandOrAlias ( alias) => alias. clone ( ) ,
4139 Self :: ListOpenBracket => String :: from ( "[" ) ,
4240 Self :: ListCloseBracket => String :: from ( "]" ) ,
@@ -63,20 +61,26 @@ pub fn split_string_to_tokens(string: &str) -> Vec<Token> {
6361pub fn split_to_tokens < ' a > ( mut symbols : Peekable < impl Iterator < Item = char > + Clone > ) -> Vec < Token > {
6462 let mut result: Vec < Token > = Vec :: new ( ) ;
6563
64+ let p = parse_special_symbol;
65+
6666 while let Some ( _) = symbols. peek ( ) {
6767 result. push (
68- parse_number ( & mut symbols)
69- . or_else ( || parse_special_symbol ( & mut symbols, '[' , Token :: CommandToken ( CommandToken :: ListOpenBracket ) ) )
70- . or_else ( || parse_special_symbol ( & mut symbols, ']' , Token :: CommandToken ( CommandToken :: ListCloseBracket ) ) )
71- . or_else ( || parse_special_symbol ( & mut symbols, '(' , Token :: FunctionOpenBracket ) )
72- . or_else ( || parse_special_symbol ( & mut symbols, ')' , Token :: FunctionCloseBracket ) )
73- . or_else ( || parse_special_symbol ( & mut symbols, '#' , Token :: CommandToken ( CommandToken :: Function ) ) )
68+ // if one of special symbols
69+ p ( & mut symbols, '[' , Token :: CommandToken ( CommandToken :: ListOpenBracket ) )
70+ . or_else ( || p ( & mut symbols, ']' , Token :: CommandToken ( CommandToken :: ListCloseBracket ) ) )
71+ . or_else ( || p ( & mut symbols, '(' , Token :: FunctionOpenBracket ) )
72+ . or_else ( || p ( & mut symbols, ')' , Token :: FunctionCloseBracket ) )
73+ // TODO: Change # to CommandContainer symbol
74+ . or_else ( || p ( & mut symbols, '#' , Token :: CommandToken ( CommandToken :: Function ) ) )
75+
76+ // Or whitespace
7477 . or_else ( || {
7578 if symbols. peek ( ) ?. is_whitespace ( ) { return Some ( Token :: WhiteSpace ( symbols. next ( ) ?) ) }
7679 None
7780 } )
78- . or_else ( || parse_alias ( & mut symbols) )
79- . unwrap_or_else ( || Token :: CommandToken ( CommandToken :: Command ( symbols. next ( ) . expect ( "Unexcpected exception: peek is lier!" ) ) ) )
81+ // Or one of "complex" tokens
82+ . or_else ( || parse_number ( & mut symbols) )
83+ . unwrap_or_else ( || parse_command_or_alias ( & mut symbols) . expect ( "Internal exception!" ) )
8084 ) ;
8185 } ;
8286
@@ -88,11 +92,12 @@ fn parse_special_symbol(iter: &mut Peekable<impl Iterator<Item = char> + Clone>,
8892 return None
8993}
9094
91- fn parse_alias < ' a > ( iter : & mut Peekable < impl Iterator < Item = char > + Clone > ) -> Option < Token > {
92- if !iter. peek ( ) ?. is_alphabetic ( ) { return None }
95+ fn parse_command_or_alias < ' a > ( iter : & mut Peekable < impl Iterator < Item = char > + Clone > ) -> Option < Token > {
96+ let p = * iter. peek ( ) ?;
97+ if p. is_numeric ( ) || p. is_whitespace ( ) || p == '.' { return None }
9398 let mut result = String :: new ( ) ;
9499 while let Some ( symbol) = iter. peek ( ) {
95- if ! symbol. is_alphanumeric ( ) { break ; }
100+ if symbol. is_whitespace ( ) { break ; }
96101 result. push ( * symbol) ;
97102 iter. next ( ) ;
98103 } ;
0 commit comments