문제

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, 당신이 위치를 나타내고, 따라서 그것을 업데이트 한 방법은, 당신의 토큰과 스트림 표현에 크게 의존합니다.

따라서보다 일반화 된 형태가 존재하지 않는 이유를 알 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top