AST - Faza druga (sytuacje błędne)

Znalazłem dziś chwilę czasu którą postanowiłem poświęcić na wznowienie budowy mojego pierwszego edytora tekstowego.

Do utworzenia wstępnego szkicu gramatyki posłużyłem się specyfikacją pierwszej wersji języka xpath którą możesz znaleźć tutaj. Jednak gramatyka utworzona w ten sposób nie jest wystarczająca by zastosować ją jako serce edytora tekstowego. Dlaczego? Ponieważ buduje ona poprawne AST tylko dla poprawnego źródła, te jednak w naszym przypadku przez większość czasu zawiera błędy. W trakcie edycji niejednokrotnie następowałaby utrata struktury AST wymaganej do synchronizacji modelu wewnętrznego. Bez modelu natomiast nie bylibyśmy w stanie oznaczyć powstałych błędów, utworzyć listy podpowiedzi etc. Poniżej postaram się zaprezentować opisaną sytuację wraz z przykładową korektą gramatyki.

Do testu posłuży nam proste wyrażenie:

doc("Elementy")//elementA/elementB/elementC



Jak widać drzewo AST jest łatwe do dalszej analizy. Co wydarzy się jednak gdy użytkownik postanowi dodać predykat wybierający instancje 'elementA' spełniające określony warunek? Sprawdźmy jak wygląda sytuacja po dodaniu pierwszego znaku '[' (modyfikacja zaznaczona kolorem).

doc("Elementy")//elementA[/elementB/elementC



Jak widać parser całkowicie się pogubił, całość utrudniła możliwość wystąpienia podwyrażenia absolutnego w ramach predykatu. W wyniku tego w poszukiwaniu nawiasu zamykającego parser zjada nam resztę wyrażenia. W tym momencie zmuszeni bylibyśmy zaznaczyć połowę tekstu jako błędną co nie wyglądałoby zbyt estetycznie nie wspominając o braku podpowiedzi etc. Spróbujmy wybrnąć z tej sytuacji inaczej.

Ponieważ w samej gramatyce nie bardzo jesteśmy w stanie ocenić w jakim miejscu powinien znaleźć się nawias zamykający, zastosujemy mechanizm auto edycji (IAutoEditStrategy) który dołoży go zaraz za wstawianym przez użytkownika nawiasem otwierającym. Podobne działanie można zobaczyć w wielu edytorach w środowisku Eclipse. Poniżej możemy zobaczyć wynikowe wyrażenie wraz z odpowiadającym AST (modyfikacja zaznaczona kolorem).

doc("Elementy")//elementA[]/elementB/elementC



Na drzewie ponownie możemy zobaczyć utracone wcześniej elementy jednak całość jest nadal bezużyteczna. Powodem jest brak obsługi pustych predykatów w naszej gramatyce które nie są poprawnymi elementami wyrażenia. Ponieważ jednocześnie chcemy by nasz parser potrafił sytuację obsłużyć poprawnie oraz oznaczyć miejsce błędu zastosujemy wirtualny token 'ERR_EMPTY_PREDICATE_TOKEN' (modyfikacja zaznaczona kolorem).

predicate
     : '[' expr ']' -> ^(PREDICATE_TOKEN expr)//;
     | '[' ']' -> ^(PREDICATE_TOKEN ERR_EMPTY_PREDICATE_TOKEN);


Poniżej zobaczyć możemy wynikowe drzewo AST:



Jak widać pierwsza sytuacja błędna została opanowana. Pozostało 99 kolejnych którymi będę musiał się zająć gdy znów znajdę czas wolny. Pozdrowienia.

AST - Faza pierwsza

Jako egzemplarz testowy wybrałem sobie dość złożone zapytanie zawierające przekrój przez mechanizmy wyrażenia selekcji języka xpath:

doc("customers")[@name = 'g.bialek']//account[parent::type = 'personal']/@id

Zawiera ono następujące elementy:
- oczywiście ścieżkę z kilkoma krokami
- wywołanie funkcji dostępu do danych
- predykaty (prosty i z wyrażeniem relatywnym)
- osie (dziecko, dziecko zagnieżdżone, ojciec, parametr)

Poniżej widok na AST:

Platforma Swordfish

Dziś na wielu serwisach informacyjnych pojawiła się zapowiedź technologii która może stać sie krokiem milowym w rozpowszechnieniu OSGi jako platformy dla aplikacji biznesowych.

Mowa o platformie Swordfish która właśnie rozpoczyna swój żywot jako produkt open-source kontrolowany przez firmę SOPERA. Co to za projekt? Jest to platforma uruchomieniowa budowana zgodnie z modelem OSGi na bazie Equinoxa której zadaniem jest połączenie cech JBI oraz SCA. Nie wgłębiałem się na razie zbytnio w temat jednak po rozmowie z jednym z ich architektów podczas Eclipse Summit Europe - głosuję obiema rękami na 'TAK'. I to wcale nie z powodu jaskrawo zielonego plecaka który dostałem, po prostu moim zdaniem to krok do przodu i to w wyjątkowo dobrym kierunku ;D