[英]Parser Combinator ^^ with Optional Values
我正在嘗試修改Action中的DSL示例。
原來,這個代碼是用來解析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
遵循account
。
例:
(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
語句以支持解析可選的 “not”值?
a <~ "FOO" ~> b
的意思是“忽略的解析器結果"FOO"
和b
,並返回的結果a
”。
像這樣重寫你的方法:
lazy val order: Parser[Order] =
items ~ opt("FOO") ~ opt("not") ~ account_spec ^^ {
case i ~ _ ~ n ~ a => println(n); Order(i, a)
}
~>
和<~
常規助記符:您可以從開始到操作符或從操作符到結尾忽略,但不能忽略表達式的中間部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.