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 Nary
15
16 module Interval
17
18 class Abstract < Expression::Abstract
19 attr_reader :fst_expr, :opt_snd_expr, :opt_lst_expr
20
21
22 def initialize(loc, fst_expr, opt_snd_expr, opt_lst_expr)
23 ASSERT.kind_of fst_expr, CSCE::Abstract
24 ASSERT.opt_kind_of opt_snd_expr, CSCE::Abstract
25 ASSERT.opt_kind_of opt_lst_expr, CSCE::Abstract
26
27 super(loc)
28
29 @fst_expr = fst_expr
30 @opt_snd_expr = opt_snd_expr
31 @opt_lst_expr = opt_lst_expr
32 end
33
34
35 def to_s
36 format("%s%s%s .. %s]",
37 __bb__,
38
39 self.fst_expr.to_s,
40
41 if self.opt_snd_expr
42 format ", %s", self.opt_snd_expr.to_s
43 else
44 ''
45 end,
46
47 if self.opt_lst_expr
48 format " %s", self.opt_lst_expr.to_s
49 else
50 ''
51 end
52 )
53 end
54
55
56 private
57
58 def __bb__
59 raise X::InternalSubclassResponsibility
60 end
61
62
63 def __desugar__(env, event)
64 new_env = env.enter event
65
66 __make__(
67 self.loc,
68
69 self.fst_expr.desugar(new_env),
70
71 if self.opt_snd_expr
72 self.opt_snd_expr.desugar(new_env)
73 else
74 nil
75 end,
76
77 if self.opt_lst_expr
78 self.opt_lst_expr.desugar(new_env)
79 else
80 nil
81 end
82 )
83 end
84
85
86 def __make__(_loc, _fst_expr, _opt_snd_expr, _lst_expr)
87 raise X::InternalSubclassResponsibility
88 end
89 end
90
91
92
93 class Basic < Abstract
94 def initialize(loc, fst_expr, opt_snd_expr, lst_expr)
95 ASSERT.kind_of fst_expr, CSCE::Abstract
96 ASSERT.opt_kind_of opt_snd_expr, CSCE::Abstract
97 ASSERT.kind_of lst_expr, CSCE::Abstract
98
99 super
100 end
101
102
103 private
104
105 def __bb__
106 '['
107 end
108
109
110 def __make__(loc, fst_expr, opt_snd_expr, lst_expr)
111 ASCE.make_interval loc, fst_expr, opt_snd_expr, lst_expr
112 end
113 end
114
115
116
117 class Stream < Abstract
118
119 private
120
121 def __bb__
122 '&['
123 end
124
125
126 def __make__(loc, fst_expr, opt_snd_expr, lst_expr)
127 ASCE.make_interval_stream loc, fst_expr, opt_snd_expr, lst_expr
128 end
129 end
130
131 end # Umu::ConcreteSyntax::Core::Expression::Nary::Interval
132
133 end # Umu::ConcreteSyntax::Core::Expression::Nary
134
135
136 module_function
137
138 def make_interval(loc, fst_expr, opt_snd_expr, lst_expr)
139 ASSERT.kind_of loc, LOC::Entry
140 ASSERT.kind_of fst_expr, CSCE::Abstract
141 ASSERT.opt_kind_of opt_snd_expr, CSCE::Abstract
142 ASSERT.kind_of lst_expr, CSCE::Abstract
143
144 Nary::Interval::Basic.new(
145 loc, fst_expr, opt_snd_expr, lst_expr
146 ).freeze
147 end
148
149
150 def make_interval_stream(loc, fst_expr, opt_snd_expr, opt_lst_expr)
151 ASSERT.kind_of loc, LOC::Entry
152 ASSERT.kind_of fst_expr, CSCE::Abstract
153 ASSERT.opt_kind_of opt_snd_expr, CSCE::Abstract
154 ASSERT.opt_kind_of opt_lst_expr, CSCE::Abstract
155
156 Nary::Interval::Stream.new(
157 loc, fst_expr, opt_snd_expr, opt_lst_expr
158 ).freeze
159 end
160
161 end # Umu::ConcreteSyntax::Core::Expression
162
163 end # Umu::ConcreteSyntax::Core
164
165 end # Umu::ConcreteSyntax
166
167 end # Umu