2012-07-25 2 views
2

은 현재 내가 스칼라 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 식과 같아야하지만 ""이 아니어야합니다. ;-)

+2

'표현식'의 값은 무엇입니까? – drstevens

+0

표현식은 XPath –

+1

과 비슷할 수 있습니다. 나는 그것을 알아. lazy val relativePath : PackratParser [NodePath] = rep1sep (nodeExpression, "/") - 하나 이상의 "nodeExpressions" –

답변

3

"&""|"은 한 문자와 만 일치합니다. 내가 생각할 수있는 유일한 설명은 expression이 비어 있거나 그 자체가 & 또는 | 일 수 있다는 것입니다.

관련 문제