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 List < Container::Abstract
19 attr_reader :opt_last_expr
20
21
22 def initialize(loc, exprs, opt_last_expr)
23 ASSERT.kind_of exprs, ::Array
24 ASSERT.opt_kind_of opt_last_expr, CSCE::Abstract
25 ASSERT.assert (
26 if exprs.empty? then opt_last_expr.nil? else true end
27 )
28
29 super(loc, exprs)
30
31 @opt_last_expr = opt_last_expr
32 end
33
34
35 def to_s
36 format("[%s%s]",
37 self.map(&:to_s).join(', '),
38
39 if self.opt_last_expr
40 '|' + self.opt_last_expr.to_s
41 else
42 ''
43 end
44 )
45 end
46
47
48 def pretty_print(q)
49 if self.opt_last_expr
50 PRT.group_for_enum q, self, bb:'[', join:', '
51 PRT.group q, bb:'|', eb:']' do
52 q.pp self.opt_last_expr
53 end
54 else
55 PRT.group_for_enum q, self, bb:'[', eb:']', join:', '
56 end
57 end
58
59
60 private
61
62 def __desugar__(env, event)
63 new_env = env.enter event
64
65 ASCE.make_list(
66 self.loc,
67
68 self.map { |elem| elem.desugar(new_env) },
69
70 if self.opt_last_expr
71 self.opt_last_expr.desugar(new_env)
72 else
73 nil
74 end
75 )
76 end
77 end
78
79 end # Umu::ConcreteSyntax::Core::Expression::Unary::Container
80
81 end # Umu::ConcreteSyntax::Core::Expression::Unary
82
83
84 module_function
85
86 def make_list(loc, exprs, opt_last_expr = nil)
87 ASSERT.kind_of loc, LOC::Entry
88 ASSERT.kind_of exprs, ::Array
89 ASSERT.opt_kind_of opt_last_expr, CSCE::Abstract
90
91 Unary::Container::List.new(loc, exprs.freeze, opt_last_expr).freeze
92 end
93
94 end # Umu::ConcreteSyntax::Core::Expression
95
96 end # Umu::ConcreteSyntax::Core
97
98 end # Umu::ConcreteSyntax
99
100 end # Umu