Im essayant de créer un analyseur pour une petite langue avec les commandes, y compris les étiquettes et goto:Ajout d'une étiquette à des classes de cas immuables dans 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>
...
le GOTO
, IFCMD
etc sont des classes de cas s'étendant classe abstraite Core
Conformément à la fonctionnelle/scala-comme/immuable-objecty -Way Je pense que la définition Core
comme celui-ci est mal:
abstract class Core(var label:Option[String] = None)
mais me permettrait de remplacer la pièce avec <APPENDLABELTO_CORE>
avec: chemin
| ident~":"~cmd ^^ { case l~_~c => c.label = Some(l); c }
Quelqu'un peut-il indiquer le « scalaish » pour le faire?
(je l'ai essayé c copy (label=Some(l))
mais la classe de base abstraite n'a pas la magie automatique constructeur de copie)