Add comments to lexer
This commit is contained in:
parent
71807c0777
commit
d9889ef2d8
@ -10,6 +10,7 @@ use crate::error::Error;
|
|||||||
#[derive(Copy, Clone, Debug, PartialEq)]
|
#[derive(Copy, Clone, Debug, PartialEq)]
|
||||||
pub enum Token<'src> {
|
pub enum Token<'src> {
|
||||||
Boolean(bool),
|
Boolean(bool),
|
||||||
|
Comment(&'src str),
|
||||||
Integer(i64),
|
Integer(i64),
|
||||||
Float(f64),
|
Float(f64),
|
||||||
String(&'src str),
|
String(&'src str),
|
||||||
@ -23,6 +24,7 @@ impl<'src> Display for Token<'src> {
|
|||||||
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
|
||||||
match self {
|
match self {
|
||||||
Token::Boolean(boolean) => write!(f, "{boolean}"),
|
Token::Boolean(boolean) => write!(f, "{boolean}"),
|
||||||
|
Token::Comment(comment) => write!(f, "# {comment}"),
|
||||||
Token::Integer(integer) => write!(f, "{integer}"),
|
Token::Integer(integer) => write!(f, "{integer}"),
|
||||||
Token::Float(float) => write!(f, "{float}"),
|
Token::Float(float) => write!(f, "{float}"),
|
||||||
Token::String(string) => write!(f, "{string}"),
|
Token::String(string) => write!(f, "{string}"),
|
||||||
@ -190,6 +192,24 @@ pub fn lexer<'src>() -> impl Parser<
|
|||||||
Vec<(Token<'src>, SimpleSpan<usize>)>,
|
Vec<(Token<'src>, SimpleSpan<usize>)>,
|
||||||
extra::Err<Rich<'src, char, SimpleSpan<usize>>>,
|
extra::Err<Rich<'src, char, SimpleSpan<usize>>>,
|
||||||
> {
|
> {
|
||||||
|
let line_comment = just("//")
|
||||||
|
.ignore_then(
|
||||||
|
none_of('\n')
|
||||||
|
.repeated()
|
||||||
|
.to_slice()
|
||||||
|
.map(|text: &str| Token::Comment(text.trim())),
|
||||||
|
)
|
||||||
|
.then_ignore(just('\n').or_not());
|
||||||
|
|
||||||
|
let multi_line_comment = just("/*")
|
||||||
|
.ignore_then(
|
||||||
|
none_of('*')
|
||||||
|
.repeated()
|
||||||
|
.to_slice()
|
||||||
|
.map(|text: &str| Token::Comment(text.trim())),
|
||||||
|
)
|
||||||
|
.then_ignore(just("*/"));
|
||||||
|
|
||||||
let boolean = choice((
|
let boolean = choice((
|
||||||
just("true").to(Token::Boolean(true)),
|
just("true").to(Token::Boolean(true)),
|
||||||
just("false").to(Token::Boolean(false)),
|
just("false").to(Token::Boolean(false)),
|
||||||
@ -308,7 +328,16 @@ pub fn lexer<'src>() -> impl Parser<
|
|||||||
.map(Token::Keyword);
|
.map(Token::Keyword);
|
||||||
|
|
||||||
choice((
|
choice((
|
||||||
boolean, float, integer, string, keyword, identifier, control, operator,
|
line_comment,
|
||||||
|
multi_line_comment,
|
||||||
|
boolean,
|
||||||
|
float,
|
||||||
|
integer,
|
||||||
|
string,
|
||||||
|
keyword,
|
||||||
|
identifier,
|
||||||
|
control,
|
||||||
|
operator,
|
||||||
))
|
))
|
||||||
.map_with(|token, state| (token, state.span()))
|
.map_with(|token, state| (token, state.span()))
|
||||||
.padded()
|
.padded()
|
||||||
@ -320,6 +349,66 @@ pub fn lexer<'src>() -> impl Parser<
|
|||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn line_comment() {
|
||||||
|
assert_eq!(
|
||||||
|
lex("// 42").unwrap(),
|
||||||
|
vec![(Token::Comment("42"), (0..5).into())]
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
lex("1// 42//2").unwrap(),
|
||||||
|
vec![
|
||||||
|
(Token::Integer(1), (0..1).into()),
|
||||||
|
(Token::Comment("42//2"), (1..9).into()),
|
||||||
|
]
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
lex("
|
||||||
|
1
|
||||||
|
// 42
|
||||||
|
2
|
||||||
|
")
|
||||||
|
.unwrap(),
|
||||||
|
vec![
|
||||||
|
(Token::Integer(1), (17..18).into()),
|
||||||
|
(Token::Comment("42"), (35..41).into()),
|
||||||
|
(Token::Integer(2), (57..58).into()),
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn multi_line_comment() {
|
||||||
|
assert_eq!(
|
||||||
|
lex("/* 42 */").unwrap(),
|
||||||
|
vec![(Token::Comment("42"), (0..8).into())]
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
lex("1/* 42//2 */").unwrap(),
|
||||||
|
vec![
|
||||||
|
(Token::Integer(1), (0..1).into()),
|
||||||
|
(Token::Comment("42//2"), (1..12).into()),
|
||||||
|
]
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
lex("
|
||||||
|
1
|
||||||
|
/*
|
||||||
|
42
|
||||||
|
*/
|
||||||
|
2
|
||||||
|
")
|
||||||
|
.unwrap(),
|
||||||
|
vec![
|
||||||
|
(Token::Integer(1), (17..18).into()),
|
||||||
|
(Token::Comment("42"), (35..79).into()),
|
||||||
|
(Token::Integer(2), (96..97).into()),
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn range() {
|
fn range() {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
|
Loading…
Reference in New Issue
Block a user