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 Unary
15
16 module Container
17
18 class CellStream < Container::Abstract
19 attr_reader :opt_last_expr
20
21
22 def initialize(loc, is_memorized, exprs, opt_last_expr)
23 ASSERT.bool is_memorized
24 ASSERT.kind_of exprs, ::Array
25 ASSERT.opt_kind_of opt_last_expr, CSCE::Abstract
26 ASSERT.assert (
27 if exprs.empty? then opt_last_expr.nil? else true end
28 )
29
30 super(loc, exprs)
31
32 @is_memorized = is_memorized
33 @opt_last_expr = opt_last_expr
34 end
35
36
37 def memorized?
38 @is_memorized
39 end
40
41
42 def to_s
43 [
44 '&',
45
46 __bb_str__,
47
48 self.map(&:to_s).join(', '),
49
50 if self.opt_last_expr
51 '|' + self.opt_last_expr.to_s
52 else
53 ''
54 end,
55
56 __eb_str__
57 ].join
58 end
59
60
61 def pretty_print(q)
62 bb = '&' + __bb_str__
63 eb = __eb_str__
64
65 if self.opt_last_expr
66 PRT.group_for_enum q, self, bb:bb, join:', '
67 PRT.group q, bb:'|', eb:eb do
68 q.pp self.opt_last_expr
69 end
70 else
71 PRT.group_for_enum q, self, bb:bb, eb:eb, join:', '
72 end
73 end
74
75
76 private
77
78 def __bb_str__
79 self.memorized? ? '{' : '['
80 end
81
82
83 def __eb_str__
84 self.memorized? ? '}' : ']'
85 end
86
87
88 def __desugar__(env, event)
89 new_env = env.enter event
90
91 exprs = self.map { |expr| expr.desugar new_env }
92
93 opt_last_expr = if self.opt_last_expr
94 self.opt_last_expr.desugar new_env
95 else
96 nil
97 end
98
99 ASCE.make_stream self.loc, exprs, opt_last_expr, self.memorized?
100 end
101 end
102
103 end # Umu::ConcreteSyntax::Core::Expression::Unary::Container
104
105 end # Umu::ConcreteSyntax::Core::Expression::Unary
106
107
108 module_function
109
110 def make_stream(loc, exprs, opt_last_expr = nil)
111 ASSERT.kind_of loc, LOC::Entry
112 ASSERT.kind_of exprs, ::Array
113 ASSERT.opt_kind_of opt_last_expr, CSCE::Abstract
114
115 Unary::Container::CellStream.new(
116 loc, false, exprs.freeze, opt_last_expr
117 ).freeze
118 end
119
120 end # Umu::ConcreteSyntax::Core::Expression
121
122 end # Umu::ConcreteSyntax::Core
123
124 end # Umu::ConcreteSyntax
125
126 end # Umu