Interpreter własneo języka w Javie

0

Witam,

Zwracam się z uprzjmą prośbą o sugestie co do rozwiązania pewnego problemu :-) Mam do opracowania "interpreter własnego języka programowania na potrzeby tworzenia prostych programów obliczeniowych".

Problem polega na tym na tym że siedzę, mam pustkę w głowie i nie wiem jak się za to zabrać [glowa]
Nie szukam gotowych odpowiedzi, a jedynie sugestii co powiniennem wziąś pod uwagę, od czego zacząć..

Poniżej wrzucam część specyfikacji projektu

Przedmiotem projektu jest opracowanie interpretera własnego języka programowania na potrzeby tworzenia prostych programów obliczeniowych. Interpreter to program, który może być widziany jako zbiór modułów (skaner, parser i wykonawca kodu), które na bieżąco, instrukcja po instrukcji, analizuje i wykonuje program zawarty w pliku źródłowym. Gdy którykolwiek z modułów napotka na błąd, interpreter przerywa pracę podając numer błędnej linii w pliku źródłowym oraz opis błędu. Schematycznie interpreter można przedstawić w następujący sposób:

Plik źródłowy > Skaner > Parser > Wykonawca kodu

Dziękuje za wskazówki,
Łukasz

0

uszczegolowie:

Plik źródłowy > Skaner > Parser > Wykonawca kodu

plik zrodlowy - no.. wiadomo.. strumien tekstowy, np. int x;x=5;++x;

skaner - jest to 'program' ktory tlumaczy kod zrodlowy na postac prostsza w zrozumieniu dla parsera. w szczegolnosci polega to na dzieleniu strumienia wejsciowego na tzw. tokeny: operatory, slowa kluczowe, wartosci itp. i tak dla owego przykladu, wyjsciem skanera by byl strumien tokenow {datatype:int} {identifier:'x'} {parserhelper:semicolon} {identifier:'x'} {operator:assign} {value:5} {parserhelper:semicolon} {operator:increment} {identifier:'x'} {parserhelper:semicolon}

parser - to 'program' sprawdzajacy poprawnosc skladni i - uwaga - albo wykonywacz na biezaco (czysty interpreter!) albo tlumacz na kod binarny (kompilator!). w Twoim przypadku wyglada na to masz zrobic parser-kompilator a potem jego wynik wykonac.. parsery generalnie sa zbudowane jako reguly, np.

datatype, identifier => createvariable identifier with datatype
identifier, assign, value => setvariable identifier to value
identifier, assign, identifier2 => setvariable identifier to getvalueofvariable(identifier2)
increment, identifier => prefixincrement of identifier
identifier, increment => postfixincrement of identifier
etc

oczywiscie postac regul strywializowalem, sa one czysto zalezne od tego jak Twoj jezyk ma wygladac.. a wiec wynikiem Twojego parsera powinien byc ciag instrukcji/bytecodu: {createvariable name=x type=int} {setvariable name='x' value='5'} {incrementvariable name='x'}.. albo bytecode np. {01 "x\0" 01} {02 "x\0" 0000005} {03 "x\0"} tak na prawde architekturalnie to bez roznicy - jak Ci wygodniej - po prostu bytecode bezdie szybszy w wykonywaniu

no i na koniec wykonywacz, generalnie w postaci wielkej petli czytajacej rozkazy, w srodki gigantyczny switch pobierajacy kodziki instrukcji, i nastepnie juz w bloczku case wykonujacy pobranie i kontrole specyficznych argumentow no i wykonanie samej operacji..

oczywiscie na kazdym poziomie - skaner - parser - executive - moga wystapic bledy. skaner - nierozpoznane konstrukcje znakowe, parser - blad skladni, executive - np. division by zero

zanim zaczniesz pisac samemu cos w Javie, badzo polecam zapoznac sie z FLEX i BISON albo YACC generujacymi kod skanerow, parserow, interpreterow/kompilatorow na podstawie podanych regul przetwarzania oraz kawalkow kodu

0

Ja dodam od siebie, że jeśli jesteś ambitny możesz napisać taki interpreter sam od początku do końca.
A jeśli chodzi o przykładowe rozwiązania to polecam przeszukać zasoby SourceForge'a - projekty interpretatorów wykonnywane przez studentów mojej uczelni są tam umieszczone.

0

Dzięki wszystkim za pomoc! :-)
Trochę to trwało, ale się udało

Pozdrawiam,
Łukasz

1 użytkowników online, w tym zalogowanych: 0, gości: 1