2009-10-28 13 views
10

Pomagałem w rozszerzeniu dwudziestoletniego zastrzeżonego języka w mojej firmie. Jest to duży, pełen Turinga język. Przetłumaczenie go na inny system gramatyczny (np. Antlr) nie jest opcją (nie decyduję o tym).Czy istnieją debuggery gramatyki Yacc?

W większości przypadków rozszerzenie gramatyki przebiegło sprawnie. Ale raz na jakiś czas będę miał redukuj-zredukować lub shift-zredukować że

  • jest trudne do wyeliminowania
  • czasami po prostu nie ma sensu (moim słabym mózgu)

Po wielu bolesnych wpatrzeniach w pliki y.output i eksperymentalnej refaktoryzacji gramatyki, zwykle dotarłem tam, gdzie chciałem iść. Czasami musiałem robić niezadowalające kompromisy.

Czy są więc jakieś narzędzia, które mogą zasysać gramatykę yacc, co usprawnia przeglądanie, eksperymentowanie i pozwala na debugowanie zmian?

Jeśli dodaję produkcję, chciałbym zobaczyć coś więcej niż "produkcję atomową, która jest wszędzie używana" (przemyślany identyfikator) "konflikty z regułą foo" (tak, jest więcej informacji, s/r, r/r, ale myślę, że dostaję mój dryf). Byłoby miło mieć jakąś wskazówkę na temat wzajemnej gry, nie tylko zakładając czapkę myślową i próbując wyobrazić sobie stos symboli i automat stanów.

Aktualizacja: Chyba powinienem wyjaśnić. Używamy Berkeley Yacc. Testowałem używając najnowszej wersji Bison. Dla danych wyjściowych skompilowałem gramatykę z --report = itemset.

Moim celem tego postu jest poszukiwanie zewnętrznych narzędzi, które zwiększenia obiekty które statek z yacc gramatyki debugowania. Dzisiaj jest bolesny z domyślnym zestawem. Pomóż mi znaleźć lepsze interaktywne narzędzia, takie jak te, których możesz używać z Antlr.

Odpowiedz

7

Ty może uzyskać pomoc od yacc -d, która produkuje debugowania - co w zasadzie daje pełną listę państw symbol stosu i takie. Wydajność jest gęsta i obszerna, więc próba przeczytania tego wszystkiego bezpośrednio bardzo rzadko przynosi wiele (i tak nigdy nie ma dla mnie). Jednak po wprowadzeniu zmiany daje (na przykład) konflikt r/r, można uruchomić yacc -d na starej gramatyki i nowej, a następnie uruchomić diff na wynikach, aby uzyskać bardziej szczegółowy przebieg zmiana (s) spowodowała konflikt.

Warto jednak zauważyć, że konflikty s/r są często łagodne - o ile nie masz pewności, że jest to problem, próba "naprawienia" często nie jest opłacalna. To samo nie dotyczy jednak konfliktów r/r. Chociaż są one łagodne, to są stosunkowo rzadkie.

Edycja: Ups - przepraszam, to powinno być -v. Wspominasz o y.output, więc najwyraźniej już wiesz, jak to zrobić. Chodzi o to, że nie próbujesz bezpośrednio przeglądać plików y.output, ale robisz różnice między tymi, które wyszły czysto, a tymi, które nie dostarczyły szczegółów na temat faktycznego konfliktu (bez patrzenia na 10). linie jillowe "rzeczy", które są w porządku

+0

Nie jestem pewien, co masz na myśli. W przypadku obu naszych yaccs -d oznacza "wypisz plik nagłówkowy dla makr tokenów". Właśnie dodałem więcej informacji o korzystaniu z przełącznika --report = itemset. Czy to jest coś, co masz na myśli? Generuje plik, y.output pełen wszystkich informacji o zmianie stanu. Używam go, ale liczyłem na potężniejsze, interaktywne narzędzie. –

+1

Jerry ma rację, konflikty S/R niekoniecznie są błędami. Prawie każda gramatyka ma ich kilka. – DigitalRoss