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.
Files changed (329) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +143 -132
  3. package/batch/browsers.template.md +3 -3
  4. package/batch/build_browsers.nako3 +72 -72
  5. package/batch/build_command.nako3 +44 -44
  6. package/batch/build_nako_version.nako3 +42 -42
  7. package/batch/calc_hash.nako3 +29 -29
  8. package/batch/cmd_txt2json.nako3 +74 -74
  9. package/batch/command.txt +270 -338
  10. package/batch/command_nakopad.txt +9 -69
  11. package/batch/download-extlib.nako3 +43 -43
  12. package/batch/gen_command_nakopad.nako3 +57 -57
  13. package/batch/jsplugin2text.nako3 +285 -285
  14. package/batch/pickup_command.nako3 +110 -110
  15. package/batch/pickup_reserved_words.nako3 +11 -11
  16. package/batch/publish_version.nako3 +46 -46
  17. package/batch/show_agents.js +14 -14
  18. package/batch/turtle2js.nako3 +21 -21
  19. package/bin/cnako3 +10 -10
  20. package/core/.editorconfig +6 -0
  21. package/core/.eslintrc.cjs +33 -0
  22. package/core/.github/dependabot.yml +7 -0
  23. package/core/.github/workflows/nodejs.yml +37 -0
  24. package/core/.github/workflows/super-linter.yml +61 -0
  25. package/core/.github/workflows/textlint.yml +199 -0
  26. package/core/LICENSE +21 -0
  27. package/core/README.md +66 -0
  28. package/core/batch/build_nako_version.nako3 +42 -0
  29. package/core/command/snako.mjs +105 -0
  30. package/core/command/snako.mts +116 -0
  31. package/core/index.mjs +21 -0
  32. package/core/index.mts +21 -0
  33. package/core/package.json +47 -0
  34. package/core/sample/hello.nako3 +7 -0
  35. package/core/sample/hoge.mjs +4 -0
  36. package/core/sample/hoge.mts +6 -0
  37. package/core/src/nako3.mjs +858 -0
  38. package/core/src/nako3.mts +967 -0
  39. package/core/src/nako_colors.mjs +78 -0
  40. package/core/src/nako_colors.mts +86 -0
  41. package/core/src/nako_core_version.mjs +8 -0
  42. package/core/src/nako_core_version.mts +19 -0
  43. package/core/src/nako_csv.mjs +185 -0
  44. package/core/src/nako_csv.mts +188 -0
  45. package/core/src/nako_errors.mjs +173 -0
  46. package/core/src/nako_errors.mts +197 -0
  47. package/core/src/nako_from_dncl.mjs +255 -0
  48. package/core/src/nako_from_dncl.mts +250 -0
  49. package/core/src/nako_gen.mjs +1648 -0
  50. package/core/src/nako_gen.mts +1719 -0
  51. package/core/src/nako_gen_async.mjs +1659 -0
  52. package/core/src/nako_gen_async.mts +1732 -0
  53. package/core/src/nako_global.mjs +107 -0
  54. package/core/src/nako_global.mts +138 -0
  55. package/core/src/nako_indent.mjs +445 -0
  56. package/core/src/nako_indent.mts +492 -0
  57. package/core/src/nako_josi_list.mjs +38 -0
  58. package/core/src/nako_josi_list.mts +45 -0
  59. package/core/src/nako_lex_rules.mjs +253 -0
  60. package/core/src/nako_lex_rules.mts +260 -0
  61. package/core/src/nako_lexer.mjs +609 -0
  62. package/core/src/nako_lexer.mts +612 -0
  63. package/core/src/nako_logger.mjs +199 -0
  64. package/core/src/nako_logger.mts +232 -0
  65. package/core/src/nako_parser3.mjs +2439 -0
  66. package/core/src/nako_parser3.mts +2195 -0
  67. package/core/src/nako_parser_base.mjs +370 -0
  68. package/core/src/nako_parser_base.mts +370 -0
  69. package/core/src/nako_parser_const.mjs +37 -0
  70. package/core/src/nako_parser_const.mts +37 -0
  71. package/core/src/nako_prepare.mjs +304 -0
  72. package/core/src/nako_prepare.mts +315 -0
  73. package/core/src/nako_reserved_words.mjs +38 -0
  74. package/core/src/nako_reserved_words.mts +38 -0
  75. package/core/src/nako_source_mapping.mjs +207 -0
  76. package/core/src/nako_source_mapping.mts +262 -0
  77. package/core/src/nako_test.mjs +37 -0
  78. package/core/src/nako_types.mjs +25 -0
  79. package/core/src/nako_types.mts +151 -0
  80. package/core/src/plugin_csv.mjs +49 -0
  81. package/core/src/plugin_csv.mts +50 -0
  82. package/core/src/plugin_math.mjs +328 -0
  83. package/core/src/plugin_math.mts +326 -0
  84. package/core/src/plugin_promise.mjs +91 -0
  85. package/core/src/plugin_promise.mts +91 -0
  86. package/core/src/plugin_system.mjs +2832 -0
  87. package/core/src/plugin_system.mts +2690 -0
  88. package/core/src/plugin_test.mjs +34 -0
  89. package/core/src/plugin_test.mts +34 -0
  90. package/core/test/array_test.mjs +34 -0
  91. package/core/test/basic_test.mjs +344 -0
  92. package/core/test/calc_test.mjs +140 -0
  93. package/core/test/core_module_test.mjs +23 -0
  94. package/core/test/debug_test.mjs +16 -0
  95. package/core/test/dncl_test.mjs +94 -0
  96. package/core/test/error_message_test.mjs +210 -0
  97. package/core/test/error_test.mjs +16 -0
  98. package/core/test/flow_test.mjs +373 -0
  99. package/core/test/func_call.mjs +160 -0
  100. package/core/test/func_test.mjs +149 -0
  101. package/core/test/indent_test.mjs +364 -0
  102. package/core/test/lex_test.mjs +168 -0
  103. package/core/test/literal_test.mjs +73 -0
  104. package/core/test/nako_lexer_test.mjs +35 -0
  105. package/core/test/nako_logger_test.mjs +76 -0
  106. package/core/test/nako_logger_test.mts +78 -0
  107. package/core/test/plugin_csv_test.mjs +38 -0
  108. package/core/test/plugin_promise_test.mjs +18 -0
  109. package/core/test/plugin_system_test.mjs +630 -0
  110. package/core/test/prepare_test.mjs +96 -0
  111. package/core/test/re_test.mjs +22 -0
  112. package/core/test/side_effects_test.mjs +92 -0
  113. package/core/test/variable_scope_test.mjs +149 -0
  114. package/core/tsconfig.json +101 -0
  115. package/demo/ace_editor.html +89 -89
  116. package/demo/ace_editor_tabs.html +161 -161
  117. package/demo/basic.html +71 -71
  118. package/demo/browsers.html +9 -10
  119. package/demo/css/basic.css +3 -3
  120. package/demo/css/common.css +157 -157
  121. package/demo/css/editor.css +8 -8
  122. package/demo/css/flow.css +3 -3
  123. package/demo/css/index.css +3 -3
  124. package/demo/flow.html +98 -98
  125. package/demo/graph.html +53 -53
  126. package/demo/image/nakopad-icon256.png +0 -0
  127. package/demo/index.html +133 -133
  128. package/demo/js/common.js +17 -17
  129. package/demo/js/turtle3d_test.js +44 -44
  130. package/demo/js/turtle_test.js +45 -45
  131. package/demo/nako3/calc.nako3 +4 -4
  132. package/demo/runscript.html +47 -47
  133. package/demo/runscript2.html +33 -33
  134. package/demo/runscript3.html +35 -35
  135. package/demo/runscript4.html +33 -33
  136. package/demo/turtle.html +58 -58
  137. package/demo/turtle2.html +141 -141
  138. package/demo/turtle3.html +279 -279
  139. package/demo/turtle3d.html +58 -58
  140. package/demo/turtle3d2.html +107 -107
  141. package/demo/version.html +24 -24
  142. package/doc/SETUP.md +157 -157
  143. package/doc/about.md +17 -17
  144. package/doc/browsers.md +26 -26
  145. package/doc/docgen.md +21 -21
  146. package/doc/editor.md +44 -44
  147. package/doc/files.md +39 -39
  148. package/doc/plugins.md +234 -234
  149. package/doc/release.md +79 -79
  150. package/doc/textlint.md +43 -43
  151. package/doc/win32.md +57 -57
  152. package/package.json +195 -192
  153. package/release/_hash.txt +28 -28
  154. package/release/_script-tags.txt +14 -14
  155. package/release/command.json +1 -1
  156. package/release/command.json.js +1 -1
  157. package/release/command_cnako3.json +1 -1
  158. package/release/command_list.json +1 -1
  159. package/release/editor.js +1 -1
  160. package/release/nako_gen_async.js +1 -1
  161. package/release/plugin_csv.js +1 -1
  162. package/release/stats.json +1 -1
  163. package/release/version.js +1 -1
  164. package/release/wnako3.js +1 -1
  165. package/release/wnako3webworker.js +1 -1
  166. package/src/browsers.txt +11 -12
  167. package/src/browsers_agents.json +2 -2
  168. package/src/browsers_agents.mjs +1 -1
  169. package/src/cnako3.mjs +17 -10
  170. package/src/cnako3.mts +18 -12
  171. package/src/cnako3mod.mjs +707 -687
  172. package/src/cnako3mod.mts +712 -696
  173. package/src/commander_ja.mjs +164 -164
  174. package/src/commander_ja.mts +161 -161
  175. package/src/enako3.mjs +68 -69
  176. package/src/era.mjs +22 -22
  177. package/src/image_turtle-elephant.mjs +2 -5
  178. package/src/image_turtle-panda.mjs +2 -5
  179. package/src/image_turtle64.mjs +2 -5
  180. package/src/index.mjs +9 -9
  181. package/src/index.mts +10 -11
  182. package/src/nako3editorfix.sfd +106 -106
  183. package/src/nako_version.mjs +8 -8
  184. package/src/nako_version.mts +2 -2
  185. package/src/plugin_browser.mjs +213 -212
  186. package/src/plugin_browser.mts +206 -205
  187. package/src/plugin_browser_ajax.mjs +399 -399
  188. package/src/plugin_browser_audio.mjs +109 -109
  189. package/src/plugin_browser_canvas.mjs +449 -449
  190. package/src/plugin_browser_chart.mjs +294 -294
  191. package/src/plugin_browser_color.mjs +49 -49
  192. package/src/plugin_browser_crypto.mjs +26 -26
  193. package/src/plugin_browser_dialog.mjs +53 -53
  194. package/src/plugin_browser_dom_basic.mjs +336 -336
  195. package/src/plugin_browser_dom_event.mjs +193 -193
  196. package/src/plugin_browser_dom_parts.mjs +396 -396
  197. package/src/plugin_browser_geolocation.mjs +51 -51
  198. package/src/plugin_browser_hotkey.mjs +25 -25
  199. package/src/plugin_browser_html.mjs +59 -59
  200. package/src/plugin_browser_in_worker.mjs +45 -45
  201. package/src/plugin_browser_location.mjs +21 -21
  202. package/src/plugin_browser_speech.mjs +111 -111
  203. package/src/plugin_browser_storage.mjs +121 -121
  204. package/src/plugin_browser_system.mjs +31 -31
  205. package/src/plugin_browser_websocket.mjs +73 -73
  206. package/src/plugin_caniuse.mjs +29 -29
  207. package/src/plugin_datetime.mjs +394 -394
  208. package/src/plugin_httpserver.mjs +277 -0
  209. package/src/plugin_httpserver.mts +286 -0
  210. package/src/plugin_kansuji.mjs +224 -224
  211. package/src/plugin_keigo.mjs +55 -55
  212. package/src/plugin_markup.mjs +32 -32
  213. package/src/plugin_node.mjs +1047 -1047
  214. package/src/plugin_node.mts +980 -980
  215. package/src/plugin_turtle.mjs +647 -647
  216. package/src/plugin_webworker.mjs +334 -334
  217. package/src/plugin_weykturtle3d.mjs +1214 -1214
  218. package/src/plugin_worker.mjs +95 -95
  219. package/src/repl.nako3 +63 -63
  220. package/src/wnako3.mjs +12 -12
  221. package/src/wnako3.mts +11 -11
  222. package/src/wnako3_editor.css +215 -215
  223. package/src/wnako3_editor.mjs +1542 -1542
  224. package/src/wnako3_editor.mts +1657 -1656
  225. package/src/wnako3mod.mjs +213 -213
  226. package/src/wnako3mod.mts +214 -214
  227. package/src/wnako3webworker.mjs +69 -68
  228. package/test/ace_editor/karma.config.js +94 -94
  229. package/test/ace_editor/test/.babelrc.json +3 -3
  230. package/test/ace_editor/test/ace_editor_test.js +178 -178
  231. package/test/ace_editor/test/html/custom_context.html +139 -139
  232. package/test/async/async_basic_test.mjs +122 -122
  233. package/test/browser/karma.config.js +221 -221
  234. package/test/browser/test/.babelrc.json +3 -3
  235. package/test/browser/test/compare_util.js +50 -50
  236. package/test/browser/test/html/div_basic.html +2 -2
  237. package/test/browser/test/html/event_dom_form.html +4 -4
  238. package/test/browser/test/html/event_dom_scrolldiv.html +5 -5
  239. package/test/browser/test/import_plugin_checker.js +24 -24
  240. package/test/browser/test/plugin_browser_test.js +51 -51
  241. package/test/browser/test/plugin_browser_test_ajax.js +123 -123
  242. package/test/browser/test/plugin_browser_test_color.js +18 -18
  243. package/test/browser/test/plugin_browser_test_dialog.js +72 -72
  244. package/test/browser/test/plugin_browser_test_dom_event.js +598 -598
  245. package/test/browser/test/plugin_browser_test_dom_parts.js +125 -125
  246. package/test/browser/test/plugin_browser_test_system.js +9 -9
  247. package/test/browser/test/plugin_turtle_test.js +817 -817
  248. package/test/browser/test/plugin_webworker_test.js +86 -86
  249. package/test/browser/test/require_test.js +68 -68
  250. package/test/bundled/karma.config.base.js +117 -117
  251. package/test/bundled/karma.config.js +86 -86
  252. package/test/bundled/test/.babelrc.json +3 -3
  253. package/test/bundled/test/bundled_test.js +69 -69
  254. package/test/bundled/test/html/custom_context.html +65 -65
  255. package/test/bundled/test/html/custom_debug.html +66 -66
  256. package/test/bundled/test4b.cmd +52 -52
  257. package/test/bundled/test_base/.babelrc.json +3 -3
  258. package/test/bundled/test_base/_checktool_test.js +25 -25
  259. package/test/bundled/test_base/basic_ajax_test.js +56 -56
  260. package/test/bundled/test_base/basic_async_test.js +18 -18
  261. package/test/bundled/test_base/basic_test.js +153 -153
  262. package/test/bundled/test_base/calc_test.js +132 -132
  263. package/test/bundled/test_base/css/browsers_box.css +114 -114
  264. package/test/bundled/test_base/html/custom_context.html +69 -69
  265. package/test/bundled/test_base/html/custom_debug.html +71 -71
  266. package/test/bundled/test_base/js/browsers_box.js +72 -72
  267. package/test/bundled/test_base/plugin_csv_test.js +37 -37
  268. package/test/bundled/test_base/plugin_datetime_test.js +115 -115
  269. package/test/bundled/test_base/plugin_kansuji_test.js +49 -49
  270. package/test/bundled/test_base/plugin_system_test.js +410 -410
  271. package/test/bundled/test_base/plugin_webworker_test.js +53 -53
  272. package/test/bundled/test_base/test_utils.js +191 -191
  273. package/test/common/plugin_browser_test.mjs +22 -24
  274. package/test/common/plugin_browser_ut_audio_test.mjs +108 -108
  275. package/test/common/plugin_browser_ut_color_test.mjs +21 -21
  276. package/test/common/plugin_browser_ut_dialog_test.mjs +100 -100
  277. package/test/common/plugin_browser_ut_html_test.mjs +13 -13
  278. package/test/common/plugin_browser_ut_system_test.mjs +10 -10
  279. package/test/common/plugin_markup_test.mjs +23 -23
  280. package/test/jsconfig.json +19 -19
  281. package/test/karma.config.js +91 -91
  282. package/test/node/async_test.mjs +96 -82
  283. package/test/node/commander_ja_test.mjs +89 -89
  284. package/test/node/error_message_test.mjs +243 -253
  285. package/test/node/kai_test.nako3 +6 -6
  286. package/test/node/node_test.mjs +60 -60
  287. package/test/node/plugin_broken.js.txt +3 -3
  288. package/test/node/plugin_browser_ut_ajax_test.mjs.todo +357 -357
  289. package/test/node/plugin_browser_ut_location_test.mjs +42 -42
  290. package/test/node/plugin_markup_test.mjs +47 -46
  291. package/test/node/plugin_math_test.mjs +45 -44
  292. package/test/node/plugin_node_test.mjs +98 -97
  293. package/test/node/plugin_test.mjs +44 -43
  294. package/test/node/relative_import_test_1.nako3 +1 -1
  295. package/test/node/relative_import_test_2.nako3 +2 -2
  296. package/test/node/require_nako3_test.mjs +67 -66
  297. package/test/node/requiretest.nako3 +4 -4
  298. package/test/node/requiretest_indirect.nako3 +1 -1
  299. package/test/node/requiretest_name.nako3 +5 -5
  300. package/test/node/runtime_error.nako3 +2 -2
  301. package/test/node/scope1.nako3 +10 -10
  302. package/test/node/scope2.nako3 +12 -12
  303. package/test/node/side_effects_test.mjs +39 -119
  304. package/test/node/sjis.txt +5 -5
  305. package/test/node/syntax_error.nako3 +1 -1
  306. package/test/node/wnako3_editor_test.mjs +384 -384
  307. package/tools/README.md +12 -7
  308. package/tools/check_new_version.nako3 +25 -25
  309. package/tools/nako3edit/html/daisyui/LICENSE +22 -22
  310. package/tools/nako3edit/html/daisyui/version_2.14.1 +1 -1
  311. package/tools/nako3edit/html/edit.html +170 -170
  312. package/tools/nako3edit/html/edit_plugin.js +6 -6
  313. package/tools/nako3edit/html/files.html +125 -125
  314. package/tools/nako3edit/html/nako3edit.css +65 -65
  315. package/tools/nako3edit/index.mjs +248 -244
  316. package/tools/nako3server/index.html +10 -0
  317. package/tools/nako3server/index.mjs +116 -116
  318. package/tools/nako3server/index.nako3 +34 -0
  319. package/release/nako_gen_async.js.LICENSE.txt +0 -35
  320. package/release/plugin_caniuse.js.LICENSE.txt +0 -11
  321. package/release/plugin_csv.js.LICENSE.txt +0 -15
  322. package/release/plugin_datetime.js.LICENSE.txt +0 -15
  323. package/release/plugin_kansuji.js.LICENSE.txt +0 -3
  324. package/release/plugin_markup.js.LICENSE.txt +0 -11
  325. package/release/plugin_turtle.js.LICENSE.txt +0 -15
  326. package/release/plugin_webworker.js.LICENSE.txt +0 -3
  327. package/release/plugin_weykturtle3d.js.LICENSE.txt +0 -3
  328. package/release/wnako3webworker.js.LICENSE.txt +0 -131
  329. package/tools/nako3edit/a.sqlite3 +0 -0
