1 # coding: utf-8
2 # frozen_string_literal: true
3
4
5
6 module Umu
7
8 module ConcreteSyntax
9
10 module Core
11
12 module Expression
13
14 module Binary
15
16 module Infix
17
18 module Abstraction
19
20 class Abstract < Binary::Abstract
21 alias lhs_opnd lhs
22 attr_reader :opr_sym
23 alias rhs_opnd rhs
24
25
26 def initialize(loc, lhs_opnd, opr_sym, rhs_opnd)
27 ASSERT.kind_of lhs_opnd, Umu::Abstraction::Model
28 ASSERT.kind_of opr_sym, ::Symbol
29 ASSERT.kind_of rhs_opnd, Umu::Abstraction::Model
30
31 super(loc, lhs_opnd, rhs_opnd)
32
33 @opr_sym = opr_sym
34 end
35
36
37 def to_s
38 format("(%s %s %s)",
39 self.lhs_opnd.to_s,
40 self.opr_sym.to_s,
41 self.rhs_opnd.to_s
42 )
43 end
44
45
46 def pretty_print(q)
47 PRT.group q, bb:'(', eb:')' do
48 q.pp self.lhs_opnd
49
50 q.text ' '
51 q.text self.opr_sym.to_s
52
53 q.breakable
54
55 q.pp self.rhs_opnd
56 end
57 end
58 end
59
60
61
62 class Simple < Abstract
63 def initialize(loc, lhs_opnd, opr_sym, rhs_opnd)
64 ASSERT.kind_of lhs_opnd, CSCE::Abstract
65 ASSERT.kind_of opr_sym, ::Symbol
66 ASSERT.kind_of rhs_opnd, CSCE::Abstract
67
68 super
69 end
70 end
71
72
73
74 class WithRepetition < Abstract
75 include Enumerable
76
77 alias hd_rhs_opnd rhs_opnd
78 attr_reader :tl_rhs_opnds
79
80
81 def initialize(loc, lhs_opnd, opr_sym, hd_rhs_opnd, tl_rhs_opnds)
82 ASSERT.kind_of lhs_opnd, CSCE::Abstract
83 ASSERT.kind_of opr_sym, ::Symbol
84 ASSERT.kind_of hd_rhs_opnd, CSCE::Abstract
85 ASSERT.kind_of tl_rhs_opnds, ::Array
86
87 super(loc, lhs_opnd, opr_sym, hd_rhs_opnd)
88
89 @tl_rhs_opnds = tl_rhs_opnds
90 end
91
92
93 def each
94 return self.to_enum unless block_given?
95
96 yield self.lhs_opnd
97
98 yield self.hd_rhs_opnd
99
100 self.tl_rhs_opnds.each do |rhs_opnd|
101 ASSERT.kind_of rhs_opnd, CSCE::Abstract
102
103 yield rhs_opnd
104 end
105 end
106
107
108 def to_s
109 opr = format " %s ", self.opr_sym.to_s
110
111 format "(%s)", self.map(&:to_s).join(opr)
112 end
113
114
115 def pretty_print(q)
116 hd_expr, *tl_exprs = self.to_a
117
118 q.text '('
119 q.pp hd_expr
120
121 tl_exprs.each do |expr|
122 q.breakable
123
124 q.text self.opr_sym.to_s
125 q.text ' '
126 q.pp expr
127 end
128
129 q.text ')'
130 end
131 end
132
133 end # Umu::ConcreteSyntax::Core::Expression::Binary::Infix::Abstraction
134
135 end # Umu::ConcreteSyntax::Core::Expression::Binary::Infix
136
137 end # Umu::ConcreteSyntax::Core::Expression::Binary
138
139 end # Umu::ConcreteSyntax::Core::Expression
140
141 end # Umu::ConcreteSyntax::Core
142
143 end # Umu::ConcreteSyntax
144
145 end # Umu