feat(if): Support >, >=, < and <= operators

Closes #52
This commit is contained in:
Kyle Fuller
2016-11-28 18:17:01 +00:00
parent ab6f1a032d
commit c59b263446
5 changed files with 179 additions and 1 deletions

View File

@@ -170,6 +170,88 @@ class EqualityExpression: Expression, InfixOperator, CustomStringConvertible {
}
class NumericExpression: Expression, InfixOperator, CustomStringConvertible {
let lhs: Expression
let rhs: Expression
required init(lhs: Expression, rhs: Expression) {
self.lhs = lhs
self.rhs = rhs
}
var description: String {
return "(\(lhs) \(op) \(rhs))"
}
func evaluate(context: Context) throws -> Bool {
if let lhs = lhs as? VariableExpression, let rhs = rhs as? VariableExpression {
let lhsValue = try lhs.variable.resolve(context)
let rhsValue = try rhs.variable.resolve(context)
if let lhs = lhsValue, let rhs = rhsValue {
if let lhs = toNumber(value: lhs), let rhs = toNumber(value: rhs) {
return compare(lhs: lhs, rhs: rhs)
}
}
}
return false
}
var op: String {
return ""
}
func compare(lhs: Float80, rhs: Float80) -> Bool {
return false
}
}
class MoreThanExpression: NumericExpression {
override var op: String {
return ">"
}
override func compare(lhs: Float80, rhs: Float80) -> Bool {
return lhs > rhs
}
}
class MoreThanEqualExpression: NumericExpression {
override var op: String {
return ">="
}
override func compare(lhs: Float80, rhs: Float80) -> Bool {
return lhs >= rhs
}
}
class LessThanExpression: NumericExpression {
override var op: String {
return "<"
}
override func compare(lhs: Float80, rhs: Float80) -> Bool {
return lhs < rhs
}
}
class LessThanEqualExpression: NumericExpression {
override var op: String {
return "<="
}
override func compare(lhs: Float80, rhs: Float80) -> Bool {
return lhs <= rhs
}
}
class InequalityExpression: EqualityExpression {
override var description: String {
return "(\(lhs) != \(rhs))"

View File

@@ -19,6 +19,10 @@ let operators: [Operator] = [
.prefix("not", 8, NotExpression.self),
.infix("==", 10, EqualityExpression.self),
.infix("!=", 10, InequalityExpression.self),
.infix(">", 10, MoreThanExpression.self),
.infix(">=", 10, MoreThanEqualExpression.self),
.infix("<", 10, LessThanExpression.self),
.infix("<=", 10, LessThanEqualExpression.self),
]