2013-04-19 10 views
10

Piszę parser dwuprzebiegowy, w którym najpierw skanuję tekst do tokenów (przy użyciu Alex), a następnie analizuję te tokeny (używając Parsec). Wszystko dobrze i dobrze, dopóki nie spróbowałem dodać informacji o pozycji do tokenów, więc mogę napisać dobry komunikat o błędzie.Pozycja śledzenia podczas skanowania tokenów komplikuje analizator składni

Początkowo miałem:

data Token = TAtom | TString String | TInt Integer | TFloat [...] 

Wydaje się, że można albo dodać element Position do każdego konstruktora Token lub utworzyć nowy typ jak data TokenWithPosition = T Token Position.

zacząłem dół ostatnią drogę, ale teraz mam problem albo konieczności tworzenia TokenWithPosition z fałszywej pozycji, gdy chcę opisać token w parsec, czy muszę rozpakować TokenWithPosition każdym razem, kiedy chcesz dokonać porównania. W skrócie, moja miła czysta gramatyka jest przepełniona kodem potrzebnym do zignorowania informacji o pozycji.

Moje pytanie: czy istnieje czysty sposób śledzenia informacji o pozycji bez komplikowania parsera w drugim przebiegu? To wydaje się być czymś, co miałoby standardowe rozwiązanie.

Odpowiedz

3

Musisz użyć funkcji z Text.Parsec.Prim (na przykład tokenPrim), aby zaimplementować własne "parsery pierwotne".

Te prymitywne analizatory składni zaktualizują stan wewnętrzny Parsec o informacje o pozycji i zwrócą czysty Token bez pozycji.

Powiązane problemy