Implement relational binops

- Gt: Greater than
- Ge: Greater or equal
- Lt: Less than
- Le: Less or equal
This commit is contained in:
Daniel M 2022-01-28 15:07:28 +01:00
parent e28a990b85
commit 4d5188d9d6
4 changed files with 49 additions and 6 deletions

View File

@ -13,7 +13,7 @@
- [x] Unary operators - [x] Unary operators
- [x] Negate `-X` - [x] Negate `-X`
- [x] Parentheses `(X+Y)*Z` - [x] Parentheses `(X+Y)*Z`
- [ ] Logical boolean operators - [x] Logical boolean operators
- [ ] Variables - [ ] Variables
- [ ] Declaration - [ ] Declaration
- [ ] Assignment - [ ] Assignment

View File

@ -46,6 +46,10 @@ impl Interpreter {
BinOpType::Shl => Value::I64(lhs << rhs), BinOpType::Shl => Value::I64(lhs << rhs),
BinOpType::Equ => Value::I64(if lhs == rhs { 1 } else { 0 }), BinOpType::Equ => Value::I64(if lhs == rhs { 1 } else { 0 }),
BinOpType::Neq => Value::I64(if lhs != rhs { 1 } else { 0 }), BinOpType::Neq => Value::I64(if lhs != rhs { 1 } else { 0 }),
BinOpType::Gt => Value::I64(if lhs > rhs { 1 } else { 0 }),
BinOpType::Ge => Value::I64(if lhs >= rhs { 1 } else { 0 }),
BinOpType::Lt => Value::I64(if lhs < rhs { 1 } else { 0 }),
BinOpType::Le => Value::I64(if lhs <= rhs { 1 } else { 0 }),
}, },
// _ => panic!("Value types are not compatible"), // _ => panic!("Value types are not compatible"),
} }

View File

@ -49,6 +49,18 @@ pub enum Token {
/// Not Equal sign (!=) /// Not Equal sign (!=)
Neq, Neq,
/// Greater than (>)
Gt,
/// Greater or equal (>=)
Ge,
/// Less than (<)
Lt,
/// Less or equal (<=)
Le,
/// End of file /// End of file
EoF, EoF,
} }
@ -111,6 +123,14 @@ impl<'a> Lexer<'a> {
self.next(); self.next();
tokens.push(Token::Neq); tokens.push(Token::Neq);
} }
'<' if matches!(self.peek(), Some('=')) => {
self.next();
tokens.push(Token::Le);
}
'>' if matches!(self.peek(), Some('=')) => {
self.next();
tokens.push(Token::Ge);
}
'+' => tokens.push(Token::Add), '+' => tokens.push(Token::Add),
'-' => tokens.push(Token::Sub), '-' => tokens.push(Token::Sub),
@ -122,6 +142,8 @@ impl<'a> Lexer<'a> {
'^' => tokens.push(Token::BXor), '^' => tokens.push(Token::BXor),
'(' => tokens.push(Token::LParen), '(' => tokens.push(Token::LParen),
')' => tokens.push(Token::RParen), ')' => tokens.push(Token::RParen),
'<' => tokens.push(Token::Lt),
'>' => tokens.push(Token::Gt),
'a'..='z' | 'A'..='Z' | '_' => { 'a'..='z' | 'A'..='Z' | '_' => {
let mut ident = String::from(ch); let mut ident = String::from(ch);
@ -137,7 +159,6 @@ impl<'a> Lexer<'a> {
"false" => tokens.push(Token::I64(0)), "false" => tokens.push(Token::I64(0)),
_ => panic!("Lexer encountered unknown ident: '{}'", ident), _ => panic!("Lexer encountered unknown ident: '{}'", ident),
} }
} }
//TODO: Don't panic, keep calm //TODO: Don't panic, keep calm
@ -187,6 +208,11 @@ impl Token {
Token::Equ => BinOpType::Equ, Token::Equ => BinOpType::Equ,
Token::Neq => BinOpType::Neq, Token::Neq => BinOpType::Neq,
Token::Gt => BinOpType::Gt,
Token::Ge => BinOpType::Ge,
Token::Lt => BinOpType::Lt,
Token::Le => BinOpType::Le,
_ => return None, _ => return None,
}) })
} }

View File

@ -40,6 +40,18 @@ pub enum BinOpType {
/// Check unequality /// Check unequality
Neq, Neq,
/// Check greater than
Gt,
/// Check greater or equal
Ge,
/// Check less than
Lt,
/// Check less or equal
Le,
} }
/// Types for unary operators /// Types for unary operators
@ -173,9 +185,10 @@ impl BinOpType {
BinOpType::BXor => 1, BinOpType::BXor => 1,
BinOpType::BAnd => 2, BinOpType::BAnd => 2,
BinOpType::Equ | BinOpType::Neq => 3, BinOpType::Equ | BinOpType::Neq => 3,
BinOpType::Shl | BinOpType::Shr => 4, BinOpType::Gt | BinOpType::Ge | BinOpType::Lt | BinOpType::Le => 4,
BinOpType::Add | BinOpType::Sub => 5, BinOpType::Shl | BinOpType::Shr => 5,
BinOpType::Mul | BinOpType::Div | BinOpType::Mod => 6, BinOpType::Add | BinOpType::Sub => 6,
BinOpType::Mul | BinOpType::Div | BinOpType::Mod => 7,
} }
} }
} }