내가 스칼라에서 기본적인 SQL 파서를 작성한다고 가정 해 보겠습니다. 내가 인해 ~ tokens
의 rep(token)
에 전체 문구를 삼키고에서 selectclause을 방지 어떻게,스칼라 RegexParsers에서 욕심없는 일치
class Arith extends RegexParsers {
def selectstatement: Parser[Any] = selectclause ~ fromclause
def selectclause: Parser[Any] = "(?i)SELECT".r ~ tokens
def fromclause: Parser[Any] = "(?i)FROM".r ~ tokens
def tokens: Parser[Any] = rep(token) //how to make this non-greedy?
def token: Parser[Any] = "(\\s*)\\w+(\\s*)".r
}
이 SELECT foo FROM bar
에 대한 SELECT 문을 일치하려고 할 때 : 나는 다음 있나요?
즉, 스칼라에서 비 욕심 많은 일치를 지정하려면 어떻게해야합니까?
분명히하기 위해 String 패턴 자체에서 표준이 아닌 greedy 구문 (*?) 또는 (+?)을 사용할 수 있다는 것을 완전히 알고 있지만 상위 수준에서 지정하는 방법이 있는지 궁금해했습니다. 내부 def 토큰. 예를 들어,이 같은 토큰을 정의했다면 :
내가 데프 토큰 내부 담당자 (토큰) 비 욕심 일치를 지정할 수있는 방법을 다음def token: Parser[Any] = stringliteral | numericliteral | columnname
?
것 같다 : 정규 표현식 매처 (matcher)가 탐욕 일치하는 것으로 시작 수 있지만, 반면에 다음 역 추적한다 CFG가 실패 할 경우 더 짧은 일치를 시도하면 PEG의'*','+'및'? '연산자는 항상 탐욕스럽게 행동하고 가능한 한 많은 입력을 소비하며 결코 뒤로 추적하지 않습니다. 식'a *'는 항상 많은 것은 입력 문자열에서 연속적으로 사용 가능하므로'(a * a)'가 항상 실패합니다. –