0
我試圖從DSLs in Action修改示例。解析器組合器^^具有可選值
最初,這段代碼被用來解析items
後跟account
。
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)
}
FOO
必須遵循account
,並且可選地,將遵循not
。
例子:
(100 IBM shares to buy at max 45) FOO not for account "A1234
---------- item ------------------ --- --- ------ account ----
然而,上面的代碼給了我這個編譯時錯誤:
[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
聲明支持解析可選「不」值?
謝謝@senia。你的回答清除了我對'〜>'和'<〜'的誤用。 –
@KevinMeredith:其實你可以使用'items〜(opt(「FOO」)〜> opt(「not」)〜account_spec)^^ {case i〜(n〜a)=> ...}。 – senia
如果我們加上'case i〜foo〜n ...',是不是'foo'只能等於'None'和'Some(「FOO」)'?我在'foo match'的模式匹配{case None => ... case某些(「FOO」)'告訴我'match'不是窮盡的。 –