Aby nie odkrywać koła, chciałbym się dowiedzieć, co już zostało zrobione w sprawie generowania losowych instrukcji z języka bez kontekstu (np. Języka Yacc itp.). Te gramatyki są przeznaczone głównie do analizowania, ale może ktoś zrobił jakieś pokolenie do testowania analizatorów składni? DziękiGenerowanie instrukcji n z gramatyk bezkontekstowych
Odpowiedz
Zapoznaj się z this blog post. Zasadniczo losuje on RHS wybrany dla każdej aplikacji reguły.
Istnieje starożytna ale nadal ciekawy artykuł here który pokazuje, dlaczego trzeba jeszcze kilka ograniczeń dotyczących skutecznego generowania losowych zdań niż ty do parsowania - to również sugeruje prosty sposób dostarczania tych dodatkowych ograniczeń i daje pełny przykładowy program (... w Fortran IV ... ale, hej, to jest od ponad 40 lat ...! -).
Niestety nie jestem świadomy nowszych prac na ten temat (lub implementacji w nowocześniejszych językach), ale transkodowanie zakurzonej talii Fortranu na dowolny język, który najbardziej lubisz, nie powinien być tak trudny jak wymyślanie tych pojęć. na własną rękę ;-) - to jest po prostu rodzaj już starożytnych rzeczy, które przeglądałem w rzeczywistych bibliotekach papierowych, kiedy byłem w college'u, i jestem zdumiony, że internetowe możliwości wyszukiwania ACM pozwoliły mi zlokalizować odniesienie Niejasno pamiętałem, tak szybko (kudos, ACM!). Nigdy nie przeprowadzałem żadnych oryginalnych badań na ten temat.
Generowanie sekwencji losowych tokenów, takich jak ten, jest w pewnym stopniu skierowane w przód; zaczynając od symbolu celu, wybierz dowolne rozwinięcie niewypełnionych nieterminali. Prawdopodobnie potrzebujesz jakiegoś odgałęzienia i ograniczonego wyszukiwania w dół dowolnej gałęzi wygenerowanego drzewa analizy, abyś mógł kontrolować głębokość/rozmiar.
Ale nie widzę dużej wartości w testowaniu analizatorów składowych w ten sposób, przynajmniej nie, jeśli generator parsera bezpośrednio akceptuje opis języka bez kontekstu. Dzieje się tak, gdy używasz generatora/narzędzia do generowania parsera bez kontekstu, takiego jak GLR (którego używamy w naszym systemie transformacji programów, DMS) lub parsera Earley.
Masz kolejny problem: jeśli chcesz przetestować analizator składni, musisz go podać, czego chce, a na pewno nie jest tokenem. Teraz musisz wygenerować prawidłowe leksemy na liście terminali. To też nie jest trudne, ale chciałeś być purystyczny w tym podejściu, że napiszesz swoją gramatykę w stylu bez skanowania.
Ale ostatni problem polega na tym, że trudno jest znaleźć gramatykę wolną od kontekstu dla większości języków. Teraz musisz również debugować swoją gramatykę złota; jak to zrobisz? Gdy dojdziesz do tego etapu, prawdopodobnie po prostu się poddasz, debugujesz parser i zaczniesz życie.
Generowanie losowych poddrzew jest użyteczne przy odzyskiwaniu po błędzie, jeśli możesz splicować w losowym drzewie, aby naprawić strumień źródłowy. Robimy to w uproszczonej formie dla parsera DMS, co oznacza, że mamy tylko jedną maszynę do obsługi błędów.
- 1. Generowanie instrukcji SQL z pythonem
- 2. Generowanie ścieżek na siatce n * n
- 3. Generowanie instrukcji przełącznika za pomocą JavaPoet
- 4. Generowanie sekwencji liczb naturalnych N
- 5. Generowanie liczby losowej N-cyfr
- 6. Korzystanie z prostych gramatyk Boost :: Spirit?
- 7. Prolog: Łączenie gramatyk DCG z innymi ograniczeniami
- 8. Generowanie instrukcji CREATE INDEX w SQL Server
- 9. Generowanie n wierszy NULL w PostgreSQL
- 10. Generowanie wszystkich możliwych permutacji (lub n-krotki)
- 11. Generowanie n-wymiarowej tablicy współrzędnych w numpy
- 12. java 8 threadPoolExecutor stucks po n zadań z instrukcji return
- 13. NLTK Kontekst Darmowe generowanie gramatyki
- 14. Czy regularne algebraiczne typy danych w języku haskell są odpowiednikami gramatyk bez kontekstu? A co z GADTS?
- 15. Generowanie warunki na m rzędu szeregu potęgowego n zmiennych
- 16. Generowanie wszystkich permutacji kulek N w grupach M
- 17. Czy używam przedrostka N w instrukcji "wstawiania do" kodu Unicode?
- 18. "Przerwa;" z instrukcji "if"?
- 19. Generowanie listy utworzonej przez prawe elementy zmieniające n razy
- 20. zwarcie z instrukcji return
- 21. Generowanie krotki z krotek
- 22. Generowanie DataContract z XSD
- 23. Generowanie czasu z numerów
- 24. Generowanie ERD z SQLyog
- 25. Generowanie linku z usługi
- 26. Generowanie raportów z Dynamodb
- 27. Poszukuję przykładów gramatyk Jison, które używają wcięcia dla struktury blokowej.
- 28. Podzielić listę elementów n * n na n list z n elementami na każdej liście
- 29. Czy log (n!) = Θ (n · log (n))?
- 30. Scala: przesuwne (N, N) kontra zgrupowane (N)
Podobny do "fuzzing" (http://en.wikipedia.org/wiki/Fuzz_testing), być może niektóre z tych prac można wykorzystać. –