2014-12-08 11 views
5

piszę niewielką parser z Menhir + Ocamllex i mam dwa warunki nie mogę wydają się spełniać jednocześniewiele raportów o błędach z menhir: jaki token?

  • chciałbym zachować parsowania po błędzie (zgłosić więcej błędów).
  • Chciałbym wydrukować token, w którym wystąpił błąd.

Mogę zrobić tylko 1) łatwo, używając tokena error. Mogę też zrobić tylko 2) łatwo, stosując podejście sugerowane dla this question. Jednak nie znam łatwego sposobu na osiągnięcie obu.

Sposób obsługi błędów I teraz coś takiego:

pair: 
| left = prodA SEPARATOR right = prodA { (* happy case *) } 
| error SEPARATOR right = prodA { print_error_report $startpos; 
(* would like to continue after the first error, just in case 
    there is a second error, so I report both *) } 

Jedną rzeczą, która pomogłaby mi korzysta samego lexbuf, więc mogę dostać token bezpośrednio. Oznaczałoby to zamiast $startpos przekazać coś jak$lexbuf Ale o ile mogę powiedzieć, nie ma oficjalnego sposobu dostępu do lexbuf. Rozwiązanie w 1 działa tylko na poziomie wywołującego do analizatora składni, gdzie wywołujący sam przekazuje lexbuf t othe parser, ale nie w ramach akcji semantycznych.

Czy ktoś wie, czy jest rzeczywiście dostępny w jakiś sposób? a może obejście?

Odpowiedz

4

Dzięki połączonym pracom Frédéric Bour i François Pottier, dostępna jest nowa wersja Menhir, która obsługuje przyrostową analizę. Zobacz announcement email wysłany 17 grudnia

Ideą tego bieżących API jest odwrócenie kontrolę: zamiast parser wywołującego lexer przetwarzać dane wejściowe, masz API niższego poziomu, gdzie manipulowania stan parsera, która zwraca stan zaktualizowany po każdym zużytym tokenie (w tym jest nieco bardziej drobnoziarnisty, ponieważ można zaobserwować wewnętrzne redukcje, które nie wymagają nowych tokenów). W szczególności można zaobserwować, czy wynikowy stan analizatora składni jest błędem, i wybrać powrót do poprzedniego kroku i podać inne dane wejściowe (w zależności od strategii startowej odzyskiwania po błędzie), aby przejść dalej.

Ogólna koncepcja jest taka, że ​​pozwoli to wdrożyć dobre strategie odzyskiwania po błędzie i raportowania błędów na stronie parser-użytkownik, i powoli wycofać raczej nieelastyczny mechanizm "błędu tokena".

Jest to już możliwe, ale prace nad tymi funkcjami wciąż trwają, a w kolejnych wersjach należy spodziewać się solidniejszej obsługi tych nowych funkcji w kolejnych wersjach.

Powiązane problemy