code wiki / _hdl_build / nx_xlate_mt_smoke.nx

nx_xlate_mt_smoke.nx source

↩ module page · 57 lines · 3552 B

1// nx_xlate_mt_smoke.nx -- fast compile+logic smoke for the data-driven engine (tiny inline lexicon, no files). 2// Proves: (1) TSV parse, (2) Cyrillic CASE-FOLD so "Привет"=="привет", (3) multi-word PHRASE longest-match, 3// (4) Russian morphology suffix-strip ("друга"->друг), (5) EN->RU + RU->EN + passthrough of unknowns. 4import "nx_syscalls.nx" 5import "nx_xlate_mt.nx" 6const K_MAGIC_1024: i64 = 1024 7 8func s_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 9func s_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n } 10func s_num(v: i64) -> i64 { 11 if v == 0 { sys_write(1, "0" as *u8, 1); return 0 } 12 var m: i64 = v 13 let d: *u8 = sys_mmap(24) 14 var k: i64 = 0 15 while m > 0 { d[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 16 var j: i64 = k 17 while j > 0 { sys_write(1, d + (j - 1), 1); j = j - 1 } 18 sys_munmap(d, 24) 19 return 0 20} 21// translate src (dir) and print " <label>: <out>"; return 1 if out==expect (byte-exact) else 0 22func s_try(eng: *i64, label: *u8, src: *u8, dir: i64, expect: *u8) -> i64 { 23 let out: *u8 = sys_mmap(K_MAGIC_1024) 24 let on: i64 = xl_translate(eng, src, s_slen(src), dir, out, K_MAGIC_1024) 25 s_puts(" "); s_puts(label); s_puts(" '"); sys_write(1, src, s_slen(src)); s_puts("' -> '") 26 sys_write(1, out, on); s_puts("'") 27 let el: i64 = s_slen(expect) 28 var ok: i64 = 1 29 if on != el { ok = 0 } 30 if ok == 1 { var i: i64 = 0; while i < el { if (out[i] as i64) != (expect[i] as i64) { ok = 0 } i = i + 1 } } 31 if ok == 1 { s_puts(" [GREEN]\n") } else { s_puts(" [RED expected '"); sys_write(1, expect, el); s_puts("']\n") } 32 sys_munmap(out, K_MAGIC_1024) 33 return ok 34} 35func main() -> i64 { 36 s_puts("=== nx_xlate_mt_smoke: data-driven RU<->EN engine ===\n") 37 let lex: *u8 = "w\tпривет\thello\t9\nw\tдруг\tfriend\t8\np\tкак дела\thow are you\t9\nw\tлюбовь\tlove\t7\nw\tспасибо\tthanks\t8\n" as *u8 38 let morph: *u8 = "ами\tnoun instr pl\nа\tnoun gen sg\nу\tnoun acc sg\nи\tnoun pl\n" as *u8 39 let eng: *i64 = sys_mmap(256) as *i64 40 let ne: i64 = xl_build(eng, lex, s_slen(lex), morph, s_slen(morph)) 41 s_puts("entries="); s_num(ne); s_puts(" suffixes="); s_num(eng[XLE_NSUF]); s_puts("\n") 42 var pass: i64 = 0 43 var fail: i64 = 0 44 // (1) capital-folding: "Привет" -> hello 45 if s_try(eng, "RU->EN casefold", "Привет" as *u8, 1, "hello" as *u8) == 1 { pass = pass + 1 } else { fail = fail + 1 } 46 // (2) phrase longest-match: "как дела" -> how are you 47 if s_try(eng, "RU->EN phrase ", "как дела" as *u8, 1, "how are you" as *u8) == 1 { pass = pass + 1 } else { fail = fail + 1 } 48 // (3) morphology: "друга" (друг+а) -> friend 49 if s_try(eng, "RU->EN morph ", "друга" as *u8, 1, "friend" as *u8) == 1 { pass = pass + 1 } else { fail = fail + 1 } 50 // (4) EN->RU: "hello friend" -> привет друг 51 if s_try(eng, "EN->RU words ", "hello friend" as *u8, 0, "привет друг" as *u8) == 1 { pass = pass + 1 } else { fail = fail + 1 } 52 // (5) unknown passthrough: "hello zzz" -> привет zzz 53 if s_try(eng, "EN->RU unknown ", "hello zzz" as *u8, 0, "привет zzz" as *u8) == 1 { pass = pass + 1 } else { fail = fail + 1 } 54 s_puts("SMOKE pass="); s_num(pass); s_puts(" fail="); s_num(fail) 55 if fail == 0 { s_puts(" verdict=GREEN\n"); sys_exit(0); return 0 } 56 s_puts(" verdict=RED\n"); sys_exit(1); return 1 57}