jamesrhester / Lerche.jl

A Julia port of the Lark parser
MIT License
45 stars 3 forks source link

`ERROR: KeyError: key Tree(expansions, ...` #24

Closed guyvdbroeck closed 2 years ago

guyvdbroeck commented 2 years ago

I could be wrong, but I think the following error should not occur? Removing parts of this grammar will remove the error.

julia> spn_grammar = raw"""
           start: domains (_NL node)+ _NL?

           domains : "(" INT (_WS INT)* ")"

           node : "v" _WS INT _WS INT -> literal_node
                | "*" (_WS INT)+ -> prod_node
                | "+" (_WS INT _WS LOGPROB)+ -> sum_node

           %import common.INT
           %import common.SIGNED_NUMBER -> LOGPROB
           %import common.WS_INLINE -> _WS
           %import common.NEWLINE -> _NL
           """;

julia> Lark(spn_grammar)
ERROR: KeyError: key Tree(expansions, Any[Tree(expansion, Any[_WS, INT])
])
 not found
Stacktrace:
  [1] getindex
    @ ./dict.jl:482 [inlined]
  [2] _add_recurse_rule(etb::Lerche.EBNF_to_BNF, type_::String, expr::Tree)
    @ Lerche ~/.julia/packages/Lerche/vHn4T/src/load_grammar.jl:160
  [3] transformer_func(::Lerche.EBNF_to_BNF, ::Val{:expr}, ::Tree, ::Token)
    @ Lerche ~/.julia/packages/Lerche/vHn4T/src/load_grammar.jl:175
  [4] transformer_func(x::Lerche.EBNF_to_BNF, y::Val{:expr}, meta::Lerche.Meta, z::Vector{Any})
    @ Lerche ~/.julia/packages/Lerche/vHn4T/src/utils.jl:234
  [5] _call_userfunc(t::Lerche.EBNF_to_BNF, tr::Tree; new_children::Nothing)
    @ Lerche ~/.julia/packages/Lerche/vHn4T/src/visitors.jl:124
  [6] _call_userfunc
    @ ~/.julia/packages/Lerche/vHn4T/src/visitors.jl:119 [inlined]
  [7] _transform_tree
    @ ~/.julia/packages/Lerche/vHn4T/src/visitors.jl:201 [inlined]
  [8] (::Lerche.var"#24#25"{Lerche.EBNF_to_BNF})(c::Tree)
    @ Lerche ~/.julia/packages/Lerche/vHn4T/src/visitors.jl:138
  [9] iterate
    @ ./generator.jl:47 [inlined]
 [10] collect_to!(dest::Vector{Lerche.Terminal}, itr::Base.Generator{Vector{Any}, Lerche.var"#24#25"{Lerche.EBNF_to_BNF}}, offs::Int64, st::Int64)
    @ Base ./array.jl:724
 [11] collect_to_with_first!(dest::Vector{Lerche.Terminal}, v1::Lerche.Terminal, itr::Base.Generator{Vector{Any}, Lerche.var"#24#25"{Lerche.EBNF_to_BNF}}, st::Int64)
    @ Base ./array.jl:702
 [12] _collect(c::Vector{Any}, itr::Base.Generator{Vector{Any}, Lerche.var"#24#25"{Lerche.EBNF_to_BNF}}, #unused#::Base.EltypeUnknown, isz::Base.HasShape{1})
    @ Base ./array.jl:696
 [13] collect_similar
    @ ./array.jl:606 [inlined]
 [14] map
    @ ./abstractarray.jl:2294 [inlined]
 [15] _transform_children(t::Lerche.EBNF_to_BNF, children::Vector{Any})
    @ Lerche ~/.julia/packages/Lerche/vHn4T/src/visitors.jl:135
 [16] transform(tip::Lerche.EBNF_to_BNF, tree::Tree)
    @ Lerche ~/.julia/packages/Lerche/vHn4T/src/visitors.jl:212
 [17] compile(g::Lerche.Grammar, start::Vector{String}, terminals_to_keep::Set{Any})
    @ Lerche ~/.julia/packages/Lerche/vHn4T/src/load_grammar.jl:643
 [18] Lark(grammar::String, loptions::Dict{String, Any}, source::String, cache_file::String)
    @ Lerche ~/.julia/packages/Lerche/vHn4T/src/lark.jl:190
 [19] Lark(grammar::String; options::Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ Lerche ~/.julia/packages/Lerche/vHn4T/src/lark.jl:123
 [20] Lark(grammar::String)
    @ Lerche ~/.julia/packages/Lerche/vHn4T/src/lark.jl:121
 [21] top-level scope
    @ REPL[24]:1
jamesrhester commented 2 years ago

Yes, that should not happen, I will have a look at it

jamesrhester commented 2 years ago

So it was because the hash calculated for a Tree object did not match even though equality did. Went away when I stopped using an unnecessary "collect", the latest update has the fix and I will do a new release shortly.