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}