Scala 具有可选值的解析器组合器^

Scala 具有可选值的解析器组合器^,scala,parsing,Scala,Parsing,我试图修改来自的一个示例 最初,此代码用于解析项目,后面是帐户 lazy val order: Parser[Order] = items ~ account_spec ^^ { case i ~ a => Order(i, a) } 可以使用上述解析器解析以下文本: (100 IBM shares to buy at max 45) for account "A1234 ------------- item ------------- ------

我试图修改来自的一个示例

最初,此代码用于解析
项目
,后面是
帐户

  lazy val order: Parser[Order] = 
    items ~ account_spec ^^ {
      case i ~ a => Order(i, a)
    }
可以使用上述解析器解析以下文本:

(100 IBM shares to buy at max 45) for account "A1234
------------- item -------------  ------ account ----
但是,我想向解析器添加
FOO
和可选的
not
值:

  lazy val order: Parser[Order] = 
    items <~ "FOO" ~> ("not"?) ~ account_spec ^^ {
      case i ~ n ~ a => println(n); Order(i, a)
    }
但是,上面的代码给了我这个编译时错误:

[WARNING] ....\OrderDsl.scala:19: error: constructor cannot be instantiated to 
expected type;
[WARNING]  found   : ch8.trading.semantic.dsl.OrderDsl.~[a,b]
[WARNING]  required: ch8.trading.semantic.dsl.AST.Items
[WARNING]       case i ~ n ~ a => println(n); Order(i, a)
[WARNING]                  ^
如何修改
case
语句以支持解析可选的“not”值?

ab
表示“忽略解析器的结果”
“FOO”
b
并返回
a
的结果”

按照以下方式重写您的方法:

lazy val order: Parser[Order] = 
  items ~ opt("FOO") ~ opt("not") ~ account_spec ^^ {
    case i ~ _ ~ n ~ a => println(n); Order(i, a)
  }

通用助记符,用于
~>
谢谢,@senia。你的回答澄清了我对
~>
@KevinMeredith的错误使用:事实上你可以使用
项目(opt(“FOO”)~>opt(“not”)~account\u spec)^{case i~(n~a)=>…}
。如果我们加上
case i~FOO~n…
,那么
FOO
是否真的只能等于
一些(“FOO”)
?我在
foo match{case None=>…case Some(“foo”)
上的模式匹配告诉我
match
是非穷举的。@KevinMeredith:是的,但编译器只知道
foo
的类型。您应该使用
foo.isDefined
lazy val order: Parser[Order] = 
  items ~ opt("FOO") ~ opt("not") ~ account_spec ^^ {
    case i ~ _ ~ n ~ a => println(n); Order(i, a)
  }