2011-09-08 9 views
1

현재 Text.Parsec.Expr 모듈을 사용하여 스크립팅 언어의 하위 집합을 구문 분석합니다.파섹 오류 - try가 작동하지 않는 것 같습니다.

는 기본적으로,이 언어의 명령 두 가지 종류가 있습니다 : 양식 $var = expr의 할당 및 형태 $var = $array[$index]의 명령 -이 물론 다른 명령의,하지만 이건 내 문제를 설명하기 위해 충분하다.

대응 형 파서와 함께 이것을 나타 내기 위해 Command 유형을 만들었습니다. 여기서 할당에 대한 expr은 Parsec의 buildExpressionParser에 의해 처리됩니다.

이제 문제가 발생했습니다. 먼저 구문 분석 코드 :

main = case parse p "" "$c = $a[$b]" of 
      Left err -> putStrLn . show $ err 
      Right r -> putStrLn . show $ r 
    where p = (try assignment <|> command) <* eof -- (1) 

전체 코드 (50 개 라인) 여기에 붙여 : Link

문제는 (당신이 파섹 설치 한 경우 컴파일해야한다), 그 구문 분석 실패 이후 assignment 아무튼 ' 이전에 try이 있더라도 구문 분석이 성공적으로 완료되었습니다. 구문 분석 순서 (try command <|> assignment)를 반대로하면 문제가 해결되지만 내 경우에는 가능하지 않습니다. 물론

나는 더 문제를 찾기 위해 노력하고 내가 expr = fail "" 말을하면 해석이 완료 이후 문제가 표현 파서 (buildExpressionParser에 의해 구축)이라고 그것은 나에게 나타납니다. 그러나 나는이 동작을 설명 할 파섹 소스에서 아무것도 찾을 수 없습니다. 사실 assigment가 (일반 where p = assignment와 그것을 시도) $c = $a을 소모 여기에 성공 않기 때문에

답변

3

당신 파서는 실패합니다. 그런 다음 eof (또는 나머지는 expr에서 assigment까지)이므로 오류가 발생합니다. '명령'의 시작은 '할당'의 인수가 var (예 : $c = $a) 일 때 '할당'과 동일합니다. 당신이 commandassignment을 취소 할 수 없습니다 그러나 다른 방법이 특정 예제 일이 될 수 있도록 이유를 확실하지 :

main = case parse p "" "$c = $a[$b]" of 
     Left err -> putStrLn . show $ err 
     Right r -> putStrLn . show $ r 
    where p = try (assignment <* eof) <|> (command <* eof) 
+0

감사합니다, 그것 뿐이다. – bzn

관련 문제