nadesiko3 3.2.30 → 3.2.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/demo/index.html +0 -1
- package/package.json +13 -5
- package/release/_hash.txt +28 -28
- package/release/_script-tags.txt +13 -13
- package/release/command.json +1 -1
- package/release/command.json.js +1 -1
- package/release/command_cnako3.json +1 -1
- package/release/command_list.json +1 -1
- package/release/editor.js +1 -1
- package/release/josi.json +1 -0
- package/release/nako_gen_async.js +1 -1
- package/release/plugin_markup.js +1 -1
- package/release/stats.json +1 -1
- package/release/version.js +1 -1
- package/release/wnako3.js +1 -1
- package/release/wnako3webworker.js +1 -1
- package/release/wnako3webworker.js.LICENSE.txt +4 -0
- package/release/yoyakugo.json +3 -0
- package/src/nako3.js +6 -1
- package/src/nako_from_dncl.js +239 -0
- package/src/nako_gen.js +24 -9
- package/src/nako_gen_async.js +97 -10
- package/src/nako_josi_list.js +1 -1
- package/src/nako_parser3.js +147 -25
- package/src/nako_parser_base.js +3 -0
- package/src/nako_reserved_words.js +4 -1
- package/src/nako_version.js +2 -2
- package/src/plugin_browser.js +14 -0
- package/src/plugin_browser_ajax.js +4 -3
- package/src/plugin_browser_canvas.js +0 -1
- package/src/plugin_browser_chart.js +0 -2
- package/src/plugin_browser_dom_basic.js +0 -2
- package/src/plugin_browser_dom_parts.js +273 -79
- package/src/plugin_node.js +2 -2
- package/src/plugin_system.js +408 -20
- package/test/common/dncl_test.js +57 -0
- package/test/common/flow_test.js +14 -0
- package/test/common/plugin_system_test.js +117 -0
- package/test/common/variable_scope_test.js +3 -0
|
@@ -58,6 +58,10 @@
|
|
|
58
58
|
!*** ./src/plugin_worker.js ***!
|
|
59
59
|
\******************************/
|
|
60
60
|
|
|
61
|
+
/*!*******************************!*\
|
|
62
|
+
!*** ./src/nako_from_dncl.js ***!
|
|
63
|
+
\*******************************/
|
|
64
|
+
|
|
61
65
|
/*!*******************************!*\
|
|
62
66
|
!*** ./src/nako_josi_list.js ***!
|
|
63
67
|
\*******************************/
|
package/release/yoyakugo.json
CHANGED
package/src/nako3.js
CHANGED
|
@@ -7,6 +7,7 @@ const NakoLexer = require('./nako_lexer')
|
|
|
7
7
|
const Prepare = require('./nako_prepare')
|
|
8
8
|
const NakoGenSync = require('./nako_gen')
|
|
9
9
|
const NakoIndent = require('./nako_indent')
|
|
10
|
+
const NakoDncl = require('./nako_from_dncl')
|
|
10
11
|
const PluginSystem = require('./plugin_system')
|
|
11
12
|
const PluginMath = require('./plugin_math')
|
|
12
13
|
const PluginPromise = require('./plugin_promise')
|
|
@@ -83,6 +84,7 @@ function NakoGen (mode) {
|
|
|
83
84
|
* column?: number
|
|
84
85
|
* }
|
|
85
86
|
* genMode?: string
|
|
87
|
+
* checkInit?: boolean
|
|
86
88
|
* }} Ast
|
|
87
89
|
*
|
|
88
90
|
* @typedef {(
|
|
@@ -301,9 +303,11 @@ class NakoCompiler {
|
|
|
301
303
|
}
|
|
302
304
|
// インデント構文 (#596)
|
|
303
305
|
const { code: code2, insertedLines, deletedLines } = NakoIndent.convert(code, filename)
|
|
306
|
+
// DNCL構文 (#1140)
|
|
307
|
+
const code3 = NakoDncl.convert(code2, filename)
|
|
304
308
|
|
|
305
309
|
// 全角半角の統一処理
|
|
306
|
-
const preprocessed = this.prepare.convert(
|
|
310
|
+
const preprocessed = this.prepare.convert(code3)
|
|
307
311
|
|
|
308
312
|
const tokenizationSourceMapping = new SourceMappingOfTokenization(code2.length, preprocessed)
|
|
309
313
|
const indentationSyntaxSourceMapping = new SourceMappingOfIndentSyntax(code2, insertedLines, deletedLines)
|
|
@@ -540,6 +544,7 @@ class NakoCompiler {
|
|
|
540
544
|
/** @type {Ast} */
|
|
541
545
|
let ast
|
|
542
546
|
try {
|
|
547
|
+
this.parser.genMode = 'sync' // set default
|
|
543
548
|
ast = this.parser.parse(lexerOutput.tokens)
|
|
544
549
|
} catch (err) {
|
|
545
550
|
if (typeof err.startOffset !== 'number') {
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DNCLに対応する構文
|
|
3
|
+
*/
|
|
4
|
+
const { NakoIndentError } = require('./nako_errors')
|
|
5
|
+
const NakoPrepare = require('./nako_prepare')
|
|
6
|
+
|
|
7
|
+
const DNCL_KEYWORDS = ['!DNCLモード']
|
|
8
|
+
/**
|
|
9
|
+
* DNCLのソースコードをなでしこに変換する
|
|
10
|
+
* @param {String} src
|
|
11
|
+
* @param {String} filename
|
|
12
|
+
* @returns {String} converted soruce
|
|
13
|
+
*/
|
|
14
|
+
function convert(src, filename) {
|
|
15
|
+
// 改行を合わせる
|
|
16
|
+
src = src.replace(/(\r\n|\r)/g, '\n')
|
|
17
|
+
// 「!DNCLモード」を使うかチェック
|
|
18
|
+
if (!isIndentSyntaxEnabled(src)) { return src }
|
|
19
|
+
let result = dncl2nako(src, filename)
|
|
20
|
+
// console.log("=====\n" + result)
|
|
21
|
+
// process.exit()
|
|
22
|
+
return result
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function isIndentSyntaxEnabled(src) {
|
|
26
|
+
// プログラム冒頭に「!DNCLモード」があればDNCL構文が有効
|
|
27
|
+
const keywords = DNCL_KEYWORDS
|
|
28
|
+
const lines = src.split('\n', 30)
|
|
29
|
+
for (const line of lines) {
|
|
30
|
+
const line2 = line.replace('!', '!')
|
|
31
|
+
if (keywords.indexOf(line2) >= 0) {
|
|
32
|
+
return true
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return false
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* make space string
|
|
40
|
+
* @param {number} n
|
|
41
|
+
*/
|
|
42
|
+
function make_spaces(n) {
|
|
43
|
+
let s = ''
|
|
44
|
+
for (let i = 0; i < n; i++) {
|
|
45
|
+
s += ' '
|
|
46
|
+
}
|
|
47
|
+
return s
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* DNCLからなでしこに変換する(判定なし)
|
|
52
|
+
* @param {string} src
|
|
53
|
+
* @param {string} filename
|
|
54
|
+
* @returns {string} converted source
|
|
55
|
+
*/
|
|
56
|
+
function dncl2nako(src, filename) {
|
|
57
|
+
// 全角半角を統一
|
|
58
|
+
src = conv2half(src)
|
|
59
|
+
// 行頭の「|」はインデントを表す記号
|
|
60
|
+
const a = src.split('\n')
|
|
61
|
+
for (let i = 0; i < a.length; i++) {
|
|
62
|
+
a[i] = a[i].replace(/^(\s*[|\s]+)(.*$)/, (m0, m1, m2) => {
|
|
63
|
+
return make_spaces(m1.length) + m2
|
|
64
|
+
})
|
|
65
|
+
}
|
|
66
|
+
src = a.join('\n')
|
|
67
|
+
// ---------------------------------
|
|
68
|
+
// 置換開始
|
|
69
|
+
// ---------------------------------
|
|
70
|
+
// 単純置換リスト
|
|
71
|
+
const simple_conv_list = {
|
|
72
|
+
'を実行する': 'ここまで',
|
|
73
|
+
'を実行し,そうでなくもし': '違えば、もし',
|
|
74
|
+
'を実行し,そうでなくもし': '違えば、もし',
|
|
75
|
+
'を実行し、そうでなくもし': '違えば、もし',
|
|
76
|
+
'を実行し,そうでなければ': '違えば',
|
|
77
|
+
'を実行し,そうでなければ': '違えば',
|
|
78
|
+
'を実行し、そうでなければ': '違えば',
|
|
79
|
+
'を繰り返す': 'ここまで',
|
|
80
|
+
'改行なしで表示': '継続表示',
|
|
81
|
+
'のすべての値を0にする': '=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]',
|
|
82
|
+
'ずつ増やしながら':'ずつ増やし繰り返す',
|
|
83
|
+
'ずつ減らしながら':'ずつ減らし繰り返す',
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
let result = ''
|
|
87
|
+
while (src !='') {
|
|
88
|
+
// 代入記号を変更
|
|
89
|
+
const ch = src.charAt(0)
|
|
90
|
+
// 空白を飛ばす
|
|
91
|
+
if (ch === ' ' || ch === ' ' || ch == '\t') {
|
|
92
|
+
result += ch
|
|
93
|
+
src = src.substring(1)
|
|
94
|
+
continue
|
|
95
|
+
}
|
|
96
|
+
// 1行先読み
|
|
97
|
+
let line = ''
|
|
98
|
+
const i = src.indexOf('\n')
|
|
99
|
+
if (i >= 0) {
|
|
100
|
+
line = src.substring(0, i)
|
|
101
|
+
} else {
|
|
102
|
+
line = src
|
|
103
|
+
}
|
|
104
|
+
//「var を n 増やす」を「var = var + 1」と置き換える
|
|
105
|
+
const r = line.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\s*を\s*([0-9a-zA-Z_]+)\s*(増やす|減らす)/)
|
|
106
|
+
if (r) {
|
|
107
|
+
const var_name = r[1]
|
|
108
|
+
const inc_val = r[2]
|
|
109
|
+
const inc_dec = r[3]
|
|
110
|
+
if (inc_dec == '増やす') {
|
|
111
|
+
result += `${var_name} = ${var_name} + ${inc_val};`
|
|
112
|
+
} else {
|
|
113
|
+
result += `${var_name} = ${var_name} - ${inc_val};`
|
|
114
|
+
}
|
|
115
|
+
src = src.substring(r[0].length)
|
|
116
|
+
continue
|
|
117
|
+
}
|
|
118
|
+
//「S1とS2とS3を表示する」を「(S1)&(S2)&S3)を表示」と置き換える
|
|
119
|
+
// あまりスマートではないが手抜きで
|
|
120
|
+
if (line.indexOf('表示') >= 0) {
|
|
121
|
+
const r5 = line.match(/^(.+?)と(.+?)と(.+?)と(.+?)と(.+?)を表示/)
|
|
122
|
+
if (r5) {
|
|
123
|
+
const s1 = r5[1]
|
|
124
|
+
const s2 = r5[2]
|
|
125
|
+
const s3 = r5[3]
|
|
126
|
+
const s4 = r5[4]
|
|
127
|
+
const s5 = r5[4]
|
|
128
|
+
result += `(${s1})&(${s2})&(${s3})&(${s4})&(${s5})を表示`
|
|
129
|
+
src = src.substring(r5[0].length)
|
|
130
|
+
continue
|
|
131
|
+
}
|
|
132
|
+
const r4 = line.match(/^(.+?)と(.+?)と(.+?)と(.+?)を表示/)
|
|
133
|
+
if (r4) {
|
|
134
|
+
const s1 = r4[1]
|
|
135
|
+
const s2 = r4[2]
|
|
136
|
+
const s3 = r4[3]
|
|
137
|
+
const s4 = r4[4]
|
|
138
|
+
result += `(${s1})&(${s2})&(${s3})&(${s4})を表示`
|
|
139
|
+
src = src.substring(r4[0].length)
|
|
140
|
+
continue
|
|
141
|
+
}
|
|
142
|
+
const r3 = line.match(/^(.+?)と(.+?)と(.+?)を表示/)
|
|
143
|
+
if (r3) {
|
|
144
|
+
const s1 = r3[1]
|
|
145
|
+
const s2 = r3[2]
|
|
146
|
+
const s3 = r3[3]
|
|
147
|
+
result += `(${s1})&(${s2})&(${s3})を表示`
|
|
148
|
+
src = src.substring(r3[0].length)
|
|
149
|
+
continue
|
|
150
|
+
}
|
|
151
|
+
const r2 = line.match(/^(.+?)と(.+?)を表示/)
|
|
152
|
+
if (r2) {
|
|
153
|
+
const s1 = r2[1]
|
|
154
|
+
const s2 = r2[2]
|
|
155
|
+
result += `(${s1})&(${s2})を表示`
|
|
156
|
+
src = src.substring(r2[0].length)
|
|
157
|
+
continue
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// 『もしj>hakosuならばhakosu←jを実行する』のような単文のもし文
|
|
161
|
+
const rif = line.match(/^もし(.+)を実行する(。|.)*/)
|
|
162
|
+
if (rif) {
|
|
163
|
+
const sent = dncl2nako(rif[1], filename)
|
|
164
|
+
result += `もし、${sent};`
|
|
165
|
+
src = src.substring(rif[0].length)
|
|
166
|
+
continue
|
|
167
|
+
}
|
|
168
|
+
// 一覧から単純な変換
|
|
169
|
+
{
|
|
170
|
+
let flag = false
|
|
171
|
+
for (let key in simple_conv_list) {
|
|
172
|
+
const src_key = src.substring(0, key.length)
|
|
173
|
+
if (src_key === key) {
|
|
174
|
+
result += simple_conv_list[key]
|
|
175
|
+
src = src.substring(key.length)
|
|
176
|
+
flag = true
|
|
177
|
+
break
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (flag) { continue }
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// 1文字削る
|
|
184
|
+
src = src.substring(1)
|
|
185
|
+
result += ch
|
|
186
|
+
}
|
|
187
|
+
return result
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* 半角に変換
|
|
192
|
+
* @param {String} src
|
|
193
|
+
* @returns {string} converted source
|
|
194
|
+
*/
|
|
195
|
+
function conv2half(src) {
|
|
196
|
+
const prepare = new NakoPrepare() // `※`, `//`, `/*` といったパターン全てに対応するために必要
|
|
197
|
+
// 全角半角の統一
|
|
198
|
+
let result = ''
|
|
199
|
+
let flagStr = false
|
|
200
|
+
let flagStrClose = ''
|
|
201
|
+
for (let i = 0; i < src.length; i++) {
|
|
202
|
+
let c = src.charAt(i)
|
|
203
|
+
let cHalf = prepare.convert1ch(c)
|
|
204
|
+
if (flagStr) {
|
|
205
|
+
if (cHalf === flagStrClose) {
|
|
206
|
+
flagStr = false
|
|
207
|
+
flagStrClose = ''
|
|
208
|
+
result += cHalf
|
|
209
|
+
continue
|
|
210
|
+
}
|
|
211
|
+
result += c
|
|
212
|
+
continue
|
|
213
|
+
}
|
|
214
|
+
if (cHalf === '「') {
|
|
215
|
+
flagStr = true
|
|
216
|
+
flagStrClose = '」'
|
|
217
|
+
result += cHalf
|
|
218
|
+
continue
|
|
219
|
+
}
|
|
220
|
+
if (cHalf === '"') {
|
|
221
|
+
flagStr = true
|
|
222
|
+
flagStrClose = '"'
|
|
223
|
+
result += cHalf
|
|
224
|
+
continue
|
|
225
|
+
}
|
|
226
|
+
// 単純な置き換えはここでやってしまう
|
|
227
|
+
// 配列記号の { ... } を [ ... ] に置換
|
|
228
|
+
if (cHalf === '{') { cHalf = '[' }
|
|
229
|
+
if (cHalf === '}') { cHalf = ']' }
|
|
230
|
+
if (cHalf === '←') { cHalf = '=' }
|
|
231
|
+
result += cHalf
|
|
232
|
+
}
|
|
233
|
+
return result
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
module.exports = {
|
|
238
|
+
convert,
|
|
239
|
+
}
|
package/src/nako_gen.js
CHANGED
|
@@ -703,6 +703,7 @@ try {
|
|
|
703
703
|
const topOfFunction = '(function(){\n'
|
|
704
704
|
const endOfFunction = '})'
|
|
705
705
|
let variableDeclarations = ''
|
|
706
|
+
let popStack = ''
|
|
706
707
|
const initialNames = new Set()
|
|
707
708
|
if (this.speedMode.invalidSore === 0) {
|
|
708
709
|
initialNames.add('それ')
|
|
@@ -712,6 +713,8 @@ try {
|
|
|
712
713
|
this.varslistSet.push(this.varsSet)
|
|
713
714
|
// JSの引数と引数をバインド
|
|
714
715
|
variableDeclarations += ' var 引数 = arguments;\n'
|
|
716
|
+
// ローカル変数を生成
|
|
717
|
+
variableDeclarations += ' var __vars = {};\n'
|
|
715
718
|
// 宣言済みの名前を保存
|
|
716
719
|
const varsDeclared = Array.from(this.varsSet.names.values())
|
|
717
720
|
let code = ''
|
|
@@ -749,7 +752,6 @@ try {
|
|
|
749
752
|
// パフォーマンスモニタ:ユーザ関数のinject
|
|
750
753
|
code += performanceMonitorInjectAtEnd
|
|
751
754
|
// 関数の末尾に、ローカル変数をPOP
|
|
752
|
-
code += endOfFunction
|
|
753
755
|
|
|
754
756
|
// 関数内で定義されたローカル変数の宣言
|
|
755
757
|
let needsVarsObject = false
|
|
@@ -765,10 +767,6 @@ try {
|
|
|
765
767
|
if (!NakoGen.isValidIdentifier('それ') && this.speedMode.invalidSore === 0) {
|
|
766
768
|
needsVarsObject = true
|
|
767
769
|
}
|
|
768
|
-
// 一度でも__varsを使ったら、それも宣言する。
|
|
769
|
-
if (needsVarsObject) {
|
|
770
|
-
variableDeclarations += ' var __vars = {};\n'
|
|
771
|
-
}
|
|
772
770
|
if (this.speedMode.invalidSore === 0) {
|
|
773
771
|
if (NakoGen.isValidIdentifier('それ')) {
|
|
774
772
|
variableDeclarations += ' var それ = \'\';\n'
|
|
@@ -776,7 +774,8 @@ try {
|
|
|
776
774
|
variableDeclarations += ` ${this.varname('それ')} = '';`
|
|
777
775
|
}
|
|
778
776
|
}
|
|
779
|
-
code = topOfFunction + performanceMonitorInjectAtStart + variableDeclarations + code
|
|
777
|
+
code = topOfFunction + performanceMonitorInjectAtStart + variableDeclarations + code + popStack
|
|
778
|
+
code += endOfFunction
|
|
780
779
|
|
|
781
780
|
if (name) { this.nako_func[name].fn = code }
|
|
782
781
|
|
|
@@ -852,14 +851,28 @@ try {
|
|
|
852
851
|
convLetArray (node) {
|
|
853
852
|
const name = this._convGen(node.name, true)
|
|
854
853
|
const list = node.index
|
|
854
|
+
let codeInit = ''
|
|
855
855
|
let code = name
|
|
856
|
+
let codeArray = ''
|
|
857
|
+
// codeInit?
|
|
858
|
+
if (node.checkInit) {
|
|
859
|
+
codeInit += `\n/*配列初期化*/if (typeof(${name}) !== 'object') { ${name} = [] }; `
|
|
860
|
+
for (let i = 0; i < list.length; i++) {
|
|
861
|
+
const idx = this._convGen(list[i], true)
|
|
862
|
+
codeArray += `[${idx}]`
|
|
863
|
+
codeInit += `if (typeof(${name}${codeArray}) !== 'object') { ${name}${codeArray} = [] }; `
|
|
864
|
+
}
|
|
865
|
+
codeInit += '\n'
|
|
866
|
+
}
|
|
867
|
+
// array
|
|
856
868
|
for (let i = 0; i < list.length; i++) {
|
|
857
869
|
const idx = this._convGen(list[i], true)
|
|
858
870
|
code += '[' + idx + ']'
|
|
859
871
|
}
|
|
860
872
|
const value = this._convGen(node.value, true)
|
|
861
873
|
code += ' = ' + value + ';\n'
|
|
862
|
-
|
|
874
|
+
// generate code
|
|
875
|
+
return this.convLineno(node, false) + codeInit + code
|
|
863
876
|
}
|
|
864
877
|
|
|
865
878
|
convGenLoop (node) {
|
|
@@ -888,6 +901,8 @@ try {
|
|
|
888
901
|
// ループ条件を確認
|
|
889
902
|
const kara = this._convGen(node.from, true)
|
|
890
903
|
const made = this._convGen(node.to, true)
|
|
904
|
+
let inc = this._convGen(node.inc, true)
|
|
905
|
+
if (inc == null || inc == undefined || inc == 'null') { inc = 1 }
|
|
891
906
|
// ループ内のブロック内容を得る
|
|
892
907
|
const block = this.convGenLoop(node.block)
|
|
893
908
|
// ループ条件を変数に入れる用
|
|
@@ -902,12 +917,12 @@ try {
|
|
|
902
917
|
`const ${varFrom} = ${kara};\n` +
|
|
903
918
|
`const ${varTo} = ${made};\n` +
|
|
904
919
|
`if (${varFrom} <= ${varTo}) { // up\n` +
|
|
905
|
-
` for (let ${varI} = ${varFrom}; ${varI} <= ${varTo}; ${varI}
|
|
920
|
+
` for (let ${varI} = ${varFrom}; ${varI} <= ${varTo}; ${varI}+= ${inc}) {\n` +
|
|
906
921
|
` ${sorePrefex}${word} = ${varI};\n` +
|
|
907
922
|
` ${block}\n` +
|
|
908
923
|
' };\n' +
|
|
909
924
|
'} else { // down\n' +
|
|
910
|
-
` for (let ${varI} = ${varFrom}; ${varI} >= ${varTo}; ${varI}
|
|
925
|
+
` for (let ${varI} = ${varFrom}; ${varI} >= ${varTo}; ${varI}-= ${inc}) {\n` +
|
|
911
926
|
` ${sorePrefex}${word} = ${varI};` + '\n' +
|
|
912
927
|
` ${block}\n` +
|
|
913
928
|
' };\n' +
|
package/src/nako_gen_async.js
CHANGED
|
@@ -18,8 +18,7 @@ const NakoGen = require('./nako_gen')
|
|
|
18
18
|
/**
|
|
19
19
|
* なでしこのインタプリタコード
|
|
20
20
|
*/
|
|
21
|
-
const
|
|
22
|
-
NakoCodeNop = 'NOP'
|
|
21
|
+
const NakoCodeNop = 'NOP'
|
|
23
22
|
const NakoCodeLabel = 'LBL'
|
|
24
23
|
const NakoCodeEOL = 'EOL'
|
|
25
24
|
const NakoCodeJump = 'JMP' // JUMP addr
|
|
@@ -550,13 +549,15 @@ try {
|
|
|
550
549
|
if (sys.index >= sys.codeSize || sys.index < 0) {return}
|
|
551
550
|
const __v0 = sys.__v0
|
|
552
551
|
try {
|
|
553
|
-
|
|
552
|
+
sys.inLoop = true
|
|
553
|
+
while (sys.index < sys.codeSize && sys.index >= 0) {
|
|
554
554
|
// console.log('@@[run]', sys.index)
|
|
555
555
|
switch (sys.index) {
|
|
556
556
|
// --- CODE.BEGIN ---
|
|
557
557
|
${result}
|
|
558
558
|
// --- CODE.END ---
|
|
559
559
|
default:
|
|
560
|
+
sys.inLoop = false
|
|
560
561
|
console.log(sys.index, sys.__stack)
|
|
561
562
|
throw new Error('Invalid sys.index:' + sys.index)
|
|
562
563
|
break
|
|
@@ -568,8 +569,13 @@ try {
|
|
|
568
569
|
} else {
|
|
569
570
|
sys.index++
|
|
570
571
|
}
|
|
571
|
-
if (sys.async) {
|
|
572
|
+
if (sys.async) {
|
|
573
|
+
sys.__saveSysenv(sys)
|
|
574
|
+
sys.async = false
|
|
575
|
+
break
|
|
576
|
+
}
|
|
572
577
|
} // end of while
|
|
578
|
+
sys.inLoop = false
|
|
573
579
|
} catch (e) {
|
|
574
580
|
sys.__errorAsync(e, sys)
|
|
575
581
|
}
|
|
@@ -595,6 +601,12 @@ try {
|
|
|
595
601
|
sys.nextIndex = no;
|
|
596
602
|
}
|
|
597
603
|
this.__return = sys => {
|
|
604
|
+
if (sys.__callstack.length === 0) {
|
|
605
|
+
sys.__destroySysenv(sys, sys.curSysenv.envid)
|
|
606
|
+
sys.index = -2
|
|
607
|
+
sys.nextIndex = -1
|
|
608
|
+
return
|
|
609
|
+
}
|
|
598
610
|
const sore = sys.__vars['それ'];
|
|
599
611
|
sys.__varslist.pop();
|
|
600
612
|
const info = sys.__callstack.pop();
|
|
@@ -616,15 +628,22 @@ try {
|
|
|
616
628
|
}
|
|
617
629
|
this.__callNakoCode = (no, backNo, sys) => {
|
|
618
630
|
this.__call(backNo, sys)
|
|
619
|
-
sys.
|
|
631
|
+
sys.nextIndex = no
|
|
632
|
+
const sysenv = sys.setAsync(sys)
|
|
620
633
|
setTimeout(() => {
|
|
621
634
|
// console.log('//__callNakoCode, back=', backNo, 'no=', no)
|
|
622
|
-
sys.
|
|
623
|
-
sys.nextIndex = -1
|
|
624
|
-
sys.index = no
|
|
625
|
-
sys.nextAsync(sys)
|
|
635
|
+
sys.compAsync(sys, sysenv)
|
|
626
636
|
} ,1)
|
|
627
637
|
}
|
|
638
|
+
this.__callNakoCodeEntry = (no, sys) => {
|
|
639
|
+
sys.__saveSysenv(sys)
|
|
640
|
+
sys.curSysenv = sys.__generateSysenv(sys)
|
|
641
|
+
sys.__restoreSysenv(sys)
|
|
642
|
+
sys.__vars = {"それ":""}
|
|
643
|
+
sys.__varslist.push(sys.__vars)
|
|
644
|
+
sys.index = no;
|
|
645
|
+
sys.nextAsync(sys)
|
|
646
|
+
}
|
|
628
647
|
this.__callObj = (vname, curNo, sys) => {
|
|
629
648
|
if (sys.__vars[vname]) {
|
|
630
649
|
const fname = sys.__vars[vname]
|
|
@@ -639,7 +658,69 @@ try {
|
|
|
639
658
|
}
|
|
640
659
|
throw new Error('async error in __callObj::', vname)
|
|
641
660
|
}
|
|
661
|
+
this.__generateSysenv = sys => {
|
|
662
|
+
sys.envid = ( sys.envid == null ? 0 : sys.envid ) + 1
|
|
663
|
+
const sysenv = {
|
|
664
|
+
callstack: [],
|
|
665
|
+
varstack: [],
|
|
666
|
+
varslist: [sys.__varslist[0], sys.__varslist[1], sys.__varslist[2]],
|
|
667
|
+
index: -1,
|
|
668
|
+
nextIndex: -1,
|
|
669
|
+
tryIndex: -1,
|
|
670
|
+
envid: sys.envid
|
|
671
|
+
}
|
|
672
|
+
sysenv.vars = sysenv.varslist[2]
|
|
673
|
+
if (sys.sysenvs == null) { sys.sysenvs={} }
|
|
674
|
+
sys.sysenvs[sys.envid] = sysenv
|
|
675
|
+
// console.log('generete envid '+sys.envid)
|
|
676
|
+
return sysenv
|
|
677
|
+
}
|
|
678
|
+
this.__destroySysenv = (sys, envid) => {
|
|
679
|
+
delete sys.sysenvs[envid]
|
|
680
|
+
// console.log('destroy envid '+envid)
|
|
681
|
+
}
|
|
682
|
+
this.__saveSysenv = sys => {
|
|
683
|
+
const sysenv = sys.curSysenv
|
|
684
|
+
sysenv.callstack = sys.__callstack
|
|
685
|
+
sysenv.varstack = sys.__stack
|
|
686
|
+
sysenv.varslist = sys.__varslist
|
|
687
|
+
sysenv.vars = sys.__vars
|
|
688
|
+
sysenv.index = sys.index
|
|
689
|
+
sysenv.nextIndex = sys.nextIndex
|
|
690
|
+
sysenv.tryIndex = sys.tryIndex
|
|
691
|
+
}
|
|
692
|
+
this.__restoreSysenv = sys => {
|
|
693
|
+
const sysenv = sys.curSysenv
|
|
694
|
+
sys.__callstack = sysenv.callstack
|
|
695
|
+
sys.__stack = sysenv.varstack
|
|
696
|
+
sys.__varslist = sysenv.varslist
|
|
697
|
+
sys.__vars = sysenv.vars
|
|
698
|
+
___vars = sys.__vars
|
|
699
|
+
sys.index = sysenv.index
|
|
700
|
+
sys.nextIndex = sysenv.nextIndex
|
|
701
|
+
sys.tryIndex = sysenv.tryIndex
|
|
702
|
+
}
|
|
703
|
+
this.setAsync = sys => {
|
|
704
|
+
sys.async = true
|
|
705
|
+
return sys.curSysenv
|
|
706
|
+
}
|
|
707
|
+
this.compAsync = (sys,sysenv) => {
|
|
708
|
+
if (sys.async && sys.curSysenv != null && sysenv != null && sys.curSysenv.envid === sysenv.envid) {
|
|
709
|
+
sys.async = false
|
|
710
|
+
} else {
|
|
711
|
+
if (sys.curSysenv == null || sysenv == null || sys.curSysenv.envid !== sysenv.envid) {
|
|
712
|
+
sys.__saveSysenv(sys)
|
|
713
|
+
const envid = sys.curSysenv.envid
|
|
714
|
+
sys.curSysenv = sysenv
|
|
715
|
+
sys.__restoreSysenv(sys)
|
|
716
|
+
// console.log('switch envid '+envid+' to '+sys.curSysenv.envid)
|
|
717
|
+
}
|
|
718
|
+
sys.nextAsync(sys)
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
|
|
642
722
|
this.__resetAsync(this)
|
|
723
|
+
this.curSysenv = this.__generateSysenv(this)
|
|
643
724
|
this.nextAsync(this)
|
|
644
725
|
//-------------------------
|
|
645
726
|
`
|
|
@@ -1076,8 +1157,14 @@ try {
|
|
|
1076
1157
|
josi: meta.josi,
|
|
1077
1158
|
fn: '(function(){\n' +
|
|
1078
1159
|
' const sys = (arguments.length > 0) ? arguments[arguments.length-1] : {}; \n' +
|
|
1160
|
+
' if (sys.newenv) { \n' +
|
|
1161
|
+
' sys.newenv = false\n' +
|
|
1162
|
+
` sys.__callNakoCodeEntry(sys.__labels['${funcName}'], sys);` + '\n' +
|
|
1163
|
+
' } else {\n' +
|
|
1079
1164
|
' ' + codeCall + '\n' +
|
|
1080
|
-
`
|
|
1165
|
+
` sys.__callNakoCode(sys.__labels['${funcName}'], sys.nextIndex, sys);` + '\n' +
|
|
1166
|
+
' if (!sys.inLoop) { sys.nextAsync(sys) }\n' +
|
|
1167
|
+
' } })',
|
|
1081
1168
|
type: 'func'
|
|
1082
1169
|
}
|
|
1083
1170
|
|
package/src/nako_josi_list.js
CHANGED
|
@@ -6,7 +6,7 @@ const josiList = [
|
|
|
6
6
|
'について', 'くらい', 'なのか', 'までを', 'までの', 'による',
|
|
7
7
|
'とは', 'から', 'まで', 'だけ', 'より', 'ほど', 'など',
|
|
8
8
|
'いて', 'えて', 'きて', 'けて', 'して', 'って', 'にて', 'みて',
|
|
9
|
-
'めて', 'ねて', 'では', 'には', 'は~', 'んで',
|
|
9
|
+
'めて', 'ねて', 'では', 'には', 'は~', 'んで', 'ずつ',
|
|
10
10
|
'は', 'を', 'に', 'へ', 'で', 'と', 'が', 'の'
|
|
11
11
|
]
|
|
12
12
|
|