@@ -6,28 +6,33 @@ use crate::{
6
6
} ;
7
7
8
8
const DIGITS : & str = ".0123456789" ;
9
+ const LETTERS : & str = "abcdefghijklmnopqrstuvwxyz" ;
9
10
10
- pub struct Lexer {
11
- source : String ,
11
+ pub struct Lexer < I : Iterator < Item = char > + Clone > {
12
+ // source: String,
13
+ iter : Peekable < I > ,
12
14
}
13
15
14
- impl Lexer {
15
- pub fn new ( source : String ) -> Self {
16
- Self { source }
16
+ impl < I : Iterator < Item = char > + Clone > Lexer < I > {
17
+ pub fn new ( source : I ) -> Self {
18
+ Self {
19
+ // source,
20
+ iter : source. peekable ( ) ,
21
+ }
17
22
}
18
23
19
- pub fn tokenize ( & self ) -> Result < Vec < Token > , ErrorReason > {
24
+ pub fn tokenize ( & mut self ) -> Result < Vec < Token > , ErrorReason > {
20
25
let mut tokens: Vec < Token > = Vec :: new ( ) ;
21
- let mut chars = self
22
- . source
23
- . chars ( )
24
- . filter ( |c| !c . is_whitespace ( ) )
25
- . peekable ( ) ;
26
-
27
- while let Some ( & current ) = chars . peek ( ) {
28
- // Best solution i could find to making sure it doesn't skip
26
+
27
+ // Best solution i could find to making sure it doesn't skip
28
+ while let Some ( & current ) = self . iter . peek ( ) {
29
+ if current . is_ascii_whitespace ( ) {
30
+ self . iter . next ( ) ;
31
+ continue ;
32
+ }
33
+
29
34
if DIGITS . contains ( current) {
30
- tokens. push ( self . generate_number ( & mut chars ) ?) ;
35
+ tokens. push ( self . generate_number ( ) ?) ;
31
36
} else {
32
37
let token = match current {
33
38
'+' => Token :: new ( TokenKind :: Plus , None ) ,
@@ -37,44 +42,67 @@ impl Lexer {
37
42
'^' => Token :: new ( TokenKind :: Power , None ) ,
38
43
'(' => Token :: new ( TokenKind :: LParen , None ) ,
39
44
')' => Token :: new ( TokenKind :: RParen , None ) ,
45
+ // 'a'..='z' => {}
40
46
_ => Token :: new (
41
47
TokenKind :: Unknown ,
42
48
Some ( TokenValue :: StrValue ( current. to_string ( ) ) ) ,
43
49
) ,
44
50
} ;
45
51
tokens. push ( token) ;
46
- chars . next ( ) ;
52
+ self . iter . next ( ) ;
47
53
}
48
54
}
49
55
50
56
Ok ( tokens)
51
57
}
52
58
53
- fn generate_number < I > ( & self , chars : & mut Peekable < I > ) -> Result < Token , ErrorReason >
59
+ fn read_function ( & mut self ) -> Token {
60
+ // TODO: read the parameters of function
61
+ // bruh i cant figure this out rn i do later
62
+ let mut name = String :: new ( ) ;
63
+
64
+ while let Some ( & current) = self . iter . peek ( ) {
65
+ if LETTERS . contains ( current) {
66
+ name. push ( current) ;
67
+ }
68
+
69
+ if current == '(' {
70
+ self . iter . next ( ) ; // Consume '('
71
+
72
+ }
73
+ self . iter . next ( ) ;
74
+ }
75
+ Token :: new ( TokenKind :: Function , Some ( TokenValue :: FuncParams ( name, 0 ) ) ) // change params later
76
+ }
77
+
78
+ fn generate_number ( & mut self ) -> Result < Token , ErrorReason >
54
79
where
55
80
I : Iterator < Item = char > ,
56
81
{
57
82
let mut decimal_point_counter = 0 ;
58
83
let mut number = String :: new ( ) ;
59
84
60
- while let Some ( & current) = chars . peek ( ) {
85
+ while let Some ( & current) = self . iter . peek ( ) {
61
86
if current == '.' {
62
87
decimal_point_counter += 1 ;
63
88
if decimal_point_counter > 1 {
64
89
return Err ( ErrorReason :: Error ( "Too many decimal points" . into ( ) ) ) ;
65
90
}
66
91
}
67
92
number. push ( current) ;
68
- chars . next ( ) ;
93
+ self . iter . next ( ) ;
69
94
70
95
// Peek the next character and check if it's valid for a number
71
- if let Some ( & next_char) = chars . peek ( ) {
96
+ if let Some ( & next_char) = self . iter . peek ( ) {
72
97
if !DIGITS . contains ( next_char) {
73
98
if number. trim ( ) == "." {
74
- return Err ( ErrorReason :: Error ( "Random decimal place found " . into ( ) ) ) ;
99
+ return Err ( ErrorReason :: Error ( "Invalid sequence " . into ( ) ) ) ;
75
100
}
76
101
break ;
77
102
}
103
+ } else {
104
+ // this is PROBABLY the error but i cbf actually finding the bugs
105
+ return Err ( ErrorReason :: Error ( "Invalid sequence" . into ( ) ) ) ;
78
106
}
79
107
}
80
108
0 commit comments