Я работаю с выражениями Ripper sexp, это выглядит так:
[:program,
[[:class,
[:const_ref, [:@const, "A", [1, 6]]],
nil,
[:bodystmt,
[[:class,
[:const_ref, [:@const, "B", [1, 15]]],
nil,
[:bodystmt,
[[:def,
[:@ident, "test", [1, 22]],
[:params, nil, nil, nil, nil, nil],
[:bodystmt, [[:void_stmt]], nil, nil, nil]]],
nil,
nil,
nil]]],
nil,
nil,
nil]]]]
И я использую массив как путь, чтобы получить элемент в выражении sexp. Например
path = [1,0,1,1] => sexp[1][0][1][1]
достанет мне
[:@const, "A", [1, 6]]
С помощью этого пути я могу получить следующие, предыдущие, родительские элементы и т. Д.
Но мне интересно, есть ли структура данных, которая больше подходит для такого рода задач?