Skip to content

Commit

Permalink
Impl Display for Expr, fix tests
Browse files Browse the repository at this point in the history
  • Loading branch information
lgyanf committed Sep 23, 2023
1 parent 3e0b146 commit 4bc2dab
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 12 deletions.
21 changes: 21 additions & 0 deletions src/ast/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,21 @@ pub enum ExprType {
Variable { name: String },
}

impl Display for ExprType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ExprType::StringLiteral(s) => write!(f, "\"{}\"", s),
ExprType::NumberLiteral(n) => write!(f, "{}", n),
ExprType::BooleanLiteral(b) => write!(f, "{}", b),
ExprType::Nil => write!(f, "Nil"),
ExprType::Unary(op, right) => write!(f, "{}{}", op, right),
ExprType::Binary(left, op, right) => write!(f, "{}{}{}", left, op, right),
ExprType::Grouping(expr) => write!(f, "({})", expr),
ExprType::Variable { name } => write!(f, "{}", name),
}
}
}

#[derive(PartialEq, Debug, Clone)]
pub struct Expr {
pub expr_type: ExprType,
Expand Down Expand Up @@ -127,3 +142,9 @@ impl Expr {
Box::new(self.clone())
}
}

impl Display for Expr {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.expr_type)
}
}
28 changes: 22 additions & 6 deletions src/ast/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -203,11 +203,26 @@ impl Parser<'_> {
message: "Expected expression.".to_owned(),
}),
Some(t) => match &t.type_ {
TokenType::Nil => Ok(Expr::nil(t.position.clone())),
TokenType::False => Ok(Expr::boolean_literal(false, t.position.clone())),
TokenType::True => Ok(Expr::boolean_literal(true, t.position.clone())),
TokenType::Number(n) => Ok(Expr::number_literal(*n, t.position.clone())),
TokenType::String(s) => Ok(Expr::string_literal(s, t.position.clone())),
TokenType::Nil => {
self.token_iterator.next();
Ok(Expr::nil(t.position.clone()))
},
TokenType::False => {
self.token_iterator.next();
Ok(Expr::boolean_literal(false, t.position.clone()))
},
TokenType::True => {
self.token_iterator.next();
Ok(Expr::boolean_literal(true, t.position.clone()))
},
TokenType::Number(n) => {
self.token_iterator.next();
Ok(Expr::number_literal(*n, t.position.clone()))
},
TokenType::String(s) => {
self.token_iterator.next();
Ok(Expr::string_literal(s, t.position.clone()))
},
TokenType::Identifier(name) => {
let position = t.position.clone();
self.token_iterator.next();
Expand Down Expand Up @@ -251,7 +266,8 @@ impl Parser<'_> {
}

fn consume_if_matches(&mut self, token_types: &[TokenType]) -> Option<Token> {
match self.token_iterator.peek() {
let peek = self.token_iterator.peek();
match peek {
None => None,
Some(t)
if (*token_types)
Expand Down
9 changes: 7 additions & 2 deletions src/ast/token_iterator.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::iter::Peekable;

use crate::{token::Token, position::PositionRange};
use crate::{token::Token, position::{PositionRange, Position}};

pub struct TokenIterator<'a> {
token_iterator: Peekable<std::slice::Iter<'a, Token>>,
Expand All @@ -11,7 +11,12 @@ impl<'a> TokenIterator<'a> {
pub fn new(tokens: &'a Vec<Token>) -> Self {

Check failure on line 11 in src/ast/token_iterator.rs

View workflow job for this annotation

GitHub Actions / Clippy

writing `&Vec` instead of `&[_]` involves a new object where a slice will do
Self {
token_iterator: tokens.iter().peekable(),
last_position: None,
last_position: Some(PositionRange { start: Position {
line: 0,
column: 0,
}, end: Position {
line: 0, column: 0,
} }),
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/interpreter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -305,11 +305,11 @@ mod run_tests {
kind: LoxErrorKind::Runtime,
position: PositionRange { start: Position {
line: 0,
column: 0,
column: 1,
},
end: Position {
line: 0,
column: 0,
column: 11,
}
},
message: "Unsupported operand types for binary operator + (String(abc), Number(123))".to_owned(),
Expand Down
3 changes: 2 additions & 1 deletion src/scanner/mod.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

mod scanner_iterator;

use std::{vec::Vec};
Expand Down Expand Up @@ -259,7 +260,7 @@ pub fn scan(source: &str) -> Result<Vec<Token>, LoxError> {
let current_position = it.current_position();
Position {
line: current_position.line,
column: current_position.column - token_type.size() + 1,
column: current_position.column + 1 - token_type.size(),
}
}),
end: it.current_position(),
Expand Down
2 changes: 1 addition & 1 deletion src/scanner/scanner_iterator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ impl<'a> Iterator for ScannerIterator<'a> {
}
match next {
Some(c) if c == '\n' => self.prev_char_is_line_break = true,
_ => {},
_ => self.prev_char_is_line_break = false,
}
next
}
Expand Down

0 comments on commit 4bc2dab

Please sign in to comment.