2016-09-19 10 views
0

私はscala.util.parsing.combinatorを使ってパーサと文法を書いています。 私の入力は":za >= 1 alok && :ft == 9"Scala Parser Combinators:タイプのリスト

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)* 

ですが、私はサンプル文字列を解析するとき、結果が期待されていません。 &&の後の2番目の式は解析されません。 &&を使用して複数の表現を結合することができます。

私が実行:

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

出力は次のとおりです。

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

私が解析されて第二の発現を参照してくださいいけません。誰かが私がここで逃したことを助けることができますか?

EDIT は-----------------------------------

要件はList[Expression]です。 私はアンスで言及変化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. 

エラーは次のとおりです: 私は別デフ書く場合 型の不一致が。 found:〜[Expression、Expression]] required:式。

[式、式]をリスト[式]に変換するにはどうすればよいですか?

おかげ

+0

というようにコンパイルされます。 '1 alok'の後ろに余分なスペースがあることに気付かせてください。そして、余分なスペースが原因です。次の '式'パーサは、 ' && ' –

+0

で区切られた2つの式を期待しています。そのため、第1クラスのメンバとして ' 'あなたの文法の空間を傷つけないでください。 –

+0

ありがとうございました。はい、それは問題です。 && から空白を削除しようとしました。このケースではうまくいった。しかし、私は別の式=> ":za> = 1 &&:ft == 9 &&:wq == 12"を与えました。 出力はList((Expression(za、> =、1)〜Some(Expression(ft、==、9)))) – Alok

答えて

1

必要な修正されました:

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

&&全体にスペースを削除し、それが動作するはずです。これは、すでに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"を与えました。 – Alok

+0

私はこの問題がdef式でもあると信じています= expression〜opt( "&&" 〜式)*。私はこれがList [Expression]を返すと期待していました。しかし、 'opt(" && "〜> expression")に 'opt'があるので、[Expression、Option [Expression]] – Alok

+0

を返します。今は '*'を使用しているので '0以上 'を意味するので' opt'は必要ありません。 –