Przyznaję, że ta część całego sterownika najbardziej mi się podoba i stanowiła dla mnie pewien walor edukacyjny - napisanie swojego języka skryptowego. Oczywiście nie jest on specjalnie skomplikowany. Są obsługiwane stałe i zmienne tylko typów (string, int, decimal), kontrola programu pozwala na użycie (if, while) oraz zagnieżdżonych podprogramów (dla if oraz while). Ale... to i tak jest fajne :-)
Źródła z krótką aplikacją konsolową oraz przykładowymi UnitTestami umieściłem pod (link).
Jak to działa.
Parser na wstępie interpretuje czy w danej linii mamy wyrażenie czy instrukcję... albo instrukcję z wyrażeniem. Trzeba też obsłużyć przypadek, gdzie w wyrażeniu znajduję się również instrukcja. Parser w znacznej mierze korzysta z wyrażeń regularnych i tak dla rozpoznania wyrażenia mamy takie dłuższe "krzaki":
^\s*(\d+\.\d+|\w+|""[^""]*"")\s*(\([^)]*\))?\s*([\^+\-*\/%\|\&><]|={2}|!=)?\s*(.*)$
Po sparsowaniu tekstu skryptu otrzymujemy jedną złączoną instrukcję, przykładowo (dla skryptu):
int x = 5
while (x < 5)
{
x = x - 1
print x
}
x = 2
print x
złączenie wygląda tak:
Jak już jest "własny język" to przyszły pomysły na nowe instrukcje. I tak wymieniony wcześniej whiletime() - to taka odmiana while'a. While ze spełnionym zawsze warunkiem (while(true) - czyli nadaje się tylko do głównej, nieskończonej pętli) a w parametrze przyjmuje minimalny czas trwania pętli. Można oczywiście to wykonać zwykłym while'em ale już potrzebne są dodatkowe polecenia pomiaru czasu i użycie przynajmniej jednej zmiennej.


Brak komentarzy:
Prześlij komentarz