私は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:式。
[式、式]をリスト[式]に変換するにはどうすればよいですか?
おかげ
というようにコンパイルされます。 '1 alok'の後ろに余分なスペースがあることに気付かせてください。そして、余分なスペースが原因です。次の '式'パーサは、 ' && ' –
で区切られた2つの式を期待しています。そのため、第1クラスのメンバとして ' 'あなたの文法の空間を傷つけないでください。 –
ありがとうございました。はい、それは問題です。 && から空白を削除しようとしました。このケースではうまくいった。しかし、私は別の式=> ":za> = 1 &&:ft == 9 &&:wq == 12"を与えました。 出力はList((Expression(za、> =、1)〜Some(Expression(ft、==、9)))) –
Alok