Dziś jest sobota, 11 października 2008 roku (z kalendarza...)

Testowanie kompilatora

Icon

16.10.2005, 15:51

Webmaster

Komentarze (0)

Powrót

Wczoraj zacząłem tworzyć od zera nowe oskryptowanie dla strony projektu Open Power Template. No... "od zera" to określenie nieco na wynos, bowiem zwyczajnie wziąłem kod z jakiegoś innego projektu i zacząłem go przerabiać. Przy tej okazji wymieniłem w nim bibliotekę OPT na tę sprzed paru dni i już na samym początku prac wykryłem kilka błędów w działaniu kompilatora. Teoria i testy teorią i testami, a praktyka jak zwykle robi swoje.

Wszystko przebiegało następująco. Pomyślałem, że skoro mam już najświeższą wersję biblioteki, wykorzystam ideę komponentów, aby ułatwić sobie tworzenie formularzy. Jakież było moje zdziwienie, kiedy okazało się, że kompilator zadławił się, gdy nie podałem żadnego parametru, choć w teorii mogłem to zrobić (wszystkie były zadeklarowane jako opcjonalne). Następnie musiałem podłubać w parserze wyrażeń, ponieważ szwankowała obsługa odwróconych apostrof. Nawet teraz nie wiem, co się stało, skoro gdzie indziej i wcześniej identyczny kod działał bez problemów. Na sam koniec wyszedł na jaw problem, który przewidywałem, projektując nowiutki algorytm. Domyślnie bierze on informacje o tym, czy napotkana instrukcja rozpoczyna, czy kończy węzeł, od procesorów poszczególnych komend, np. klasy optSection. Jednak w najnowszej wersji dopuszcza on także używanie klauzul, do których żaden z nich się nie przyznaje, przynajmniej jawnie i tu pojawia się problem. Kompilator musi sam rozpoznać, co dane homo-niewiadomo ma zrobić z aktualnym węzłem. Tu wzorowałem się na XML'u i dałem: {instrukcja} - rozpocznij węzeł; {/instrukcja} - zakończ węzeł, jeśli zgadzają się identyfikatory. Oczywiście o wariancie {instrukcja/}, tj. zrób węzeł pusty, już nie pomyślałem, co zmusza mnie obecnie do deklarowania parametrów komponentu w dość dziwny sposób: {param name="parametr" value="wartosc"}{/param}.

Poprawki spróbuję zaaplikować do SVN'a jutro, niemniej jednak sprawa zastanowiła mnie, bowiem nie jest to już pierwszy raz, gdy wychodzą na jaw takie poważne braki. Dlatego też rozszerzyłem ideę unitTestów na sam kompilator. W tym celu na bazie optApi napisałem ultraminimalistyczny parser mający robić jedynie za środowisko dla działania testowanego elementu. Poszczególne testy odwołują się bezpośrednio do metod klasy optCompiler, by nie tracić czasu na tworzenie plików testowych oraz, co szczególnie ważne, przepuszczanie ich przez ten wielokrokowy proces, który utrudniałby ewentualną diagnozę. Aktualnie zdołałem napisać procedury kontrolne dla parsera wyrażeń, gdzie ujawnił się jeden dość poważny błąd: `test \` test` - w takim ciągu nie jest prawidłowo escape'owany znak \`. Pozostałe dwie niezdane procedury tyczą się już spraw kosmetycznych - przy łączeniu tablicy tokenów z powrotem w wyrażenie między każdy z nich wstawiane są spacje, co czasami nie jest w ogóle potrzebne. Skontrolowałem także parser parametrów i tu więcej błędów, poza omówionym wyżej, nie stwierdziłem. Zastanawiam się teraz, jak kontrolować sam algorytm kompilacji. Drzewo emulowane za pomocą tablic PHP jest diabelnie trudne nawet do prostego debugowego wyświetlenia. Kiedy pisałem ten element, musiałem napisać własną implementację funkcji print_r, gdyż domyślna sobie nie radziła! A tu mamy nie tylko wyświetlanie, ale i porównanie, czy otrzymane wyniki zgadzają się z danymi kontrolnymi! Oj, będzie ciężko...

Powrót

Skomentuj

NickInformacja
E-mailTylko do użytku wewnętrznego.
WWWNie zapomnij o http://
LayoutNapisz tu, czy widzisz dzienny czy nocny layout.
WpisFormatowanie wiki
Internauto, pamiętaj! Wolność to nie samowola - dbaj o kulturę wypowiedzi oraz dyskusji w sieci.

Na Zyxist.com panuje swoboda wyrażania opinii oraz krytyki pod dowolnym adresem. Jedyny warunek: musi być ona kulturalna i rzeczowa. Na chamstwo, prostactwo lub jawne obrażanie kogokolwiek nie ma tu miejsca i takie komentarze są bardzo szybko usuwane. Jeśli zamierzasz polemizować z treścią wpisu, wpierw uważnie ją przeczytaj.

© Tomasz "Zyx" Jędrzejewski 2005 - 2008 | Wykonanych zapytań: 1 | Serwer wirtualny zapewnia