2008-09-09 25 views

cevap

1

Takım sorusuna bir cevabım yok, ancak herhangi bir metin işleme dilinde (perl/python/etc) bir BNF dilbilgisinden rastgele bir şekilde cümle oluşturmasını ve biraz daha fazla ayrıntı vermenin oldukça kolay olduğunu söyleyeceğim Daha büyük bir dil (Java/C/etc), ama kendi başınızı döndürmek çok zor olmamalı.

Buradaki sorun, elbette, yalnızca dilbilgisinde dizeler oluşturabilmesidir ve dilbilginiz çok basit olmadığı sürece, test alanı sonsuz büyüktür.

1

Tam olarak hazzen olarak yorumladım (bir kodlama dilinde gömülü bir DSL kullanarak). Hafif derecede ilginç bir egzersizdi, ancak en temel testler hariç, örn. ayrıştırma, çok yararlı değildi. En ilginç testlerimin çoğu, BNF'de (veya herhangi bir bağlam-içermeyen gramerde) kolayca ifade edilenden daha karmaşık ilişkiler ile ilgilidir.

0

Bir derleyici oluşturuyorsanız, büyük olasılıkla soyut bir sözdizimi ağacı veri türünüz var demektir. Eğer öyleyse, o zaman rastgele bir AST oluşturmak için bir işlev yazabilirsiniz - bununla, bir dizeye yazdırabilir ve bunu birim testinize iletebilirsiniz. , AST'nizle'u başlattığınızdan bu şekilde geçerli bir program olması garanti edilir.

Haskell veya ML'de bir derleyici yazıyor olsaydım, QuickCheck kullanarak bunu yapardım.

0

Gramtest, rastgele kullanıcı tanımlı BNF dilbilgisinden dizeleri oluşturabilen böyle bir araçtır. Gramtest here'un arkasındaki algoritma hakkında daha fazla ayrıntı okuyabilirsiniz ve araçla ilgili bazı pratik ipuçları here kullanılabilir.