From b2ca3d3bbb8796adcd897f8343d9530821ef391e Mon Sep 17 00:00:00 2001 From: Louis Capitanchik <contact@louiscap.co> Date: Sun, 4 Jun 2023 20:27:31 +0100 Subject: [PATCH] Add missing boolean ops to scanner --- forge-script-lang/src/pratt/parser.rs | 31 +++++++++++++++++++---- forge-script-lang/src/pratt/test_cases.rs | 2 ++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/forge-script-lang/src/pratt/parser.rs b/forge-script-lang/src/pratt/parser.rs index 0ccdc48..93f49fe 100644 --- a/forge-script-lang/src/pratt/parser.rs +++ b/forge-script-lang/src/pratt/parser.rs @@ -173,9 +173,7 @@ impl<'a> Scanner<'a> { }); } - let next_char = self.source.chars().nth(self.position.offset); - self.position.advance(1); - self.scan_state.advance(1); + let next_char = self.next(); match next_char { Some('=') => { @@ -205,6 +203,30 @@ impl<'a> Scanner<'a> { Some(';') => Ok(self.tokenise(ScriptTokenType::Semicolon)), Some('/') => Ok(self.tokenise(ScriptTokenType::Slash)), Some('*') => Ok(self.tokenise(ScriptTokenType::Asterisk)), + Some('&') => { + if next_match!(self, '&') { + Ok(self.tokenise(ScriptTokenType::DoubleAmpersand)) + } else { + Err(ScannerError { + kind: ScannerErrorKind::UnexpectedToken { + span: gen_token_span(self), + }, + position: self.position, + }) + } + } + Some('|') => { + if next_match!(self, '|') { + Ok(self.tokenise(ScriptTokenType::DoublePipe)) + } else { + Err(ScannerError { + kind: ScannerErrorKind::UnexpectedToken { + span: gen_token_span(self), + }, + position: self.position, + }) + } + } Some('<') => { if next_match!(self, '=') { Ok(self.tokenise(ScriptTokenType::LessEqual)) @@ -471,8 +493,7 @@ impl<'a> Scanner<'a> { fn next(&mut self) -> Option<char> { let ch = self.source.chars().nth(self.position.offset); - self.position.advance(1); - self.scan_state.advance(1); + self.increment_cursor(); ch } diff --git a/forge-script-lang/src/pratt/test_cases.rs b/forge-script-lang/src/pratt/test_cases.rs index dd15338..7959a01 100644 --- a/forge-script-lang/src/pratt/test_cases.rs +++ b/forge-script-lang/src/pratt/test_cases.rs @@ -22,6 +22,8 @@ use test_case::test_case; #[test_case("==", Ok(ScriptTokenType::EqualEqual) ; "Expects ScriptTokenType::EqualEqual")] #[test_case(">", Ok(ScriptTokenType::Greater) ; "Expects ScriptTokenType::Greater")] #[test_case(">=", Ok(ScriptTokenType::GreaterEqual) ; "Expects ScriptTokenType::GreaterEqual")] +#[test_case("&&", Ok(ScriptTokenType::DoubleAmpersand) ; "Expects ScriptTokenType::DoubleAmpersand")] +#[test_case("||", Ok(ScriptTokenType::DoublePipe) ; "Expects ScriptTokenType::DoublePipe")] #[test_case("<", Ok(ScriptTokenType::Less) ; "Expects ScriptTokenType::Less")] #[test_case("<=", Ok(ScriptTokenType::LessEqual) ; "Expects ScriptTokenType::LessEqual")] #[test_case("\"Foo\"", Ok(ScriptTokenType::String(String::from("Foo"))) ; "Expects ScriptTokenType::String")] -- GitLab