@@ -6,16 +6,19 @@ pub type Span = SimpleSpan<usize>;
6
6
pub type Output < ' a > = Vec < ( Token < ' a > , Span ) > ;
7
7
pub type Error < ' a > = extra:: Err < Rich < ' a , char , Span > > ;
8
8
9
- #[ derive( Clone , Debug , PartialEq , Eq ) ]
9
+ #[ derive( Clone , Debug , PartialEq ) ]
10
10
pub enum Token < ' src > {
11
11
Semicolon ,
12
12
LBracket ,
13
13
RBracket ,
14
14
LParen ,
15
15
RParen ,
16
16
Comma ,
17
+ DotDot ,
17
18
Bool ( bool ) ,
18
- Num ( & ' src str ) ,
19
+ Int ( i64 ) ,
20
+ UInt ( u64 ) ,
21
+ Float ( f64 ) ,
19
22
Ident ( & ' src str ) ,
20
23
Minus ,
21
24
Plus ,
@@ -49,8 +52,11 @@ impl<'src> fmt::Display for Token<'src> {
49
52
Token :: LParen => write ! ( f, "(" ) ,
50
53
Token :: RParen => write ! ( f, ")" ) ,
51
54
Token :: Comma => write ! ( f, "," ) ,
55
+ Token :: DotDot => write ! ( f, ".." ) ,
52
56
Token :: Bool ( val) => write ! ( f, "{}" , val) ,
53
- Token :: Num ( val) => write ! ( f, "{}" , val) ,
57
+ Token :: Int ( val) => write ! ( f, "{}" , val) ,
58
+ Token :: UInt ( val) => write ! ( f, "{}" , val) ,
59
+ Token :: Float ( val) => write ! ( f, "{}" , val) ,
54
60
Token :: Ident ( ident) => write ! ( f, "{}" , ident) ,
55
61
Token :: Minus => write ! ( f, "-" ) ,
56
62
Token :: Plus => write ! ( f, "+" ) ,
@@ -85,14 +91,22 @@ pub fn lexer<'src>() -> impl Parser<'src, &'src str, Output<'src>, Error<'src>>
85
91
86
92
let exp = just ( 'e' ) . or ( just ( 'E' ) ) . then ( one_of ( "+-" ) . or_not ( ) ) . then ( digits) ;
87
93
88
- let number = just ( '-' )
94
+ let floating_number = just ( '-' )
89
95
. or_not ( )
90
- . then ( text :: int ( 10 ) )
96
+ . then ( digits )
91
97
. then ( frac. or_not ( ) )
92
98
. then ( exp. or_not ( ) )
93
- . map_slice ( Token :: Num )
99
+ . map_slice ( | s : & str | Token :: Float ( s . parse ( ) . unwrap ( ) ) )
94
100
. boxed ( ) ;
95
101
102
+ let signed_int = one_of ( "+-" )
103
+ . or_not ( )
104
+ . then ( digits)
105
+ . map_slice ( |s : & str | Token :: Int ( s. parse ( ) . unwrap ( ) ) ) ;
106
+ let unsigned_int = digits. map_slice ( |s : & str | Token :: UInt ( s. parse ( ) . unwrap ( ) ) ) ;
107
+
108
+ let number = choice ( ( floating_number, signed_int, unsigned_int) ) ;
109
+
96
110
// A parser for control characters (delimiters, semicolons, etc.)
97
111
let ctrl = choice ( (
98
112
just ( ";" ) . to ( Token :: Semicolon ) ,
@@ -101,6 +115,7 @@ pub fn lexer<'src>() -> impl Parser<'src, &'src str, Output<'src>, Error<'src>>
101
115
just ( "(" ) . to ( Token :: LParen ) ,
102
116
just ( ")" ) . to ( Token :: RParen ) ,
103
117
just ( "," ) . to ( Token :: Comma ) ,
118
+ just ( ".." ) . to ( Token :: DotDot ) ,
104
119
) ) ;
105
120
106
121
// Lexer for operator symbols
0 commit comments