저는 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)*
제거 공간과 그것을 작동합니다 :
감사
'을 컴파일합니다. '1 alok' 다음에 여분의 공간을 알아보십시오. 그리고 여분의 공백이 원인입니다. 다음 표현식 파서가 두 개의 표현식을 ' && '로 바꿀 것으로 예상하므로 –
입니다. 그 이유는 ''을 첫 번째 클래스 멤버로 사용하는 것이 좋습니다. 문법의 우주를 과소 평가하지 마십시오. –
감사합니다. 예, 그것이 문제입니다. && 에서 공백을 제거하려고했습니다. 이 경우에 효과가있었습니다. 그러나 나는 다른 식 => ": za> = 1 && : ft == 9 && : wq == 12"을주었습니다.이 경우에는 3이 아니라 2식이 필요했습니다. 출력은 List입니다 (Expression (za,> =, 1) ~ Some (Expression (ft, ==, 9)))) –
Alok