2016-09-19 10 views
0

저는 scala.util.parsing.combinator를 사용하여 구문 분석기와 문법 작성기를 작성합니다. 내 입력 ":za >= 1 alok && :ft == 9"Scala Parser Combinators : Extract 형식의 목록

case class Expression(op1:Operand,operator:Operator,op2:Operand) 

def word: Parser[String] = """[a-z\\\s]+""".r ^^ { _.toString } 

def colonWord:Parser[Operand]=":"~> word ^^{case variable => Operand(variable)} 

def constant:Parser[Operand]="""^[a-zA-Z0-9\\\s-]*""".r ^^ {case constant => Operand(constant)} 

def expression:Parser[Expression] = colonWord ~ operator ~ constant ^^{ case op1~operator~op2 => Expression(op1, operator, op2)} 

def expressions = expression ~ opt(" && " ~> expression)* 

하지만 난 샘플 문자열을 구문 분석 할 때, 그 결과는 예상되지 않는다. && 뒤의 두 번째 표현식은 구문 분석되지 않습니다. &&을 사용하여 여러 표현식을 결합 할 수 있습니다.

난 실행할 때 :

val expr= ":za >= 1 alok && :ft == 9" 
    parse(expressions, expr) match { 
     case Success(matched, _) => println(matched) 
     case ..} 

출력된다 : I 번째 식은 해석되는 참조 말아

List((Expression(za ,>= ,1 alok)~None)) 

. 아무도 내가 여기 놓친 것을 도울 수 있습니까?

편집 -----------------------------------

요구 사항은 List[Expression]입니다. 나는 Ans By의에서 언급 한 변화를 incorporting, 말할 때 : 표현의

def expressions = expression ~ ("&&" ~> expression)* 

반환 형식은 [식] 목록이 아닙니다. 예를 들어 :

case class Condition(exprs: List[Expression], st:Statement) 
def condition = expressions ~","~statement ^^{ 
    case exprs~commaa~statement => Condition(exprs,statement) //This is giving error. 

오류는 다음과 같습니다 : 나는 또 다른 데프 작성하는 경우 유형 불일치를; 발견 : ~ [Expression, Expression]] 필수 : ​​표현식.

[Expression, Expression]을 List [Expressions]로 어떻게 변환합니까? &&에 걸쳐

expression ~ opt("&&" ~> expression)* 

제거 공간과 그것을 작동합니다 :

감사

+0

'을 컴파일합니다. '1 alok' 다음에 여분의 공간을 알아보십시오. 그리고 여분의 공백이 원인입니다. 다음 표현식 파서가 두 개의 표현식을 ' && '로 바꿀 것으로 예상하므로 –

+0

입니다. 그 이유는 ''을 첫 번째 클래스 멤버로 사용하는 것이 좋습니다. 문법의 우주를 과소 평가하지 마십시오. –

+0

감사합니다. 예, 그것이 문제입니다. && 에서 공백을 제거하려고했습니다. 이 경우에 효과가있었습니다. 그러나 나는 다른 식 => ": za> = 1 && : ft == 9 && : wq == 12"을주었습니다.이 경우에는 3이 아니라 2식이 필요했습니다. 출력은 List입니다 (Expression (za,> =, 1) ~ Some (Expression (ft, ==, 9)))) – Alok

답변

1

필요한 수정했다. 이는 이미 파서의 constant 파서의 공간을 덮고 있기 때문입니다.

편집 : 편집 질문을 바탕으로 이며,이 당신이 원하는 :

def expressions = expression ~ (("&&" ~> expression)*) ^^{ 
    case x ~ y => x :: y 
    } 

지금 expressions의 반환 형식이 List[Expression]입니다. condition은 이제 출력`List ((Expression (za,> =, 1 alok) ~ None))`에서`

+0

고마워요. 예, 그것이 문제입니다. && 에서 공백을 제거하려고했습니다. 이 경우에 효과가있었습니다. 그러나 나는 다른 식 => ": za> = 1 && : ft == 9 && : wq == 12"을주었습니다.이 경우에는 3이 아니라 2식이 필요했습니다. 내가 얻는 결과는 List이다. (Expression (za,> = 1) ~ Some (Expression (ft, ==, 9)))) – Alok

+0

나는 문제가 def expression = expression ~ opt ("&&" ~ 표현) *. 나는 이것이 List [Expression]을 돌려 주길 기대하고 있었다. 그러나'opt ("&&"~> expression ")에'opt'가 있기 때문에 [Expression, Option [Expression]] – Alok

+0

을 반환합니다. 이제'*'를 사용하고 있기 때문에 '0 이상'을 의미하므로'opt'는 필요 없습니다. –