2011-08-23 7 views

Odpowiedz

4

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.

17

Oto przykład whitespace sensitive language w XText

+0

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. –

+0

Wydaje się być hostowany na github teraz https://github.com/ralfebert/org.eclipselabs.todotext –

+2

Niestety, nie mogę znaleźć tego przykładu w dowolnym miejscu. – rds

2

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.

+0

Inni mają ten sam problem: [post na liście XText marzec 2013] (http://www.eclipse.org/forums/index.php/mv/tree/457763/) –

3

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.

Powiązane problemy