Ostatnio natknąłem się na artykuł opisujący technikę parsowania wspomnianą w tytule. Niestety terminologia zastosowana we wspomnianym artykule jest nieco poza moim zrozumieniem, więc starałem się zrozumieć algorytm konstrukcji bardziej intuicyjnie. Wierzę, że mi się udało ( ta prezentacja była źródłem momentu ah-ha), ale doceniona zostanie weryfikacja poprawności przez kogoś, kto zna technikę lub zawartą w niej terminologię.
Opiszę swoje podejście do rozwiązania (jeśli jest poprawne, uważam, że mogłoby to pomóc innym osobom próbującym zrozumieć technikę) i zadam dodatkowe pytania. Aby uniknąć nieporozumień, użyję następującej standardowej notacji: , , , i, jak w artykule, dla oznaczenia reguły numer . Jednak prawdopodobnie użyję innych nazw pojęć niż oryginalny artykuł., B , C , . . . ∈ N . . . X , Y , Z ∈ N ∪ T α , β , γ , . . . ∈ { N ∪ T } ∗ A i → ω i
Ponadto w całym opisie stosowana jest relacja równoważności .
Budowa
Istnieją dwa rodzaje elementów wewnątrz automatu analizującego: proste elementy LR (0) w postaci które nazywam elementami przesuwnymi i elementy w postaci które nazywam elementami rozstrzygania ; informują one parsera, aby wypchnął symboli z powrotem do strumienia wejściowego, a następnie zmniejszył liczbę reguł o pierwszy symbol .m β
Gramatyka jest powiększona o regułę a konstrukcja rozpoczyna się od pozycji przesunięcia w stanie początkowym.S ′ 0 → ∙ S $
Teraz, aby zbudować automat, zdecyduj pomiędzy tymi alternatywami dla każdego elementu w stanie :
Jeśli element jest przesuniętym przedmiotem , nastąpi przejście w automacie, gdzie jest pierwszym symbolem .q X → q ′ X β
Jeśli element jest ukończonym przesunięciem elementu , dodaj element rozstrzygania dla każdej reguły .B j → α A ∙ β , i , 0 B j → α A β
Jeśli przedmiot jest elementem rozstrzygającym , niech będzie pierwszym symbolem . Jeśli , dodaj pozycję przesunięcia dla każdej reguły . Jeśli inne elementy niż mają jako kropkę przed sobą, dodaj do automatu przejście . Każdy element rozwiązać , w spowoduje w elemencie rozwiązać wX β X ∈ N X j → ∙ ω X j → ω A i → α ∙ β , m , n X C i → α ∙ X β , m , n q C i → α X ∙ β , mq ′ .
Jeśli przedmiot jest elementem rozstrzygającym , nie wniesie żadnych informacji dotyczących przyszłości i może zostać odrzucony, ale najpierw dodaj element rozstrzygający dla każdej reguły .B j →αA∙β,m,nB j →αAβ
To oczywiście tylko szkic; w rzeczywistości najpierw należy obliczyć zamknięcie państwa, a dopiero potem możemy poradzić sobie z przejściami / zmianami i rozdzielczościami.
Przekształcenie automatu w stół analizujący z przesunięciem i przesunięciem jest trywialne; po prostu, jako niewielka odmiana, autorzy artykułu interpretują rozdzielczość jako akcję akceptacji. Biorąc pod uwagę powstały automat, uznałem, że wygodniej jest traktować zmianę jako akcję akceptacji. $
pytania
Pierwszym z nich jest oczywiście to, czy opisany powyżej proces jest prawidłowy.
Drugi dotyczy relacji równoważności. Mogę tylko zgadywać, że relacja równoważności jest odpowiedzialna za podejmowanie decyzji, które elementy rozstrzygania są wprowadzane, gdy widzi się gotowy element zmiany. Wygląda na to, że że jest uderzająco podobny do parserów LSLR. Artykuł opisuje „dokładniejszą relację równoważności” na stronie 11; czy istnieje sposób interpretacji tej relacji w kategoriach intuicyjnych? Czy znane są inne relacje?κ 0 F O L L O W L M
I ostatni dotyczy rozwiązywania konfliktów. Artykuł dobrze opisuje, co stanowi nieadekwatność automatu z rozdzielczością zmiany; czy istnieje sposób na rozwiązanie tych niedociągnięć, podobny do sposobów rozwiązywania konfliktów w tradycyjnym parserze LR? Czy coś takiego jak rozwiązywanie konfliktów w stylu yacc poprzez pierwszeństwo i asocjatywność można zaimplementować w generatorze parsera ShRe?
Dzięki, jeśli przeczytasz to wszystko, a wszelkie odpowiedzi będą mile widziane :)