1 # coding: utf-8
2 # frozen_string_literal: true
3
4
5
6 module Umu
7
8 module Lexical
9
10 module Lexer
11
12 class Abstract < Abstraction::Record
13 attr_reader :loc
14 attr_reader :braket_stack
15
16
17 def self.deconstruct_keys
18 {
19 :loc => LOC::Entry,
20 :braket_stack => ::Array
21 }
22 end
23
24
25 def initialize(loc, braket_stack)
26 ASSERT.kind_of loc, LOC::Entry
27 ASSERT.kind_of braket_stack, ::Array
28
29 @loc = loc
30 @braket_stack = braket_stack
31 end
32
33
34 def to_s
35 format("%s {braket_stack=%s} -- %s",
36 E::Tracer.class_to_string(self.class),
37 self.braket_stack.inspect,
38 self.loc.to_s
39 )
40 end
41
42
43 def comment_depth
44 0
45 end
46
47
48 def braket_depth
49 self.braket_stack.length
50 end
51
52
53 def in_comment?
54 false
55 end
56
57
58 def in_braket?
59 not self.braket_stack.empty?
60 end
61
62
63 def between_braket?
64 if self.in_comment?
65 false
66 elsif self.in_braket?
67 false
68 else
69 true
70 end
71 end
72
73
74 def next_line_num(n = 1)
75 ASSERT.kind_of n, ::Integer
76
77 self.update(loc: self.loc.next_line_num(n))
78 end
79
80
81 def recover
82 __make_separator__ self.loc.next_line_num, []
83 end
84
85
86 def lex(scanner)
87 raise X::InternalSubclassResponsibility
88 end
89
90
91 private
92
93 def __make_separator__(
94 loc = self.loc,
95 braket_stack = self.braket_stack
96 )
97 ASSERT.kind_of loc, LOC::Entry
98
99 Separator.new(
100 loc, braket_stack.freeze
101 ).freeze
102 end
103
104
105 def __make_comment__(
106 saved_loc,
107 comment_depth,
108 buf,
109 loc = self.loc,
110 braket_stack = self.braket_stack
111 )
112 ASSERT.kind_of saved_loc, LOC::Entry
113 ASSERT.kind_of comment_depth, ::Integer
114 ASSERT.kind_of buf, ::String
115 ASSERT.kind_of loc, LOC::Entry
116
117 Comment.new(
118 loc, braket_stack.freeze, buf.freeze, saved_loc, comment_depth
119 ).freeze
120 end
121
122
123 def __make_token__(
124 loc = self.loc,
125 braket_stack = self.braket_stack
126 )
127 ASSERT.kind_of loc, LOC::Entry
128
129 Token.new(
130 loc, braket_stack.freeze
131 ).freeze
132 end
133
134
135 def __make_string__(
136 buf,
137 loc = self.loc,
138 braket_stack = self.braket_stack
139 )
140 ASSERT.kind_of buf, ::String
141 ASSERT.kind_of loc, LOC::Entry
142
143 String::Basic.new(
144 loc, braket_stack.freeze, buf.freeze
145 ).freeze
146 end
147
148
149 def __make_symbolized_string__(
150 buf,
151 loc = self.loc,
152 braket_stack = self.braket_stack
153 )
154 ASSERT.kind_of buf, ::String
155 ASSERT.kind_of loc, LOC::Entry
156
157 String::Symbolized.new(
158 loc, braket_stack.freeze, buf.freeze
159 ).freeze
160 end
161 end
162
163 end # Umu::Lexical::Lexer
164
165 end # Umu::Lexical
166
167 end # Umu