1
我試着去創建一個解析器的小語種與命令包括標籤和GOTO:Scala中追加一個標籤不變的情況下,類
...
lazy val cmds = opt("{")~>rep(cmd<~opt(";"))<~opt("}") ^^ {...}
lazy val cmd = ("if"~boolexpr~"then"~cmds~"else"~cmds
^^ { case _~b~_~c1~_~c2 => IFCMD(boolexpr,c1
| ident ~":="~numericLit ^^ {case i1~_~v => ASSIGN(i1,v) }
| "goto" ~>ident ^^ { case l => GOTO(l) }
| ident~":"~cmd ^^ { case l~_~c => <APPENDLABELTO_CORE>
...
的GOTO
,IFCMD
等都是延長抽象類case類Core
與功能/斯卡拉樣/不可改變objecty保持-WAY我在想,定義Core
這樣是錯誤的:
abstract class Core(var label:Option[String] = None)
,但會允許我用<APPENDLABELTO_CORE>
與更換部件:
| ident~":"~cmd ^^ { case l~_~c => c.label = Some(l); c }
任何人都可以指出「scalaish」的方式來做到這一點?
(我試過c copy (label=Some(l))
但抽象基類還沒有得到自動拷貝構造函數魔法)