2011-01-06 2 views
5

스칼라의 파서 결합자가 역 추적하지 않는 것처럼 보입니다.스칼라 파서 결합 자의 역 추적?

copy in to out . 

되돌아와 구문 분석을 용이해야한다 : 나는 문법 (아래 참조)를 올바르게 다음 "STMT"을 구문 분석 할 수 없습니다가

stmt: (to out(copy in)) 

또는 내가 뭔가를 놓친 게 뭐죠?

파서 :

당신은 2.8 PackratParsers를 사용하려면
type ExprP = Parser[Expr] 
type ValueP = Parser[ValExpr] 
type CallP = Parser[Call] 
type ArgsP = Parser[Seq[Expr]] 

val ident  = "[a-zA-Z\\+\\-\\*/%><\\\\\\=]+".r 
val sqstart = "\\["       .r 
val sqend  = "\\]"       .r 
val del  = ","       .r 
val end  = "\\."       .r 

def stmt: ExprP  = expr <~ end 
def expr: ExprP  = ucall | call | value 
def value: ValueP = ident ^^ {str => IdentExpr(str)} 
def call: CallP  = (args ~ ident ~ expr) ^^ {case args ~ method ~ upon => Call(args, method, upon)} 
def ucall: CallP  = (ident ~ expr) ^^ {case method ~ upon => Call(Seq(), method, upon)} 
def args: ArgsP  = advargs | smplargs 
def smplargs: ArgsP = expr ^^ {e => Seq(e)} 
def advargs: ArgsP = (sqstart ~> repsep(expr, del) <~ sqend) ^^ {seq => seq} 
+0

작동이 끝나면 스택 오버플로가 발생합니다. 업데이트 된 파서. – Anonymous

답변

4

. packrat 파서가 유일한 backtracking 파서라고 생각합니다.

수정 : 2015 년 중반부터 fastparse을 사용해야합니다. 훨씬 빠르지 만 사용하기 쉽습니다 (특히 구문 분석을 통해 데이터 구조를 만들 때).

+0

그것은 그것을 고치는 것처럼 보이지 않습니다; 나는 여전히 (왼쪽 재귀 문법을 가지고있는) SO를 얻었고, packrat-parsing이 그것을 고칠 수 있어야한다고 들었다. 호출하기 전에 구문 분석 값을 만들면 구문 분석을 수행하지 않습니다 (역 추적을하지 않습니까?). 어쩌면 나는 packrat 구문 분석을 활성화하지 않았지만, PackratParser에서 혼합하고 모든 함수에서 PakratParser를 반환하도록했습니다. PackratParsers에 대해 알고 있습니까? – Anonymous

+1

오, 좋아, 이제 찾았 어. packrat-parser를 필요로하는 여러분 모두에게 : "def"를 "lazy val"로 바꾸고, "Parser [T]"를 "PackratParser [T]"로 바꾸고 PackatParser에서 파서 클래스/객체 믹스 인을 만드십시오. – Anonymous

+0

@Anonymous 마지막 지시 사항에 대해 "PackerParser에서 파서 클래스/오브젝트 믹스 인 만들기"를 더 명확히하십시오. 클래스에 대해 단순히 "PackratParsers를 사용하고 있습니까?" – javadba

3

문제는 되돌아 오지 않습니다. scala.util.parsing.combinator의 표준 | 연산자는 역 추적을 수행합니다. 문제는 왼쪽 재귀입니다 (exprcallargssmplargsexpr). 실제로 Packrat 파싱이 도움이 될 수 있습니다.

관련 문제