Skip to content

Commit

Permalink
Merge branch 'master' into depth_lim_iss
Browse files Browse the repository at this point in the history
  • Loading branch information
rcnlee committed Oct 21, 2020
2 parents 933e0f4 + 8573b55 commit 3002dab
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 17 deletions.
46 changes: 29 additions & 17 deletions src/interpreter.jl
Expand Up @@ -19,24 +19,36 @@ interpret(tab::SymbolTable, s::Symbol) = tab[s]
function interpret(tab::SymbolTable, ex::Expr)
args = ex.args
if ex.head == :call
len = length(args)
#unroll for performance and avoid excessive allocations
if len == 1
return tab[args[1]]()
elseif len == 2
return tab[args[1]](interpret(tab,args[2]))
elseif len == 3
return tab[args[1]](interpret(tab,args[2]), interpret(tab,args[3]))
elseif len == 4
return tab[args[1]](interpret(tab,args[2]), interpret(tab,args[3]), interpret(tab,args[4]))
elseif len == 5
return tab[args[1]](interpret(tab,args[2]), interpret(tab,args[3]), interpret(tab,args[4]),
interpret(tab,args[5]))
elseif len == 6
return tab[args[1]](interpret(tab,args[2]), interpret(tab,args[3]), interpret(tab,args[4]),
interpret(tab,args[5]), interpret(tab,args[6]))
if ex.args[1] == Symbol(".&")
return (interpret(tab, args[2]) .& interpret(tab, args[3]))
elseif ex.args[1] == Symbol(".|")
return (interpret(tab, args[2]) .| interpret(tab, args[3]))
elseif ex.args[1] == Symbol(".==")
return (interpret(tab, args[2]) .== interpret(tab, args[3]))
elseif ex.args[1] == Symbol(".>=")
return (interpret(tab, args[2]) .>= interpret(tab, args[3]))
elseif ex.args[1] == Symbol(".<=")
return (interpret(tab, args[2]) .<= interpret(tab, args[3]))
else
return tab[args[1]](interpret.(Ref(tab),args[2:end])...)
len = length(args)
#unroll for performance and avoid excessive allocations
if len == 1
return tab[args[1]]()
elseif len == 2
return tab[args[1]](interpret(tab,args[2]))
elseif len == 3
return tab[args[1]](interpret(tab,args[2]), interpret(tab,args[3]))
elseif len == 4
return tab[args[1]](interpret(tab,args[2]), interpret(tab,args[3]), interpret(tab,args[4]))
elseif len == 5
return tab[args[1]](interpret(tab,args[2]), interpret(tab,args[3]), interpret(tab,args[4]),
interpret(tab,args[5]))
elseif len == 6
return tab[args[1]](interpret(tab,args[2]), interpret(tab,args[3]), interpret(tab,args[4]),
interpret(tab,args[5]), interpret(tab,args[6]))
else
return tab[args[1]](interpret.(Ref(tab),args[2:end])...)
end
end
elseif ex.head == :(.)
return Base.broadcast(Base.eval(args[1]), interpret(tab, args[2])...)
Expand Down
9 changes: 9 additions & 0 deletions test/runtests.jl
Expand Up @@ -437,4 +437,13 @@ let
E = 1
end
rulenode = rand(RuleNode, grammar, :A, 1)
end

let
S = SymbolTable(:x => [1,2,3], :y => [0,2,4], :b1 => [1,1,1], :b2=>[1,0,1])
@test all(interpret(S, Meta.parse("x .<= y")) .== [false, true, true])
@test all(interpret(S, Meta.parse("x .>= y")) .== [true, true, false])
@test all(interpret(S, Meta.parse("x .== y")) .== [false, true, false])
@test all(interpret(S, Meta.parse("b1 .& b2")) .== [true, false, true])
@test all(interpret(S, Meta.parse("b1 .| b2")) .== [true, true, true])
end

0 comments on commit 3002dab

Please sign in to comment.