@@ -0,0 +1,253 @@
1
+ /**
2
+ * なでしこ3字句解析のためのルール
3
+ */
4
+ import { josiRE, removeJosiMap } from './nako_josi_list.mjs';
5
+ const kanakanji = /^[\u3005\u4E00-\u9FCF_a-zA-Z0-9ァ-ヶー\u2460-\u24FF\u2776-\u277F\u3251-\u32BF]+/;
6
+ const hira = /^[ぁ-ん]/;
7
+ const allHiragana = /^[ぁ-ん]+$/;
8
+ const wordHasIjoIka = /^.+(以上|以下|超|未満)$/;
9
+ const errorRead = (ch) => {
10
+ return function () { throw new Error('突然の『' + ch + '』があります。'); };
11
+ };
12
+ export const unitRE = /^(円|ドル|元|歩|㎡|坪|度|℃|°|個|つ|本|冊|才|歳|匹|枚|皿|セット|羽|人|件|行|列|機|品|m|mm|cm|km|g|kg|t|px|dot|pt|em|b|mb|kb|gb)/;
13
+ export const rules = [
14
+ // 上から順にマッチさせていく
15
+ { name: 'ここまで', pattern: /^;;;/ },
16
+ { name: 'eol', pattern: /^\n/ },
17
+ { name: 'eol', pattern: /^;/ },
18
+ // eslint-disable-next-line no-control-regex
19
+ { name: 'space', pattern: /^(\x20|\x09|・)+/ },
20
+ { name: 'comma', pattern: /^,/ },
21
+ { name: 'line_comment', pattern: /^#[^\n]*/ },
22
+ { name: 'line_comment', pattern: /^\/\/[^\n]*/ },
23
+ { name: 'range_comment', pattern: /^\/\*/, cbParser: cbRangeComment },
24
+ { name: 'def_test', pattern: /^●テスト:/ },
25
+ { name: 'def_func', pattern: /^●/ },
26
+ // 数値の判定 --- この後nako_lexerにて単位を読む処理が入る(#994)
27
+ { name: 'number', pattern: /^0[xX][0-9a-fA-F]+(_[0-9a-fA-F]+)*/, readJosi: true, cb: parseNumber },
28
+ { name: 'number', pattern: /^0[oO][0-7]+(_[0-7]+)*/, readJosi: true, cb: parseNumber },
29
+ { name: 'number', pattern: /^0[bB][0-1]+(_[0-1]+)*/, readJosi: true, cb: parseNumber },
30
+ // 下の三つは小数点が挟まっている場合、小数点から始まっている場合、小数点がない場合の十進法の数値にマッチします
31
+ { name: 'number', pattern: /^\d+(_\d+)*\.(\d+(_\d+)*)?([eE][+|-]?\d+(_\d+)*)?/, readJosi: true, cb: parseNumber },
32
+ { name: 'number', pattern: /^\.\d+(_\d+)*([eE][+|-]?\d+(_\d+)*)?/, readJosi: true, cb: parseNumber },
33
+ { name: 'number', pattern: /^\d+(_\d+)*([eE][+|-]?\d+(_\d+)*)?/, readJosi: true, cb: parseNumber },
34
+ { name: 'ここから', pattern: /^(ここから),?/ },
35
+ { name: 'ここまで', pattern: /^(ここまで|💧)/ },
36
+ { name: 'もし', pattern: /^もしも?/ },
37
+ // 「ならば」は助詞として定義している
38
+ { name: '違えば', pattern: /^違(えば)?/ },
39
+ // 「回」「間」「繰返」「反復」「抜」「続」「戻」「代入」「条件分岐」などは NakoLexer._replaceWord で word から変換
40
+ // @see nako_reserved_words.js
41
+ { name: 'shift_r0', pattern: /^>>>/ },
42
+ { name: 'shift_r', pattern: /^>>/ },
43
+ { name: 'shift_l', pattern: /^<</ },
44
+ { name: '===', pattern: /^===/ },
45
+ { name: '!==', pattern: /^!==/ },
46
+ { name: 'gteq', pattern: /^(≧|>=|=>)/ },
47
+ { name: 'lteq', pattern: /^(≦|<=|=<)/ },
48
+ { name: 'noteq', pattern: /^(≠|<>|!=)/ },
49
+ { name: '←', pattern: /^(←|<--)/ },
50
+ { name: 'eq', pattern: /^(=|🟰)/ },
51
+ { name: 'line_comment', pattern: /^(!|💡)(インデント構文|ここまでだるい)[^\n]*/ },
52
+ { name: 'not', pattern: /^(!|💡)/ },
53
+ { name: 'gt', pattern: /^>/ },
54
+ { name: 'lt', pattern: /^</ },
55
+ { name: 'and', pattern: /^(かつ|&&)/ },
56
+ { name: 'or', pattern: /^(または|或いは|あるいは|\|\|)/ },
57
+ { name: '@', pattern: /^@/ },
58
+ { name: '+', pattern: /^\+/ },
59
+ { name: '-', pattern: /^-/ },
60
+ { name: '*', pattern: /^(×|\*)/ },
61
+ { name: '÷÷', pattern: /^÷÷/ },
62
+ { name: '÷', pattern: /^(÷|\/)/ },
63
+ { name: '%', pattern: /^%/ },
64
+ { name: '^', pattern: /^\^/ },
65
+ { name: '&', pattern: /^&/ },
66
+ { name: '[', pattern: /^\[/ },
67
+ { name: ']', pattern: /^]/, readJosi: true },
68
+ { name: '(', pattern: /^\(/ },
69
+ { name: ')', pattern: /^\)/, readJosi: true },
70
+ { name: '|', pattern: /^\|/ },
71
+ { name: 'string', pattern: /^🌿/, cbParser: src => cbString('🌿', '🌿', src) },
72
+ { name: 'string_ex', pattern: /^🌴/, cbParser: src => cbString('🌴', '🌴', src) },
73
+ { name: 'string_ex', pattern: /^「/, cbParser: src => cbString('「', '」', src) },
74
+ { name: 'string', pattern: /^『/, cbParser: src => cbString('『', '』', src) },
75
+ { name: 'string_ex', pattern: /^“/, cbParser: src => cbString('“', '”', src) },
76
+ { name: 'string_ex', pattern: /^"/, cbParser: src => cbString('"', '"', src) },
77
+ { name: 'string', pattern: /^'/, cbParser: src => cbString('\'', '\'', src) },
78
+ { name: '」', pattern: /^」/, cbParser: errorRead('」') },
79
+ { name: '』', pattern: /^』/, cbParser: errorRead('』') },
80
+ { name: 'func', pattern: /^\{関数\},?/ },
81
+ { name: '{', pattern: /^\{/ },
82
+ { name: '}', pattern: /^\}/, readJosi: true },
83
+ { name: ':', pattern: /^:/ },
84
+ { name: '_eol', pattern: /^_\s*\n/ },
85
+ { name: 'dec_lineno', pattern: /^‰/ },
86
+ // 絵文字変数 = (絵文字)英数字*
87
+ { name: 'word', pattern: /^[\uD800-\uDBFF][\uDC00-\uDFFF][_a-zA-Z0-9]*/, readJosi: true },
88
+ { name: 'word', pattern: /^[\u1F60-\u1F6F][_a-zA-Z0-9]*/, readJosi: true },
89
+ { name: 'word', pattern: /^《.+?》/, readJosi: true },
90
+ // 単語句
91
+ {
92
+ name: 'word',
93
+ pattern: /^[_a-zA-Z\u3005\u4E00-\u9FCFぁ-んァ-ヶ\u2460-\u24FF\u2776-\u277F\u3251-\u32BF]/,
94
+ cbParser: cbWordParser
95
+ }
96
+ ];
97
+ export function trimOkurigana(s) {
98
+ // ひらがなから始まらない場合、送り仮名を削除。(例)置換する
99
+ if (!hira.test(s)) {
100
+ return s.replace(/[ぁ-ん]+/g, '');
101
+ }
102
+ // 全てひらがな? (例) どうぞ
103
+ if (allHiragana.test(s)) {
104
+ return s;
105
+ }
106
+ // 末尾のひらがなのみ (例)お願いします →お願
107
+ return s.replace(/[ぁ-ん]+$/g, '');
108
+ }
109
+ // Utility for Rule
110
+ function cbRangeComment(src) {
111
+ let res = '';
112
+ const josi = '';
113
+ let numEOL = 0;
114
+ src = src.substring(2); // skip /*
115
+ const i = src.indexOf('*/');
116
+ if (i < 0) { // not found
117
+ res = src;
118
+ src = '';
119
+ }
120
+ else {
121
+ res = src.substring(0, i);
122
+ src = src.substring(i + 2);
123
+ }
124
+ // 改行を数える
125
+ for (let i = 0; i < res.length; i++) {
126
+ if (res.charAt(i) === '\n') {
127
+ numEOL++;
128
+ }
129
+ }
130
+ res = res.replace(/(^\s+|\s+$)/, ''); // trim
131
+ return { src, res, josi, numEOL };
132
+ }
133
+ /**
134
+ * @param {string} src
135
+ */
136
+ function cbWordParser(src, isTrimOkurigana = true) {
137
+ /*
138
+ kanji = [\u3005\u4E00-\u9FCF]
139
+ hiragana = [ぁ-ん]
140
+ katakana = [ァ-ヶー]
141
+ emoji = [\u1F60-\u1F6F]
142
+ uni_extra = [\uD800-\uDBFF] [\uDC00-\uDFFF]
143
+ alphabet = [_a-zA-Z]
144
+ numchars = [0-9]
145
+ */
146
+ let res = '';
147
+ let josi = '';
148
+ while (src !== '') {
149
+ if (res.length > 0) {
150
+ // 助詞の判定
151
+ const j = josiRE.exec(src);
152
+ if (j) {
153
+ josi = j[0].replace(/^\s+/, '');
154
+ src = src.substr(j[0].length);
155
+ // 助詞の直後にある「,」を飛ばす #877
156
+ if (src.charAt(0) === ',') {
157
+ src = src.substr(1);
158
+ }
159
+ break;
160
+ }
161
+ }
162
+ // カタカナ漢字英数字か?
163
+ const m = kanakanji.exec(src);
164
+ if (m) {
165
+ res += m[0];
166
+ src = src.substr(m[0].length);
167
+ continue;
168
+ }
169
+ // ひらがな?
170
+ const h = hira.test(src);
171
+ if (h) {
172
+ res += src.charAt(0);
173
+ src = src.substr(1);
174
+ continue;
175
+ }
176
+ break; // other chars
177
+ }
178
+ // 「間」の特殊ルール (#831)
179
+ // 「等しい間」や「一致する間」なら「間」をsrcに戻す。ただし「システム時間」はそのままにする。
180
+ if (/[ぁ-ん]間$/.test(res)) {
181
+ src = res.charAt(res.length - 1) + src;
182
+ res = res.slice(0, -1);
183
+ }
184
+ // 「以上」「以下」「超」「未満」 #918
185
+ const ii = wordHasIjoIka.exec(res);
186
+ if (ii) {
187
+ src = ii[1] + josi + src;
188
+ josi = '';
189
+ res = res.substr(0, res.length - ii[1].length);
190
+ }
191
+ // 助詞「こと」「である」「です」などは「**すること」のように使うので削除 #936 #939 #974
192
+ if (removeJosiMap[josi]) {
193
+ josi = '';
194
+ }
195
+ // 漢字カタカナ英語から始まる語句 --- 送り仮名を省略
196
+ if (isTrimOkurigana) {
197
+ res = trimOkurigana(res);
198
+ }
199
+ // 助詞だけの語句の場合
200
+ if (res === '' && josi !== '') {
201
+ res = josi;
202
+ josi = '';
203
+ }
204
+ return { src, res, josi, numEOL: 0 };
205
+ }
206
+ function cbString(beginTag, closeTag, src) {
207
+ let res = '';
208
+ let josi = '';
209
+ let numEOL = 0;
210
+ src = src.substr(beginTag.length); // skip beginTag
211
+ const i = src.indexOf(closeTag);
212
+ if (i < 0) { // not found
213
+ res = src;
214
+ src = '';
215
+ }
216
+ else {
217
+ res = src.substr(0, i);
218
+ src = src.substr(i + closeTag.length);
219
+ // res の中に beginTag があればエラーにする #953
220
+ if (res.indexOf(beginTag) >= 0) {
221
+ if (beginTag === '『') {
222
+ throw new Error('「『」で始めた文字列の中に「『」を含めることはできません。');
223
+ }
224
+ else {
225
+ throw new Error(`『${beginTag}』で始めた文字列の中に『${beginTag}』を含めることはできません。`);
226
+ }
227
+ }
228
+ }
229
+ // 文字列直後の助詞を取得
230
+ const j = josiRE.exec(src);
231
+ if (j) {
232
+ josi = j[0].replace(/^\s+/, '');
233
+ src = src.substr(j[0].length);
234
+ // 助詞の後のカンマ #877
235
+ if (src.charAt(0) === ',') {
236
+ src = src.substr(1);
237
+ }
238
+ }
239
+ // 助詞「こと」「である」「です」などは「**すること」のように使うので削除 #936 #939 #974
240
+ if (removeJosiMap[josi]) {
241
+ josi = '';
242
+ }
243
+ // 改行を数える
244
+ for (let i = 0; i < res.length; i++) {
245
+ if (res.charAt(i) === '\n') {
246
+ numEOL++;
247
+ }
248
+ }
249
+ return { src, res, josi, numEOL };
250
+ }
251
+ function parseNumber(n) {
252
+ return Number(n.replace(/_/g, ''));
253
+ }
@@ -0,0 +1,260 @@
1
+ /**
2
+ * なでしこ3字句解析のためのルール
3
+ */
4
+
5
+ import { josiRE, removeJosiMap } from './nako_josi_list.mjs'
6
+
7
+ const kanakanji = /^[\u3005\u4E00-\u9FCF_a-zA-Z0-9ァ-ヶー\u2460-\u24FF\u2776-\u277F\u3251-\u32BF]+/
8
+ const hira = /^[ぁ-ん]/
9
+ const allHiragana = /^[ぁ-ん]+$/
10
+ const wordHasIjoIka = /^.+(以上|以下|超|未満)$/
11
+ const errorRead = (ch: string): any => {
12
+ return function () { throw new Error('突然の『' + ch + '』があります。') }
13
+ }
14
+
15
+ export const unitRE = /^(円|ドル|元|歩|㎡|坪|度|℃|°|個|つ|本|冊|才|歳|匹|枚|皿|セット|羽|人|件|行|列|機|品|m|mm|cm|km|g|kg|t|px|dot|pt|em|b|mb|kb|gb)/
16
+
17
+ interface NakoLexParseResult {
18
+ src: string;
19
+ res: string;
20
+ josi: string;
21
+ numEOL: number;
22
+ }
23
+
24
+ export interface NakoLexRule {
25
+ name: string;
26
+ pattern: RegExp;
27
+ readJosi?: boolean;
28
+ cb?: (v: string) => any;
29
+ cbParser?: (v: string, b?: boolean) => NakoLexParseResult;
30
+ }
31
+
32
+ export const rules: NakoLexRule[] = [
33
+ // 上から順にマッチさせていく
34
+ { name: 'ここまで', pattern: /^;;;/ }, // #925
35
+ { name: 'eol', pattern: /^\n/ },
36
+ { name: 'eol', pattern: /^;/ },
37
+ // eslint-disable-next-line no-control-regex
38
+ { name: 'space', pattern: /^(\x20|\x09|・)+/ }, // #877,#1015
39
+ { name: 'comma', pattern: /^,/ },
40
+ { name: 'line_comment', pattern: /^#[^\n]*/ },
41
+ { name: 'line_comment', pattern: /^\/\/[^\n]*/ },
42
+ { name: 'range_comment', pattern: /^\/\*/, cbParser: cbRangeComment },
43
+ { name: 'def_test', pattern: /^●テスト:/ },
44
+ { name: 'def_func', pattern: /^●/ },
45
+ // 数値の判定 --- この後nako_lexerにて単位を読む処理が入る(#994)
46
+ { name: 'number', pattern: /^0[xX][0-9a-fA-F]+(_[0-9a-fA-F]+)*/, readJosi: true, cb: parseNumber },
47
+ { name: 'number', pattern: /^0[oO][0-7]+(_[0-7]+)*/, readJosi: true, cb: parseNumber },
48
+ { name: 'number', pattern: /^0[bB][0-1]+(_[0-1]+)*/, readJosi: true, cb: parseNumber },
49
+ // 下の三つは小数点が挟まっている場合、小数点から始まっている場合、小数点がない場合の十進法の数値にマッチします
50
+ { name: 'number', pattern: /^\d+(_\d+)*\.(\d+(_\d+)*)?([eE][+|-]?\d+(_\d+)*)?/, readJosi: true, cb: parseNumber },
51
+ { name: 'number', pattern: /^\.\d+(_\d+)*([eE][+|-]?\d+(_\d+)*)?/, readJosi: true, cb: parseNumber },
52
+ { name: 'number', pattern: /^\d+(_\d+)*([eE][+|-]?\d+(_\d+)*)?/, readJosi: true, cb: parseNumber },
53
+ { name: 'ここから', pattern: /^(ここから),?/ },
54
+ { name: 'ここまで', pattern: /^(ここまで|💧)/ },
55
+ { name: 'もし', pattern: /^もしも?/ },
56
+ // 「ならば」は助詞として定義している
57
+ { name: '違えば', pattern: /^違(えば)?/ },
58
+ // 「回」「間」「繰返」「反復」「抜」「続」「戻」「代入」「条件分岐」などは NakoLexer._replaceWord で word から変換
59
+ // @see nako_reserved_words.js
60
+ { name: 'shift_r0', pattern: /^>>>/ },
61
+ { name: 'shift_r', pattern: /^>>/ },
62
+ { name: 'shift_l', pattern: /^<</ },
63
+ { name: '===', pattern: /^===/ }, // #999
64
+ { name: '!==', pattern: /^!==/ }, // #999
65
+ { name: 'gteq', pattern: /^(≧|>=|=>)/ },
66
+ { name: 'lteq', pattern: /^(≦|<=|=<)/ },
67
+ { name: 'noteq', pattern: /^(≠|<>|!=)/ },
68
+ { name: '←', pattern: /^(←|<--)/ }, // 関数呼び出し演算子 #891 #899
69
+ { name: 'eq', pattern: /^(=|🟰)/ },
70
+ { name: 'line_comment', pattern: /^(!|💡)(インデント構文|ここまでだるい)[^\n]*/ }, // #1184
71
+ { name: 'not', pattern: /^(!|💡)/ }, // #1184
72
+ { name: 'gt', pattern: /^>/ },
73
+ { name: 'lt', pattern: /^</ },
74
+ { name: 'and', pattern: /^(かつ|&&)/ },
75
+ { name: 'or', pattern: /^(または|或いは|あるいは|\|\|)/ },
76
+ { name: '@', pattern: /^@/ },
77
+ { name: '+', pattern: /^\+/ },
78
+ { name: '-', pattern: /^-/ },
79
+ { name: '*', pattern: /^(×|\*)/ },
80
+ { name: '÷÷', pattern: /^÷÷/ }, // 整数の割り算
81
+ { name: '÷', pattern: /^(÷|\/)/ }, // 普通の割り算
82
+ { name: '%', pattern: /^%/ },
83
+ { name: '^', pattern: /^\^/ },
84
+ { name: '&', pattern: /^&/ },
85
+ { name: '[', pattern: /^\[/ },
86
+ { name: ']', pattern: /^]/, readJosi: true },
87
+ { name: '(', pattern: /^\(/ },
88
+ { name: ')', pattern: /^\)/, readJosi: true },
89
+ { name: '|', pattern: /^\|/ },
90
+ { name: 'string', pattern: /^🌿/, cbParser: src => cbString('🌿', '🌿', src) },
91
+ { name: 'string_ex', pattern: /^🌴/, cbParser: src => cbString('🌴', '🌴', src) },
92
+ { name: 'string_ex', pattern: /^「/, cbParser: src => cbString('「', '」', src) },
93
+ { name: 'string', pattern: /^『/, cbParser: src => cbString('『', '』', src) },
94
+ { name: 'string_ex', pattern: /^“/, cbParser: src => cbString('“', '”', src) },
95
+ { name: 'string_ex', pattern: /^"/, cbParser: src => cbString('"', '"', src) },
96
+ { name: 'string', pattern: /^'/, cbParser: src => cbString('\'', '\'', src) },
97
+ { name: '」', pattern: /^」/, cbParser: errorRead('」') }, // error
98
+ { name: '』', pattern: /^』/, cbParser: errorRead('』') }, // error
99
+ { name: 'func', pattern: /^\{関数\},?/ },
100
+ { name: '{', pattern: /^\{/ },
101
+ { name: '}', pattern: /^\}/, readJosi: true },
102
+ { name: ':', pattern: /^:/ },
103
+ { name: '_eol', pattern: /^_\s*\n/ },
104
+ { name: 'dec_lineno', pattern: /^‰/ },
105
+ // 絵文字変数 = (絵文字)英数字*
106
+ { name: 'word', pattern: /^[\uD800-\uDBFF][\uDC00-\uDFFF][_a-zA-Z0-9]*/, readJosi: true },
107
+ { name: 'word', pattern: /^[\u1F60-\u1F6F][_a-zA-Z0-9]*/, readJosi: true }, // 絵文字
108
+ { name: 'word', pattern: /^《.+?》/, readJosi: true }, // 《特別名前トークン》(#672)
109
+ // 単語句
110
+ {
111
+ name: 'word',
112
+ pattern: /^[_a-zA-Z\u3005\u4E00-\u9FCFぁ-んァ-ヶ\u2460-\u24FF\u2776-\u277F\u3251-\u32BF]/,
113
+ cbParser: cbWordParser
114
+ }
115
+ ]
116
+
117
+ export function trimOkurigana (s: string): string {
118
+ // ひらがなから始まらない場合、送り仮名を削除。(例)置換する
119
+ if (!hira.test(s)) {
120
+ return s.replace(/[ぁ-ん]+/g, '')
121
+ }
122
+ // 全てひらがな? (例) どうぞ
123
+ if (allHiragana.test(s)) { return s }
124
+ // 末尾のひらがなのみ (例)お願いします →お願
125
+ return s.replace(/[ぁ-ん]+$/g, '')
126
+ }
127
+
128
+ // Utility for Rule
129
+ function cbRangeComment (src: string): NakoLexParseResult {
130
+ let res = ''
131
+ const josi = ''
132
+ let numEOL = 0
133
+ src = src.substring(2) // skip /*
134
+ const i = src.indexOf('*/')
135
+ if (i < 0) { // not found
136
+ res = src
137
+ src = ''
138
+ } else {
139
+ res = src.substring(0, i)
140
+ src = src.substring(i + 2)
141
+ }
142
+ // 改行を数える
143
+ for (let i = 0; i < res.length; i++) { if (res.charAt(i) === '\n') { numEOL++ } }
144
+
145
+ res = res.replace(/(^\s+|\s+$)/, '') // trim
146
+ return { src, res, josi, numEOL }
147
+ }
148
+
149
+ /**
150
+ * @param {string} src
151
+ */
152
+ function cbWordParser (src: string, isTrimOkurigana = true): NakoLexParseResult {
153
+ /*
154
+ kanji = [\u3005\u4E00-\u9FCF]
155
+ hiragana = [ぁ-ん]
156
+ katakana = [ァ-ヶー]
157
+ emoji = [\u1F60-\u1F6F]
158
+ uni_extra = [\uD800-\uDBFF] [\uDC00-\uDFFF]
159
+ alphabet = [_a-zA-Z]
160
+ numchars = [0-9]
161
+ */
162
+ let res = ''
163
+ let josi = ''
164
+ while (src !== '') {
165
+ if (res.length > 0) {
166
+ // 助詞の判定
167
+ const j = josiRE.exec(src)
168
+ if (j) {
169
+ josi = j[0].replace(/^\s+/, '')
170
+ src = src.substr(j[0].length)
171
+ // 助詞の直後にある「,」を飛ばす #877
172
+ if (src.charAt(0) === ',') { src = src.substr(1) }
173
+ break
174
+ }
175
+ }
176
+ // カタカナ漢字英数字か?
177
+ const m = kanakanji.exec(src)
178
+ if (m) {
179
+ res += m[0]
180
+ src = src.substr(m[0].length)
181
+ continue
182
+ }
183
+ // ひらがな?
184
+ const h = hira.test(src)
185
+ if (h) {
186
+ res += src.charAt(0)
187
+ src = src.substr(1)
188
+ continue
189
+ }
190
+ break // other chars
191
+ }
192
+ // 「間」の特殊ルール (#831)
193
+ // 「等しい間」や「一致する間」なら「間」をsrcに戻す。ただし「システム時間」はそのままにする。
194
+ if (/[ぁ-ん]間$/.test(res)) {
195
+ src = res.charAt(res.length - 1) + src
196
+ res = res.slice(0, -1)
197
+ }
198
+ // 「以上」「以下」「超」「未満」 #918
199
+ const ii = wordHasIjoIka.exec(res)
200
+ if (ii) {
201
+ src = ii[1] + josi + src
202
+ josi = ''
203
+ res = res.substr(0, res.length - ii[1].length)
204
+ }
205
+ // 助詞「こと」「である」「です」などは「**すること」のように使うので削除 #936 #939 #974
206
+ if (removeJosiMap[josi]) { josi = '' }
207
+
208
+ // 漢字カタカナ英語から始まる語句 --- 送り仮名を省略
209
+ if (isTrimOkurigana) {
210
+ res = trimOkurigana(res)
211
+ }
212
+ // 助詞だけの語句の場合
213
+ if (res === '' && josi !== '') {
214
+ res = josi
215
+ josi = ''
216
+ }
217
+ return { src, res, josi, numEOL: 0 }
218
+ }
219
+
220
+ function cbString (beginTag: string, closeTag: string, src: string): NakoLexParseResult {
221
+ let res = ''
222
+ let josi = ''
223
+ let numEOL = 0
224
+ src = src.substr(beginTag.length) // skip beginTag
225
+ const i = src.indexOf(closeTag)
226
+ if (i < 0) { // not found
227
+ res = src
228
+ src = ''
229
+ } else {
230
+ res = src.substr(0, i)
231
+ src = src.substr(i + closeTag.length)
232
+ // res の中に beginTag があればエラーにする #953
233
+ if (res.indexOf(beginTag) >= 0) {
234
+ if (beginTag === '『') {
235
+ throw new Error('「『」で始めた文字列の中に「『」を含めることはできません。')
236
+ } else {
237
+ throw new Error(`『${beginTag}』で始めた文字列の中に『${beginTag}』を含めることはできません。`)
238
+ }
239
+ }
240
+ }
241
+ // 文字列直後の助詞を取得
242
+ const j = josiRE.exec(src)
243
+ if (j) {
244
+ josi = j[0].replace(/^\s+/, '')
245
+ src = src.substr(j[0].length)
246
+ // 助詞の後のカンマ #877
247
+ if (src.charAt(0) === ',') { src = src.substr(1) }
248
+ }
249
+ // 助詞「こと」「である」「です」などは「**すること」のように使うので削除 #936 #939 #974
250
+ if (removeJosiMap[josi]) { josi = '' }
251
+
252
+ // 改行を数える
253
+ for (let i = 0; i < res.length; i++) { if (res.charAt(i) === '\n') { numEOL++ } }
254
+
255
+ return { src, res, josi, numEOL }
256
+ }
257
+
258
+ function parseNumber (n: string): number {
259
+ return Number(n.replace(/_/g, ''))
260
+ }