【发布时间】:2011-03-28 09:57:42
【问题描述】:
我正在尝试使用包括标签和 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-like/immutable-objecty 方式保持一致,我认为像这样定义 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)),但抽象基类没有自动复制构造函数)
【问题讨论】:
标签: scala functional-programming parser-combinators case-class