2014-11-24 4 views
0

스칼라 파서의 확장을 사용하여 두 가지 유형의 정보 (패턴 및 필터)를 구문 분석하고 싶습니다. 이러한 패턴과 필터는 순서에 관계없이 나타날 수 있습니다.파서 대체 연산자 | 실패

참고로
val patternRepetition: Parser[List[ParsedPattern]] = { 
    rep1sep(pattern, ".") <~ opt(".") 
} 

val patternOrFilter: Parser[List[ParsedPattern]] = { 
    patternRepetition | rep1(filterSpec) 
} 

val patternList: Parser[List[ParsedPattern]] = { 
    rep1(patternOrFilter) ^^ { 
    _.flatten 
    } 
} 

, 코드 : 필터 패턴은 어떤 순서로 공급 될 수 있도록 패턴 변수 정의 필터 형식 patternfilter 함께

각각, I는 이들을 결합 할 patternfilter은이 게시물의 끝에 표시됩니다. 일치하도록되어 무엇 patternList


몇 가지 예 :

?A ?C ?B .
?A ?C ?B . 
FILTER(?A > ?B)
?A ?C ?B . 
?A ?C ?B 
FILTER(?A > ?B)
?A ?C ?B 
FILTER(?A > ?B) 
?A ?C ?B

는 는 즉시 필터가 나타납니다, 파서는 예상치 못한 (에 대해 불평

캐릭터. 그러나 |에서 을 patternOrFilter으로 변경하면 두 번째 및 세 번째 예와 같이 필터 목록 뒤에 패턴 목록이 성공적으로 파싱되므로 대체 연산자 |을 사용하는 데 문제가 있다고 생각됩니다.

따라서 내 질문 : | 연산자가 필터를 인식하지 못하는 이유는 무엇입니까?


패턴 현재 정의는 다음과 같다

val pattern: Parser[ParsedPattern] = { 
    "?A" ~! "?C" ~! "?B" ^^ { 
    case s ~ p ~ o => 
     ParsedPattern(s, p, o) 
    } 
} 

을이 분명히 일치 :

필터는 다음 코드로 정의된다
?A ?C ?B 

:

,210
val filter: Parser[ParsedPattern] = { 
    "FILTER(" ~> "?A" ~ ">" ~ "?B") <~ ")" ^^ { 
    case lhs ~ comp ~ rhs => 
     ParsedPattern(lhs, comp, rhs) 
    } 
} 

이 다음 줄을 일치 :

FILTER(?A > ?B) 

답변

1

| 한쪽에만 (패턴 또는 필터 있지만 둘 다)를 구문 분석합니다.

같은 새 규칙 (변경 유형, 나는 _를 사용) 해보십시오 :

def patternOrFilterAll: Parser[_] = { 
    rep1(patternOrFilter) 
} 

당신은 당신이 원하는 반환 값을 얻기 위해 patternRepetitionpatternOrFilter을 변경해야 할 수 있습니다.

귀하의 파서 때문에 ~!의 사용 작동하지 않습니다

편집. 파서 대신 ~을 사용하면 예제가 작동합니다 (예 :http://scalafiddle.net/console/97ea3cfb64eeaa1edba65501d0bb3c86).

이유 : 파서가 역 추적을 사용하고 ~!을 사용 중지합니다. 파서는 url 정규 표현식이 실패 할 수 있기 때문에 역 추적이 필요합니다.

+0

오, 맞습니다. 지금 문제 설명에 추가했습니다. 불행히도 이미 내 코드에이 코드가 있습니다. – ljacqu

+0

작은 * 작동하지 않는 예가 있습니까? 여기에 귀하의 질문에 기반한 * working * 예제가 있습니다. ParsedPattern이 없기 때문에 일부 코드를 제거해야했습니다. http://scalafiddle.net/console/c359889a833e7612e0cff1dc69d272bc – planetenkiller

+0

시간 내 주셔서 감사합니다. 이것은 내가 얻을 수있는 가장 짧은 것입니다 : http://scalafiddle.net/console/65d90fc6d307590b14e9e1800d4e8eab 나는 길이에 대해 사과드립니다. URL 부분이 문제를 일으키는 것 같습니다. 의견을 통해, 나는 누락 된 부분이 문제를 없애는 3 곳을 지적했다. – ljacqu