feat(tazjin/rlox): Implement multi-character scanning
Change-Id: Ic5a246a7f5834477aeb97824fa30ba74a8422bc1 Reviewed-on: https://cl.tvl.fyi/c/depot/+/2161 Reviewed-by: tazjin <mail@tazj.in> Tested-by: BuildkiteCI
This commit is contained in:
parent
6363efbebf
commit
3f6b88bce2
1 changed files with 16 additions and 0 deletions
|
|
@ -90,6 +90,7 @@ impl<'a> Scanner<'a> {
|
||||||
|
|
||||||
fn scan_token(&mut self) {
|
fn scan_token(&mut self) {
|
||||||
match self.advance() {
|
match self.advance() {
|
||||||
|
// simple single-character tokens
|
||||||
'(' => self.add_token(TokenKind::LeftParen),
|
'(' => self.add_token(TokenKind::LeftParen),
|
||||||
')' => self.add_token(TokenKind::RightParen),
|
')' => self.add_token(TokenKind::RightParen),
|
||||||
'{' => self.add_token(TokenKind::LeftBrace),
|
'{' => self.add_token(TokenKind::LeftBrace),
|
||||||
|
|
@ -101,6 +102,12 @@ impl<'a> Scanner<'a> {
|
||||||
';' => self.add_token(TokenKind::Semicolon),
|
';' => self.add_token(TokenKind::Semicolon),
|
||||||
'*' => self.add_token(TokenKind::Star),
|
'*' => self.add_token(TokenKind::Star),
|
||||||
|
|
||||||
|
// possible multi-character tokens
|
||||||
|
'!' => self.add_if_next('=', TokenKind::BangEqual, TokenKind::Bang),
|
||||||
|
'=' => self.add_if_next('=', TokenKind::EqualEqual, TokenKind::Equal),
|
||||||
|
'<' => self.add_if_next('=', TokenKind::LessEqual, TokenKind::Less),
|
||||||
|
'>' => self.add_if_next('=', TokenKind::GreaterEqual, TokenKind::Greater),
|
||||||
|
|
||||||
unexpected => self.errors.push(Error {
|
unexpected => self.errors.push(Error {
|
||||||
line: self.line,
|
line: self.line,
|
||||||
kind: ErrorKind::UnexpectedChar(unexpected),
|
kind: ErrorKind::UnexpectedChar(unexpected),
|
||||||
|
|
@ -108,6 +115,15 @@ impl<'a> Scanner<'a> {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn add_if_next(&mut self, expected:char, then: TokenKind, or: TokenKind) {
|
||||||
|
if self.is_at_end() || self.source[self.current] != expected {
|
||||||
|
self.add_token(or);
|
||||||
|
} else {
|
||||||
|
self.current += 1;
|
||||||
|
self.add_token(then);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn scan_tokens(mut self) -> Vec<Token<'a>> {
|
fn scan_tokens(mut self) -> Vec<Token<'a>> {
|
||||||
while !self.is_at_end() {
|
while !self.is_at_end() {
|
||||||
self.start = self.current;
|
self.start = self.current;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue