YkLib 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +6 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +7 -0
  7. data/Gemfile.lock +34 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +44 -0
  10. data/Rakefile +6 -0
  11. data/YkLib.gemspec +29 -0
  12. data/bin/console +14 -0
  13. data/bin/setup +8 -0
  14. data/lib/YkLib/Yk/__advance__.rb +151 -0
  15. data/lib/YkLib/Yk/__defun__.rb +44 -0
  16. data/lib/YkLib/Yk/__hook__.rb +244 -0
  17. data/lib/YkLib/Yk/__minmax__.rb +123 -0
  18. data/lib/YkLib/Yk/__stdlog.rb +329 -0
  19. data/lib/YkLib/Yk/adhocLiterals/email.rb +119 -0
  20. data/lib/YkLib/Yk/adhocLiterals/path.rb +402 -0
  21. data/lib/YkLib/Yk/adhocLiterals/tag.rb +19 -0
  22. data/lib/YkLib/Yk/adhocLiterals/url.rb +36 -0
  23. data/lib/YkLib/Yk/adhocLiterals.rb +199 -0
  24. data/lib/YkLib/Yk/auto_escseq.rb +5 -0
  25. data/lib/YkLib/Yk/auto_pstore.rb +179 -0
  26. data/lib/YkLib/Yk/bsearch.rb +120 -0
  27. data/lib/YkLib/Yk/clambda.rb +309 -0
  28. data/lib/YkLib/Yk/confLine.rb +423 -0
  29. data/lib/YkLib/Yk/create_tty_width_available.rb +24 -0
  30. data/lib/YkLib/Yk/crypt.rb +26 -0
  31. data/lib/YkLib/Yk/debug2 +1 -0
  32. data/lib/YkLib/Yk/debug2.rb +473 -0
  33. data/lib/YkLib/Yk/debugout.rb +139 -0
  34. data/lib/YkLib/Yk/email_tz.rb +533 -0
  35. data/lib/YkLib/Yk/enum_expect.rb +170 -0
  36. data/lib/YkLib/Yk/errlog.rb +5 -0
  37. data/lib/YkLib/Yk/escseq.rb +59 -0
  38. data/lib/YkLib/Yk/eval_alt.rb +281 -0
  39. data/lib/YkLib/Yk/expector.rb +93 -0
  40. data/lib/YkLib/Yk/fetch.rb +556 -0
  41. data/lib/YkLib/Yk/fetch_old.rb +290 -0
  42. data/lib/YkLib/Yk/fib.rb +158 -0
  43. data/lib/YkLib/Yk/file_aux.rb +843 -0
  44. data/lib/YkLib/Yk/file_aux2.rb +919 -0
  45. data/lib/YkLib/Yk/file_aux_old.rb +160 -0
  46. data/lib/YkLib/Yk/filemod.rb +19 -0
  47. data/lib/YkLib/Yk/force_escseq.rb +3 -0
  48. data/lib/YkLib/Yk/generator__.rb +144 -0
  49. data/lib/YkLib/Yk/generator__.rb.org +139 -0
  50. data/lib/YkLib/Yk/indenter/argless_case.rb +46 -0
  51. data/lib/YkLib/Yk/indenter/each_token.rb +671 -0
  52. data/lib/YkLib/Yk/indenter/free_case.rb +313 -0
  53. data/lib/YkLib/Yk/indenter/if_less.rb +53 -0
  54. data/lib/YkLib/Yk/indenter/independent_ensure.rb +23 -0
  55. data/lib/YkLib/Yk/indenter/independent_rescue.rb +23 -0
  56. data/lib/YkLib/Yk/indenter/operand_circumflex.rb +0 -0
  57. data/lib/YkLib/Yk/indenter/operand_period.rb +16 -0
  58. data/lib/YkLib/Yk/indenter/parenless_and.rb +37 -0
  59. data/lib/YkLib/Yk/indenter/post_test.rb +48 -0
  60. data/lib/YkLib/Yk/indenter/token.rb +1525 -0
  61. data/lib/YkLib/Yk/indenter.rb +1382 -0
  62. data/lib/YkLib/Yk/inot.rb +265 -0
  63. data/lib/YkLib/Yk/intf.rb +815 -0
  64. data/lib/YkLib/Yk/io_aux.rb +1332 -0
  65. data/lib/YkLib/Yk/ioctl.rb +60 -0
  66. data/lib/YkLib/Yk/ipcc.rb +87 -0
  67. data/lib/YkLib/Yk/ipcountry.rb +207 -0
  68. data/lib/YkLib/Yk/ipv4adr.rb +318 -0
  69. data/lib/YkLib/Yk/localmail.rb +276 -0
  70. data/lib/YkLib/Yk/method_chain.rb +359 -0
  71. data/lib/YkLib/Yk/misc_tz.rb +1716 -0
  72. data/lib/YkLib/Yk/missing_method.rb +50 -0
  73. data/lib/YkLib/Yk/mojiConv.rb +257 -0
  74. data/lib/YkLib/Yk/nostdlog.rb +4 -0
  75. data/lib/YkLib/Yk/on_marshal.rb +20 -0
  76. data/lib/YkLib/Yk/overrider.rb +47 -0
  77. data/lib/YkLib/Yk/path.rb +293 -0
  78. data/lib/YkLib/Yk/path_aux.rb +883 -0
  79. data/lib/YkLib/Yk/path_aux_alt.rb +0 -0
  80. data/lib/YkLib/Yk/path_rep.rb +1267 -0
  81. data/lib/YkLib/Yk/pg_setup.rb +917 -0
  82. data/lib/YkLib/Yk/procinfo.rb +314 -0
  83. data/lib/YkLib/Yk/proclist.rb +492 -0
  84. data/lib/YkLib/Yk/property.rb +863 -0
  85. data/lib/YkLib/Yk/ranger.rb +606 -0
  86. data/lib/YkLib/Yk/resolv_tz.rb +88 -0
  87. data/lib/YkLib/Yk/rlprompt.rb +73 -0
  88. data/lib/YkLib/Yk/rootexec.rb +48 -0
  89. data/lib/YkLib/Yk/rpm-packageproxy.rb +784 -0
  90. data/lib/YkLib/Yk/rpm-packageproxy2.rb +1430 -0
  91. data/lib/YkLib/Yk/rwhen.rb +21 -0
  92. data/lib/YkLib/Yk/selector.rb +124 -0
  93. data/lib/YkLib/Yk/set.rb +170 -0
  94. data/lib/YkLib/Yk/shellquote.rb +300 -0
  95. data/lib/YkLib/Yk/sio.rb +1001 -0
  96. data/lib/YkLib/Yk/sio0.rb +835 -0
  97. data/lib/YkLib/Yk/sio_aux.rb +1524 -0
  98. data/lib/YkLib/Yk/sio_inot.rb +86 -0
  99. data/lib/YkLib/Yk/sock_aux.rb +42 -0
  100. data/lib/YkLib/Yk/spipe.rb +843 -0
  101. data/lib/YkLib/Yk/sql_table.rb +565 -0
  102. data/lib/YkLib/Yk/stdlog.rb +4 -0
  103. data/lib/YkLib/Yk/syscommand.rb +173 -0
  104. data/lib/YkLib/Yk/sysinit.rb +75 -0
  105. data/lib/YkLib/Yk/ttyFontWidth.rb +46113 -0
  106. data/lib/YkLib/Yk/tty_char.dump +0 -0
  107. data/lib/YkLib/Yk/tty_char.rb +47 -0
  108. data/lib/YkLib/Yk/tty_char_create.rb +437031 -0
  109. data/lib/YkLib/Yk/tty_char_static.rb +437016 -0
  110. data/lib/YkLib/Yk/tty_rewrite.rb +142 -0
  111. data/lib/YkLib/Yk/tty_str.rb +461 -0
  112. data/lib/YkLib/Yk/tty_width.dat.rb +114 -0
  113. data/lib/YkLib/Yk/tty_width.rb +180 -0
  114. data/lib/YkLib/Yk/tty_width_available +569 -0
  115. data/lib/YkLib/Yk/tty_width_list +0 -0
  116. data/lib/YkLib/Yk/tty_width_list.linux +280 -0
  117. data/lib/YkLib/Yk/tty_width_list.windows +324 -0
  118. data/lib/YkLib/Yk/tz_tty +0 -0
  119. data/lib/YkLib/Yk/tz_tty.rb +0 -0
  120. data/lib/YkLib/Yk/uprepos.rb +94 -0
  121. data/lib/YkLib/Yk/userinfo.rb +91 -0
  122. data/lib/YkLib/Yk/with.rb +109 -0
  123. data/lib/YkLib/version.rb +3 -0
  124. data/lib/YkLib.rb +6 -0
  125. metadata +170 -0
