2010-03-20 4 views
11

나는 대안 해피 등에 전통적인 파서 발전기 솔루션과 같은 재귀 하강 파서 자바의 하위 집합을 구문 분석 하스켈의 파섹 분석 라이브러리를 사용하여 고려했습니다. Parsec은 사용하기가 매우 쉽습니다. 구문 분석 속도는 확실히 저를위한 요소가 아닙니다. 나는 Parsec으로 "백업"을 구현하는 것이 가능한지 궁금합니다. Parsec은 각각의 제품을 차례대로 시도하여 올바른 제작을 찾는 기술입니다.Haskell의 Parsec 라이브러리를 사용하여 백업과 함께 재귀 적 파생 파서를 구현할 수 있습니까?

Literal: 
    IntegerLiteral 
    FloatingPointLiteral 

은 내가 성공할 수있는 구문 분석을 얻기 위해이 두 가지 규칙을 주문하는 방법을 알아 내야 할 필요가 없게하는 방법을 싶습니다 간단한 예를 들어, JLS 자바 문법의 매우 시작을 고려한다. 약자로,이 같은 순진 구현 : "."

literal = do { 
    x <- try (do { v <- integer; return (IntLiteral v)}) <|> 
     (do { v <- float; return (FPLiteral v)}); 
    return(Literal x) 
} 

가 작동하지 않습니다 ... 같은 입력 "15.2"정수 파서 먼저 성공하고 모든 일이 질식 것입니다 원인이됩니다 상징. 이 경우 두 프로덕션을 다시 정렬하여 문제를 해결할 수 있습니다. 일반적인 경우에, 이와 같은 것을 발견하는 것은 악몽이 될 것이고, 나는 몇몇 경우를 그리워 할 가능성이 매우 높습니다. 이상적으로, Parsec이 나 같은 것을 찾아 낼 수있는 방법을 원합니다. 이것이 가능한가, 아니면 도서관에서 단순히 너무 많은 것을하려고 하는가? 파섹 문서는 "무한보기 미리 문법을 상황에 맞는 구문 분석"할 수 있다고 주장, 내가 여기서 뭔가를 할 수 있어야처럼 뭔가처럼 보인다.

답변

2

integer이 어떤 토큰 구분자까지 모든 것을 소비했는지 확인하려면 Parsec의 notFollowedBy을 사용하거나 가능한 모든 구문 분석 대안을 탐색하는 파서 연결자를 살펴보십시오. 먼저 염두에 두어야 할 것은 UU_Parsing 라이브러리입니다.

8

이 방법 중 하나는 try 연결자를 사용하는 것입니다.이 방법을 사용하면 파서가 전체 구문 분석을 실패하지 않고 입력을 소비하고 실패 할 수 있습니다.

은 대칭 선택 연산자를 구현하며, a +++ b = b +++ a이라는 사실이 입증되므로 실제로 어떤 순서가 중요하지 않습니다. 나는 다소 작기 때문에 ReadP의 부분적이지만, 실제로 강력한 파서를 구축하는 데 필요한 것을 제공합니다. 약간의 경험 후, 나는 ReadP``덜 마법에 걸린 오전

+2

참고. 때로는 발견하기 힘든 몇 가지 기하 급수적 인 행동을 보이며 실패하지는 않습니다. '파섹 (Parsec) '은 더 크고 까다 롭지 만, 이제 나는 더 나은 소프트웨어를 발견했다. – luqui