Próbuję nauczyć się Parsec przez zaimplementowanie małego parsera wyrażeń regularnych. W BNF, moja gramatyka wygląda mniej więcej tak:Używanie Parsera do parsowania wyrażeń regularnych
EXP : EXP *
| LIT EXP
| LIT
Próbowałem zaimplementować to w Haskell jak:
expr = try star
<|> try litE
<|> lit
litE = do c <- noneOf "*"
rest <- expr
return (c : rest)
lit = do c <- noneOf "*"
return [c]
star = do content <- expr
char '*'
return (content ++ "*")
Istnieją pewne nieskończone pętle tutaj chociaż (np expr -> star -> wyrażenie bez zużywania żadnych tokenów), co sprawia, że pętla parsera trwa wiecznie. Naprawdę nie jestem pewien, jak to naprawić, ponieważ z natury star
wynika, że zużywa on swój obowiązkowy token na końcu.
Jakieś myśli?
Wow. To takie proste, prawie wydaje się, że to oszustwo. – Xodarap
Byłoby jeszcze łatwiej, gdyby "Kolejność, Wybór :: Termin -> Termin -> Termin" zamiast "[Term] -> Termin", ale myślę, że to pokazuje, jak radzić sobie z AST, który nie pasuje dokładnie drzewo parsowania ... – pat