@@ -0,0 +1,313 @@
1
+
2
+ class Token
3
+
4
+ MethodChain.override do
5
+ def checkRequireArgStarterWithoutArg
6
+ begin
7
+ super
8
+ rescue WhenWithoutArg => e
9
+ if !parent.trySetUnderCase
10
+ raise e
11
+ end
12
+ end
13
+ end
14
+ def checkRequireArgStarterWithArg
15
+ begin
16
+ super
17
+ rescue ForWithoutIn => e
18
+ if trySetUnderCase
19
+ kind = :for_when
20
+ else
21
+ raise e
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ Modules :OnNl, :OnSemicolon do
28
+ MethodChain.override do
29
+ def onClassify
30
+ begin
31
+ super
32
+ rescue ForWithoutIn => e
33
+ if !parent.trySetUnderCase
34
+ raise e
35
+ end
36
+ parent.kind = :for_when
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ Modules :OnLbrace do
43
+ MethodChain.override do
44
+ def onClassify
45
+ condKinds = [:when, :for, :free_when, :for_when]
46
+ if condKinds.include?(parent.kind) && (condKinds + [:on_comma]).include(prev.kind)
47
+ kind = :case_cond_lbrace
48
+ else
49
+ super
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ Modules :In, :When do
56
+ MethodChain.override do
57
+ def onClassify
58
+ begin
59
+ super
60
+ @case = @wrapper.orgEntity
61
+ @direct = true
62
+ @case.addChild self
63
+ @upperCaseClause = @case
64
+ rescue OrphanContClause => e
65
+ if prev_nl? && trySetUnderCase
66
+ kind = "free_#{@kind}".intern
67
+ spush
68
+ else
69
+ raise e
70
+ end
71
+ rescue ForWhen => e # "for when", "for in"
72
+ parent.kind = "for_#{@kind}".intern
73
+ if !parent.trySetUnderCase
74
+ raise e
75
+ end
76
+ kind = :on_sp
77
+ str = " " * str.size()
78
+ end
79
+ end
80
+ end
81
+ end
82
+
83
+
84
+ class CaseCondList
85
+ def initialize vn, cn
86
+ @vn = vn
87
+ @cn = cn
88
+ @list = []
89
+ end
90
+ def add c
91
+ @list.push c
92
+ end
93
+ def head
94
+ <<~Out
95
+ #{@vn}.pushCondProxy
96
+ begin
97
+ begin
98
+ #{getSubHead}
99
+ rescue #{@vn}.FinishCond
100
+ end
101
+ if #{@vn}.hasTrue?
102
+ Out
103
+ end
104
+ def getSubHead
105
+ emb = ""
106
+ @list.each do |e|
107
+ if e.is_a? CaseCondList
108
+ emb += e.getSubHead
109
+ else
110
+ case e
111
+ when /\A(when|in)\b/
112
+ emb += <<~Out
113
+ if case #{@vn}.case #{e}; true; else false end
114
+ #{@vn}.pushCond true
115
+ #{@vn}.finishCond
116
+ else
117
+ #{@vn}.pushCond false
118
+ end
119
+ Out
120
+ when /\Afor\b/
121
+ emb += <<~Out
122
+ if case #{@vn}.case when #{$'}; true; else false end
123
+ #{@vn}.pushCond true
124
+ else
125
+ #{@vn}.pushCond false
126
+ end
127
+ Out
128
+ end
129
+ end
130
+ end
131
+ emb
132
+ end
133
+ def tail
134
+ emb += <<~Out
135
+ #{
136
+ if ["when", "in"].include? @cn
137
+ #{@vn}.finish
138
+ end
139
+ }
140
+ end # if #{@vn}.hasTrue?
141
+ ensure
142
+ #{@vn}.popCondProxy
143
+ end
144
+ Out
145
+ end
146
+ end
147
+
148
+ def gatherDescendantsCond vn, s, condList
149
+ s.children.each do |e|
150
+ if s != e.parent
151
+ raise Error.new("free case clause '#{e.str}' is not a direct member of argless upper clause, '#{s.str}'")
152
+ end
153
+ if e.argStart # with argument
154
+ ###################...................... eの完全な出力結果で置換する
155
+ condList.add @expr[e.first ... e.argEnd.first]
156
+ Token.add e.range,"if #{vn}.shiftCond;"
157
+ pre = "#{vn}.set_res("
158
+ post = ")" + (e.kind != :for_when ? ".finish" : "")
159
+ if e.sentences
160
+ Token.addMod e.sentences[0].first.first, pre
161
+ Token.addMod e.sentences.last.last.first, post
162
+ else
163
+ Token.addMod e.argEnd.first, pre + "nil" + post
164
+ end
165
+ if e.children # still has children
166
+ e.children.each do |ch|
167
+ eachCaseChild(vn, ch, false)
168
+ end
169
+ end
170
+ elsif e.children # argless when, gather conditions from children
171
+ gatherDescendantsCond(vn, s, cnd = CaseCondList.new(vn, e.str))
172
+ condList.add cnd
173
+ else
174
+ raise Error.new("argument less '#{e.str}' under argument less '#{s.str}'")
175
+ end
176
+ end
177
+ end
178
+
179
+ def eachCaseChild vn, s, direct # 'when', 'in', 'for' with argument
180
+ if !s.arglessWhen? # argument less when
181
+ if s.children # proxy condition for children
182
+ gatherDescendantsCond(vn, s, cnd = CaseCondList.new(vn, s.str))
183
+ h = cnd.head
184
+ t = cnd.tail
185
+ else # unconditional when, in, for : mimic 'else' of traditional 'case'
186
+ h = "begin;"
187
+ t = "end"
188
+ end
189
+ Token.addMod s.range, h
190
+ Token.addMod s.sentences.last.last, (s.kind != :for_when ? ";#{vn}.finish" : "") + t
191
+ else
192
+ if !direct
193
+ Token.add s.first,"if (case #{vn}.case; "
194
+ if (tmp = case s.kind
195
+ when :for_when
196
+ "when"
197
+ when :for_in
198
+ "in"
199
+ end) then
200
+ Token.add s.range, tmp
201
+ end
202
+ Token.add s.last, "; true; else false; end)"
203
+ pre = "#{vn}.set_res("
204
+ post = ")" + (!tmp ? ".finish" : "")
205
+ if s.sentences
206
+ Token.addMod s.sentences[0].first.first, pre
207
+ Token.addMod s.sentences.last.last.first, post
208
+ else
209
+ Token.addMod s.argEnd.first, pre + "nil" + post
210
+ end
211
+ end
212
+ s.children&.each do |s|
213
+ eachCaseChild(vn, s, false)
214
+ end
215
+ end
216
+ end
217
+
218
+ def addChild t
219
+ (@children ||= []).push t
220
+ end
221
+
222
+ attr_reader :case
223
+ def direct?
224
+ @direct
225
+ end
226
+ def requireIfConversion?
227
+ @requireIfConversion
228
+ end
229
+ attr_writer :requireIfConversion
230
+ def trySetUnderCase
231
+ f = eachParent do |par|
232
+ if [:case, :non_free_case].include? par.kind
233
+ @case = par
234
+ break :found
235
+ end
236
+ end
237
+ return false if f != :found
238
+ eachParent do |par|
239
+ if [:when, :in, :for_in, :for_when, :free_when, :free_in, :case, :non_free_case].include?(par.kind)
240
+ || par.kind == :else && par.wrapped.orgEntity == @freeCase
241
+ if par.whenWithoutArg?
242
+ if whenWithoutArg?
243
+ raise Error.new("argless '#{str}' under argless '#{par.str}'")
244
+ elsif par != parent
245
+ raise Error.new("argless '#{par.str}' do not allow '#{str}' clause enclosed by '#{parent.str}...#{parent.ender.str}'")
246
+ end
247
+ end
248
+ par.addChild self
249
+ @upperCaseClause = par
250
+ return true
251
+ end
252
+ end
253
+ return false
254
+ end
255
+
256
+ attr_accessor_predicate :caseCondLBraceReplaced
257
+
258
+ def whenWithoutArg?
259
+ !@argStart || (dnext&.kind == :> && dnext.dnext&.var_able? && [:on_nl, :on_semicolon].include?(dnext&.dnext&.next&.kind))
260
+ end
261
+ def whenWithVar?
262
+ dnext&.kind == :> && dnext.dnext&.var_able?
263
+ end
264
+
265
+ Module :Case, :NonFreeCase do
266
+ def closeBeginner pi
267
+ vn = spVarName
268
+ @direct = true
269
+ children.each do |s|
270
+ if !s.direct? || s.whenWithoutArg? || s.whenWithVar?
271
+ @direct = false
272
+ break
273
+ end
274
+ end
275
+ if @direct
276
+ head = "case(#{vn})"
277
+ end
278
+ Token.addMod range, "#begin (begin #{vn} = FreeCase.new("
279
+ Token.addMod argEnd.first, "); begin #{head}"
280
+ children.each do |s|
281
+ eachCaseChild(vn, s, @direct)
282
+ end
283
+ tmp = dnext
284
+ while tmp != e
285
+ if tmp.kind == :on_ivar && tmp.str == "@"
286
+ if f = tmp.findParent{[:case, :non_free_case].include(_1.kind)}
287
+ if f == self
288
+ if tmp.parent.kind == :case_cond_lbrace
289
+ if !tmp.parent.caseCondLBraceReplaced?
290
+ Token.addMod tmp.parent.ipos, "->"
291
+ tmp.parent.caseCondLBraceReplaced = tue
292
+ end
293
+ Token.addMod tmp.range, "_1"
294
+ end
295
+ Token.addMod tmp.range, f.spVarName
296
+ end
297
+ end
298
+ end
299
+ else
300
+ Token.addMod tmp.range, "#{vn}.case"
301
+ end
302
+ if %i{case non_free_case}.include? tmp.kind
303
+ tmp = tmp.ender
304
+ else
305
+ tmp = tmp.dnext
306
+ end
307
+ end
308
+ ";rescue #{vn}.Finish;ensure #{vn}.pop;end;#{vn}.result);" + "end"
309
+ end
310
+ end
311
+
312
+
313
+ end
@@ -0,0 +1,53 @@
1
+
2
+ require 'each_token'
3
+
4
+
5
+ class Token
6
+ Modules :Then, :Else, :Elsif, :IflessThen, :IflessElse, :IflessElsif do
7
+ def closeBeginner pi
8
+ if !((ps = parent.sentences)[-1].first != self)
9
+ raise Error.new("'#{str}' without 'if' not registered as sentence in upper clause, '#{parent.str}'")
10
+ end
11
+ if !ps[-2]
12
+ raise Error.new("'#{str}' without 'if' missing previous line")
13
+ end
14
+ ps[-2].last = nil
15
+ ps.pop
16
+ Token.addMod ps[-2].first.first, "if("
17
+ case @kind
18
+ when :ifless_then, :then
19
+ Token.addMod orgStarter.first, ")"
20
+ when :ifless_elsif, :ifless_else, :elsif, :else
21
+ Token.addMod orgStarter.first, ")then "
22
+ end
23
+ "end"
24
+ end
25
+ end
26
+ [
27
+ [:Then, :ifless_then]
28
+ [:Else, :ifless_else]
29
+ [:Elsif, :ifless_elseif]
30
+ ].each do |modName, tk|
31
+ Modules modName do
32
+ MethodChain.override do
33
+ module_eval %{
34
+ def onClassify
35
+ begin
36
+ super
37
+ rescue OrphanContClause => e
38
+ if !prev_nl?
39
+ raise e
40
+ else
41
+ spush
42
+ kind = :#{tk}
43
+ end
44
+ end
45
+ end
46
+ }
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+
53
+
@@ -0,0 +1,23 @@
1
+
2
+
3
+ require 'each_token'
4
+
5
+
6
+ class Token
7
+ module Ensure do
8
+ MethodChain.override do
9
+ def onClassify
10
+ begin
11
+ super
12
+ rescue OrphanContClause => e
13
+ if !prev_nl?
14
+ raise e
15
+ else
16
+ spush
17
+ kind = :independent_ensure
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+
2
+
3
+ require 'each_token'
4
+
5
+
6
+ class Token
7
+ module Rescue do
8
+ MethodChain.override do
9
+ def onClassify
10
+ begin
11
+ super
12
+ rescue OrphanContClause => e
13
+ if !prev_nl?
14
+ raise e
15
+ else
16
+ spush
17
+ kind = :independent_rescue
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
File without changes
@@ -0,0 +1,16 @@
1
+
2
+ class Token
3
+ module OnPeriod
4
+ def onClassify #
5
+ if isOperand? # should not be parent
6
+ if [:on_ident, :on_const].include?(dnext.kind)
7
+ Token.addMod(first, "___theme_by_period")
8
+ elsif ambiguousPeriodTheme?
9
+ raise Error.new("Nested theme is referenced by single '.'")
10
+ else
11
+ Token.addMod(range, "___theme_by_period")
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,37 @@
1
+
2
+
3
+
4
+
5
+ attr_accessor_predicate :hasAndOp, :andOpProcessed
6
+ def inDirectParen?
7
+ prev.kind == :on_lparen && next.kind == :on_rparen
8
+ end
9
+
10
+ def checkAndOp
11
+ if hasAndOp? && !andOpProcessed? && !inDirectParen? && %i{on_ident on_const ' "}.include?(dprev)
12
+ Token.addMod tb.last, "("
13
+ Token.addMod t.first, ")"
14
+ @andOpProcessed = true
15
+ end
16
+ end
17
+
18
+ Modules :And, :Or, :Not do
19
+ MethodChain.override do
20
+ def onClassify
21
+ super
22
+ if [:on_lbracket, :on_lparen].include?(parent)
23
+ parent.hasAndOp = true
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ Modules :OnRparen, :OnRbracket do
30
+ MethodChain.override do
31
+ def onClassify
32
+ super
33
+ beginner.checkAndOp
34
+ end
35
+ end
36
+ end
37
+
@@ -0,0 +1,48 @@
1
+
2
+ class Token
3
+
4
+ module PostTestDo
5
+
6
+ def postTestFinalize pi
7
+ if !requireArg?
8
+ raise Error.new("descrepant post test clause")
9
+ end
10
+ @argEnd = pi
11
+ closeSentence pi
12
+ (d = (w = pi.parent).wrapped.orgEntity).iteratorCand = nil
13
+ toReplace = "break " + case w.str
14
+ when "while"
15
+ "unless "
16
+ when "until"
17
+ "if "
18
+ end
19
+ Token.addMod w.range, toReplace
20
+ if (v = d.dnext).kind == :on_symbeg && label = v.var_label
21
+ d.defClsFirstSententence.first.setIteratorLabelVar label
22
+ Token.addMod d.range,
23
+ "begin
24
+ #{label} = ItratorLabel.new
25
+ while true
26
+ begin
27
+ #{label}.setLast((".gsub(/\n/, ";").gsub(/\s+/, " ")
28
+ res = "))
29
+ rescue #{label}.exNext
30
+ next
31
+ rescue #{label}.exRedo
32
+ redo
33
+ end
34
+ end
35
+ #{label}.res #nil or something in case iterator
36
+ rescue #{label}.exBreak
37
+ #{label}.res
38
+ end".gsub(/\n/, ";").gsub(/\s+/, " ")
39
+ else
40
+ Token.addMod d.range, "while true;" # "do" -> "while true;"
41
+ res = ";end;"
42
+ end
43
+ pi.spop
44
+ Token.addMod pi.ipos, res
45
+ end
46
+
47
+ end
48
+ end