2014-09-15 2 views
4

줄 끝 "\ r \ r \ n"이있는 파일을 가지고 있으며 파서 eol = string "\r\r\n" :: Parser String을 사용하여 처리합니다. 이 구분 기호 사이의 줄 목록을 얻으려면 eol에 캡처되지 않는 텍스트를 반환하는 파서와 함께 sepBy을 사용하고 싶습니다. 문서를 살펴보면 파서를 무효화하는 결합 자 ('”\r\r\n” 패턴'이외의 파서)를 보지 못했습니다.Parsec을 사용하여 파서를 무효화하는 방법

나는 sepBy (many anyToken) end을 사용해 보았지만, many anyToken은 욕심이 많으며, eol과 일치하지 않습니다. 나는 many (noneOf "\n\r")을 사용할 수 없다. 내 텍스트에 하나의 '\n' 문자가 포함되어 있기 때문에 나는 사용할 수 없다.

string "\r\r\n"의 역수를 구할 수있는 연결자가 있습니까?

답변

3

임시 응답으로, manyTill anyChar (try eol)은 내가 원하는 것을 수행합니다. 필자의 원래 질문의 일부로, 파서를 무효화하는 일반적인 방법이 있는지 또는 내가 원하는 것을 수행하기위한 또 다른 권장 방법이 있는지 여부에 관심이 있습니다.

+2

합니까 notFollowedBy을 도움? – Tim

+0

제안을 주셔서 감사합니다. @Tim, 아직 '많은'형식 파서가 필요하지 않은 경우이 방법이 도움이 될 것입니다. – beardc

7

나는 거꾸로 돌아가고 싶어합니다. Parsec 파서는 입력을 잘라 내지 않고 출력을 만듭니다. 당신이 원하지 않는 것에 대해 생각함으로써 파싱을 시도할수록 어려울 것입니다. 허용 할 수있는 것을 상향식으로 생각하고 잘라내는 곳에서 위로 내려 가지 말아야합니다.

가장 기본적인 것부터 시작해야합니다. 이됩니다. 예를 들어, 식별자를 공백 앞에있는 모든 것으로 생각하지 마십시오. 영숫자 데이터가 뒤 따르는 문자로 생각하십시오. 그런 다음 공백으로 구분하여이를 선상에있는 다른 것들과 결합 할 수 있습니다. 당신이 성공적으로 당신이 온라인에서 원하는 것을 분석하고 거부 파서 유효하지 않은 라인이 여러 라인 분석한다 완료 만

line = do 
     i <- identifier 
     whiteSpace 
     string "=" 
     e <- expr 
     return $ Line i e 

: (Text.Parsec.Combinator에서)

lines = sepBy line eol 
+0

조언 해 주셔서 감사합니다. 필자의 경우, 다소 표준적인 구조를 따르는 대부분의 라인에 대해, 당신과 비슷한 기초에서 파서를 만들었다. 이 질문에 대해서는, 구조체 파서와 일치하지 않는 다른 모든 것을 빌드하려고합니다. 영숫자, 개행 문자, 일부 '\ 652 ...'유형 문자 또는 모두 사이에있는 모든 것을 포함 할 수 있습니다. "\ r \ r \ n"구분 기호. 이 경우 캡처하고 싶지 않은 시퀀스가 ​​아닌 가능한 모든 문자를 열거하는 것이 지루한 일이 아니겠습니까? 아니면 아직도 잘못 생각하고 있습니까? – beardc

+0

@ BirdJaguarIV "\ r \ r \ n"사이에 구조가 없습니까? 확실하게 당신은 절대적으로 무언가가가는 곳에서 무작위로 끈을 원하는 것이 아닌가? 진정으로 그렇지 않다면 파싱을하지 않고 그냥 자르고 Split 패키지의 Data.List.Split에서 splitOn의 단일 응용 프로그램을 사용할 수 있습니다. 그러나 각 줄을 의미있는 데이터로 분리하려는 경우 sepBy와 결합하기 전에 원하는 데이터의 각 하위 구조/비트에 대해 하나의 패스러를 정의해야합니다. 규칙이 없으면 분할하고 규칙이 있으면 구문을 분석합니다. 파서를 분할 함수로 사용하지 마십시오. – AndrewC

+0

@BirdJaguarIV 처리중인 데이터는 무엇입니까? 당신은 ech 라인의 감각을 만들거나 재미없는 캐릭터의 단일 한 얼룩으로 취급해야합니까? – AndrewC

관련 문제