Scala Combinator Parsers- 숫자 문자열과 가변 문자열을 구별합니다.
-
05-07-2019 - |
문제
저는 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
.
제휴하지 않습니다 StackOverflow