簡體   English   中英

具有可選值的解析器組合器^^

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM