Guest User

Untitled

a guest
Jan 23rd, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.47 KB | None | 0 0
  1. trait VisitorsBase {self =>
  2. trait Node {
  3. def accept(v: V)
  4. }
  5. case class Add(l: Node, r: Node) extends Node {
  6. def accept(v: V) {
  7. v.visit(this)
  8. }
  9. }
  10. case class Sub(l: Node, r: Node) extends Node {
  11. def accept(v: V) {
  12. v.visit(this)
  13. }
  14. }
  15. case class Value(value: Int) extends Node {
  16. def accept(v: V) {
  17. v.visit(this)
  18. }
  19. }
  20. type V <: Visitor
  21. trait Visitor {self: V =>
  22. def visit(node: Add) {
  23. println("Add!")
  24. node.l.accept(this)
  25. node.r.accept(this)
  26. }
  27. def visit(node: Sub) {
  28. println("Sub!")
  29. node.l.accept(this)
  30. node.r.accept(this)
  31. }
  32. def visit(node: Value) {
  33. println("Value: " + node.value)
  34. }
  35. }
  36. }
  37.  
  38. object VisitorsPlus extends VisitorsBase {
  39. type V = Visitor
  40. case class Mul(l: Node, r: Node) extends Node {
  41. def accept(v: V) {
  42. v.visit(this)
  43. }
  44. }
  45. case class Div(l: Node, r: Node) extends Node {
  46. def accept(v: V) {
  47. v.visit(this)
  48. }
  49. }
  50. class Visitor extends super.Visitor {
  51. def visit(node: Mul) {
  52. println("Mul")
  53. node.l.accept(this)
  54. node.r.accept(this)
  55. }
  56. def visit(node: Div) {
  57. println("Div")
  58. node.l.accept(this)
  59. node.r.accept(this)
  60. }
  61. }
  62. }
  63.  
  64. object VisitorMain {
  65. import VisitorsPlus._
  66. def main(args: Array[String]) {
  67. val v = new Visitor
  68. Add(Value(1), Value(2)).accept(v)
  69. Sub(Value(1), Value(2)).accept(v)
  70. Mul(Value(1), Value(2)).accept(v)
  71. Div(Value(1), Value(2)).accept(v)
  72. }
  73. }
Add Comment
Please, Sign In to add comment