11use std:: iter:: { FromIterator , Peekable } ;
22use std:: str:: Chars ;
33
4+ use crate :: lexical_analysis:: model:: lexical_error:: LexicalError ;
45use crate :: lexical_analysis:: model:: token:: Token ;
56use crate :: lexical_analysis:: utilities:: * ;
67
@@ -15,19 +16,19 @@ pub(crate) struct LexicalAnalysis<'a> {
1516}
1617
1718impl < ' a > LexicalAnalysis < ' a > {
18- pub ( crate ) fn from ( code : & str ) -> Vec < Token > {
19+ pub ( crate ) fn from ( code : & str ) -> Result < Vec < Token > , LexicalError > {
1920 let mut lexical_analysis = LexicalAnalysis {
2021 source_code : code. chars ( ) . peekable ( ) ,
2122 } ;
2223
2324 lexical_analysis. get_tokens ( )
2425 }
2526
26- fn get_tokens ( & mut self ) -> Vec < Token > {
27+ fn get_tokens ( & mut self ) -> Result < Vec < Token > , LexicalError > {
2728 let mut tokens = Vec :: new ( ) ;
2829
2930 loop {
30- let token = self . get_next_token ( ) ;
31+ let token = self . get_next_token ( ) ? ;
3132 let end_of_file = token == Token :: EndOfFile ;
3233 tokens. push ( token) ;
3334
@@ -36,54 +37,52 @@ impl<'a> LexicalAnalysis<'a> {
3637 }
3738 }
3839
39- tokens
40+ Ok ( tokens)
4041 }
4142
42- fn get_next_token ( & mut self ) -> Token {
43+ fn get_next_token ( & mut self ) -> Result < Token , LexicalError > {
4344 match self . get_next_character ( ) {
4445 Some ( character) => {
4546 debug ! ( "Matching the character '{}'." , character) ;
4647 match character {
4748 '!' => {
48- check_next_character ! ( self . source_code, '=' , Token :: NotEquals ) ;
49- Token :: Not
49+ check_next_character ! ( self . source_code, '=' , Ok ( Token :: NotEquals ) ) ;
50+ Ok ( Token :: Not )
5051 }
51- '-' => Token :: Minus ,
52- '/' => Token :: Divide ,
53- '*' => Token :: Multiply ,
54- '>' => Token :: GreaterThan ,
55- '<' => Token :: LesserThan ,
52+ '-' => Ok ( Token :: Minus ) ,
53+ '/' => Ok ( Token :: Divide ) ,
54+ '*' => Ok ( Token :: Multiply ) ,
55+ '>' => Ok ( Token :: GreaterThan ) ,
56+ '<' => Ok ( Token :: LesserThan ) ,
5657 '=' => {
57- check_next_character ! ( self . source_code, '=' , Token :: Equals ) ;
58- Token :: Assign
58+ check_next_character ! ( self . source_code, '=' , Ok ( Token :: Equals ) ) ;
59+ Ok ( Token :: Assign )
5960 }
60- '+' => Token :: Plus ,
61- '(' => Token :: OpeningRoundBracket ,
62- ')' => Token :: ClosingRoundBracket ,
63- '{' => Token :: OpeningCurlyBracket ,
64- '}' => Token :: ClosingCurlyBracket ,
65- ',' => Token :: Comma ,
66- ';' => Token :: SemiColon ,
61+ '+' => Ok ( Token :: Plus ) ,
62+ '(' => Ok ( Token :: OpeningRoundBracket ) ,
63+ ')' => Ok ( Token :: ClosingRoundBracket ) ,
64+ '{' => Ok ( Token :: OpeningCurlyBracket ) ,
65+ '}' => Ok ( Token :: ClosingCurlyBracket ) ,
66+ ',' => Ok ( Token :: Comma ) ,
67+ ';' => Ok ( Token :: SemiColon ) ,
6768 _ => {
6869 if is_valid_identifier_character ( character) {
6970 debug ! ( "Parsing word from characters." ) ;
70- return get_keyword_token ( & self . get_word ( character) ) ;
71+ return Ok ( get_keyword_token ( & self . get_word ( character) ) ) ;
7172 }
7273
7374 if is_digit ( character) {
7475 debug ! ( "Parsing integer from characters." ) ;
75- return Token :: Integer {
76+ return Ok ( Token :: Integer {
7677 literal : self . get_integer ( character) ,
77- } ;
78+ } ) ;
7879 }
7980
80- Token :: Illegal {
81- literal : character. to_string ( ) ,
82- }
81+ Err ( LexicalError :: IllegalCharacter ( character) )
8382 }
8483 }
8584 }
86- None => Token :: EndOfFile ,
85+ None => Ok ( Token :: EndOfFile ) ,
8786 }
8887 }
8988
0 commit comments