Custom Token 데이터 유형이 포함 된 Parsec-3.1.0
문제
parsec-3.1.0 ( http://hackage.haskell.org/package/parsec-3.1.0 )는 모든 토큰 유형과 함께 작동합니다. 그러나 텍스트. 더 일반적인 상대가없는 것 같습니다.
내 자신의 버전을 정의해야합니까, 아니면 뭔가를 놓쳤습니까?
아마도 Haskell에는 다음을 허용하는 다른 Parser 라이브러리가있을 것입니다.
- 맞춤형 토큰 유형
- Custom Parser State (Stateful Format -Wavefront OBJ를 구문 분석해야합니다)
해결책
일반화 된 버전 oneOf
, noneOf
, 그리고 anyChar
일반화 된 상태에서 구축 할 수 있습니다 satisfy
, 충분히 :
oneOfT :: (Eq t, Show t, Stream s m t) => [t] -> ParsecT s u m t
oneOfT ts = satisfyT (`elem` ts)
noneOfT :: (Eq t, Show t, Stream s m t) => [t] -> ParsecT s u m t
noneOfT ts = satisfyT (not . (`elem` ts))
anyT :: (Show t, Stream s m t) => ParsecT s u m t
anyT = satisfyT (const True)
satisfyT :: (Show t, Stream s m t) => (t -> Bool) -> ParsecT s u m t
satisfyT p = tokenPrim showTok nextPos testTok
where
showTok t = show t
testTok t = if p t then Just t else Nothing
nextPos p t s = -- however you update position for your token stream
이것들의 일반화가 누락 된 것처럼 보일지 모르지만, 여기서 이러한 일반화는이 유형에 대한 특정 가정을 할 것임을 알 수 있습니다. t
누군가의 토큰 유형에 해당되지 않을 수 있습니다. 그것은 인스턴스라고 가정합니다 Show
그리고 Eq
, 그러나 나는 그들이 다른 방법으로 표시되는 토큰 유형을 상상할 수 있습니다. show
, 및 해당 토큰 클래스의 멤버십은 ==
그리고 elem
.
마지막으로, 일단 토큰 유형이 더 이상 Char
, 당신이 위치를 나타내고, 따라서 그것을 업데이트 한 방법은, 당신의 토큰과 스트림 표현에 크게 의존합니다.
따라서보다 일반화 된 형태가 존재하지 않는 이유를 알 수 있습니다.
제휴하지 않습니다 StackOverflow