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.