czwartek, 8 marca 2018

Interpreter języka skryptowego


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