하스켈에서 Parser Combinators (a la parsec)를 구현할 때 this tutorial을 따르고 있습니다. 이 게시물을 통해 언급 한 NanoParsec의 모든 것을 구현했습니다. 이제 몇 시간 동안 파서 결합자를 사용하여 try (look-ahead) 및 untilStop 구현
, 나는 꽤 작업-- try p. If p fails continue without consuming anything
try :: Parser a -> Parser a
try p = ...
-- Parser for everything, until the character-sequence stop appears.
-- If stop does not appear at all: fail
untilStop :: String -> Parser String
untilStop stop = ...
에게 untilStop
은 다음과 같이 다소처럼 보이는 않는 구현하기 위해 최선 시도를 구현하는 struggeling하고
untilStop :: String -> Parser String
untilStop (c : cs) = do
s <- some $ satisfy (/= d)
string (c : cs) <|> do
i <- item
untilStop (d : ds)
-- maybe use msum from MonadPlus to combine?
나는 방법을 알아낼 수 없었다 s
, i
과 재귀 호출을 결합하면 string
이 모든 것을 함께 얻지 못하기 때문에 영원히 실패하지 않습니다.
한번 생각해 보면 try
일 때 untilStop
은 간단해야합니다. 누군가 나를 올바른 방향으로 가르키거나 구현할 수 있습니까 (try
)?
지금 당장은 모나드, 응용 프로그램 및 관련 자료에 대해 배우기 때문에 파섹의 소스 코드를 이해하려고 시도하는 것은 불가능했습니다.
이 간단한 파서 라이브러리에'시도 '할 필요가 없습니다. 'p <|> q '는 이미'try p <|> q'처럼 행동합니다. 내가 맞습니까? – Euge
음'<|> :: 파서 a -> 파서 a -> 파서 a'는 내 * 시도한 * 옵션에 대한 대안이 필요합니다. 나는 단지 시도 할 수있는 무엇인가를 원했고 실패하면 아무것도하지 않고 단지'do' 표기법으로 다음 문장으로 넘어갔습니다. – elfeck
정확하게'<|>'이 이미 작동하는 방법입니다. – Euge