문제

저는 Cay Horstmann의 콤비네이터 파서 연습을하고 있습니다. 숫자를 나타내는 문자열과 매치 문에서 변수를 나타내는 문자열을 구별하는 가장 좋은 방법에 대해 궁금합니다.

def factor: Parser[ExprTree] = (wholeNumber | "(" ~ expr ~ ")" | ident) ^^ {
    case a: wholeNumber  => Number(a.toInt)
    case a: String => Variable(a)
}

두 번째 줄은 "Case A : Wholumber"는 합법적이지 않습니다. Regexp에 대해 생각했지만 "Case"로 작업 할 수있는 방법을 찾지 못했습니다.

도움이 되었습니까?

해결책

나는 그것을 조금 나누고 케이스 분석을 |. 이것은 콤비네이터의 장점 중 하나이며 일반적으로 LL (*) 파싱입니다.

def factor: Parser[ExprTree] = ( wholeNumber ^^ { Number(_.toInt) }
                               | "(" ~> expr <~ ")" 
                               | ident ^^ { Variable(_) } )

밑줄 구문에 익숙하지 않으면 사과드립니다. 기본적으로 그것은 단지 "대체를 의미합니다 N동봉 함수 값에 대한 매개 변수 ". { Variable(_) } 동일합니다 { x => Variable(x) }.

여기서 구문 마법의 또 다른 부분은 다음과 같습니다 ~> 그리고 <~ 대신 운영자 ~. 이 연산자들은 해당 용어의 구문 분석에 통사론 두 파렌의 두 가지 중에서 결과는 결과에 의해서만 결정되어야합니다. expr. 그래서 "(" ~> expr <~ ")" 정확히 같은 것과 일치합니다 "(" ~ expr ~ ")", 그러나 내부 결과 값을 검색하기 위해 추가 사례 분석이 필요하지 않습니다. expr.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top