nadesiko3 3.3.45 → 3.3.49
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/LICENSE +21 -21
- package/README.md +143 -132
- package/batch/browsers.template.md +3 -3
- package/batch/build_browsers.nako3 +72 -72
- package/batch/build_command.nako3 +44 -44
- package/batch/build_nako_version.nako3 +42 -42
- package/batch/calc_hash.nako3 +29 -29
- package/batch/cmd_txt2json.nako3 +74 -74
- package/batch/command.txt +270 -338
- package/batch/command_nakopad.txt +9 -69
- package/batch/download-extlib.nako3 +43 -43
- package/batch/gen_command_nakopad.nako3 +57 -57
- package/batch/jsplugin2text.nako3 +285 -285
- package/batch/pickup_command.nako3 +110 -110
- package/batch/pickup_reserved_words.nako3 +11 -11
- package/batch/publish_version.nako3 +46 -46
- package/batch/show_agents.js +14 -14
- package/batch/turtle2js.nako3 +21 -21
- package/bin/cnako3 +10 -10
- package/core/.editorconfig +6 -0
- package/core/.eslintrc.cjs +33 -0
- package/core/.github/dependabot.yml +7 -0
- package/core/.github/workflows/nodejs.yml +37 -0
- package/core/.github/workflows/super-linter.yml +61 -0
- package/core/.github/workflows/textlint.yml +199 -0
- package/core/LICENSE +21 -0
- package/core/README.md +66 -0
- package/core/batch/build_nako_version.nako3 +42 -0
- package/core/command/snako.mjs +105 -0
- package/core/command/snako.mts +116 -0
- package/core/index.mjs +21 -0
- package/core/index.mts +21 -0
- package/core/package.json +47 -0
- package/core/sample/hello.nako3 +7 -0
- package/core/sample/hoge.mjs +4 -0
- package/core/sample/hoge.mts +6 -0
- package/core/src/nako3.mjs +858 -0
- package/core/src/nako3.mts +967 -0
- package/core/src/nako_colors.mjs +78 -0
- package/core/src/nako_colors.mts +86 -0
- package/core/src/nako_core_version.mjs +8 -0
- package/core/src/nako_core_version.mts +19 -0
- package/core/src/nako_csv.mjs +185 -0
- package/core/src/nako_csv.mts +188 -0
- package/core/src/nako_errors.mjs +173 -0
- package/core/src/nako_errors.mts +197 -0
- package/core/src/nako_from_dncl.mjs +255 -0
- package/core/src/nako_from_dncl.mts +250 -0
- package/core/src/nako_gen.mjs +1648 -0
- package/core/src/nako_gen.mts +1719 -0
- package/core/src/nako_gen_async.mjs +1659 -0
- package/core/src/nako_gen_async.mts +1732 -0
- package/core/src/nako_global.mjs +107 -0
- package/core/src/nako_global.mts +138 -0
- package/core/src/nako_indent.mjs +445 -0
- package/core/src/nako_indent.mts +492 -0
- package/core/src/nako_josi_list.mjs +38 -0
- package/core/src/nako_josi_list.mts +45 -0
- package/core/src/nako_lex_rules.mjs +253 -0
- package/core/src/nako_lex_rules.mts +260 -0
- package/core/src/nako_lexer.mjs +609 -0
- package/core/src/nako_lexer.mts +612 -0
- package/core/src/nako_logger.mjs +199 -0
- package/core/src/nako_logger.mts +232 -0
- package/core/src/nako_parser3.mjs +2439 -0
- package/core/src/nako_parser3.mts +2195 -0
- package/core/src/nako_parser_base.mjs +370 -0
- package/core/src/nako_parser_base.mts +370 -0
- package/core/src/nako_parser_const.mjs +37 -0
- package/core/src/nako_parser_const.mts +37 -0
- package/core/src/nako_prepare.mjs +304 -0
- package/core/src/nako_prepare.mts +315 -0
- package/core/src/nako_reserved_words.mjs +38 -0
- package/core/src/nako_reserved_words.mts +38 -0
- package/core/src/nako_source_mapping.mjs +207 -0
- package/core/src/nako_source_mapping.mts +262 -0
- package/core/src/nako_test.mjs +37 -0
- package/core/src/nako_types.mjs +25 -0
- package/core/src/nako_types.mts +151 -0
- package/core/src/plugin_csv.mjs +49 -0
- package/core/src/plugin_csv.mts +50 -0
- package/core/src/plugin_math.mjs +328 -0
- package/core/src/plugin_math.mts +326 -0
- package/core/src/plugin_promise.mjs +91 -0
- package/core/src/plugin_promise.mts +91 -0
- package/core/src/plugin_system.mjs +2832 -0
- package/core/src/plugin_system.mts +2690 -0
- package/core/src/plugin_test.mjs +34 -0
- package/core/src/plugin_test.mts +34 -0
- package/core/test/array_test.mjs +34 -0
- package/core/test/basic_test.mjs +344 -0
- package/core/test/calc_test.mjs +140 -0
- package/core/test/core_module_test.mjs +23 -0
- package/core/test/debug_test.mjs +16 -0
- package/core/test/dncl_test.mjs +94 -0
- package/core/test/error_message_test.mjs +210 -0
- package/core/test/error_test.mjs +16 -0
- package/core/test/flow_test.mjs +373 -0
- package/core/test/func_call.mjs +160 -0
- package/core/test/func_test.mjs +149 -0
- package/core/test/indent_test.mjs +364 -0
- package/core/test/lex_test.mjs +168 -0
- package/core/test/literal_test.mjs +73 -0
- package/core/test/nako_lexer_test.mjs +35 -0
- package/core/test/nako_logger_test.mjs +76 -0
- package/core/test/nako_logger_test.mts +78 -0
- package/core/test/plugin_csv_test.mjs +38 -0
- package/core/test/plugin_promise_test.mjs +18 -0
- package/core/test/plugin_system_test.mjs +630 -0
- package/core/test/prepare_test.mjs +96 -0
- package/core/test/re_test.mjs +22 -0
- package/core/test/side_effects_test.mjs +92 -0
- package/core/test/variable_scope_test.mjs +149 -0
- package/core/tsconfig.json +101 -0
- package/demo/ace_editor.html +89 -89
- package/demo/ace_editor_tabs.html +161 -161
- package/demo/basic.html +71 -71
- package/demo/browsers.html +9 -10
- package/demo/css/basic.css +3 -3
- package/demo/css/common.css +157 -157
- package/demo/css/editor.css +8 -8
- package/demo/css/flow.css +3 -3
- package/demo/css/index.css +3 -3
- package/demo/flow.html +98 -98
- package/demo/graph.html +53 -53
- package/demo/image/nakopad-icon256.png +0 -0
- package/demo/index.html +133 -133
- package/demo/js/common.js +17 -17
- package/demo/js/turtle3d_test.js +44 -44
- package/demo/js/turtle_test.js +45 -45
- package/demo/nako3/calc.nako3 +4 -4
- package/demo/runscript.html +47 -47
- package/demo/runscript2.html +33 -33
- package/demo/runscript3.html +35 -35
- package/demo/runscript4.html +33 -33
- package/demo/turtle.html +58 -58
- package/demo/turtle2.html +141 -141
- package/demo/turtle3.html +279 -279
- package/demo/turtle3d.html +58 -58
- package/demo/turtle3d2.html +107 -107
- package/demo/version.html +24 -24
- package/doc/SETUP.md +157 -157
- package/doc/about.md +17 -17
- package/doc/browsers.md +26 -26
- package/doc/docgen.md +21 -21
- package/doc/editor.md +44 -44
- package/doc/files.md +39 -39
- package/doc/plugins.md +234 -234
- package/doc/release.md +79 -79
- package/doc/textlint.md +43 -43
- package/doc/win32.md +57 -57
- package/package.json +195 -192
- package/release/_hash.txt +28 -28
- package/release/_script-tags.txt +14 -14
- 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/nako_gen_async.js +1 -1
- package/release/plugin_csv.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/src/browsers.txt +11 -12
- package/src/browsers_agents.json +2 -2
- package/src/browsers_agents.mjs +1 -1
- package/src/cnako3.mjs +17 -10
- package/src/cnako3.mts +18 -12
- package/src/cnako3mod.mjs +707 -687
- package/src/cnako3mod.mts +712 -696
- package/src/commander_ja.mjs +164 -164
- package/src/commander_ja.mts +161 -161
- package/src/enako3.mjs +68 -69
- package/src/era.mjs +22 -22
- package/src/image_turtle-elephant.mjs +2 -5
- package/src/image_turtle-panda.mjs +2 -5
- package/src/image_turtle64.mjs +2 -5
- package/src/index.mjs +9 -9
- package/src/index.mts +10 -11
- package/src/nako3editorfix.sfd +106 -106
- package/src/nako_version.mjs +8 -8
- package/src/nako_version.mts +2 -2
- package/src/plugin_browser.mjs +213 -212
- package/src/plugin_browser.mts +206 -205
- package/src/plugin_browser_ajax.mjs +399 -399
- package/src/plugin_browser_audio.mjs +109 -109
- package/src/plugin_browser_canvas.mjs +449 -449
- package/src/plugin_browser_chart.mjs +294 -294
- package/src/plugin_browser_color.mjs +49 -49
- package/src/plugin_browser_crypto.mjs +26 -26
- package/src/plugin_browser_dialog.mjs +53 -53
- package/src/plugin_browser_dom_basic.mjs +336 -336
- package/src/plugin_browser_dom_event.mjs +193 -193
- package/src/plugin_browser_dom_parts.mjs +396 -396
- package/src/plugin_browser_geolocation.mjs +51 -51
- package/src/plugin_browser_hotkey.mjs +25 -25
- package/src/plugin_browser_html.mjs +59 -59
- package/src/plugin_browser_in_worker.mjs +45 -45
- package/src/plugin_browser_location.mjs +21 -21
- package/src/plugin_browser_speech.mjs +111 -111
- package/src/plugin_browser_storage.mjs +121 -121
- package/src/plugin_browser_system.mjs +31 -31
- package/src/plugin_browser_websocket.mjs +73 -73
- package/src/plugin_caniuse.mjs +29 -29
- package/src/plugin_datetime.mjs +394 -394
- package/src/plugin_httpserver.mjs +277 -0
- package/src/plugin_httpserver.mts +286 -0
- package/src/plugin_kansuji.mjs +224 -224
- package/src/plugin_keigo.mjs +55 -55
- package/src/plugin_markup.mjs +32 -32
- package/src/plugin_node.mjs +1047 -1047
- package/src/plugin_node.mts +980 -980
- package/src/plugin_turtle.mjs +647 -647
- package/src/plugin_webworker.mjs +334 -334
- package/src/plugin_weykturtle3d.mjs +1214 -1214
- package/src/plugin_worker.mjs +95 -95
- package/src/repl.nako3 +63 -63
- package/src/wnako3.mjs +12 -12
- package/src/wnako3.mts +11 -11
- package/src/wnako3_editor.css +215 -215
- package/src/wnako3_editor.mjs +1542 -1542
- package/src/wnako3_editor.mts +1657 -1656
- package/src/wnako3mod.mjs +213 -213
- package/src/wnako3mod.mts +214 -214
- package/src/wnako3webworker.mjs +69 -68
- package/test/ace_editor/karma.config.js +94 -94
- package/test/ace_editor/test/.babelrc.json +3 -3
- package/test/ace_editor/test/ace_editor_test.js +178 -178
- package/test/ace_editor/test/html/custom_context.html +139 -139
- package/test/async/async_basic_test.mjs +122 -122
- package/test/browser/karma.config.js +221 -221
- package/test/browser/test/.babelrc.json +3 -3
- package/test/browser/test/compare_util.js +50 -50
- package/test/browser/test/html/div_basic.html +2 -2
- package/test/browser/test/html/event_dom_form.html +4 -4
- package/test/browser/test/html/event_dom_scrolldiv.html +5 -5
- package/test/browser/test/import_plugin_checker.js +24 -24
- package/test/browser/test/plugin_browser_test.js +51 -51
- package/test/browser/test/plugin_browser_test_ajax.js +123 -123
- package/test/browser/test/plugin_browser_test_color.js +18 -18
- package/test/browser/test/plugin_browser_test_dialog.js +72 -72
- package/test/browser/test/plugin_browser_test_dom_event.js +598 -598
- package/test/browser/test/plugin_browser_test_dom_parts.js +125 -125
- package/test/browser/test/plugin_browser_test_system.js +9 -9
- package/test/browser/test/plugin_turtle_test.js +817 -817
- package/test/browser/test/plugin_webworker_test.js +86 -86
- package/test/browser/test/require_test.js +68 -68
- package/test/bundled/karma.config.base.js +117 -117
- package/test/bundled/karma.config.js +86 -86
- package/test/bundled/test/.babelrc.json +3 -3
- package/test/bundled/test/bundled_test.js +69 -69
- package/test/bundled/test/html/custom_context.html +65 -65
- package/test/bundled/test/html/custom_debug.html +66 -66
- package/test/bundled/test4b.cmd +52 -52
- package/test/bundled/test_base/.babelrc.json +3 -3
- package/test/bundled/test_base/_checktool_test.js +25 -25
- package/test/bundled/test_base/basic_ajax_test.js +56 -56
- package/test/bundled/test_base/basic_async_test.js +18 -18
- package/test/bundled/test_base/basic_test.js +153 -153
- package/test/bundled/test_base/calc_test.js +132 -132
- package/test/bundled/test_base/css/browsers_box.css +114 -114
- package/test/bundled/test_base/html/custom_context.html +69 -69
- package/test/bundled/test_base/html/custom_debug.html +71 -71
- package/test/bundled/test_base/js/browsers_box.js +72 -72
- package/test/bundled/test_base/plugin_csv_test.js +37 -37
- package/test/bundled/test_base/plugin_datetime_test.js +115 -115
- package/test/bundled/test_base/plugin_kansuji_test.js +49 -49
- package/test/bundled/test_base/plugin_system_test.js +410 -410
- package/test/bundled/test_base/plugin_webworker_test.js +53 -53
- package/test/bundled/test_base/test_utils.js +191 -191
- package/test/common/plugin_browser_test.mjs +22 -24
- package/test/common/plugin_browser_ut_audio_test.mjs +108 -108
- package/test/common/plugin_browser_ut_color_test.mjs +21 -21
- package/test/common/plugin_browser_ut_dialog_test.mjs +100 -100
- package/test/common/plugin_browser_ut_html_test.mjs +13 -13
- package/test/common/plugin_browser_ut_system_test.mjs +10 -10
- package/test/common/plugin_markup_test.mjs +23 -23
- package/test/jsconfig.json +19 -19
- package/test/karma.config.js +91 -91
- package/test/node/async_test.mjs +96 -82
- package/test/node/commander_ja_test.mjs +89 -89
- package/test/node/error_message_test.mjs +243 -253
- package/test/node/kai_test.nako3 +6 -6
- package/test/node/node_test.mjs +60 -60
- package/test/node/plugin_broken.js.txt +3 -3
- package/test/node/plugin_browser_ut_ajax_test.mjs.todo +357 -357
- package/test/node/plugin_browser_ut_location_test.mjs +42 -42
- package/test/node/plugin_markup_test.mjs +47 -46
- package/test/node/plugin_math_test.mjs +45 -44
- package/test/node/plugin_node_test.mjs +98 -97
- package/test/node/plugin_test.mjs +44 -43
- package/test/node/relative_import_test_1.nako3 +1 -1
- package/test/node/relative_import_test_2.nako3 +2 -2
- package/test/node/require_nako3_test.mjs +67 -66
- package/test/node/requiretest.nako3 +4 -4
- package/test/node/requiretest_indirect.nako3 +1 -1
- package/test/node/requiretest_name.nako3 +5 -5
- package/test/node/runtime_error.nako3 +2 -2
- package/test/node/scope1.nako3 +10 -10
- package/test/node/scope2.nako3 +12 -12
- package/test/node/side_effects_test.mjs +39 -119
- package/test/node/sjis.txt +5 -5
- package/test/node/syntax_error.nako3 +1 -1
- package/test/node/wnako3_editor_test.mjs +384 -384
- package/tools/README.md +12 -7
- package/tools/check_new_version.nako3 +25 -25
- package/tools/nako3edit/html/daisyui/LICENSE +22 -22
- package/tools/nako3edit/html/daisyui/version_2.14.1 +1 -1
- package/tools/nako3edit/html/edit.html +170 -170
- package/tools/nako3edit/html/edit_plugin.js +6 -6
- package/tools/nako3edit/html/files.html +125 -125
- package/tools/nako3edit/html/nako3edit.css +65 -65
- package/tools/nako3edit/index.mjs +248 -244
- package/tools/nako3server/index.html +10 -0
- package/tools/nako3server/index.mjs +116 -116
- package/tools/nako3server/index.nako3 +34 -0
- package/release/nako_gen_async.js.LICENSE.txt +0 -35
- package/release/plugin_caniuse.js.LICENSE.txt +0 -11
- package/release/plugin_csv.js.LICENSE.txt +0 -15
- package/release/plugin_datetime.js.LICENSE.txt +0 -15
- package/release/plugin_kansuji.js.LICENSE.txt +0 -3
- package/release/plugin_markup.js.LICENSE.txt +0 -11
- package/release/plugin_turtle.js.LICENSE.txt +0 -15
- package/release/plugin_webworker.js.LICENSE.txt +0 -3
- package/release/plugin_weykturtle3d.js.LICENSE.txt +0 -3
- package/release/wnako3webworker.js.LICENSE.txt +0 -131
- package/tools/nako3edit/a.sqlite3 +0 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import assert from 'assert'
|
|
2
|
+
import { NakoCompiler } from '../src/nako3.mjs'
|
|
3
|
+
|
|
4
|
+
describe('func_test', async () => {
|
|
5
|
+
// nako.logger.addListener('trace', ({ browserConsole }) => { console.log(...browserConsole) })
|
|
6
|
+
const cmp = async (/** @type {string} */ code, /** @type {string} */ res) => {
|
|
7
|
+
const nako = new NakoCompiler()
|
|
8
|
+
nako.logger.debug('code=' + code)
|
|
9
|
+
assert.strictEqual((await nako.runAsync(code)).log, res)
|
|
10
|
+
}
|
|
11
|
+
// --- test ---
|
|
12
|
+
|
|
13
|
+
it('簡単な関数定義', async () => {
|
|
14
|
+
await cmp('●HOGE()\n「あ」と表示\nここまで\nHOGE。', 'あ')
|
|
15
|
+
await cmp('関数 HOGE()\n「あ」と表示\nここまで\nHOGE。', 'あ')
|
|
16
|
+
})
|
|
17
|
+
it('引数付き関数定義', async () => {
|
|
18
|
+
await cmp('●(Sの)表示処理とは\nSを表示\nここまで\n「殿」の表示処理。', '殿')
|
|
19
|
+
await cmp('●(AとBの)加算処理とは;それはA+B;ここまで;3と8の加算処理して表示', '11')
|
|
20
|
+
await cmp('●(AにBをCと)連続加算処理\nそれはA+B+C\nここまで\n100に20を3と連続加算処理して表示。', '123')
|
|
21
|
+
})
|
|
22
|
+
it('引数付き関数定義(互換性のため)', async () => {
|
|
23
|
+
await cmp('●表示処理(Sの)\nSを表示\nここまで\n「殿」の表示処理。', '殿')
|
|
24
|
+
await cmp('●加算処理(AとBの);それはA+B;ここまで;3と8の加算処理して表示', '11')
|
|
25
|
+
await cmp('●HOGE(Aに)\nAと表示\nここまで\n「姫」にHOGE。', '姫')
|
|
26
|
+
})
|
|
27
|
+
it('三つの引数', async () => {
|
|
28
|
+
await cmp('●踊る(AとBがCを)\n「{A}:{B}:{C}」と表示\nここまで\n「姫」と「殿」が「タンゴ」を踊る。', '姫:殿:タンゴ')
|
|
29
|
+
await cmp('●踊る(AとBとCが)\n「{A}:{B}:{C}」と表示\nここまで\n「姫」と「殿」と「息子」が踊る。', '姫:殿:息子')
|
|
30
|
+
})
|
|
31
|
+
it('戻るのテスト', async () => {
|
|
32
|
+
await cmp('●加算(AにBを)\n(A+B)で戻る\nここまで\n2に3を加算して表示。', '5')
|
|
33
|
+
})
|
|
34
|
+
it('再帰テスト', async () => {
|
|
35
|
+
await cmp('●NN(vとlevelで)\n' +
|
|
36
|
+
'もしlevel<=0ならば、vで戻る。\n' +
|
|
37
|
+
'(v+1)と(level-1)でNN。\n' +
|
|
38
|
+
'それで戻る。\nここまで\n' +
|
|
39
|
+
'0と5でNN。それを表示。', '5')
|
|
40
|
+
})
|
|
41
|
+
it('ローカル変数1', async () => {
|
|
42
|
+
await cmp('N=30\n' +
|
|
43
|
+
'●テスト\n' +
|
|
44
|
+
' Nとは変数\n' +
|
|
45
|
+
' N=10\n' +
|
|
46
|
+
'ここまで\n' +
|
|
47
|
+
'テスト。\n' +
|
|
48
|
+
'Nを表示。', '30')
|
|
49
|
+
})
|
|
50
|
+
it('ローカル変数2', async () => {
|
|
51
|
+
await cmp('N=30\n' +
|
|
52
|
+
'●テスト\n' +
|
|
53
|
+
' Nとは変数=10\n' +
|
|
54
|
+
'ここまで\n' +
|
|
55
|
+
'テスト。\n' +
|
|
56
|
+
'Nを表示。', '30')
|
|
57
|
+
})
|
|
58
|
+
it('ローカル変数3', async () => {
|
|
59
|
+
await cmp('N=300\n' +
|
|
60
|
+
'●テスト(AにBを)\n' +
|
|
61
|
+
' 変数のN=A+B\n' +
|
|
62
|
+
'ここまで\n' +
|
|
63
|
+
'1に2をテスト。\n' +
|
|
64
|
+
'Nを表示。', '300')
|
|
65
|
+
})
|
|
66
|
+
it('ローカル定数1', async () => {
|
|
67
|
+
await cmp('定数のN=30\n' +
|
|
68
|
+
'Nを表示。', '30')
|
|
69
|
+
})
|
|
70
|
+
it('ローカル定数2', async () => {
|
|
71
|
+
const expected = '30'
|
|
72
|
+
const nako = new NakoCompiler()
|
|
73
|
+
for (let i = 0; i < 2; i++) {
|
|
74
|
+
const env = await nako.run('定数のN=30\nNを表示。', 'main.nako3')
|
|
75
|
+
assert.strictEqual(env.log, expected)
|
|
76
|
+
env.reset()
|
|
77
|
+
}
|
|
78
|
+
})
|
|
79
|
+
it('助詞の複数定義', async () => {
|
|
80
|
+
await cmp('●加算処理(AにBを|AとBの)\n' +
|
|
81
|
+
'(A+B)を戻す。\n' +
|
|
82
|
+
'ここまで\n' +
|
|
83
|
+
'10に20を加算処理して表示。\n' +
|
|
84
|
+
'20と10の加算処理して表示。\n', '30\n30')
|
|
85
|
+
})
|
|
86
|
+
it('それを関数の戻り値とする', async () => {
|
|
87
|
+
await cmp('●加算処理(AにBを|AとBの)\n' +
|
|
88
|
+
'それは、A+B。\n' +
|
|
89
|
+
'ここまで\n' +
|
|
90
|
+
'10に20を加算処理して表示。\n' +
|
|
91
|
+
'20と10の加算処理して表示。\n', '30\n30')
|
|
92
|
+
})
|
|
93
|
+
it('英語言語っぽい関数定義', async () => {
|
|
94
|
+
await cmp('●加算処理(A,B)\n' +
|
|
95
|
+
'それは、A+B。\n' +
|
|
96
|
+
'ここまで\n' +
|
|
97
|
+
'加算処理(10,20)を表示。\n' +
|
|
98
|
+
'加算処理(20,10)を表示。\n', '30\n30')
|
|
99
|
+
})
|
|
100
|
+
it('関数の参照渡し', async () => {
|
|
101
|
+
await cmp('●({関数}fで)演算処理とは\n' +
|
|
102
|
+
' それは、f()\n' +
|
|
103
|
+
'ここまで\n' +
|
|
104
|
+
'●二倍処理とは\n' +
|
|
105
|
+
' それは2\n' +
|
|
106
|
+
'ここまで\n' +
|
|
107
|
+
'二倍処理で演算処理して表示。', '2')
|
|
108
|
+
await cmp('●({関数}fでaを)演算処理とは\n' +
|
|
109
|
+
' それは、f(a)\n' +
|
|
110
|
+
'ここまで\n' +
|
|
111
|
+
'●(aを)二倍処理とは\n' +
|
|
112
|
+
' それはa*2\n' +
|
|
113
|
+
'ここまで\n' +
|
|
114
|
+
'二倍処理で2を演算処理して表示。', '4')
|
|
115
|
+
await cmp('●({関数}fでaとbを)演算処理とは\n' +
|
|
116
|
+
' それは、f(a,b)\n' +
|
|
117
|
+
'ここまで\n' +
|
|
118
|
+
'●(aとbを)二倍処理とは\n' +
|
|
119
|
+
' それはa*b*2\n' +
|
|
120
|
+
'ここまで\n' +
|
|
121
|
+
'二倍処理で2と3を演算処理して表示。', '12')
|
|
122
|
+
})
|
|
123
|
+
it('無名関数', async () => {
|
|
124
|
+
await cmp('F=関数(a,b)それはa+b;ここまで。\n' +
|
|
125
|
+
'F(3,5)を表示。\n', '8')
|
|
126
|
+
await cmp('F=関数(a,b)それは(a+b);ここまで\n' +
|
|
127
|
+
'F(3,5)を表示。\n', '8')
|
|
128
|
+
await cmp('(関数(a,b)それは(a+b);ここまで)をFに代入。\n' +
|
|
129
|
+
'F(1,2)を表示。\n', '3')
|
|
130
|
+
await cmp('(●(a,b)それは(a+b);ここまで)をFに代入。\n' +
|
|
131
|
+
'F(1,2)を表示。\n', '3')
|
|
132
|
+
})
|
|
133
|
+
it('暗黙的な無名関数「には」', async () => {
|
|
134
|
+
await cmp('●(Fを)処理した時\nF()を表示\nここまで\n' +
|
|
135
|
+
'処理した時には\nそれは「OK」\nここまで。', 'OK')
|
|
136
|
+
await cmp('●(fでaを)演算処理とは\nf(a)を表示\nここまで\n' +
|
|
137
|
+
'2を演算処理には(a)\nそれはa*2\nここまで\n', '4')
|
|
138
|
+
})
|
|
139
|
+
it('暗黙的な無名関数「は〜」', async () => {
|
|
140
|
+
await cmp('●(Fを)処理した時\nF()を表示\nここまで\n' +
|
|
141
|
+
'処理した時は〜\nそれは「OK」\nここまで。', 'OK')
|
|
142
|
+
await cmp('●(fでaを)演算処理とは\nf(a)を表示\nここまで\n' +
|
|
143
|
+
'2を演算処理は~(a)\nそれはa*2\nここまで\n', '4')
|
|
144
|
+
})
|
|
145
|
+
it('**すること #936', async () => {
|
|
146
|
+
await cmp('●(AとBを)加算処理とは\nAとBを足すこと。。。3と5を加算処理して表示。', '8')
|
|
147
|
+
await cmp('●(Nを)二乗処理とは;A=0;N回,AにNを足してAに代入すること。それはA。。。5を二乗処理して表示。', '25')
|
|
148
|
+
})
|
|
149
|
+
})
|
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
import assert from 'assert'
|
|
2
|
+
import NakoIndent from '../src/nako_indent.mjs'
|
|
3
|
+
|
|
4
|
+
describe('indent', () => {
|
|
5
|
+
const cmp = (/** @type {unknown} */ src, /** @type {string} */ expected) => {
|
|
6
|
+
// @ts-ignore
|
|
7
|
+
src = NakoIndent.convert(src).code
|
|
8
|
+
// @ts-ignore
|
|
9
|
+
src = src.replace(/\s+$/, '')
|
|
10
|
+
expected = expected.replace(/\s+$/, '')
|
|
11
|
+
assert.strictEqual(src, expected)
|
|
12
|
+
}
|
|
13
|
+
it('もし', () => {
|
|
14
|
+
cmp('!インデント構文\n' +
|
|
15
|
+
'もしA=1ならば\n' +
|
|
16
|
+
' 1を表示\n',
|
|
17
|
+
// ---
|
|
18
|
+
'!インデント構文\n' +
|
|
19
|
+
'もしA=1ならば\n' +
|
|
20
|
+
' 1を表示\n' +
|
|
21
|
+
'ここまで‰\n')
|
|
22
|
+
cmp('!インデント構文\n' +
|
|
23
|
+
'もしA=1ならば\n' +
|
|
24
|
+
' 「わん」と表示。\n',
|
|
25
|
+
// ---
|
|
26
|
+
'!インデント構文\n' +
|
|
27
|
+
'もしA=1ならば\n' +
|
|
28
|
+
' 「わん」と表示。\n' +
|
|
29
|
+
'ここまで‰\n')
|
|
30
|
+
})
|
|
31
|
+
it('もし 違えば', () => {
|
|
32
|
+
cmp('!インデント構文\n' +
|
|
33
|
+
'もしA=1ならば\n' +
|
|
34
|
+
' 1を表示\n' +
|
|
35
|
+
'違えば\n' +
|
|
36
|
+
' 2を表示\n',
|
|
37
|
+
// ---
|
|
38
|
+
'!インデント構文\n' +
|
|
39
|
+
'もしA=1ならば\n' +
|
|
40
|
+
' 1を表示\n' +
|
|
41
|
+
'違えば\n' +
|
|
42
|
+
' 2を表示\n' +
|
|
43
|
+
'ここまで‰\n')
|
|
44
|
+
})
|
|
45
|
+
it('3回と5回', () => {
|
|
46
|
+
cmp('!インデント構文\n' +
|
|
47
|
+
'5回\n' +
|
|
48
|
+
' 3回\n' +
|
|
49
|
+
' 1を表示\n',
|
|
50
|
+
// ---
|
|
51
|
+
'!インデント構文\n' +
|
|
52
|
+
'5回\n' +
|
|
53
|
+
' 3回\n' +
|
|
54
|
+
' 1を表示\n' +
|
|
55
|
+
' ここまで‰\n' +
|
|
56
|
+
'ここまで‰\n')
|
|
57
|
+
})
|
|
58
|
+
it('もし 違えば 入れ子', () => {
|
|
59
|
+
cmp('!インデント構文\n' +
|
|
60
|
+
'もしA=1ならば\n' +
|
|
61
|
+
' もしB=1ならば\n' +
|
|
62
|
+
' 1を表示\n' +
|
|
63
|
+
' 違えば\n' +
|
|
64
|
+
' 2を表示\n' +
|
|
65
|
+
'違えば\n' +
|
|
66
|
+
' 3を表示\n',
|
|
67
|
+
// ---
|
|
68
|
+
'!インデント構文\n' +
|
|
69
|
+
'もしA=1ならば\n' +
|
|
70
|
+
' もしB=1ならば\n' +
|
|
71
|
+
' 1を表示\n' +
|
|
72
|
+
' 違えば\n' +
|
|
73
|
+
' 2を表示\n' +
|
|
74
|
+
' ここまで‰\n' +
|
|
75
|
+
'違えば\n' +
|
|
76
|
+
' 3を表示\n' +
|
|
77
|
+
'ここまで‰\n')
|
|
78
|
+
})
|
|
79
|
+
it('JSONで改行がある場合(#699)', () => {
|
|
80
|
+
cmp('!インデント構文\n' +
|
|
81
|
+
'J={"taro":30,\n' +
|
|
82
|
+
' "jiro":50}\n',
|
|
83
|
+
// ---
|
|
84
|
+
'!インデント構文\n' +
|
|
85
|
+
'J={"taro":30,\n' +
|
|
86
|
+
' "jiro":50}\n')
|
|
87
|
+
cmp('!インデント構文\n' +
|
|
88
|
+
'S=「aaa\n' +
|
|
89
|
+
'bbb」\n' +
|
|
90
|
+
'もしS=30ならば\n' +
|
|
91
|
+
' 「あ」と表示\n',
|
|
92
|
+
// ---
|
|
93
|
+
'!インデント構文\n' +
|
|
94
|
+
'S=「aaa\n' +
|
|
95
|
+
'bbb」\n' +
|
|
96
|
+
'もしS=30ならば\n' +
|
|
97
|
+
' 「あ」と表示\n' +
|
|
98
|
+
'ここまで‰\n')
|
|
99
|
+
})
|
|
100
|
+
it('コメント内に文字列リテラルの開始記号がある場合', () => {
|
|
101
|
+
cmp('!インデント構文\n' +
|
|
102
|
+
'もしA=1ならば\n' +
|
|
103
|
+
' 1を表示 # 「\n' +
|
|
104
|
+
'2を表示\n',
|
|
105
|
+
// ---
|
|
106
|
+
'!インデント構文\n' +
|
|
107
|
+
'もしA=1ならば\n' +
|
|
108
|
+
' 1を表示 # 「\n' +
|
|
109
|
+
'ここまで‰\n' +
|
|
110
|
+
'2を表示\n'
|
|
111
|
+
)
|
|
112
|
+
cmp('!インデント構文\n' +
|
|
113
|
+
'もしA=1ならば\n' +
|
|
114
|
+
' 1を表示 // 「\n' +
|
|
115
|
+
'2を表示\n',
|
|
116
|
+
// ---
|
|
117
|
+
'!インデント構文\n' +
|
|
118
|
+
'もしA=1ならば\n' +
|
|
119
|
+
' 1を表示 // 「\n' +
|
|
120
|
+
'ここまで‰\n' +
|
|
121
|
+
'2を表示\n'
|
|
122
|
+
)
|
|
123
|
+
})
|
|
124
|
+
it('複数行コメント内に文字列リテラルの開始記号がある場合', () => {
|
|
125
|
+
cmp('!インデント構文\n' +
|
|
126
|
+
'もしA=1ならば\n' +
|
|
127
|
+
' 1を表示 /* 「 */\n' +
|
|
128
|
+
'2を表示\n',
|
|
129
|
+
// ---
|
|
130
|
+
'!インデント構文\n' +
|
|
131
|
+
'もしA=1ならば\n' +
|
|
132
|
+
' 1を表示 /* 「 */\n' +
|
|
133
|
+
'ここまで‰\n' +
|
|
134
|
+
'2を表示\n'
|
|
135
|
+
)
|
|
136
|
+
cmp('!インデント構文\n' +
|
|
137
|
+
'もしA=1ならば\n' +
|
|
138
|
+
' 1を表示 /* 「 */\n' +
|
|
139
|
+
'2を表示\n',
|
|
140
|
+
// ---
|
|
141
|
+
'!インデント構文\n' +
|
|
142
|
+
'もしA=1ならば\n' +
|
|
143
|
+
' 1を表示 /* 「 */\n' +
|
|
144
|
+
'ここまで‰\n' +
|
|
145
|
+
'2を表示\n'
|
|
146
|
+
)
|
|
147
|
+
})
|
|
148
|
+
it('改行を含む、絵文字による文字列がある場合', () => {
|
|
149
|
+
cmp(
|
|
150
|
+
'!インデント構文\n' +
|
|
151
|
+
'2回\n' +
|
|
152
|
+
' 🌴1\n' +
|
|
153
|
+
'🌴を表示\n' +
|
|
154
|
+
'「2」を表示\n',
|
|
155
|
+
// ---
|
|
156
|
+
'!インデント構文\n' +
|
|
157
|
+
'2回\n' +
|
|
158
|
+
' 🌴1\n' +
|
|
159
|
+
'🌴を表示\n' +
|
|
160
|
+
'ここまで‰\n' +
|
|
161
|
+
'「2」を表示\n'
|
|
162
|
+
)
|
|
163
|
+
})
|
|
164
|
+
it('前後が一致しない括弧がある場合', () => {
|
|
165
|
+
cmp(
|
|
166
|
+
'!インデント構文\n' +
|
|
167
|
+
'2回\n' +
|
|
168
|
+
' A={\n' +
|
|
169
|
+
'}を表示\n' +
|
|
170
|
+
'1を表示\n',
|
|
171
|
+
// ---
|
|
172
|
+
'!インデント構文\n' +
|
|
173
|
+
'2回\n' +
|
|
174
|
+
' A={\n' +
|
|
175
|
+
'}を表示\n' +
|
|
176
|
+
'ここまで‰\n' +
|
|
177
|
+
'1を表示\n'
|
|
178
|
+
)
|
|
179
|
+
})
|
|
180
|
+
it('「違えば」に行コメントがある場合', () => {
|
|
181
|
+
cmp('!インデント構文\n' +
|
|
182
|
+
'もしA=1ならば\n' +
|
|
183
|
+
' 1を表示\n' +
|
|
184
|
+
'違えば # コメント\n' +
|
|
185
|
+
' 2を表示\n',
|
|
186
|
+
// ---
|
|
187
|
+
'!インデント構文\n' +
|
|
188
|
+
'もしA=1ならば\n' +
|
|
189
|
+
' 1を表示\n' +
|
|
190
|
+
'違えば # コメント\n' +
|
|
191
|
+
' 2を表示\n' +
|
|
192
|
+
'ここまで‰\n')
|
|
193
|
+
})
|
|
194
|
+
it('「違えば」に範囲コメントがある場合', () => {
|
|
195
|
+
cmp('!インデント構文\n' +
|
|
196
|
+
'もしA=1ならば\n' +
|
|
197
|
+
' 1を表示\n' +
|
|
198
|
+
'/* foo \n' +
|
|
199
|
+
'*/違えば /* bar */\n' +
|
|
200
|
+
' 2を表示\n',
|
|
201
|
+
// ---
|
|
202
|
+
'!インデント構文\n' +
|
|
203
|
+
'もしA=1ならば\n' +
|
|
204
|
+
' 1を表示\n' +
|
|
205
|
+
'/* foo \n' +
|
|
206
|
+
'*/違えば /* bar */\n' +
|
|
207
|
+
' 2を表示\n' +
|
|
208
|
+
'ここまで‰\n')
|
|
209
|
+
})
|
|
210
|
+
it('コメントのみの行がある場合', () => {
|
|
211
|
+
cmp('!インデント構文\n' +
|
|
212
|
+
'もしA=1ならば\n' +
|
|
213
|
+
' # コメント\n' +
|
|
214
|
+
' 1を表示\n' +
|
|
215
|
+
'違えば\n' +
|
|
216
|
+
'/* */\n' +
|
|
217
|
+
'/* */ \n' +
|
|
218
|
+
' 2を表示\n',
|
|
219
|
+
// ---
|
|
220
|
+
'!インデント構文\n' +
|
|
221
|
+
'もしA=1ならば\n' +
|
|
222
|
+
' # コメント\n' +
|
|
223
|
+
' 1を表示\n' +
|
|
224
|
+
'違えば\n' +
|
|
225
|
+
'/* */\n' +
|
|
226
|
+
'/* */ \n' +
|
|
227
|
+
' 2を表示\n' +
|
|
228
|
+
'ここまで‰\n')
|
|
229
|
+
})
|
|
230
|
+
it('"・"がある場合', () => {
|
|
231
|
+
cmp('!インデント構文\n' +
|
|
232
|
+
'1回\n' +
|
|
233
|
+
'・1回\n' +
|
|
234
|
+
'・・1を表示\n' +
|
|
235
|
+
'・\n' +
|
|
236
|
+
'・・2を表示\n',
|
|
237
|
+
// ---
|
|
238
|
+
'!インデント構文\n' +
|
|
239
|
+
'1回\n' +
|
|
240
|
+
'・1回\n' +
|
|
241
|
+
'・・1を表示\n' +
|
|
242
|
+
'・・2を表示\n' +
|
|
243
|
+
' ここまで‰\n' +
|
|
244
|
+
'ここまで‰\n'
|
|
245
|
+
)
|
|
246
|
+
})
|
|
247
|
+
it('「違えばもし」の場合(#940)', () => {
|
|
248
|
+
cmp('!インデント構文\n' +
|
|
249
|
+
'もしA=1ならば\n' +
|
|
250
|
+
' 1を表示\n' +
|
|
251
|
+
'違えば、もしA=2ならば\n' +
|
|
252
|
+
' 2を表示\n' +
|
|
253
|
+
'違えば\n' +
|
|
254
|
+
' 3を表示\n',
|
|
255
|
+
// ---
|
|
256
|
+
'!インデント構文\n' +
|
|
257
|
+
'もしA=1ならば\n' +
|
|
258
|
+
' 1を表示\n' +
|
|
259
|
+
'違えば、もしA=2ならば\n' +
|
|
260
|
+
' 2を表示\n' +
|
|
261
|
+
'違えば\n' +
|
|
262
|
+
' 3を表示\n' +
|
|
263
|
+
'ここまで‰\n')
|
|
264
|
+
})
|
|
265
|
+
it('ソースマップ', () => {
|
|
266
|
+
const result = NakoIndent.convert(
|
|
267
|
+
'!インデント構文\n' +
|
|
268
|
+
'\n' +
|
|
269
|
+
'●(nを)階乗とは\n' +
|
|
270
|
+
' もしnが1と等しいならば\n' +
|
|
271
|
+
' それは1\n' +
|
|
272
|
+
' 違えば\n' +
|
|
273
|
+
' それは((n - 1)を階乗) * n\n' +
|
|
274
|
+
'\n' +
|
|
275
|
+
'もし1=1なら\n' +
|
|
276
|
+
' 「こんに\n' +
|
|
277
|
+
'ちは」と表示\n' +
|
|
278
|
+
'\n' +
|
|
279
|
+
'「こんにちは」と表示\n' +
|
|
280
|
+
'\n' +
|
|
281
|
+
''
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* 出力されるべきコード:
|
|
286
|
+
* ```
|
|
287
|
+
* 0!インデント構文
|
|
288
|
+
* 1 ●(nを)階乗とは
|
|
289
|
+
* 2 もしnが1と等しいならば
|
|
290
|
+
* 3 それは1
|
|
291
|
+
* 4 違えば
|
|
292
|
+
* 5 それは((n - 1)を階乗) * n
|
|
293
|
+
* 6 ここまで‰
|
|
294
|
+
* 7 ここまで‰
|
|
295
|
+
* 8 もし1=1なら
|
|
296
|
+
* 9 「こんに
|
|
297
|
+
* 10 ちは」と表示
|
|
298
|
+
* 11 ここまで‰
|
|
299
|
+
* 12 「こんにちは」と表示
|
|
300
|
+
* ```
|
|
301
|
+
*/
|
|
302
|
+
|
|
303
|
+
// 6, 7, 11 行目に「ここまで‰」が挿入された。
|
|
304
|
+
assert.deepStrictEqual(result.insertedLines, [6, 7, 11])
|
|
305
|
+
|
|
306
|
+
// 1, 6, 11, 13, 13行目の直前の空白行が消された。
|
|
307
|
+
// ※ 正確には、各空白行を消したときに、それまでに出力した行数(「ここまで‰」を含む)が 1, 6, 11, 13, 13 行。
|
|
308
|
+
assert.deepStrictEqual(result.deletedLines, [
|
|
309
|
+
{ lineNumber: 1, len: 0 },
|
|
310
|
+
{ lineNumber: 6, len: 0 },
|
|
311
|
+
{ lineNumber: 11, len: 0 },
|
|
312
|
+
{ lineNumber: 13, len: 0 },
|
|
313
|
+
{ lineNumber: 13, len: 0 }
|
|
314
|
+
])
|
|
315
|
+
})
|
|
316
|
+
it('ブロック構造の取得', () => {
|
|
317
|
+
assert.deepStrictEqual(
|
|
318
|
+
NakoIndent.getBlockStructure(
|
|
319
|
+
'もしはいならば\n' +
|
|
320
|
+
' 「こん\n' +
|
|
321
|
+
'にちは」を表示\n' +
|
|
322
|
+
'ここまで'
|
|
323
|
+
),
|
|
324
|
+
{
|
|
325
|
+
lines: [0, 4, 4, 0], // 各行の高さは 0, 4, 4, 0
|
|
326
|
+
pairs: [[0, 3]], // 0行目と3行目のペアがブロックを構成している。
|
|
327
|
+
parents: [null, 0, 0, null],
|
|
328
|
+
spaces: ['', ' ', ' ', '']
|
|
329
|
+
}
|
|
330
|
+
)
|
|
331
|
+
})
|
|
332
|
+
it('ブロック構造の取得 - 複数行にまたがる構文', () => {
|
|
333
|
+
// 複数行にまたがる文の2行目以降のインデントは、先頭行のインデントと等しいものとする。
|
|
334
|
+
// コメントのみの行のインデントは、直近の通常の行のインデントと等しいものとする。
|
|
335
|
+
assert.deepStrictEqual(
|
|
336
|
+
NakoIndent.getBlockStructure(
|
|
337
|
+
'!インデント構文\n' +
|
|
338
|
+
'Nを1から3まで繰り返す\n' +
|
|
339
|
+
' 「1行目\n' +
|
|
340
|
+
'2行目」を表示\n' +
|
|
341
|
+
'/*範囲コメント\n' +
|
|
342
|
+
'*/'
|
|
343
|
+
),
|
|
344
|
+
{
|
|
345
|
+
lines: [0, 0, 4, 4, 4, 4],
|
|
346
|
+
pairs: [[1, 6]],
|
|
347
|
+
parents: [null, null, 1, 1, 1, 1],
|
|
348
|
+
spaces: ['', '', ' ', ' ', '', '']
|
|
349
|
+
}
|
|
350
|
+
)
|
|
351
|
+
})
|
|
352
|
+
it('ブロック構造の取得 - 違えば', () => {
|
|
353
|
+
assert.deepStrictEqual(
|
|
354
|
+
NakoIndent.getBlockStructure(
|
|
355
|
+
'もしはいならば\n' +
|
|
356
|
+
' a\n' +
|
|
357
|
+
'違えば\n' +
|
|
358
|
+
' b\n' +
|
|
359
|
+
'ここまで'
|
|
360
|
+
).pairs,
|
|
361
|
+
[[0, 2], [2, 4]]
|
|
362
|
+
)
|
|
363
|
+
})
|
|
364
|
+
})
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import assert from 'assert'
|
|
2
|
+
import { NakoCompiler } from '../src/nako3.mjs'
|
|
3
|
+
|
|
4
|
+
describe('lex_test', async () => {
|
|
5
|
+
// nako.logger.addListener('trace', ({ browserConsole }) => { console.log(...browserConsole) })
|
|
6
|
+
const cmp = async (/** @type {string} */ code, /** @type {string} */ res) => {
|
|
7
|
+
const nako = new NakoCompiler()
|
|
8
|
+
nako.logger.debug('code=' + code)
|
|
9
|
+
assert.strictEqual((await nako.runAsync(code)).log, res)
|
|
10
|
+
}
|
|
11
|
+
// --- test ---
|
|
12
|
+
it('送り仮名の省略テスト', async () => {
|
|
13
|
+
await cmp('『abc』の『a』を「*」に置換。表示', '*bc')
|
|
14
|
+
await cmp('『abc』の『a』を「*」に置換します。それを表示', '*bc')
|
|
15
|
+
await cmp('『abc』の『a』を「*」に置換しろ。表示しろ。', '*bc')
|
|
16
|
+
})
|
|
17
|
+
it('仮名表記の曖昧', async () => {
|
|
18
|
+
await cmp('『abc』の『a』を「*」に置き換え。表示', '*bc')
|
|
19
|
+
})
|
|
20
|
+
it('範囲コメントの処理', async () => {
|
|
21
|
+
await cmp('1を表示\n/*2を表示\n3を表示\n*/\n4を表示\n', '1\n4')
|
|
22
|
+
await cmp('1を表示\n/*2を表示\n3を表示\n4を表示\n5を表示\n*/\n6を表示\n', '1\n6')
|
|
23
|
+
})
|
|
24
|
+
it('文字列の埋め込み', async () => {
|
|
25
|
+
await cmp('見出し=30;「--{見出し}--」を表示', '--30--')
|
|
26
|
+
})
|
|
27
|
+
it('文字列の埋め込み語句のかな省略', async () => {
|
|
28
|
+
await cmp('見出し=30;「--{見出}--」を表示', '--30--')
|
|
29
|
+
})
|
|
30
|
+
it('文字列に式を埋め込む', async () => {
|
|
31
|
+
await cmp('「--{3に2を掛ける}--」を表示', '--6--')
|
|
32
|
+
})
|
|
33
|
+
it('文字列の埋め込み変数名全角英数字', async () => {
|
|
34
|
+
await cmp('N1=30;「--{N1}--」を表示', '--30--')
|
|
35
|
+
})
|
|
36
|
+
it('文字列の埋め込みで対応しない閉じ括弧がある場合', async () => {
|
|
37
|
+
await cmp('B=1;E=2;「A{B}C}D{E}F」を表示', 'A1C}D2F')
|
|
38
|
+
})
|
|
39
|
+
it('文字列の埋め込み配列', async () => {
|
|
40
|
+
await cmp('手説明=["グー","チョキ","パー"];「自分は{手説明@1}、相手は{手説明@0}」と表示', '自分はチョキ、相手はグー')
|
|
41
|
+
})
|
|
42
|
+
it('はい/いいえ', async () => {
|
|
43
|
+
await cmp('はいを表示', '1')
|
|
44
|
+
await cmp('いいえを表示', '0')
|
|
45
|
+
})
|
|
46
|
+
it('A = 8の書き方', async () => {
|
|
47
|
+
await cmp('A = 8;Aを表示', '8')
|
|
48
|
+
})
|
|
49
|
+
it('数値表現のテスト', async () => {
|
|
50
|
+
await cmp('123e1を表示', '1230')
|
|
51
|
+
await cmp('123E-1を表示', '12.3')
|
|
52
|
+
await cmp('123e+1を表示', '1230')
|
|
53
|
+
await cmp('.123e-1を表示', '0.0123')
|
|
54
|
+
await cmp('123.e1を表示', '1230')
|
|
55
|
+
})
|
|
56
|
+
it('2進数/8進数/16進数のテスト', async () => {
|
|
57
|
+
await cmp('0xFFを表示', '255')
|
|
58
|
+
await cmp('0XFFを表示', '255')
|
|
59
|
+
await cmp('0b11を表示', '3')
|
|
60
|
+
await cmp('0B1111を表示', '15')
|
|
61
|
+
await cmp('0o10を表示', '8')
|
|
62
|
+
await cmp('0O11を表示', '9')
|
|
63
|
+
})
|
|
64
|
+
it('《特別名トークン》のテスト', async () => {
|
|
65
|
+
await cmp('《今日から明日》=30;《今日から明日》を表示', '30')
|
|
66
|
+
await cmp('《AからBまで》=30;《AからBまで》を表示', '30')
|
|
67
|
+
})
|
|
68
|
+
it('以上、以下、超、未満 (#918)', async () => {
|
|
69
|
+
await cmp('A=4;もし、Aが2以上ならば\nAを表示;\nここまで。', '4')
|
|
70
|
+
await cmp('A=4;もし、30がA以上ならば\nAを表示;\nここまで。', '4')
|
|
71
|
+
})
|
|
72
|
+
it('ソースマップ - 単純な例', async () => {
|
|
73
|
+
const nako = new NakoCompiler()
|
|
74
|
+
const tokens = nako.lex('「こんにちは」と表示', 'main.nako3', '').tokens
|
|
75
|
+
|
|
76
|
+
// 0-7文字目: 「こんにちは」と
|
|
77
|
+
assert.strictEqual(tokens[0].startOffset, 0)
|
|
78
|
+
assert.strictEqual(tokens[0].endOffset, 8)
|
|
79
|
+
|
|
80
|
+
// 8-9文字目: 表示
|
|
81
|
+
assert.strictEqual(tokens[1].startOffset, 8)
|
|
82
|
+
assert.strictEqual(tokens[1].endOffset, 10)
|
|
83
|
+
})
|
|
84
|
+
it('ソースマップ - スペース扱いの文字', async () => {
|
|
85
|
+
// '・'はスペース扱いであり、トークン化されない。
|
|
86
|
+
const nako = new NakoCompiler()
|
|
87
|
+
const tokens = nako.lex('ならば・A', 'main.nako3', '').tokens
|
|
88
|
+
|
|
89
|
+
// 0-2文字目: ならば
|
|
90
|
+
assert.strictEqual(tokens[0].startOffset, 0)
|
|
91
|
+
assert.strictEqual(tokens[0].endOffset, 3)
|
|
92
|
+
|
|
93
|
+
// 4文字目: A
|
|
94
|
+
assert.strictEqual(tokens[1].startOffset, 4)
|
|
95
|
+
assert.strictEqual(tokens[1].endOffset, 5)
|
|
96
|
+
})
|
|
97
|
+
it('ソースマップ - 複数行の場合', async () => {
|
|
98
|
+
const nako = new NakoCompiler()
|
|
99
|
+
const tokens = nako.lex('「こんにちは」を表示する。\n「こんにちは」を表示する。', 'main.nako3', '').tokens
|
|
100
|
+
assert.strictEqual(tokens[0].startOffset, 0) // 0-7: 「こんにちは」を
|
|
101
|
+
assert.strictEqual(tokens[1].startOffset, 8) // 8-11: 表示する
|
|
102
|
+
assert.strictEqual(tokens[2].startOffset, 12) // 12: 。
|
|
103
|
+
assert.strictEqual(tokens[3].startOffset, 13) // 13: eol
|
|
104
|
+
assert.strictEqual(tokens[4].startOffset, 14) // 14-21: 「こんにちは」を
|
|
105
|
+
assert.strictEqual(tokens[5].startOffset, 22) // 22-25: 表示する
|
|
106
|
+
assert.strictEqual(tokens[6].startOffset, 26) // 26: 。
|
|
107
|
+
})
|
|
108
|
+
it('ソースマップ - 行コメント', async () => {
|
|
109
|
+
const nako = new NakoCompiler()
|
|
110
|
+
const tokens = nako.lex('# コメント').commentTokens
|
|
111
|
+
assert.strictEqual(tokens[0].startOffset, 0)
|
|
112
|
+
assert.strictEqual(tokens[0].endOffset, 6)
|
|
113
|
+
})
|
|
114
|
+
it('ソースマップ - 範囲コメント', async () => {
|
|
115
|
+
const nako = new NakoCompiler()
|
|
116
|
+
const tokens = nako.lex('/*\nここは全部コメント\nここは全部コメント\n*/').commentTokens
|
|
117
|
+
assert.strictEqual(tokens[0].startOffset, 0)
|
|
118
|
+
assert.strictEqual(tokens[0].endOffset, 25)
|
|
119
|
+
})
|
|
120
|
+
it('ソースマップ - 範囲コメントの直後に文字がある場合', async () => {
|
|
121
|
+
const nako = new NakoCompiler()
|
|
122
|
+
const result = nako.lex('/*\nここは全部コメント\nここは全部コメント\n*/a')
|
|
123
|
+
|
|
124
|
+
// コメント
|
|
125
|
+
assert.strictEqual(result.commentTokens[0].startOffset, 0)
|
|
126
|
+
assert.strictEqual(result.commentTokens[0].endOffset, 25)
|
|
127
|
+
|
|
128
|
+
// a
|
|
129
|
+
assert.strictEqual(result.tokens[0].startOffset, 25)
|
|
130
|
+
assert.strictEqual(result.tokens[0].endOffset, 26)
|
|
131
|
+
})
|
|
132
|
+
it('ソースマップ - "_"による改行', async () => {
|
|
133
|
+
const nako = new NakoCompiler()
|
|
134
|
+
const tokens = nako.lex('[_\n]\nりんごの値段は30').tokens
|
|
135
|
+
const nedan = tokens.find((t) => t.value === '値段') || { startOffset: 0, endOffset: 0 }
|
|
136
|
+
assert.strictEqual(nedan.startOffset, 9)
|
|
137
|
+
assert.strictEqual(nedan.endOffset, 11)
|
|
138
|
+
})
|
|
139
|
+
it('ソースマップ - インデント構文', async () => {
|
|
140
|
+
const nako = new NakoCompiler()
|
|
141
|
+
const tokens = nako.lex('!インデント構文\n1回\n 「2」を表示\n\n「3」を表示').tokens
|
|
142
|
+
// @ts-ignore
|
|
143
|
+
assert.strictEqual(tokens.find((t) => t.value === '2').startOffset, 16) // 「1」を
|
|
144
|
+
// @ts-ignore
|
|
145
|
+
assert.strictEqual(tokens.find((t) => t.value === '3').startOffset, 24) // 「2」を
|
|
146
|
+
})
|
|
147
|
+
it('ソースマップ - string_ex', async () => {
|
|
148
|
+
const nako = new NakoCompiler()
|
|
149
|
+
const tokens = nako.lex('"{あ}"').tokens
|
|
150
|
+
// @ts-ignore
|
|
151
|
+
assert.strictEqual(tokens.find((t) => t.value === 'あ').startOffset, 2)
|
|
152
|
+
// @ts-ignore
|
|
153
|
+
assert.strictEqual(tokens.find((t) => t.value === 'あ').endOffset, 3)
|
|
154
|
+
})
|
|
155
|
+
it('「ならば」+「(全角|半角)空白」直後の改行が消える問題 #1015', async () => {
|
|
156
|
+
await cmp('もし、3=3ならば \n『OK』と表示;違えば;「NG」と表示;ここまで。', 'OK')
|
|
157
|
+
await cmp('もし、3=3ならば \n『OK』と表示;違えば;「NG」と表示;ここまで。', 'OK')
|
|
158
|
+
})
|
|
159
|
+
it('助詞の前後に空白があるとエラーになる問題 #1079', async () => {
|
|
160
|
+
await cmp('x=1;x と 2 と "3" を連続表示', '123')
|
|
161
|
+
})
|
|
162
|
+
it('丸付き数字が変数名として使えない #1185', async () => {
|
|
163
|
+
await cmp('⓪=0;①=1;㊿=50;❿=10;⓪+①+㊿+❿を表示', '61')
|
|
164
|
+
})
|
|
165
|
+
it('絵文字の四則演算を認識する #1183', async () => {
|
|
166
|
+
await cmp('リンゴ🟰3✖5;ミカン🟰9➗3;リンゴ+ミカンを表示', '18')
|
|
167
|
+
})
|
|
168
|
+
})
|