ラベルと 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
Functional/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 }
これを行うための「スカッシュな」方法を指摘できる人はいますか?
(試してみましc copy (label=Some(l))
たが、抽象基本クラスには自動コピーコンストラクターの魔法がありません)