2011-05-11 13 views
11

Piszę parser dla dość skomplikowanych plików konfiguracyjnych, które wykorzystują wcięcia itp. Postanowiłem użyć Lexa, aby przełamać dane wejściowe na tokeny, ponieważ wydaje się, że ułatwiają życie. Problem polega na tym, że nie mogę znaleźć przykładów użycia narzędzi raportowania błędów Qi (on_error) z analizatorami działającymi na strumieniu tokenów zamiast znaków.Boost.Spirit: raportowanie błędu Lex + Qi

Procedura obsługi błędów, która ma być używana w on_error, pozwala niektórym określić dokładnie, gdzie znajduje się błąd w strumieniu wejściowym. Wszystkie przykłady po prostu skonstruuj std::string z pary iteratorów i wydrukuj je. Ale jeśli używa się Lexa, to iteratory są iteratorami do sekwencji tokenów, a nie postaci. W moim programie doprowadziło to do zawieszenia w konstruktorze std::string zanim zauważyłem nieprawidłowy typ iteratora.

Jak rozumiem, token może pomieścić parę iteratorów do strumienia wejściowego jako jego wartość. Jest to domyślny typ atrybutu (jeśli typ jest podobny do lex::lexertl::token<>). Ale jeśli chcę, aby mój token zawierał coś bardziej użytecznego do analizowania (int, std::string itd.), Te iteratory zostaną utracone.

W jaki sposób mogę generować przyjazne dla człowieka komunikaty o błędach wskazujące pozycję w strumieniu wejściowym podczas używania Lex z Qi? Czy są jakieś przykłady takiego użycia?

Dzięki.

+0

@Thimssomebody dzięki za edytowanie :) – sehe

Odpowiedz

10

Przepraszamy za spóźnioną odpowiedź, ale zajęło mi trochę czasu, aby przygotować porządny przykład tego, co próbujesz osiągnąć. Dodałem teraz nowy przykład leksykonu do Spirit: conjure_lexer. Jest to zmodyfikowana wersja przykładu conjure (Qi) implementująca mały język programowania. Główną różnicą jest to, że używa lexera zamiast czystej gramatyki Qi.

Nowy conjure_lexer przykład demonstruje kilka rzeczy: a) jest za pomocą nowego position_token klasę, która rozszerza istniejący token typu. Zawsze przechowuje parę iteratorów wskazujących odpowiednią dopasowaną sekwencję wejściową (oprócz zwykłych informacji, takich jak identyfikator tokena, wartość tokena itp.). b) używa tej informacji o pozycji do zgłaszania błędów c) i wzdłuż linii pokazuje, jak używanie leksykonu może uprościć gramatykę.

Nowy przykład znajduje się w SVN (trunk) i będzie dostępny w Boost V1.47 (wkrótce zostanie wydany). Jest w tym katalogu: $ BOOST_ROOT/libs/spirit/example/qi/compiler-tutorial/conjure_lexer.

+0

Wielkie dzięki, Hartmut! –

+2

Po prostu aktualizacja: przykład został przemianowany w SVN, aby przywołać2. – hkaiser

Powiązane problemy