feat: Support filters in if expressions

Closes #90
This commit is contained in:
Kyle Fuller
2017-01-05 20:56:09 +00:00
parent 39517b7514
commit 99efba56e9
5 changed files with 42 additions and 23 deletions

View File

@@ -31,18 +31,18 @@ final class StaticExpression: Expression, CustomStringConvertible {
final class VariableExpression: Expression, CustomStringConvertible {
let variable: Variable
let variable: Resolvable
init(variable: Variable) {
init(variable: Resolvable) {
self.variable = variable
}
var description: String {
return "(variable: \(variable.variable))"
return "(variable: \(variable))"
}
/// Resolves a variable in the given context as boolean
func resolve(context: Context, variable: Variable) throws -> Bool {
func resolve(context: Context, variable: Resolvable) throws -> Bool {
let result = try variable.resolve(context)
var truthy = false

View File

@@ -40,7 +40,7 @@ func findOperator(name: String) -> Operator? {
enum IfToken {
case infix(name: String, bindingPower: Int, op: InfixOperator.Type)
case prefix(name: String, bindingPower: Int, op: PrefixOperator.Type)
case variable(Variable)
case variable(Resolvable)
case end
var bindingPower: Int {
@@ -99,8 +99,8 @@ final class IfExpressionParser {
let tokens: [IfToken]
var position: Int = 0
init(components: [String]) {
self.tokens = components.map { component in
init(components: [String], tokenParser: TokenParser) throws {
self.tokens = try components.map { component in
if let op = findOperator(name: component) {
switch op {
case .infix(let name, let bindingPower, let cls):
@@ -110,7 +110,7 @@ final class IfExpressionParser {
}
}
return .variable(Variable(component))
return .variable(try tokenParser.compileFilter(component))
}
}
@@ -154,8 +154,8 @@ final class IfExpressionParser {
}
func parseExpression(components: [String]) throws -> Expression {
let parser = IfExpressionParser(components: components)
func parseExpression(components: [String], tokenParser: TokenParser) throws -> Expression {
let parser = try IfExpressionParser(components: components, tokenParser: tokenParser)
return try parser.parse()
}
@@ -182,7 +182,7 @@ class IfNode : NodeType {
_ = parser.nextToken()
}
let expression = try parseExpression(components: components)
let expression = try parseExpression(components: components, tokenParser: parser)
return IfNode(expression: expression, trueNodes: trueNodes, falseNodes: falseNodes)
}
@@ -206,7 +206,7 @@ class IfNode : NodeType {
_ = parser.nextToken()
}
let expression = try parseExpression(components: components)
let expression = try parseExpression(components: components, tokenParser: parser)
return IfNode(expression: expression, trueNodes: trueNodes, falseNodes: falseNodes)
}