diff --git a/src/ExprRules.jl b/src/ExprRules.jl index b100148..1b49e87 100644 --- a/src/ExprRules.jl +++ b/src/ExprRules.jl @@ -432,9 +432,13 @@ Generates a random RuleNode of return type typ and maximum depth max_depth. function Base.rand(::Type{RuleNode}, grammar::Grammar, typ::Symbol, max_depth::Int=10, bin::Union{NodeRecycler,Nothing}=nothing) rules = grammar[typ] - rule_index = max_depth > 1 ? - StatsBase.sample(rules) : - StatsBase.sample(filter(r->isterminal(grammar,r), rules)) + + if max_depth <= 1 + terminals = filter(r->isterminal(grammar,r), rules) + rule_index = !isempty(terminals) ? StatsBase.sample(terminals) : StatsBase.sample(rules) + else + rule_index = StatsBase.sample(rules) + end rulenode = iseval(grammar, rule_index) ? RuleNode(bin, rule_index, Core.eval(grammar, rule_index)) : diff --git a/test/runtests.jl b/test/runtests.jl index 6ce12c3..97c00ec 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -427,3 +427,14 @@ let ex = get_executable(tree, grammar) interpret(tab, ex) == exp.([1, 2]) end + +let + grammar = @grammar begin + A = B + B = C + C = D + D = E + E = 1 + end + rulenode = rand(RuleNode, grammar, :A, 1) +end \ No newline at end of file