bugfix for binary and, modulo, binary ops tests

This commit is contained in:
russ
2017-10-31 15:06:13 -07:00
parent 896c2f7a08
commit 4fed05c20a
3 changed files with 80 additions and 3 deletions

View File

@@ -168,6 +168,8 @@ pub enum Token {
LeftShift,
RightShift,
XOr,
Modulo,
ModuloEquals,
LexErr(LexError),
}
@@ -626,6 +628,15 @@ impl<'a> TokenIterator<'a> {
}
_ => return Some(Token::XOr)
}
},
'%' => {
match self.char_stream.peek() {
Some(&'=') => {
self.char_stream.next();
return Some(Token::ModuloEquals);
}
_ => return Some(Token::Modulo)
}
}
_x if _x.is_whitespace() => (),
_ => return Some(Token::LexErr(LexError::UnexpectedChar)),
@@ -664,11 +675,13 @@ fn get_precedence(token: &Token) -> i32 {
| Token::RightShiftEquals
| Token::AndEquals
| Token::OrEquals
| Token::XOrEquals => 10,
| Token::XOrEquals
| Token::ModuloEquals => 10,
Token::Or
| Token::XOr
| Token::Pipe => 11,
Token::And => 12,
Token::And
| Token::Ampersand => 12,
Token::LessThan
| Token::LessThanEqual
| Token::GreaterThan
@@ -681,6 +694,7 @@ fn get_precedence(token: &Token) -> i32 {
| Token::Multiply => 40,
Token::LeftShift
| Token::RightShift => 50,
Token::Modulo => 60,
Token::Period => 100,
_ => -1,
}
@@ -947,6 +961,15 @@ fn parse_binop<'a>(input: &mut Peekable<TokenIterator<'a>>,
Box::new(Expr::FnCall(">>".to_string(), vec![lhs_copy, rhs]))
)
},
Token::Ampersand => Expr::FnCall("&".to_string(), vec![lhs_curr, rhs]),
Token::Modulo => Expr::FnCall("%".to_string(), vec![lhs_curr, rhs]),
Token::ModuloEquals => {
let lhs_copy = lhs_curr.clone();
Expr::Assignment(
Box::new(lhs_curr),
Box::new(Expr::FnCall("%".to_string(), vec![lhs_copy, rhs]))
)
}
_ => return Err(ParseError::UnknownOperator),
};
}