Add punctuation support

next
Sayan Nandan 2 years ago
parent 979c427d3a
commit bc3694dd0c
No known key found for this signature in database
GPG Key ID: 8BC07A0A4D41DD52

File diff suppressed because it is too large Load Diff

@ -257,3 +257,41 @@ impl LexItem for LitStringEscaped {
}
}
}
macro_rules! impl_punctuation {
($($ty:ident: $byte:literal),*) => {
$(
pub struct $ty;
impl $ty {
const fn get_byte() -> u8 { $byte }
}
impl LexItem for $ty {
fn lex(scanner: &mut Scanner) -> LangResult<Self> {
if scanner.not_exhausted() && unsafe {
// UNSAFE(@ohsayan): The first operand ensures correctness
scanner.deref_cursor() == $byte
} {
unsafe {
// UNSAFE(@ohsayan): The above condition guarantees safety
scanner.incr_cursor()
};
Ok(Self)
} else {
Err(LangError::InvalidSyntax)
}
}
}
)*
};
}
impl_punctuation! {
OpenParen: b'(',
CloseParen: b')',
OpenAngular: b'<',
CloseAngular: b'>',
Colon: b':',
Semicolon: b';',
SingleQuote: b'\'',
DoubleQuote: b'"'
}

@ -25,7 +25,10 @@
*/
use super::{
lex::{Ident, LitNum, LitString, LitStringEscaped},
lex::{
CloseAngular, CloseParen, Colon, DoubleQuote, Ident, LitNum, LitString, LitStringEscaped,
OpenAngular, OpenParen, Semicolon, SingleQuote,
},
Scanner,
};
@ -103,3 +106,18 @@ fn lex_lit_string_escaped() {
let litstr = Scanner::new(&src).next::<LitStringEscaped>().unwrap().0;
assert_eq!(litstr, "hello\\world");
}
#[test]
fn lex_punctutation() {
let src = br#"()<>:;'""#.to_vec();
let mut scanner = Scanner::new(&src);
scanner.next::<OpenParen>().unwrap();
scanner.next::<CloseParen>().unwrap();
scanner.next::<OpenAngular>().unwrap();
scanner.next::<CloseAngular>().unwrap();
scanner.next::<Colon>().unwrap();
scanner.next::<Semicolon>().unwrap();
scanner.next::<SingleQuote>().unwrap();
scanner.next::<DoubleQuote>().unwrap();
assert!(scanner.exhausted());
}

Loading…
Cancel
Save