Wprowadzenie do ANTLRWorks

  1. Uruchomić ANTLRWorks (java -jar /opt/antlr3/antlrworks.jar),
    1. wypełnić i wysłać ankietę (niech autor wie, że ktoś używa jego programu) (Nieaktualne. Autor nie zajmuje się już tą wersją),
    2. wybrać typ tworzonego pliku: .g i utworzyć go


      Pod linuksem i kde niestety nie można wpisać nazwy gramatyki. Wystarczy natomiast kliknąć 'OK' i dać się skrzyczeć przez program.Za drugim razem już można pisać w polu z nazwą.

    Nie radzę dawać spacji w nazwie (pliku bądź kartoteki) bo później będą kłopoty.
    Dalej wybieramy rodzaj gramatyki 'Combined Grammar'. Do wyboru mamy jeszcze 'Lexer', 'Parser' i 'Tree' ale dziś potrzebna będzie ta pierwsza.

    Dodatkowo możemy wybrać kilka leksemów do utworzenia. Dzisiaj przydatne będą te, które są podkreślone na powyższym rysunku. Po kliknięciu 'OK' otrzymamy tekst definicji analizatora leksykalnego z wybranymi leksemami. Teraz warto zapisać program aby go nie utracić.

    Nazwa pliku musi być tożsama z nazwą gramatyki.

    Na powyższym rysunku widzimy trzy okienka. Pierwsza zakładka to 'Syntax Diagram'. Okienko to prezentuje w jednej z dwóch form, zależnych od przełącznika opisanego jako 'NFA', diagram wybranej reguły. Sprawdzić! Przełącznik 'Rule Name' chyba nie wymaga tłumaczenia.
    Na niebiesko macie zaznaczone akcje, które będąc w tym miejscu, czyli w regule leksykalnej są akcjami leksykalnymi. Akcje w regułach składniowych nazywamy semantycznymi gdyż pełnią tam rolę analizatora semantycznego. Akcja $channel = HIDDEN powoduje wrzucenie właśnie wykrytego leksemu do ukrytego kanału. Ukrytego przed parserem. Oznacza to, że leksemy danego typu są ignorowane, ale także, że nie mogą one wystąpić w definicjach reguł gramatycznych bo parser nigdy ich nie dostanie (to ważne!). Druga akcja: greedy = false jest ustawieniem opcji działania analizatora. Tu umieszczona dotyczy tylko najbliższej gwiazdki. Fałsz oznacza, że wzorzec ma być dopasowany niezachłannie. Kropka oznacza dowolny znak, a więc także '*' i '/'. Dopasowanie zachłanne dopasowywałoby do symbolu wieloznacznego czyli kropki wszystkie znaki aż do ostatniego wystąpienia sekwencji '*/' kończącej definicję. Dopasowanie niezachłanne zakończy swoje działanie na pierwszej napotkanej sekwencji '*/'. O to właśnie nam tutaj chodzi.
  2. Teraz przystępujemy do definiowania reguł gramatycznych.
    Dobrym punktem wyjścia są reguły pokazane na stronie http://kompilatory.iiar.pwr.wroc.pl/. Znajdują się one w drugim polu pierwszego punktu. Zwykle reguły gramatyczne umieszcza się nad leksykalnymi. Nie jest to obowiązkowe ale często praktykowane. Reguły te napisane są w notacji BNF, a my tutaj potrzebujemy EBNF. Musimy je więc nieco zmodyfikować. Zamiast symboli '::=' dajemy ':' oraz na końcu każdej reguły dajemy średnik.

    Większość leksemów występujących w akcjach gramatycznych jest podkreślona na czerwono co sugeruje błąd. Po prostu leksemy te są niezdefiniowane.

    Narzędzie pomaga nam w usuwaniu tego typu błędów. Oczywiście nie wymyśli za nas jaką definicję powinien mieć brakujący leksem ale przynajmniej go utworzy. Pojawi się
    PLUS
    :
    ;

    Musimy go tylko wypełnić treścią:
    PLUS
    : '+'
    ;

    Analogicznie pozostałe brakujące leksemy. Można je też skopiować ze strony, z której wzięliśmy reguły gramatyczne i poprawić w analogiczny sposób. Leksemu 'EOF' nie musimy, a nawet nie powinniśmy definiować.
    Uwaga! Mamy teraz dwa leksemy, które zawierają tą samą definicję:

    Proponuję wyrzucić '\n' z definicji 'WS'.
  3. Mamy gramatykę czterodziałaniowego kalkulatora z nawiasami. Możemy teraz sprawdzić jak działa parser.
    Wybieramy zakładkę 'Interpreter'. Zadbajmy o to aby wybrać odpowiednią regułę startową. U nas będzie to reguła 'plik'.

    Po wpisaniu łańcucha testowego i naciśnięciu strzałki z lewej strony otrzymamy wynik w postaci drzewa wywodu.

    Możemy wpisać inne wyrażenie i też otrzymać drzewo wywodu:

    Oops? Nie przejmujcie się - to jest objaw znanego błędu interpretera. Wystarczy reguły, które mają alternatywę wewnątrz nawiasów, po których jest gwiazdka lub plus wziąć w podwójną parę nawiasów. Potrzebne jest to wyłącznie interpreterowi.
    	expr
    	:	term ((PLUS term 
    	| MINUS term))* NL
    	;
    	


    I już jest dobrze.
  4. Konsola
    Jest to ważne okienko gdyż w nim pojawiają się komunikaty o błędach. Komunikaty te nie są automatycznie czyszczone, a więc przed kompilacją czy uruchomieniem programu należy wyczyścić konsolę żeby nie walczyć z błędami, których już nie ma.
  5. Debugger
    Uwaga dla Windowsowców: Trzeba wejść w preferencje (menu File), wybrać zakładkę "Compiler" i zaznaczyć tam "javac", "Path" i podać ścieżkę do kartoteki gdzie jest kompilator javy (np. C:\Program Files\Java\jdk1.8.0_112\bin). Dodatkowo w zakładce "Debugger" należy zmienić numer portu na np. o jeden większy od domyślnego (ten jest w windowsie zajęty). Pod Linuxem nie trzeba tego robić. Acha, popsuła się nam właśnie czcionka w edytorze - zakładka Editor :p.
    Debugger uruchamiamy klikając zieloną pluskwę (ang. bug) lub wybierając z menu 'Run' polecenie 'Debug', ewentualnie wciskając klawisze Cntl-D

    Program zostanie skompilowany ale przy kompilacji mogą wystąpić błędy. Pojawia się wtedy poniższe okienko:

    Błędy należy oczywiście usunąć i spróbować kompilacji ponownie. Jak się wreszcie uda to otwiera się okno następujące:

    Podajemy w nim łańcuch testowy (na górze) lub nazwę pliku (na dole), w którym zapisany jest test. Ważne jest upewnienie się, że reguła startowa jest poprawna! U nas tą regułą jest plik. Po kliknięciu 'OK' pojawi się okno uruchamiania, w którym można, krokowo bądź nie, wykonać program analizujący łańcuch testowy. W trakcie śledzenia programu lub po jego zakończeniu można wybrać element drzewa wywodu lub strumienia wejściowego. Spowoduje to zaznaczenie odpowiadających sobie elementów drzewa wywodu, gramatyki i strumienia wejściowego. Mówię o elementach zaznaczonych poniżej na niebiesko. Tak, Drogie Dziewczyny, mówię o tym kolorze, który nazwałybyście błękitnym, turkusowym, indygo, oberżynowym albo jeszcze innym ale nie niebieskim. Tak, Szanowny Geeku, mówię o kolorze #99ccfe, który nie ma kodu PANTONE.

    Czerwony kursor pokazuje gdzie aktualnie znajdujemy się podczas wykonania programu.
  6. To nie wszystko na dzisiaj! Teraz zadanie dla Was.
    1. Dołożyć obsługę nawiasów. Podpowiedź jest na jednym z rysunków na tej stronie. Nawet na dwóch.
    2. Sprawić by kalkulator zaczął liczyć. Po odpowiednie zaklęcia odsyłam do działu F.A.Q.
    3. Dodać sprawdzenie czy nie próbujemy dzielić przez zero. (Można użyć wyjątków)
    4. Dodać jakieś nowe działania np. modulo, operacje logiczne lub bitowe, shift w lewo lub w prawo, ...
c.d.n.