Add use token

This commit is contained in:
Jeff 2024-06-28 15:59:20 -04:00
parent adfd3aa5d4
commit 1e7636903e

View File

@ -17,6 +17,7 @@ pub enum Token<'src> {
Identifier(&'src str), Identifier(&'src str),
Symbol(Symbol), Symbol(Symbol),
Keyword(Keyword), Keyword(Keyword),
Use(&'src str),
} }
impl<'src> Display for Token<'src> { impl<'src> Display for Token<'src> {
@ -30,6 +31,7 @@ impl<'src> Display for Token<'src> {
Token::Identifier(string) => write!(f, "{string}"), Token::Identifier(string) => write!(f, "{string}"),
Token::Symbol(control) => write!(f, "{control}"), Token::Symbol(control) => write!(f, "{control}"),
Token::Keyword(keyword) => write!(f, "{keyword}"), Token::Keyword(keyword) => write!(f, "{keyword}"),
Token::Use(path) => write!(f, "use {path}"),
} }
} }
} }
@ -316,6 +318,13 @@ pub fn lexer<'src>() -> impl Parser<
let identifier = text::ident().map(|text: &str| Token::Identifier(text)); let identifier = text::ident().map(|text: &str| Token::Identifier(text));
let r#use = just("use ").ignore_then(
none_of('\n')
.repeated()
.to_slice()
.map(|text: &str| Token::Use(text)),
);
choice(( choice((
line_comment, line_comment,
multi_line_comment, multi_line_comment,
@ -325,6 +334,7 @@ pub fn lexer<'src>() -> impl Parser<
string, string,
keyword, keyword,
symbol, symbol,
r#use,
identifier, identifier,
)) ))
.map_with(|token: Token, state| (token, state.span())) .map_with(|token: Token, state| (token, state.span()))
@ -337,6 +347,19 @@ pub fn lexer<'src>() -> impl Parser<
mod tests { mod tests {
use super::*; use super::*;
#[test]
fn r#use() {
assert_eq!(
lex("use std/io.ds").unwrap(),
vec![(Token::Use("std/io.ds"), (0..13).into())]
);
assert_eq!(
lex("use https://example.com/std.ds").unwrap(),
vec![(Token::Use("https://example.com/std.ds"), (0..30).into())]
);
}
#[test] #[test]
fn line_comment() { fn line_comment() {
assert_eq!( assert_eq!(