2012-09-05 3 views
1

나는이 같은 여러 문자열이 있습니다이 구조체를 파싱하는 방법 : "name [arg, arg]"에 스칼라 연결자 파서를 사용 하시겠습니까?

name[arg,arg,arg] 
name[arg,arg] 
name[arg] 
name 

내가 스칼라 콤비 파서로 구문 분석 원을, 이것은 내가 얻을 관리가 최고입니다 : 그것은 name에서 작동

object TaskDepParser extends JavaTokenParsers { 
    def name: Parser[String] = "[^\\[\\],]+".r 
    def expr: Parser[(String, Option[List[String]])] = 
    name ^^ { a => (a, None) } | 
    name ~ "[" ~ repsep(name, ",") ~ "]" ^^ { case name~_~args~_ => (name, Some(args)) } 
} 

을하지만, name[arg]에서 작동하지 않음 - \ z '이지만 예상치는 [' found입니다. 그것을 고칠 수 있습니까?

+0

주위를 뒤집어 놓으면 효과가있을 것이라고 생각합니다 ... 이름이 첫 번째 규칙에 의해 빨려 들어간 것 같아요. 그러면 입력에 실패할까요? –

+0

@ TonyK. - 와우, 바보. 당신 말이 맞아요. 답변을 게시 할 수 있습니다. 동의하겠습니다. – Rogach

답변

4

@TonyK는 이미 자신의 의견에 대답을주었습니다. 하지만 싶어 스칼라 파서 콤비는 이미 옵션 값을 분석 할 수 있음을 시사 : ^^ 불필요한 두둑 매칭을 방지하기 위해 전용 왼쪽 또는 오른쪽으로 결과를 유지할 수

object TaskDepParser extends JavaTokenParsers { 
    def name: Parser[String] = """[^\[\],]+""".r 
    def expr: Parser[(String, Option[List[String]])] = 
    name ~ opt("[" ~> repsep(name, ",") <~ "]") ^^ { case name ~ args => (name, args) } 
} 

~><~. 또한 나는 이스케이프를 많이 피하기 위해 문자열에 3 중 따옴표를 사용합니다.

2

만약 당신이 그것을 넘겨 주면 작동하는 것 같아요 ... 이름은 첫 번째 규칙에 의해 빨려 들어가고 입력에 실패합니다.