@lokascript/semantic 1.0.0
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 -0
- package/README.md +686 -0
- package/dist/browser-ar.ar.global.js +2 -0
- package/dist/browser-core.core.global.js +2 -0
- package/dist/browser-de.de.global.js +2 -0
- package/dist/browser-east-asian.east-asian.global.js +2 -0
- package/dist/browser-en-tr.en-tr.global.js +2 -0
- package/dist/browser-en.en.global.js +2 -0
- package/dist/browser-es-en.es-en.global.js +2 -0
- package/dist/browser-es.es.global.js +2 -0
- package/dist/browser-fr.fr.global.js +2 -0
- package/dist/browser-id.id.global.js +2 -0
- package/dist/browser-ja.ja.global.js +2 -0
- package/dist/browser-ko.ko.global.js +2 -0
- package/dist/browser-lazy.lazy.global.js +2 -0
- package/dist/browser-priority.priority.global.js +2 -0
- package/dist/browser-pt.pt.global.js +2 -0
- package/dist/browser-qu.qu.global.js +2 -0
- package/dist/browser-sw.sw.global.js +2 -0
- package/dist/browser-tr.tr.global.js +2 -0
- package/dist/browser-western.western.global.js +2 -0
- package/dist/browser-zh.zh.global.js +2 -0
- package/dist/browser.global.js +3 -0
- package/dist/browser.global.js.map +1 -0
- package/dist/index.cjs +35051 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +3426 -0
- package/dist/index.d.ts +3426 -0
- package/dist/index.js +34890 -0
- package/dist/index.js.map +1 -0
- package/dist/languages/ar.d.ts +78 -0
- package/dist/languages/ar.js +1622 -0
- package/dist/languages/ar.js.map +1 -0
- package/dist/languages/de.d.ts +38 -0
- package/dist/languages/de.js +1168 -0
- package/dist/languages/de.js.map +1 -0
- package/dist/languages/en.d.ts +44 -0
- package/dist/languages/en.js +3491 -0
- package/dist/languages/en.js.map +1 -0
- package/dist/languages/es.d.ts +52 -0
- package/dist/languages/es.js +1493 -0
- package/dist/languages/es.js.map +1 -0
- package/dist/languages/fr.d.ts +37 -0
- package/dist/languages/fr.js +1159 -0
- package/dist/languages/fr.js.map +1 -0
- package/dist/languages/id.d.ts +35 -0
- package/dist/languages/id.js +1152 -0
- package/dist/languages/id.js.map +1 -0
- package/dist/languages/ja.d.ts +53 -0
- package/dist/languages/ja.js +1430 -0
- package/dist/languages/ja.js.map +1 -0
- package/dist/languages/ko.d.ts +51 -0
- package/dist/languages/ko.js +1729 -0
- package/dist/languages/ko.js.map +1 -0
- package/dist/languages/pt.d.ts +37 -0
- package/dist/languages/pt.js +1127 -0
- package/dist/languages/pt.js.map +1 -0
- package/dist/languages/qu.d.ts +36 -0
- package/dist/languages/qu.js +1143 -0
- package/dist/languages/qu.js.map +1 -0
- package/dist/languages/sw.d.ts +35 -0
- package/dist/languages/sw.js +1147 -0
- package/dist/languages/sw.js.map +1 -0
- package/dist/languages/tr.d.ts +45 -0
- package/dist/languages/tr.js +1529 -0
- package/dist/languages/tr.js.map +1 -0
- package/dist/languages/zh.d.ts +58 -0
- package/dist/languages/zh.js +1257 -0
- package/dist/languages/zh.js.map +1 -0
- package/dist/types-C4dcj53L.d.ts +600 -0
- package/package.json +202 -0
- package/src/__test-utils__/index.ts +7 -0
- package/src/__test-utils__/test-helpers.ts +8 -0
- package/src/__types__/test-helpers.ts +122 -0
- package/src/analysis/index.ts +479 -0
- package/src/ast-builder/command-mappers.ts +1133 -0
- package/src/ast-builder/expression-parser/index.ts +41 -0
- package/src/ast-builder/expression-parser/parser.ts +563 -0
- package/src/ast-builder/expression-parser/tokenizer.ts +394 -0
- package/src/ast-builder/expression-parser/types.ts +208 -0
- package/src/ast-builder/index.ts +536 -0
- package/src/ast-builder/value-converters.ts +172 -0
- package/src/bridge.ts +275 -0
- package/src/browser-ar.ts +162 -0
- package/src/browser-core.ts +231 -0
- package/src/browser-de.ts +162 -0
- package/src/browser-east-asian.ts +173 -0
- package/src/browser-en-tr.ts +165 -0
- package/src/browser-en.ts +157 -0
- package/src/browser-es-en.ts +200 -0
- package/src/browser-es.ts +170 -0
- package/src/browser-fr.ts +162 -0
- package/src/browser-id.ts +162 -0
- package/src/browser-ja.ts +162 -0
- package/src/browser-ko.ts +162 -0
- package/src/browser-lazy.ts +189 -0
- package/src/browser-priority.ts +214 -0
- package/src/browser-pt.ts +162 -0
- package/src/browser-qu.ts +162 -0
- package/src/browser-sw.ts +162 -0
- package/src/browser-tr.ts +162 -0
- package/src/browser-western.ts +181 -0
- package/src/browser-zh.ts +162 -0
- package/src/browser.ts +268 -0
- package/src/cache/index.ts +14 -0
- package/src/cache/semantic-cache.ts +344 -0
- package/src/core-bridge.ts +372 -0
- package/src/explicit/converter.ts +258 -0
- package/src/explicit/index.ts +18 -0
- package/src/explicit/parser.ts +236 -0
- package/src/explicit/renderer.ts +424 -0
- package/src/generators/command-schemas.ts +1636 -0
- package/src/generators/event-handler-generator.ts +109 -0
- package/src/generators/index.ts +117 -0
- package/src/generators/language-profiles.ts +139 -0
- package/src/generators/pattern-generator.ts +537 -0
- package/src/generators/profiles/arabic.ts +131 -0
- package/src/generators/profiles/bengali.ts +132 -0
- package/src/generators/profiles/chinese.ts +124 -0
- package/src/generators/profiles/english.ts +113 -0
- package/src/generators/profiles/french.ts +125 -0
- package/src/generators/profiles/german.ts +126 -0
- package/src/generators/profiles/hindi.ts +146 -0
- package/src/generators/profiles/index.ts +46 -0
- package/src/generators/profiles/indonesian.ts +125 -0
- package/src/generators/profiles/italian.ts +139 -0
- package/src/generators/profiles/japanese.ts +149 -0
- package/src/generators/profiles/korean.ts +127 -0
- package/src/generators/profiles/marker-templates.ts +288 -0
- package/src/generators/profiles/ms.ts +130 -0
- package/src/generators/profiles/polish.ts +249 -0
- package/src/generators/profiles/portuguese.ts +115 -0
- package/src/generators/profiles/quechua.ts +113 -0
- package/src/generators/profiles/russian.ts +260 -0
- package/src/generators/profiles/spanish.ts +130 -0
- package/src/generators/profiles/swahili.ts +129 -0
- package/src/generators/profiles/thai.ts +132 -0
- package/src/generators/profiles/tl.ts +128 -0
- package/src/generators/profiles/turkish.ts +124 -0
- package/src/generators/profiles/types.ts +165 -0
- package/src/generators/profiles/ukrainian.ts +270 -0
- package/src/generators/profiles/vietnamese.ts +133 -0
- package/src/generators/schema-error-codes.ts +160 -0
- package/src/generators/schema-validator.ts +391 -0
- package/src/index.ts +429 -0
- package/src/language-building-schema.ts +3170 -0
- package/src/language-loader.ts +394 -0
- package/src/languages/_all.ts +65 -0
- package/src/languages/ar.ts +15 -0
- package/src/languages/bn.ts +16 -0
- package/src/languages/de.ts +15 -0
- package/src/languages/en.ts +29 -0
- package/src/languages/es.ts +15 -0
- package/src/languages/fr.ts +15 -0
- package/src/languages/hi.ts +26 -0
- package/src/languages/id.ts +15 -0
- package/src/languages/index.ts +18 -0
- package/src/languages/it.ts +15 -0
- package/src/languages/ja.ts +15 -0
- package/src/languages/ko.ts +15 -0
- package/src/languages/ms.ts +16 -0
- package/src/languages/pl.ts +18 -0
- package/src/languages/pt.ts +15 -0
- package/src/languages/qu.ts +15 -0
- package/src/languages/ru.ts +26 -0
- package/src/languages/sw.ts +15 -0
- package/src/languages/th.ts +16 -0
- package/src/languages/tl.ts +16 -0
- package/src/languages/tr.ts +15 -0
- package/src/languages/uk.ts +26 -0
- package/src/languages/vi.ts +16 -0
- package/src/languages/zh.ts +15 -0
- package/src/parser/index.ts +15 -0
- package/src/parser/pattern-matcher.ts +1181 -0
- package/src/parser/semantic-parser.ts +573 -0
- package/src/parser/utils/index.ts +35 -0
- package/src/parser/utils/marker-resolution.ts +111 -0
- package/src/parser/utils/possessive-keywords.ts +43 -0
- package/src/parser/utils/role-positioning.ts +70 -0
- package/src/parser/utils/type-validation.ts +134 -0
- package/src/patterns/add/ar.ts +71 -0
- package/src/patterns/add/bn.ts +70 -0
- package/src/patterns/add/hi.ts +69 -0
- package/src/patterns/add/index.ts +87 -0
- package/src/patterns/add/it.ts +61 -0
- package/src/patterns/add/ja.ts +93 -0
- package/src/patterns/add/ko.ts +74 -0
- package/src/patterns/add/ms.ts +30 -0
- package/src/patterns/add/pl.ts +62 -0
- package/src/patterns/add/ru.ts +62 -0
- package/src/patterns/add/th.ts +49 -0
- package/src/patterns/add/tl.ts +30 -0
- package/src/patterns/add/tr.ts +71 -0
- package/src/patterns/add/uk.ts +62 -0
- package/src/patterns/add/vi.ts +61 -0
- package/src/patterns/add/zh.ts +71 -0
- package/src/patterns/builders.ts +207 -0
- package/src/patterns/decrement/bn.ts +70 -0
- package/src/patterns/decrement/de.ts +42 -0
- package/src/patterns/decrement/hi.ts +68 -0
- package/src/patterns/decrement/index.ts +79 -0
- package/src/patterns/decrement/it.ts +69 -0
- package/src/patterns/decrement/ms.ts +30 -0
- package/src/patterns/decrement/pl.ts +58 -0
- package/src/patterns/decrement/ru.ts +58 -0
- package/src/patterns/decrement/th.ts +49 -0
- package/src/patterns/decrement/tl.ts +30 -0
- package/src/patterns/decrement/tr.ts +48 -0
- package/src/patterns/decrement/uk.ts +58 -0
- package/src/patterns/decrement/vi.ts +61 -0
- package/src/patterns/decrement/zh.ts +32 -0
- package/src/patterns/en.ts +302 -0
- package/src/patterns/event-handler/ar.ts +151 -0
- package/src/patterns/event-handler/bn.ts +72 -0
- package/src/patterns/event-handler/de.ts +117 -0
- package/src/patterns/event-handler/en.ts +117 -0
- package/src/patterns/event-handler/es.ts +136 -0
- package/src/patterns/event-handler/fr.ts +117 -0
- package/src/patterns/event-handler/hi.ts +64 -0
- package/src/patterns/event-handler/id.ts +117 -0
- package/src/patterns/event-handler/index.ts +119 -0
- package/src/patterns/event-handler/it.ts +54 -0
- package/src/patterns/event-handler/ja.ts +118 -0
- package/src/patterns/event-handler/ko.ts +133 -0
- package/src/patterns/event-handler/ms.ts +30 -0
- package/src/patterns/event-handler/pl.ts +62 -0
- package/src/patterns/event-handler/pt.ts +117 -0
- package/src/patterns/event-handler/qu.ts +66 -0
- package/src/patterns/event-handler/ru.ts +62 -0
- package/src/patterns/event-handler/shared.ts +270 -0
- package/src/patterns/event-handler/sw.ts +117 -0
- package/src/patterns/event-handler/th.ts +53 -0
- package/src/patterns/event-handler/tl.ts +30 -0
- package/src/patterns/event-handler/tr.ts +170 -0
- package/src/patterns/event-handler/uk.ts +62 -0
- package/src/patterns/event-handler/vi.ts +61 -0
- package/src/patterns/event-handler/zh.ts +150 -0
- package/src/patterns/get/ar.ts +49 -0
- package/src/patterns/get/bn.ts +47 -0
- package/src/patterns/get/de.ts +32 -0
- package/src/patterns/get/hi.ts +52 -0
- package/src/patterns/get/index.ts +83 -0
- package/src/patterns/get/it.ts +56 -0
- package/src/patterns/get/ja.ts +53 -0
- package/src/patterns/get/ko.ts +53 -0
- package/src/patterns/get/ms.ts +30 -0
- package/src/patterns/get/pl.ts +57 -0
- package/src/patterns/get/ru.ts +57 -0
- package/src/patterns/get/th.ts +29 -0
- package/src/patterns/get/tl.ts +30 -0
- package/src/patterns/get/uk.ts +57 -0
- package/src/patterns/get/vi.ts +48 -0
- package/src/patterns/grammar-transformed/index.ts +39 -0
- package/src/patterns/grammar-transformed/ja.ts +1713 -0
- package/src/patterns/grammar-transformed/ko.ts +1311 -0
- package/src/patterns/grammar-transformed/tr.ts +1067 -0
- package/src/patterns/hide/ar.ts +67 -0
- package/src/patterns/hide/bn.ts +47 -0
- package/src/patterns/hide/de.ts +36 -0
- package/src/patterns/hide/hi.ts +61 -0
- package/src/patterns/hide/index.ts +91 -0
- package/src/patterns/hide/it.ts +56 -0
- package/src/patterns/hide/ja.ts +69 -0
- package/src/patterns/hide/ko.ts +69 -0
- package/src/patterns/hide/ms.ts +30 -0
- package/src/patterns/hide/pl.ts +57 -0
- package/src/patterns/hide/ru.ts +57 -0
- package/src/patterns/hide/th.ts +29 -0
- package/src/patterns/hide/tl.ts +30 -0
- package/src/patterns/hide/tr.ts +65 -0
- package/src/patterns/hide/uk.ts +57 -0
- package/src/patterns/hide/vi.ts +56 -0
- package/src/patterns/hide/zh.ts +68 -0
- package/src/patterns/increment/bn.ts +70 -0
- package/src/patterns/increment/de.ts +36 -0
- package/src/patterns/increment/hi.ts +68 -0
- package/src/patterns/increment/index.ts +79 -0
- package/src/patterns/increment/it.ts +69 -0
- package/src/patterns/increment/ms.ts +30 -0
- package/src/patterns/increment/pl.ts +58 -0
- package/src/patterns/increment/ru.ts +58 -0
- package/src/patterns/increment/th.ts +49 -0
- package/src/patterns/increment/tl.ts +30 -0
- package/src/patterns/increment/tr.ts +52 -0
- package/src/patterns/increment/uk.ts +58 -0
- package/src/patterns/increment/vi.ts +61 -0
- package/src/patterns/increment/zh.ts +32 -0
- package/src/patterns/index.ts +84 -0
- package/src/patterns/languages/en/control-flow.ts +93 -0
- package/src/patterns/languages/en/fetch.ts +62 -0
- package/src/patterns/languages/en/index.ts +42 -0
- package/src/patterns/languages/en/repeat.ts +67 -0
- package/src/patterns/languages/en/set.ts +48 -0
- package/src/patterns/languages/en/swap.ts +38 -0
- package/src/patterns/languages/en/temporal.ts +57 -0
- package/src/patterns/put/ar.ts +74 -0
- package/src/patterns/put/bn.ts +53 -0
- package/src/patterns/put/en.ts +74 -0
- package/src/patterns/put/es.ts +74 -0
- package/src/patterns/put/hi.ts +69 -0
- package/src/patterns/put/id.ts +96 -0
- package/src/patterns/put/index.ts +99 -0
- package/src/patterns/put/it.ts +56 -0
- package/src/patterns/put/ja.ts +75 -0
- package/src/patterns/put/ko.ts +67 -0
- package/src/patterns/put/ms.ts +30 -0
- package/src/patterns/put/pl.ts +81 -0
- package/src/patterns/put/ru.ts +85 -0
- package/src/patterns/put/th.ts +32 -0
- package/src/patterns/put/tl.ts +30 -0
- package/src/patterns/put/tr.ts +67 -0
- package/src/patterns/put/uk.ts +85 -0
- package/src/patterns/put/vi.ts +72 -0
- package/src/patterns/put/zh.ts +62 -0
- package/src/patterns/registry.ts +163 -0
- package/src/patterns/remove/ar.ts +71 -0
- package/src/patterns/remove/bn.ts +68 -0
- package/src/patterns/remove/hi.ts +69 -0
- package/src/patterns/remove/index.ts +87 -0
- package/src/patterns/remove/it.ts +69 -0
- package/src/patterns/remove/ja.ts +74 -0
- package/src/patterns/remove/ko.ts +78 -0
- package/src/patterns/remove/ms.ts +30 -0
- package/src/patterns/remove/pl.ts +62 -0
- package/src/patterns/remove/ru.ts +62 -0
- package/src/patterns/remove/th.ts +49 -0
- package/src/patterns/remove/tl.ts +30 -0
- package/src/patterns/remove/tr.ts +78 -0
- package/src/patterns/remove/uk.ts +62 -0
- package/src/patterns/remove/vi.ts +61 -0
- package/src/patterns/remove/zh.ts +72 -0
- package/src/patterns/set/ar.ts +84 -0
- package/src/patterns/set/bn.ts +53 -0
- package/src/patterns/set/de.ts +84 -0
- package/src/patterns/set/es.ts +92 -0
- package/src/patterns/set/fr.ts +88 -0
- package/src/patterns/set/hi.ts +56 -0
- package/src/patterns/set/id.ts +84 -0
- package/src/patterns/set/index.ts +107 -0
- package/src/patterns/set/it.ts +56 -0
- package/src/patterns/set/ja.ts +86 -0
- package/src/patterns/set/ko.ts +85 -0
- package/src/patterns/set/ms.ts +30 -0
- package/src/patterns/set/pl.ts +57 -0
- package/src/patterns/set/pt.ts +84 -0
- package/src/patterns/set/ru.ts +57 -0
- package/src/patterns/set/th.ts +31 -0
- package/src/patterns/set/tl.ts +30 -0
- package/src/patterns/set/tr.ts +107 -0
- package/src/patterns/set/uk.ts +57 -0
- package/src/patterns/set/vi.ts +53 -0
- package/src/patterns/set/zh.ts +84 -0
- package/src/patterns/show/ar.ts +67 -0
- package/src/patterns/show/bn.ts +47 -0
- package/src/patterns/show/de.ts +32 -0
- package/src/patterns/show/fr.ts +32 -0
- package/src/patterns/show/hi.ts +61 -0
- package/src/patterns/show/index.ts +95 -0
- package/src/patterns/show/it.ts +56 -0
- package/src/patterns/show/ja.ts +69 -0
- package/src/patterns/show/ko.ts +73 -0
- package/src/patterns/show/ms.ts +30 -0
- package/src/patterns/show/pl.ts +57 -0
- package/src/patterns/show/ru.ts +57 -0
- package/src/patterns/show/th.ts +29 -0
- package/src/patterns/show/tl.ts +30 -0
- package/src/patterns/show/tr.ts +65 -0
- package/src/patterns/show/uk.ts +57 -0
- package/src/patterns/show/vi.ts +56 -0
- package/src/patterns/show/zh.ts +68 -0
- package/src/patterns/take/ar.ts +51 -0
- package/src/patterns/take/index.ts +31 -0
- package/src/patterns/toggle/ar.ts +61 -0
- package/src/patterns/toggle/bn.ts +70 -0
- package/src/patterns/toggle/en.ts +61 -0
- package/src/patterns/toggle/es.ts +61 -0
- package/src/patterns/toggle/hi.ts +80 -0
- package/src/patterns/toggle/index.ts +95 -0
- package/src/patterns/toggle/it.ts +69 -0
- package/src/patterns/toggle/ja.ts +156 -0
- package/src/patterns/toggle/ko.ts +113 -0
- package/src/patterns/toggle/ms.ts +30 -0
- package/src/patterns/toggle/pl.ts +62 -0
- package/src/patterns/toggle/ru.ts +62 -0
- package/src/patterns/toggle/th.ts +50 -0
- package/src/patterns/toggle/tl.ts +30 -0
- package/src/patterns/toggle/tr.ts +88 -0
- package/src/patterns/toggle/uk.ts +62 -0
- package/src/patterns/toggle/vi.ts +61 -0
- package/src/patterns/toggle/zh.ts +99 -0
- package/src/public-api.ts +286 -0
- package/src/registry.ts +441 -0
- package/src/tokenizers/arabic.ts +723 -0
- package/src/tokenizers/base.ts +1300 -0
- package/src/tokenizers/bengali.ts +289 -0
- package/src/tokenizers/chinese.ts +481 -0
- package/src/tokenizers/english.ts +416 -0
- package/src/tokenizers/french.ts +326 -0
- package/src/tokenizers/german.ts +324 -0
- package/src/tokenizers/hindi.ts +319 -0
- package/src/tokenizers/index.ts +127 -0
- package/src/tokenizers/indonesian.ts +306 -0
- package/src/tokenizers/italian.ts +458 -0
- package/src/tokenizers/japanese.ts +447 -0
- package/src/tokenizers/korean.ts +642 -0
- package/src/tokenizers/morphology/arabic-normalizer.ts +242 -0
- package/src/tokenizers/morphology/french-normalizer.ts +268 -0
- package/src/tokenizers/morphology/german-normalizer.ts +256 -0
- package/src/tokenizers/morphology/index.ts +46 -0
- package/src/tokenizers/morphology/italian-normalizer.ts +329 -0
- package/src/tokenizers/morphology/japanese-normalizer.ts +288 -0
- package/src/tokenizers/morphology/korean-normalizer.ts +428 -0
- package/src/tokenizers/morphology/polish-normalizer.ts +264 -0
- package/src/tokenizers/morphology/portuguese-normalizer.ts +310 -0
- package/src/tokenizers/morphology/spanish-normalizer.ts +327 -0
- package/src/tokenizers/morphology/turkish-normalizer.ts +412 -0
- package/src/tokenizers/morphology/types.ts +211 -0
- package/src/tokenizers/ms.ts +198 -0
- package/src/tokenizers/polish.ts +354 -0
- package/src/tokenizers/portuguese.ts +304 -0
- package/src/tokenizers/quechua.ts +339 -0
- package/src/tokenizers/russian.ts +375 -0
- package/src/tokenizers/spanish.ts +403 -0
- package/src/tokenizers/swahili.ts +303 -0
- package/src/tokenizers/thai.ts +236 -0
- package/src/tokenizers/tl.ts +198 -0
- package/src/tokenizers/turkish.ts +411 -0
- package/src/tokenizers/ukrainian.ts +369 -0
- package/src/tokenizers/vietnamese.ts +410 -0
- package/src/types/grammar-types.ts +617 -0
- package/src/types/unified-profile.ts +267 -0
- package/src/types.ts +709 -0
- package/src/utils/confidence-calculator.ts +147 -0
- package/src/validators/command-validator.ts +380 -0
- package/src/validators/index.ts +15 -0
package/src/types.ts
ADDED
|
@@ -0,0 +1,709 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semantic-First Multilingual Hyperscript Types
|
|
3
|
+
*
|
|
4
|
+
* This module defines the canonical semantic representation that all languages
|
|
5
|
+
* parse to and render from. The semantic layer is language-neutral - it captures
|
|
6
|
+
* the MEANING of hyperscript commands independent of surface syntax.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
// Re-export the SemanticRole type from local grammar-types for consistency
|
|
10
|
+
export type {
|
|
11
|
+
SemanticRole,
|
|
12
|
+
WordOrder,
|
|
13
|
+
AdpositionType,
|
|
14
|
+
MorphologyType,
|
|
15
|
+
GrammaticalMarker,
|
|
16
|
+
LanguageProfile,
|
|
17
|
+
} from './types/grammar-types';
|
|
18
|
+
|
|
19
|
+
import type { SemanticRole } from './types/grammar-types';
|
|
20
|
+
|
|
21
|
+
// =============================================================================
|
|
22
|
+
// Action Types
|
|
23
|
+
// =============================================================================
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Canonical action names (English-based internally, but not visible to users)
|
|
27
|
+
* These map to hyperscript commands and are used in the semantic AST.
|
|
28
|
+
*/
|
|
29
|
+
export type ActionType =
|
|
30
|
+
// Class/Attribute operations
|
|
31
|
+
| 'toggle'
|
|
32
|
+
| 'add'
|
|
33
|
+
| 'remove'
|
|
34
|
+
// Content operations
|
|
35
|
+
| 'put'
|
|
36
|
+
| 'append'
|
|
37
|
+
| 'prepend'
|
|
38
|
+
| 'take'
|
|
39
|
+
| 'make'
|
|
40
|
+
| 'clone'
|
|
41
|
+
| 'swap'
|
|
42
|
+
| 'morph'
|
|
43
|
+
// Variable operations
|
|
44
|
+
| 'set'
|
|
45
|
+
| 'get'
|
|
46
|
+
| 'increment'
|
|
47
|
+
| 'decrement'
|
|
48
|
+
| 'log'
|
|
49
|
+
// Visibility
|
|
50
|
+
| 'show'
|
|
51
|
+
| 'hide'
|
|
52
|
+
| 'transition'
|
|
53
|
+
// Events
|
|
54
|
+
| 'on'
|
|
55
|
+
| 'trigger'
|
|
56
|
+
| 'send'
|
|
57
|
+
// DOM focus
|
|
58
|
+
| 'focus'
|
|
59
|
+
| 'blur'
|
|
60
|
+
// Navigation
|
|
61
|
+
| 'go'
|
|
62
|
+
// Async
|
|
63
|
+
| 'wait'
|
|
64
|
+
| 'fetch'
|
|
65
|
+
| 'settle'
|
|
66
|
+
// Animation/Measurement
|
|
67
|
+
| 'measure'
|
|
68
|
+
// Behavior system
|
|
69
|
+
| 'install'
|
|
70
|
+
// Control flow
|
|
71
|
+
| 'if'
|
|
72
|
+
| 'unless'
|
|
73
|
+
| 'else'
|
|
74
|
+
| 'repeat'
|
|
75
|
+
| 'for'
|
|
76
|
+
| 'while'
|
|
77
|
+
| 'continue'
|
|
78
|
+
| 'halt'
|
|
79
|
+
| 'throw'
|
|
80
|
+
| 'call'
|
|
81
|
+
| 'return'
|
|
82
|
+
// Advanced
|
|
83
|
+
| 'js'
|
|
84
|
+
| 'async'
|
|
85
|
+
| 'tell'
|
|
86
|
+
| 'default'
|
|
87
|
+
| 'init'
|
|
88
|
+
| 'behavior'
|
|
89
|
+
// Meta (for compound nodes)
|
|
90
|
+
| 'compound';
|
|
91
|
+
|
|
92
|
+
// =============================================================================
|
|
93
|
+
// Semantic Values
|
|
94
|
+
// =============================================================================
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* A semantic value represents a typed piece of data in a semantic node.
|
|
98
|
+
* Values are language-neutral - they capture what something IS, not how it's written.
|
|
99
|
+
*/
|
|
100
|
+
export type SemanticValue =
|
|
101
|
+
| LiteralValue
|
|
102
|
+
| SelectorValue
|
|
103
|
+
| ReferenceValue
|
|
104
|
+
| PropertyPathValue
|
|
105
|
+
| ExpressionValue;
|
|
106
|
+
|
|
107
|
+
export interface LiteralValue {
|
|
108
|
+
readonly type: 'literal';
|
|
109
|
+
readonly value: string | number | boolean;
|
|
110
|
+
readonly dataType?: 'string' | 'number' | 'boolean' | 'duration';
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export interface SelectorValue {
|
|
114
|
+
readonly type: 'selector';
|
|
115
|
+
readonly value: string; // The CSS selector: #id, .class, [attr], etc.
|
|
116
|
+
readonly selectorKind: 'id' | 'class' | 'attribute' | 'element' | 'complex';
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export interface ReferenceValue {
|
|
120
|
+
readonly type: 'reference';
|
|
121
|
+
readonly value: 'me' | 'you' | 'it' | 'result' | 'event' | 'target' | 'body';
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export interface PropertyPathValue {
|
|
125
|
+
readonly type: 'property-path';
|
|
126
|
+
readonly object: SemanticValue;
|
|
127
|
+
readonly property: string;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export interface ExpressionValue {
|
|
131
|
+
readonly type: 'expression';
|
|
132
|
+
/** Raw expression string for complex expressions that need further parsing */
|
|
133
|
+
readonly raw: string;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// =============================================================================
|
|
137
|
+
// Semantic Nodes
|
|
138
|
+
// =============================================================================
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Base interface for all semantic nodes.
|
|
142
|
+
* Semantic nodes capture the MEANING of hyperscript constructs.
|
|
143
|
+
*/
|
|
144
|
+
export interface SemanticNode {
|
|
145
|
+
readonly kind: 'command' | 'event-handler' | 'conditional' | 'compound' | 'loop';
|
|
146
|
+
readonly action: ActionType;
|
|
147
|
+
readonly roles: ReadonlyMap<SemanticRole, SemanticValue>;
|
|
148
|
+
readonly metadata?: SemanticMetadata;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Metadata about the source of a semantic node.
|
|
153
|
+
* Useful for debugging, error messages, and round-trip conversion.
|
|
154
|
+
*/
|
|
155
|
+
export interface SemanticMetadata {
|
|
156
|
+
readonly sourceLanguage?: string;
|
|
157
|
+
readonly sourceText?: string;
|
|
158
|
+
readonly sourcePosition?: SourcePosition;
|
|
159
|
+
readonly patternId?: string;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export interface SourcePosition {
|
|
163
|
+
readonly start: number;
|
|
164
|
+
readonly end: number;
|
|
165
|
+
readonly line?: number;
|
|
166
|
+
readonly column?: number;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* A command semantic node - represents a single hyperscript command.
|
|
171
|
+
*/
|
|
172
|
+
export interface CommandSemanticNode extends SemanticNode {
|
|
173
|
+
readonly kind: 'command';
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* An event handler semantic node - represents "on [event] [commands]".
|
|
178
|
+
*/
|
|
179
|
+
export interface EventHandlerSemanticNode extends SemanticNode {
|
|
180
|
+
readonly kind: 'event-handler';
|
|
181
|
+
readonly action: 'on';
|
|
182
|
+
readonly body: SemanticNode[];
|
|
183
|
+
readonly eventModifiers?: EventModifiers;
|
|
184
|
+
/**
|
|
185
|
+
* Event parameter names for destructuring.
|
|
186
|
+
* E.g., for "on click(clientX, clientY)", this would be ['clientX', 'clientY']
|
|
187
|
+
*/
|
|
188
|
+
readonly parameterNames?: readonly string[];
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export interface EventModifiers {
|
|
192
|
+
readonly once?: boolean;
|
|
193
|
+
readonly debounce?: number;
|
|
194
|
+
readonly throttle?: number;
|
|
195
|
+
readonly queue?: 'first' | 'last' | 'all' | 'none';
|
|
196
|
+
readonly from?: SemanticValue; // Event source filter
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* A conditional semantic node - represents "if [condition] then [body] else [body]".
|
|
201
|
+
*/
|
|
202
|
+
export interface ConditionalSemanticNode extends SemanticNode {
|
|
203
|
+
readonly kind: 'conditional';
|
|
204
|
+
readonly action: 'if';
|
|
205
|
+
readonly thenBranch: SemanticNode[];
|
|
206
|
+
readonly elseBranch?: SemanticNode[];
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* A compound semantic node - represents multiple chained statements.
|
|
211
|
+
*/
|
|
212
|
+
export interface CompoundSemanticNode extends SemanticNode {
|
|
213
|
+
readonly kind: 'compound';
|
|
214
|
+
readonly statements: SemanticNode[];
|
|
215
|
+
readonly chainType: 'then' | 'and' | 'async';
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Loop variant discriminant for different loop types.
|
|
220
|
+
*/
|
|
221
|
+
export type LoopVariant =
|
|
222
|
+
| 'forever' // repeat forever
|
|
223
|
+
| 'times' // repeat 5 times
|
|
224
|
+
| 'for' // for item in collection
|
|
225
|
+
| 'while' // while condition
|
|
226
|
+
| 'until'; // until condition
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* A loop semantic node - represents repeat/for/while loops.
|
|
230
|
+
*/
|
|
231
|
+
export interface LoopSemanticNode extends SemanticNode {
|
|
232
|
+
readonly kind: 'loop';
|
|
233
|
+
readonly action: 'repeat' | 'for' | 'while';
|
|
234
|
+
/** The type of loop (forever, times, for, while, until) */
|
|
235
|
+
readonly loopVariant: LoopVariant;
|
|
236
|
+
/** Commands to execute in each iteration */
|
|
237
|
+
readonly body: SemanticNode[];
|
|
238
|
+
/** Loop variable name for 'for' loops (e.g., 'item' in 'for item in list') */
|
|
239
|
+
readonly loopVariable?: string;
|
|
240
|
+
/** Index variable name if specified (e.g., 'i' in 'for item with index i') */
|
|
241
|
+
readonly indexVariable?: string;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// =============================================================================
|
|
245
|
+
// Language Patterns
|
|
246
|
+
// =============================================================================
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* A pattern defines how a semantic structure appears in a specific language.
|
|
250
|
+
* Patterns enable bidirectional conversion: parse (natural → semantic) and
|
|
251
|
+
* render (semantic → natural).
|
|
252
|
+
*/
|
|
253
|
+
export interface LanguagePattern {
|
|
254
|
+
/** Unique identifier for this pattern */
|
|
255
|
+
readonly id: string;
|
|
256
|
+
|
|
257
|
+
/** ISO 639-1 language code */
|
|
258
|
+
readonly language: string;
|
|
259
|
+
|
|
260
|
+
/** Which command this pattern matches */
|
|
261
|
+
readonly command: ActionType;
|
|
262
|
+
|
|
263
|
+
/** Priority for disambiguation (higher = checked first) */
|
|
264
|
+
readonly priority: number;
|
|
265
|
+
|
|
266
|
+
/** The pattern template with role placeholders */
|
|
267
|
+
readonly template: PatternTemplate;
|
|
268
|
+
|
|
269
|
+
/** Rules for extracting semantic roles from matched tokens */
|
|
270
|
+
readonly extraction: ExtractionRules;
|
|
271
|
+
|
|
272
|
+
/** Optional constraints on when this pattern applies */
|
|
273
|
+
readonly constraints?: PatternConstraints;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* A pattern template defines the expected token sequence.
|
|
278
|
+
*
|
|
279
|
+
* Template syntax:
|
|
280
|
+
* - Literal tokens: "toggle", "を", "على"
|
|
281
|
+
* - Role placeholders: {patient}, {target}, {destination}
|
|
282
|
+
* - Optional groups: [on {target}]
|
|
283
|
+
* - Alternatives in extraction (not in template string)
|
|
284
|
+
*
|
|
285
|
+
* Example templates:
|
|
286
|
+
* - English: "toggle {patient} [on {target}]"
|
|
287
|
+
* - Japanese: "{target} の {patient} を 切り替え"
|
|
288
|
+
* - Arabic: "بدّل {patient} [على {target}]"
|
|
289
|
+
*/
|
|
290
|
+
export interface PatternTemplate {
|
|
291
|
+
/** Human-readable template string */
|
|
292
|
+
readonly format: string;
|
|
293
|
+
|
|
294
|
+
/** Parsed token sequence for matching */
|
|
295
|
+
readonly tokens: PatternToken[];
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
export type PatternToken = LiteralPatternToken | RolePatternToken | GroupPatternToken;
|
|
299
|
+
|
|
300
|
+
export interface LiteralPatternToken {
|
|
301
|
+
readonly type: 'literal';
|
|
302
|
+
readonly value: string;
|
|
303
|
+
/** Alternative spellings/forms that also match */
|
|
304
|
+
readonly alternatives?: string[];
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
export interface RolePatternToken {
|
|
308
|
+
readonly type: 'role';
|
|
309
|
+
readonly role: SemanticRole;
|
|
310
|
+
readonly optional?: boolean;
|
|
311
|
+
/** Expected value types (for validation) */
|
|
312
|
+
readonly expectedTypes?: Array<SemanticValue['type']>;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
export interface GroupPatternToken {
|
|
316
|
+
readonly type: 'group';
|
|
317
|
+
readonly tokens: PatternToken[];
|
|
318
|
+
readonly optional?: boolean;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* Rules for extracting semantic values from matched tokens.
|
|
323
|
+
*/
|
|
324
|
+
export interface ExtractionRules {
|
|
325
|
+
readonly [role: string]: ExtractionRule;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
export interface ExtractionRule {
|
|
329
|
+
/** Position-based extraction (0-indexed from pattern start) */
|
|
330
|
+
readonly position?: number;
|
|
331
|
+
/** Marker-based extraction (find value after this marker) */
|
|
332
|
+
readonly marker?: string;
|
|
333
|
+
/** Alternative markers that also work */
|
|
334
|
+
readonly markerAlternatives?: string[];
|
|
335
|
+
/** Transform the extracted value */
|
|
336
|
+
readonly transform?: (raw: string) => SemanticValue;
|
|
337
|
+
/** Default value if not found (for optional roles) */
|
|
338
|
+
readonly default?: SemanticValue;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* Additional constraints on pattern applicability.
|
|
343
|
+
*/
|
|
344
|
+
export interface PatternConstraints {
|
|
345
|
+
/** Required roles that must be present */
|
|
346
|
+
readonly requiredRoles?: SemanticRole[];
|
|
347
|
+
/** Roles that must NOT be present */
|
|
348
|
+
readonly forbiddenRoles?: SemanticRole[];
|
|
349
|
+
/** Valid selector types for the patient role */
|
|
350
|
+
readonly validPatientTypes?: Array<SelectorValue['selectorKind']>;
|
|
351
|
+
/** Pattern IDs this conflicts with */
|
|
352
|
+
readonly conflictsWith?: string[];
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
// =============================================================================
|
|
356
|
+
// Token Stream (for pattern matching)
|
|
357
|
+
// =============================================================================
|
|
358
|
+
|
|
359
|
+
/**
|
|
360
|
+
* A token from language-specific tokenization.
|
|
361
|
+
*/
|
|
362
|
+
export interface LanguageToken {
|
|
363
|
+
readonly value: string;
|
|
364
|
+
readonly kind: TokenKind;
|
|
365
|
+
readonly position: SourcePosition;
|
|
366
|
+
/** Normalized form from explicit keyword map (e.g., 切り替え → toggle) */
|
|
367
|
+
readonly normalized?: string;
|
|
368
|
+
/** Morphologically normalized stem (e.g., 切り替えた → 切り替え) */
|
|
369
|
+
readonly stem?: string;
|
|
370
|
+
/** Confidence in the morphological stem (0.0-1.0) */
|
|
371
|
+
readonly stemConfidence?: number;
|
|
372
|
+
/** Additional metadata for specific token types (e.g., event modifier data) */
|
|
373
|
+
readonly metadata?: Record<string, unknown>;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
export type TokenKind =
|
|
377
|
+
| 'keyword' // Command or modifier keyword
|
|
378
|
+
| 'selector' // CSS selector (#id, .class, [attr])
|
|
379
|
+
| 'literal' // String or number literal
|
|
380
|
+
| 'particle' // Grammatical particle (を, に, من)
|
|
381
|
+
| 'conjunction' // Grammatical conjunction (Arabic و/ف proclitics)
|
|
382
|
+
| 'event-modifier' // Event modifier (.once, .debounce(300), .throttle(100))
|
|
383
|
+
| 'identifier' // Variable or property name
|
|
384
|
+
| 'operator' // Comparison or logical operator
|
|
385
|
+
| 'punctuation' // Brackets, quotes, etc.
|
|
386
|
+
| 'url'; // URL/path (/path, https://...)
|
|
387
|
+
|
|
388
|
+
/**
|
|
389
|
+
* A stream of tokens with navigation capabilities.
|
|
390
|
+
*/
|
|
391
|
+
export interface TokenStream {
|
|
392
|
+
readonly tokens: readonly LanguageToken[];
|
|
393
|
+
readonly language: string;
|
|
394
|
+
|
|
395
|
+
/** Look at token at current position + offset without consuming */
|
|
396
|
+
peek(offset?: number): LanguageToken | null;
|
|
397
|
+
|
|
398
|
+
/** Consume and return current token, advance position */
|
|
399
|
+
advance(): LanguageToken;
|
|
400
|
+
|
|
401
|
+
/** Check if we've consumed all tokens */
|
|
402
|
+
isAtEnd(): boolean;
|
|
403
|
+
|
|
404
|
+
/** Save current position for backtracking */
|
|
405
|
+
mark(): StreamMark;
|
|
406
|
+
|
|
407
|
+
/** Restore to a saved position */
|
|
408
|
+
reset(mark: StreamMark): void;
|
|
409
|
+
|
|
410
|
+
/** Get current position */
|
|
411
|
+
position(): number;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
export interface StreamMark {
|
|
415
|
+
readonly position: number;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// =============================================================================
|
|
419
|
+
// Pattern Matching Results
|
|
420
|
+
// =============================================================================
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* Result of successfully matching a pattern.
|
|
424
|
+
*/
|
|
425
|
+
export interface PatternMatchResult {
|
|
426
|
+
readonly pattern: LanguagePattern;
|
|
427
|
+
readonly captured: ReadonlyMap<SemanticRole, SemanticValue>;
|
|
428
|
+
readonly consumedTokens: number;
|
|
429
|
+
readonly confidence: number; // 0-1, how well the pattern matched
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
/**
|
|
433
|
+
* Error when pattern matching fails.
|
|
434
|
+
*/
|
|
435
|
+
export interface PatternMatchError {
|
|
436
|
+
readonly message: string;
|
|
437
|
+
readonly position: SourcePosition;
|
|
438
|
+
readonly expectedPatterns?: string[];
|
|
439
|
+
readonly partialMatch?: Partial<PatternMatchResult>;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
// =============================================================================
|
|
443
|
+
// Tokenizer Interface
|
|
444
|
+
// =============================================================================
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* Language-specific tokenizer interface.
|
|
448
|
+
* Each language implements its own tokenizer to handle:
|
|
449
|
+
* - Word boundaries (spaces for English, particles for Japanese)
|
|
450
|
+
* - Character sets (ASCII, CJK, Arabic, etc.)
|
|
451
|
+
* - Special markers (particles, prefixes, suffixes)
|
|
452
|
+
*/
|
|
453
|
+
export interface LanguageTokenizer {
|
|
454
|
+
readonly language: string;
|
|
455
|
+
readonly direction: 'ltr' | 'rtl';
|
|
456
|
+
|
|
457
|
+
/** Convert input string to token stream */
|
|
458
|
+
tokenize(input: string): TokenStream;
|
|
459
|
+
|
|
460
|
+
/** Classify a single token */
|
|
461
|
+
classifyToken(token: string): TokenKind;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
// =============================================================================
|
|
465
|
+
// Semantic Parser Interface
|
|
466
|
+
// =============================================================================
|
|
467
|
+
|
|
468
|
+
/**
|
|
469
|
+
* Main parser interface - converts natural language to semantic nodes.
|
|
470
|
+
*/
|
|
471
|
+
export interface SemanticParser {
|
|
472
|
+
/** Parse input in specified language to semantic node */
|
|
473
|
+
parse(input: string, language: string): SemanticNode;
|
|
474
|
+
|
|
475
|
+
/** Check if input can be parsed in the specified language */
|
|
476
|
+
canParse(input: string, language: string): boolean;
|
|
477
|
+
|
|
478
|
+
/** Get all supported languages */
|
|
479
|
+
supportedLanguages(): string[];
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
// =============================================================================
|
|
483
|
+
// Semantic Renderer Interface
|
|
484
|
+
// =============================================================================
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* Renderer interface - converts semantic nodes to natural language.
|
|
488
|
+
*/
|
|
489
|
+
export interface SemanticRenderer {
|
|
490
|
+
/** Render semantic node in specified language */
|
|
491
|
+
render(node: SemanticNode, language: string): string;
|
|
492
|
+
|
|
493
|
+
/** Render semantic node in explicit mode */
|
|
494
|
+
renderExplicit(node: SemanticNode): string;
|
|
495
|
+
|
|
496
|
+
/** Get all supported languages */
|
|
497
|
+
supportedLanguages(): string[];
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
// =============================================================================
|
|
501
|
+
// Helper Functions
|
|
502
|
+
// =============================================================================
|
|
503
|
+
|
|
504
|
+
/**
|
|
505
|
+
* Create a selector semantic value from a CSS selector string.
|
|
506
|
+
*/
|
|
507
|
+
export function createSelector(value: string): SelectorValue {
|
|
508
|
+
let selectorKind: SelectorValue['selectorKind'] = 'complex';
|
|
509
|
+
|
|
510
|
+
if (value.startsWith('#') && !value.includes(' ')) {
|
|
511
|
+
selectorKind = 'id';
|
|
512
|
+
} else if (value.startsWith('.') && !value.includes(' ')) {
|
|
513
|
+
selectorKind = 'class';
|
|
514
|
+
} else if (value.startsWith('[') && value.endsWith(']')) {
|
|
515
|
+
selectorKind = 'attribute';
|
|
516
|
+
} else if (/^[a-z][a-z0-9]*$/i.test(value)) {
|
|
517
|
+
selectorKind = 'element';
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
return { type: 'selector', value, selectorKind };
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
/**
|
|
524
|
+
* Create a literal semantic value.
|
|
525
|
+
*/
|
|
526
|
+
export function createLiteral(
|
|
527
|
+
value: string | number | boolean,
|
|
528
|
+
dataType?: LiteralValue['dataType']
|
|
529
|
+
): LiteralValue {
|
|
530
|
+
const result: LiteralValue = { type: 'literal', value };
|
|
531
|
+
if (dataType !== undefined) {
|
|
532
|
+
return { type: 'literal', value, dataType };
|
|
533
|
+
}
|
|
534
|
+
return result;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
/**
|
|
538
|
+
* Create a reference semantic value.
|
|
539
|
+
*/
|
|
540
|
+
export function createReference(value: ReferenceValue['value']): ReferenceValue {
|
|
541
|
+
return { type: 'reference', value };
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
/**
|
|
545
|
+
* Create a property path semantic value.
|
|
546
|
+
*/
|
|
547
|
+
export function createPropertyPath(object: SemanticValue, property: string): PropertyPathValue {
|
|
548
|
+
return { type: 'property-path', object, property };
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
/**
|
|
552
|
+
* Create a semantic node with the given action and roles.
|
|
553
|
+
*/
|
|
554
|
+
export function createCommandNode(
|
|
555
|
+
action: ActionType,
|
|
556
|
+
roles: Record<string, SemanticValue>,
|
|
557
|
+
metadata?: SemanticMetadata
|
|
558
|
+
): CommandSemanticNode {
|
|
559
|
+
const node: CommandSemanticNode = {
|
|
560
|
+
kind: 'command',
|
|
561
|
+
action,
|
|
562
|
+
roles: new Map(Object.entries(roles) as [SemanticRole, SemanticValue][]),
|
|
563
|
+
};
|
|
564
|
+
if (metadata !== undefined) {
|
|
565
|
+
return { ...node, metadata };
|
|
566
|
+
}
|
|
567
|
+
return node;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
/**
|
|
571
|
+
* Create an event handler semantic node.
|
|
572
|
+
*/
|
|
573
|
+
export function createEventHandler(
|
|
574
|
+
event: SemanticValue,
|
|
575
|
+
body: SemanticNode[],
|
|
576
|
+
modifiers?: EventModifiers,
|
|
577
|
+
metadata?: SemanticMetadata,
|
|
578
|
+
parameterNames?: string[]
|
|
579
|
+
): EventHandlerSemanticNode {
|
|
580
|
+
const roles = new Map<SemanticRole, SemanticValue>();
|
|
581
|
+
roles.set('event', event);
|
|
582
|
+
|
|
583
|
+
const node: EventHandlerSemanticNode = {
|
|
584
|
+
kind: 'event-handler',
|
|
585
|
+
action: 'on',
|
|
586
|
+
roles,
|
|
587
|
+
body,
|
|
588
|
+
};
|
|
589
|
+
|
|
590
|
+
if (modifiers !== undefined) {
|
|
591
|
+
(node as { eventModifiers?: EventModifiers }).eventModifiers = modifiers;
|
|
592
|
+
}
|
|
593
|
+
if (metadata !== undefined) {
|
|
594
|
+
(node as { metadata?: SemanticMetadata }).metadata = metadata;
|
|
595
|
+
}
|
|
596
|
+
if (parameterNames !== undefined && parameterNames.length > 0) {
|
|
597
|
+
(node as { parameterNames?: readonly string[] }).parameterNames = parameterNames;
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
return node;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
/**
|
|
604
|
+
* Create a compound semantic node (for chained statements).
|
|
605
|
+
*/
|
|
606
|
+
export function createCompoundNode(
|
|
607
|
+
statements: SemanticNode[],
|
|
608
|
+
chainType: 'then' | 'and' | 'async' = 'then',
|
|
609
|
+
metadata?: SemanticMetadata
|
|
610
|
+
): CompoundSemanticNode {
|
|
611
|
+
const node: CompoundSemanticNode = {
|
|
612
|
+
kind: 'compound',
|
|
613
|
+
action: 'compound' as ActionType, // Compound doesn't have a specific action
|
|
614
|
+
roles: new Map(),
|
|
615
|
+
statements,
|
|
616
|
+
chainType,
|
|
617
|
+
};
|
|
618
|
+
if (metadata !== undefined) {
|
|
619
|
+
(node as { metadata?: SemanticMetadata }).metadata = metadata;
|
|
620
|
+
}
|
|
621
|
+
return node;
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
/**
|
|
625
|
+
* Create a conditional semantic node (if/else).
|
|
626
|
+
*/
|
|
627
|
+
export function createConditionalNode(
|
|
628
|
+
condition: SemanticValue,
|
|
629
|
+
thenBranch: SemanticNode[],
|
|
630
|
+
elseBranch?: SemanticNode[],
|
|
631
|
+
metadata?: SemanticMetadata
|
|
632
|
+
): ConditionalSemanticNode {
|
|
633
|
+
const roles = new Map<SemanticRole, SemanticValue>();
|
|
634
|
+
roles.set('condition' as SemanticRole, condition);
|
|
635
|
+
|
|
636
|
+
const node: ConditionalSemanticNode = {
|
|
637
|
+
kind: 'conditional',
|
|
638
|
+
action: 'if',
|
|
639
|
+
roles,
|
|
640
|
+
thenBranch,
|
|
641
|
+
};
|
|
642
|
+
if (elseBranch !== undefined) {
|
|
643
|
+
(node as { elseBranch?: SemanticNode[] }).elseBranch = elseBranch;
|
|
644
|
+
}
|
|
645
|
+
if (metadata !== undefined) {
|
|
646
|
+
(node as { metadata?: SemanticMetadata }).metadata = metadata;
|
|
647
|
+
}
|
|
648
|
+
return node;
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
/**
|
|
652
|
+
* Create a loop semantic node.
|
|
653
|
+
*/
|
|
654
|
+
export function createLoopNode(
|
|
655
|
+
action: 'repeat' | 'for' | 'while',
|
|
656
|
+
loopVariant: LoopVariant,
|
|
657
|
+
roles: Record<string, SemanticValue>,
|
|
658
|
+
body: SemanticNode[],
|
|
659
|
+
options?: {
|
|
660
|
+
loopVariable?: string;
|
|
661
|
+
indexVariable?: string;
|
|
662
|
+
metadata?: SemanticMetadata;
|
|
663
|
+
}
|
|
664
|
+
): LoopSemanticNode {
|
|
665
|
+
const node: LoopSemanticNode = {
|
|
666
|
+
kind: 'loop',
|
|
667
|
+
action,
|
|
668
|
+
loopVariant,
|
|
669
|
+
roles: new Map(Object.entries(roles) as [SemanticRole, SemanticValue][]),
|
|
670
|
+
body,
|
|
671
|
+
};
|
|
672
|
+
|
|
673
|
+
if (options?.loopVariable) {
|
|
674
|
+
(node as { loopVariable?: string }).loopVariable = options.loopVariable;
|
|
675
|
+
}
|
|
676
|
+
if (options?.indexVariable) {
|
|
677
|
+
(node as { indexVariable?: string }).indexVariable = options.indexVariable;
|
|
678
|
+
}
|
|
679
|
+
if (options?.metadata) {
|
|
680
|
+
(node as { metadata?: SemanticMetadata }).metadata = options.metadata;
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
return node;
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
// =============================================================================
|
|
687
|
+
// Semantic Parse Result (for validation)
|
|
688
|
+
// =============================================================================
|
|
689
|
+
|
|
690
|
+
/**
|
|
691
|
+
* Argument with semantic role attached.
|
|
692
|
+
*/
|
|
693
|
+
export type SemanticArgument = SemanticValue & {
|
|
694
|
+
role?: SemanticRole;
|
|
695
|
+
};
|
|
696
|
+
|
|
697
|
+
/**
|
|
698
|
+
* Result of semantic parsing (used by command validator).
|
|
699
|
+
*/
|
|
700
|
+
export interface SemanticParseResult {
|
|
701
|
+
/** The action/command type */
|
|
702
|
+
readonly action: ActionType;
|
|
703
|
+
/** Confidence score (0-1) */
|
|
704
|
+
readonly confidence: number;
|
|
705
|
+
/** Source language code */
|
|
706
|
+
readonly language: string;
|
|
707
|
+
/** Parsed arguments with roles */
|
|
708
|
+
readonly arguments: SemanticArgument[];
|
|
709
|
+
}
|