2014-10-09 2 views
0

나는이 간단한 파서를 명령 행에서 작성했다. [ps auxww | ./myparser]를 실행하고 ps 명령의 출력을 구문 분석하여 내가 만든 프로세스 데이터 구조에 삽입합니다. 결과 문자열의 한 줄을 파싱하는 데 성공했지만 이제는 전체 문자열을 구문 분석하고 단일 프로세스가 아닌 [프로세스]를 반환하려고했습니다. 문제는 parsePS를 구현하는 방법입니다. 모든 단일 행을 구문 분석하고 Process 목록을 반환하고이를 터미널에 인쇄하려면 myParser를 여러 번 호출해야합니다. 누군가 나를 도울 수 있습니까?하스켈 명령 시스템 파서

답변

1

나는 당신에게 무엇이 실패했는지 모르겠다. 그러나 나는 그 간격이 당신을 죽이고 있다고 생각하고있다. 그렇다면 두 가지 아이디어가 도움이 될 것입니다.

끝에 공백을 사용하려면 myParser을 수정하고 연결자 many을 사용해야합니다.

myParser = do 
    ... 
    spaces 
    command <- pCommand 
    spaces -- CONSUME END OF LINE 
    return Entry{ ... } 

many myParser이 작동해야합니다.

또는 입력을 개별적으로 줄로 분리하고 각각을 개별적으로 구문 분석 할 수 있습니다. 당신은 순서대로 각 줄을 구문 분석과를 반환하는 방법을 찾고있는 것처럼

argLines <- fmap lines getContents 

0

그것은 나에게 소리 (내가? 당신이 hGetContents 전에 getLine를 통해 첫 선을 구울 의미를 가지고) 파싱 ​​된 결과 목록. Prelude의 mapM 어때요?

myParser :: String -> Parser Process이면 Parsec의 파서 유형에 대해 일반적인 이름을 사용하여 찾고있는 것으로 보이는 mapM myParser :: [String] -> Parser [Process]입니다. 따라서 순차적으로 구문 분석하려는 행 목록 (lns이라고 함)이있는 경우 parse (mapM myParser) lns을 사용하여 원하는 결과를 얻을 수 있습니다.