Jak używać Xtext do parsowania języków z semantycznymi białymi znakami? Próbuję napisać gramatykę dla CoffeeScript i nie mogę znaleźć żadnej dobrej dokumentacji na ten temat.Xtext: gramatyka dla języka ze znaczącymi/semantycznymi białymi znakami
Odpowiedz
AFAIK, nie możesz.
W przypadku parsowania języków podobnych do Python, potrzebujesz lexer do emitowania tokenów o wartości INDENT
i DEDENT
. Aby tak się stało, potrzebne byłyby semantyczne predykaty, które będą obsługiwane wewnątrz reguł leksykalnych (reguły Xtext'a: terminal
), które najpierw sprawdzą, czy aktualna pozycja w linii następnego znaku na wejściu równa się 0 (początek linii) i to ' '
lub '\t'
.
Jednak przeglądanie documentation, nie widzę w tej chwili obsługiwane przez Xtext. Od Xtext 2.0, wsparcie zostało dodane dla predykatów semantycznych w regułach produkcji (patrz: 6.2.8. Predykaty syntaktyczne), ale nie w regułach terminala.
Jedynym sposobem na wykonanie tego przy pomocy Xtext byłoby zezwolenie lexerowi na tworzenie przestrzeni końcowych i podziałów wierszy, ale spowodowałoby to całkowite zniekształcenie reguł produkcji.
Jeśli chcesz przeanalizować taki język, używając Java (Java i zorientowany generator parsera) Polecam ANTLR, w którym mogą emitować takie INDENT
i DEDENT
znaki dość łatwo. Ale jeśli interesuje Cię integracja Eclipse, to nie widzę, jak możesz to zrobić za pomocą Xtext, przepraszam.
Oto przykład whitespace sensitive language w XText
Dla osób zainteresowanych coffeescript Adam Schmideg ma Eclipse plugin that uses XText.
Dla osób zainteresowanych analizowaniem pythonopodobnych DSL w XText, kod Ralfa Eberta dla Todotext wspomnianego powyżej nie jest już dostępny z Github, ale można go znaleźć w Eclipse test repository. Zobacz: original thread na temat tej pracy i Eclipse issue, która została poruszona na ten temat.
Gram z tym kodem dzisiaj i mój wniosek jest już nie działa w obecnej wersji XText. Kiedy XText jest używany w Eclipse, myślę, że robi "częściowe parsowanie". To nie jest kompatybilne z statefulcxerem, którego potrzebujesz, aby przetworzyć języki wrażliwe na wcięcia. Podejrzewam, że nawet jeśli łatasz lexer, edytor Eclipse nie działa. W tym numerze wygląda na to, że Ralf zaproponował łaty do rozwiązania tych problemów, ale patrząc na źródło XText, te zmiany wydają się dawno już minęły? Jeśli się mylę i ktoś może go uruchomić, byłbym bardzo zainteresowany?
Istnieje inna implementacja here, ale nie mogę tego zrobić, aby działała z bieżącą wersją XText.
Zamiast tego przełączyłem się na parboiled, która nie obsługuje już okna indentation based grammars.
Inni mają ten sam problem: [post na liście XText marzec 2013] (http://www.eclipse.org/forums/index.php/mv/tree/457763/) –
Wersja 2.8 tekstu XText zawiera obsługę Whitespace-Aware Languages. Ta wersja jest dostarczana z "Przykładem automatyki domowej", który możesz wykorzystać jako szablon.
Fajnie (będę musiał zagłębić się trochę w XText, pytanie _nie_ odpowiedź w tym tagu ... :))! Nie mogę jednak usunąć mojej odpowiedzi, ponieważ jest to zaakceptowana odpowiedź[email protected] musi zaakceptować twoje zanim będę mógł usunąć moje. –
Wydaje się być hostowany na github teraz https://github.com/ralfebert/org.eclipselabs.todotext –
Niestety, nie mogę znaleźć tego przykładu w dowolnym miejscu. – rds