[fine] A concrete syntax tree parser

Where in the world am I going with this?
This commit is contained in:
John Doty 2024-01-03 16:12:17 -08:00
parent 5968fb1f6a
commit 4fe3137027
2 changed files with 507 additions and 11 deletions

View file

@ -17,6 +17,9 @@ pub enum TokenKind {
Slash,
Star,
Arrow,
Colon,
Bang,
BangEqual,
Equal,
@ -414,8 +417,15 @@ impl<'a> Tokens<'a> {
')' => self.token(pos, TokenKind::RightParen),
',' => self.token(pos, TokenKind::Comma),
'.' => self.token(pos, TokenKind::Dot),
'-' => self.token(pos, TokenKind::Minus),
'-' => {
if self.matches('>') {
self.token(pos, TokenKind::Arrow)
} else {
self.token(pos, TokenKind::Minus)
}
}
'+' => self.token(pos, TokenKind::Plus),
':' => self.token(pos, TokenKind::Colon),
';' => self.token(pos, TokenKind::Semicolon),
'/' => self.token(pos, TokenKind::Slash),
'*' => self.token(pos, TokenKind::Star),
@ -555,7 +565,7 @@ mod tests {
test_tokens!(
symbols,
"{ } ( ) [ ] . ! != < <= > >= = == , - + * / ;",
"{ } ( ) [ ] . ! != < <= > >= = == , - -> + * / ; :",
(0, LeftBrace, "{"),
(2, RightBrace, "}"),
(4, LeftParen, "("),
@ -573,9 +583,11 @@ mod tests {
(31, EqualEqual, "=="),
(34, Comma, ","),
(36, Minus, "-"),
(38, Plus, "+"),
(40, Star, "*"),
(42, Slash, "/"),
(44, Semicolon, ";")
(38, Arrow, "->"),
(41, Plus, "+"),
(43, Star, "*"),
(45, Slash, "/"),
(47, Semicolon, ";"),
(49, Colon, ":")
);
}