@@ -6,6 +6,36 @@ use crate::error::{ParseError, ParseErrorKind, Result};
66use crate :: strings:: Strings ;
77use crate :: token:: { Kind , Operator , Token , Value } ;
88
9+ // TODO:
10+ // const EOF: char = '\0';
11+ // * change the lexer to use this one instead.
12+ // * split the spans and tokens
13+ // * spans can point to tokens, know their lines and cols
14+ // struct Cursor<'src> {
15+ // chars: Peekable<Chars<'src>>,
16+ // }
17+
18+ // impl<'src> Cursor<'src> {
19+ // fn new(chars: Peekable<Chars<'src>>) -> Self {
20+ // Self { chars }
21+ // }
22+
23+ // fn next(&mut self) -> char {
24+ // self.chars.next().unwrap_or(EOF)
25+ // }
26+
27+ // fn first(&self) -> char {
28+ // let mut iter = self.chars.clone();
29+ // iter.next().unwrap_or(EOF)
30+ // }
31+
32+ // fn second(&self) -> char {
33+ // let mut iter = self.chars.clone();
34+ // iter.next();
35+ // iter.next().unwrap_or(EOF)
36+ // }
37+ // }
38+
939impl < ' src , ' consts > Iterator for Lexer < ' src , ' consts > {
1040 type Item = Result < Token > ;
1141
@@ -58,6 +88,10 @@ impl<'src, 'strings> Lexer<'src, 'strings> {
5888 let _ = self . chars . next ( ) ;
5989 Ok ( Kind :: Op ( Operator :: And ) . to_token ( index) )
6090 }
91+ ( '.' , Some ( '.' ) ) => {
92+ let _ = self . chars . next ( ) ;
93+ Ok ( Kind :: Op ( Operator :: DotDot ) . to_token ( index) )
94+ }
6195 ( '|' , Some ( '|' ) ) => {
6296 let _ = self . chars . next ( ) ;
6397 Ok ( Kind :: Op ( Operator :: Or ) . to_token ( index) )
@@ -179,14 +213,27 @@ impl<'src, 'strings> Lexer<'src, 'strings> {
179213 let mut end = index;
180214 let mut parse_float = & self . src [ index..=index] == "." ;
181215
182- let _signed = & self . src [ index..=index] == "-" || self . chars . peek ( ) . map ( |( _, c) | * c == '-' ) . unwrap_or ( false ) ;
216+ loop {
217+ if let Some ( ( e, '0' ..='9' ) ) = self . chars . peek ( ) {
218+ end = * e;
219+ self . chars . next ( ) ;
220+ continue ;
221+ }
183222
184- while let Some ( ( e, c @ ( '0' ..='9' | '.' ) ) ) = self . chars . peek ( ) {
185- if * c == '.' {
186- parse_float = true ;
223+ if let Some ( ( _, '.' ) ) = self . chars . peek ( ) {
224+ let mut chars = self . chars . clone ( ) ;
225+ _ = chars. next ( ) ;
226+ // If the next character is a dot, then the following character has to be a number
227+ // or this is not a valid float.
228+ if let Some ( ( e, '0' ..='9' ) ) = chars. peek ( ) {
229+ parse_float = true ;
230+ end = * e;
231+ self . chars . next ( ) ;
232+ continue ;
233+ }
187234 }
188- end = * e ;
189- self . chars . next ( ) ;
235+
236+ break ;
190237 }
191238
192239 let input = & self . src [ index..=end] ;
@@ -527,4 +574,10 @@ mod test {
527574 let decl = token_kind ( "?" ) ;
528575 assert_eq ! ( decl, Kind :: Op ( Operator :: Either ) ) ;
529576 }
577+
578+ #[ test]
579+ fn double_dot ( ) {
580+ let decl = token_kind ( ".." ) ;
581+ assert_eq ! ( decl, Kind :: Op ( Operator :: DotDot ) ) ;
582+ }
530583}
0 commit comments