Как выполнить итерацию "вдоль" леса разбора Marpa, а не "через" его деревья разбора?
Скажем, у меня хорошая двусмысленная грамматика Марпы и хорошая двусмысленная входная строка.
Я могу разобрать строку с Марпой и в итоге разобрать лес. Я даже могу перебирать каждое дерево разбора в лесу.
Но как я могу выполнить итерацию "вдоль" леса разбора?
Чтобы описать, что я имею в виду:
Лес синтаксического анализа - это вид графа, в котором могут быть узлы, где альтернативы разделены, и узлы, где альтернативы объединяются в "основной поток".
Скажем, это альтернативные деревья разбора одного леса разбора:
A B1 C
A B2 C
A B3 B4 C
Есть основной поток A
... C
но неоднозначный B
раздел.
Конечно, в реальных анализах может быть много уровней ветвления при ветвлении, и могут быть потоки, которые не воссоединяются с одним основным потоком. Но в целом будет много частей, общих для двух или многих интерпретаций.
Какие подходы можно использовать для итерации по цепочке однозначных и неоднозначных узлов?
На самом деле я могу вывести весь график?
2 ответа
В этом разделе приведены 2 примера (базовый и расширенный) итерации по узлам ASF для получения списка сериализованных AST.
Оба основаны на коде из набора тестов Marpa::R2 (cpan/t/sl_panda(1).t).
Надеюсь, поможет.
PS Эта суть, вероятно, будет служить вам лучше - она печатает все узлы ASF в порядке посещения - вы можете использовать
$spans->{ $literal }->{ $start }
хэш, чтобы увидеть, является ли узел неоднозначным или нет, и построить график оттуда на основе интервалов промежутка ($start, $start + $length) для построения дочерних / родительских ссылок.
Интерфейс для этого только что перешел из альфы в константу в Marpa::R2, так что вопрос уместен. Посмотрите https://metacpan.org/pod/distribution/Marpa-R2/pod/ASF.pod и https://metacpan.org/pod/distribution/Marpa-R2/pod/Glade.pod.
Можете ли вы вывести весь график? Да, но это легко сделать. Сложная часть заключалась в том, чтобы найти хороший способ детализировать интересующие детали, не прибегая к экспоненте.
Кстати, другой эксперт Marpa, может быть, тут кто-то другой, у кого больше опыта работы с моим интерфейсом, чем у меня. Возможно, вы хотели бы немного подождать его ответа, который вам может понравиться больше, чем мой.:-)