Implement relational binops
- Gt: Greater than - Ge: Greater or equal - Lt: Less than - Le: Less or equal
This commit is contained in:
parent
e28a990b85
commit
4d5188d9d6
@ -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
|
||||||
|
|||||||
@ -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"),
|
||||||
}
|
}
|
||||||
|
|||||||
30
src/lexer.rs
30
src/lexer.rs
@ -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
|
||||||
@ -186,7 +207,12 @@ 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,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user