code wiki / _hdl_build / nx_mt_multi.nx

nx_mt_multi.nx source

↩ module page · 144 lines · 6963 B

1// nx_mt_multi.nx -- sovereign MULTILINGUAL phrase translator over EN/RU/BE/UK/PL, ENGLISH-PIVOT (the standard 2// MT design: any pair X->Y routes X->EN->Y, so N languages need only 2N tables, not N^2). Token-level, Cyrillic- 3// & Polish-aware tokenizer (bytes >=0x80 are token chars), NO float, deterministic. Unknown tokens pass through 4// (Cardinal 25). Lexicon is edit-here R1 (R2 -> seg_store per language-pair, Cardinal 11). license_tier: ORIGINAL 5import "nx_syscalls.nx" 6 7const MM_EN: i64 = 0 8const MM_RU: i64 = 1 9const MM_BE: i64 = 2 10const MM_UK: i64 = 3 11const MM_PL: i64 = 4 12 13func mm_lc(c: i64) -> i64 { if c >= 65 { if c <= 90 { return c + 32 } } return c } 14func mm_is_tok(c: i64) -> i64 { 15 if c >= 48 { if c <= 57 { return 1 } } 16 if c >= 65 { if c <= 90 { return 1 } } 17 if c >= 97 { if c <= 122 { return 1 } } 18 if c >= 128 { return 1 } 19 return 0 20} 21// byte-exact nul-terminated compare 22func mm_streq(a: *u8, b: *u8) -> i64 { 23 var i: i64 = 0 24 while a[i] != (0 as u8) { if a[i] != b[i] { return 0 } i = i + 1 } 25 if b[i] != (0 as u8) { return 0 } 26 return 1 27} 28// extract src[s..e) into buf, lowercasing ASCII; nul-terminate 29func mm_extract(src: *u8, s: i64, e: i64, buf: *u8) -> i64 { 30 var k: i64 = 0 31 var i: i64 = s 32 while i < e { buf[k] = mm_lc(src[i] as i64) as u8; k = k + 1; i = i + 1 } 33 buf[k] = 0 as u8 34 return k 35} 36// English token -> language `lang` 37func mm_en_to(lang: i64, tok: *u8) -> *u8 { 38 if lang == MM_RU { 39 if mm_streq(tok,"hello" as *u8)==1 { return "привет" as *u8 } 40 if mm_streq(tok,"friend" as *u8)==1 { return "друг" as *u8 } 41 if mm_streq(tok,"thanks" as *u8)==1 { return "спасибо" as *u8 } 42 if mm_streq(tok,"love" as *u8)==1 { return "любовь" as *u8 } 43 if mm_streq(tok,"yes" as *u8)==1 { return "да" as *u8 } 44 if mm_streq(tok,"no" as *u8)==1 { return "нет" as *u8 } 45 } 46 if lang == MM_BE { 47 if mm_streq(tok,"hello" as *u8)==1 { return "вітаю" as *u8 } 48 if mm_streq(tok,"friend" as *u8)==1 { return "сябар" as *u8 } 49 if mm_streq(tok,"thanks" as *u8)==1 { return "дзякуй" as *u8 } 50 if mm_streq(tok,"love" as *u8)==1 { return "любоў" as *u8 } 51 if mm_streq(tok,"yes" as *u8)==1 { return "так" as *u8 } 52 if mm_streq(tok,"no" as *u8)==1 { return "не" as *u8 } 53 } 54 if lang == MM_UK { 55 if mm_streq(tok,"hello" as *u8)==1 { return "привіт" as *u8 } 56 if mm_streq(tok,"friend" as *u8)==1 { return "друг" as *u8 } 57 if mm_streq(tok,"thanks" as *u8)==1 { return "дякую" as *u8 } 58 if mm_streq(tok,"love" as *u8)==1 { return "любов" as *u8 } 59 if mm_streq(tok,"yes" as *u8)==1 { return "так" as *u8 } 60 if mm_streq(tok,"no" as *u8)==1 { return "ні" as *u8 } 61 } 62 if lang == MM_PL { 63 if mm_streq(tok,"hello" as *u8)==1 { return "cześć" as *u8 } 64 if mm_streq(tok,"friend" as *u8)==1 { return "przyjaciel" as *u8 } 65 if mm_streq(tok,"thanks" as *u8)==1 { return "dziękuję" as *u8 } 66 if mm_streq(tok,"love" as *u8)==1 { return "miłość" as *u8 } 67 if mm_streq(tok,"yes" as *u8)==1 { return "tak" as *u8 } 68 if mm_streq(tok,"no" as *u8)==1 { return "nie" as *u8 } 69 } 70 return 0 as *u8 71} 72// language `lang` token -> English 73func mm_to_en(lang: i64, tok: *u8) -> *u8 { 74 if lang == MM_RU { 75 if mm_streq(tok,"привет" as *u8)==1 { return "hello" as *u8 } 76 if mm_streq(tok,"друг" as *u8)==1 { return "friend" as *u8 } 77 if mm_streq(tok,"спасибо" as *u8)==1 { return "thanks" as *u8 } 78 if mm_streq(tok,"любовь" as *u8)==1 { return "love" as *u8 } 79 if mm_streq(tok,"да" as *u8)==1 { return "yes" as *u8 } 80 if mm_streq(tok,"нет" as *u8)==1 { return "no" as *u8 } 81 } 82 if lang == MM_BE { 83 if mm_streq(tok,"вітаю" as *u8)==1 { return "hello" as *u8 } 84 if mm_streq(tok,"сябар" as *u8)==1 { return "friend" as *u8 } 85 if mm_streq(tok,"дзякуй" as *u8)==1 { return "thanks" as *u8 } 86 if mm_streq(tok,"любоў" as *u8)==1 { return "love" as *u8 } 87 if mm_streq(tok,"так" as *u8)==1 { return "yes" as *u8 } 88 if mm_streq(tok,"не" as *u8)==1 { return "no" as *u8 } 89 } 90 if lang == MM_UK { 91 if mm_streq(tok,"привіт" as *u8)==1 { return "hello" as *u8 } 92 if mm_streq(tok,"друг" as *u8)==1 { return "friend" as *u8 } 93 if mm_streq(tok,"дякую" as *u8)==1 { return "thanks" as *u8 } 94 if mm_streq(tok,"любов" as *u8)==1 { return "love" as *u8 } 95 if mm_streq(tok,"так" as *u8)==1 { return "yes" as *u8 } 96 if mm_streq(tok,"ні" as *u8)==1 { return "no" as *u8 } 97 } 98 if lang == MM_PL { 99 if mm_streq(tok,"cześć" as *u8)==1 { return "hello" as *u8 } 100 if mm_streq(tok,"przyjaciel" as *u8)==1 { return "friend" as *u8 } 101 if mm_streq(tok,"dziękuję" as *u8)==1 { return "thanks" as *u8 } 102 if mm_streq(tok,"miłość" as *u8)==1 { return "love" as *u8 } 103 if mm_streq(tok,"tak" as *u8)==1 { return "yes" as *u8 } 104 if mm_streq(tok,"nie" as *u8)==1 { return "no" as *u8 } 105 } 106 return 0 as *u8 107} 108// translate one already-extracted token from srcLang to dstLang (EN pivot). 0 if no mapping. 109func mm_xlate_token(tok: *u8, srcLang: i64, dstLang: i64) -> *u8 { 110 if srcLang == dstLang { return tok } 111 if srcLang == MM_EN { return mm_en_to(dstLang, tok) } 112 if dstLang == MM_EN { return mm_to_en(srcLang, tok) } 113 let piv: *u8 = mm_to_en(srcLang, tok) 114 if (piv as i64) == 0 { return 0 as *u8 } 115 return mm_en_to(dstLang, piv) 116} 117func mm_app(dst: *u8, pos: *i64, cap: i64, s: *u8) -> i64 { 118 var i: i64 = 0 119 while s[i] != (0 as u8) { let p: i64 = *pos; if p < cap { dst[p]=s[i]; *pos=p+1 } i=i+1 } 120 return 0 121} 122func mm_appb(dst: *u8, pos: *i64, cap: i64, b: i64) -> i64 { let p: i64 = *pos; if p < cap { dst[p]=b as u8; *pos=p+1 } return 0 } 123 124// translate src (n bytes) from srcLang to dstLang -> dst. returns dst length. 125func nx_multi_translate(src: *u8, n: i64, srcLang: i64, dstLang: i64, dst: *u8, cap: i64) -> i64 { 126 let pos: *i64 = sys_mmap(8) as *i64 127 *pos = 0 128 let tok: *u8 = sys_mmap(128) 129 var i: i64 = 0 130 var first: i64 = 1 131 while i < n { 132 while i < n { if mm_is_tok(src[i] as i64) == 1 { break } i = i + 1 } 133 if i >= n { break } 134 let s: i64 = i 135 while i < n { if mm_is_tok(src[i] as i64) == 1 { i = i + 1 } else { break } } 136 let e: i64 = i 137 mm_extract(src, s, e, tok) 138 if first == 0 { mm_appb(dst, pos, cap, 32) } 139 first = 0 140 let tr: *u8 = mm_xlate_token(tok, srcLang, dstLang) 141 if (tr as i64) != 0 { mm_app(dst, pos, cap, tr) } else { mm_app(dst, pos, cap, tok) } 142 } 143 return *pos 144}