我正在尝试使用包括标签和 goto 在内的命令为小语言创建解析器:
...
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
案例类Core
为了与功能/类似scala/不可变对象的方式保持一致,我认为这样定义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))
了,但抽象基类没有自动复制构造函数的魔力)