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.
@Thimssomebody dzięki za edytowanie :) – sehe