스칼라 파서의 확장을 사용하여 두 가지 유형의 정보 (패턴 및 필터)를 구문 분석하고 싶습니다. 이러한 패턴과 필터는 순서에 관계없이 나타날 수 있습니다.파서 대체 연산자 | 실패
참고로val patternRepetition: Parser[List[ParsedPattern]] = {
rep1sep(pattern, ".") <~ opt(".")
}
val patternOrFilter: Parser[List[ParsedPattern]] = {
patternRepetition | rep1(filterSpec)
}
val patternList: Parser[List[ParsedPattern]] = {
rep1(patternOrFilter) ^^ {
_.flatten
}
}
, 코드 : 필터 패턴은 어떤 순서로 공급 될 수 있도록 패턴 변수 정의 필터 형식 pattern
및 filter
함께
pattern
및
filter
은이 게시물의 끝에 표시됩니다. 일치하도록되어 무엇
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
:
,210val filter: Parser[ParsedPattern] = {
"FILTER(" ~> "?A" ~ ">" ~ "?B") <~ ")" ^^ {
case lhs ~ comp ~ rhs =>
ParsedPattern(lhs, comp, rhs)
}
}
이 다음 줄을 일치 :
FILTER(?A > ?B)
오, 맞습니다. 지금 문제 설명에 추가했습니다. 불행히도 이미 내 코드에이 코드가 있습니다. – ljacqu
작은 * 작동하지 않는 예가 있습니까? 여기에 귀하의 질문에 기반한 * working * 예제가 있습니다. ParsedPattern이 없기 때문에 일부 코드를 제거해야했습니다. http://scalafiddle.net/console/c359889a833e7612e0cff1dc69d272bc – planetenkiller
시간 내 주셔서 감사합니다. 이것은 내가 얻을 수있는 가장 짧은 것입니다 : http://scalafiddle.net/console/65d90fc6d307590b14e9e1800d4e8eab 나는 길이에 대해 사과드립니다. URL 부분이 문제를 일으키는 것 같습니다. 의견을 통해, 나는 누락 된 부분이 문제를 없애는 3 곳을 지적했다. – ljacqu