은 현재 내가 스칼라 2.9.2 에서 스칼라 PackratParsers을 사용하고하는 제한 생산은 다음과 같습니다스칼라 PacktRat 파서 운영자가 정확히 하나의
lazy val andExpression: PackratParser[Expression] = equalityExpression | expression ~ "&" ~ expression ^^ {
case x ~"&"~y => AndExpr(x,y)
}
lazy val orExpression: PackratParser[Expression] = andExpression | (expression ~ "|" ~ expression) ^^ {
case x ~"|"~y => OrExpr(x,y)
}
그것은 다음과 같은 입력
"a & b", "a | c", "(a & b) | c"
와 함께 잘 작동
그러나 파서가 너무 탐욕 스럽다는 것을 발견했습니다.
"a && b", "a &&& b", "a ||||| b"
잘 파싱됩니다. 나는 결합 자에 대한 명시적인 정규 표현자를 놓치고 있다고 생각한다. 정확히 e ~ "&".{1} ~ e
라고하는 것은 무엇입니까? 정확히 어떻게 연산자의 하나의 발생과 정확히 일치합니까?
내가하는 XPath
lazy val absolutePath: PackratParser[NodePath] = "/" ~ relativePath ^^ {
case "/" ~ rel => NodePath(rel.nodeExpr, true);
}
lazy val relativePath: PackratParser[NodePath] = repsep(nodeExpression , "/") ^^ {
case x =>
if (debug) printf("x=%s NodePath\n",x);
NodePath(x , false)
그리고 당신이 올바른지 유사하게 취급에게 표현을 쓰고 있어요 파서.
lazy val nodeExpression: PackratParser[Token] = qname | variable | step
lazy val expression = orExpression | nodeExpression | variable | literal | function | ...
NodePath(List[QName]())
"예!" 표현식은 empy이므로 "x &"및 "&x"가 성공적으로 구문 분석됩니다. 따라서 내 파서는 욕심을 나타냅니다.
relativeExpression
에 적어도 QName
이 포함되도록하려면 어떻게해야합니까?
기본적으로 문자열 ("x" , "/x", "x/y", "/x/y", ...)
은 유효한 XPath 식과 같아야하지만 ""
이 아니어야합니다. ;-)
'표현식'의 값은 무엇입니까? – drstevens
표현식은 XPath –
과 비슷할 수 있습니다. 나는 그것을 알아. lazy val relativePath : PackratParser [NodePath] = rep1sep (nodeExpression, "/") - 하나 이상의 "nodeExpressions" –