code wiki / _hdl_build / nx_lex_kat.nx
nx_lex_kat.nx source
↩ module page · 43 lines · 2894 B
1// nx_lex_kat.nx -- EXHAUSTIVE KAT for nx_lex (lexer whitespace + identifier classifiers). HONESTY [W]
2// weak point (reach=180, 12 children). All 256 bytes vs inlined ground truth. license_tier: ORIGINAL expect_exit:0
3import "nx_syscalls.nx"
4import "nx_lex.nx"
5
6func w(s: *u8) -> i64 { var k:i64=0; while s[k]!=(0 as u8){k=k+1} sys_write(1,s,k); return 0 }
7func n(v: i64) -> i64 { let b:*u8=sys_mmap(24); var m:i64=v; if m<0{sys_write(1,"-" as *u8,1);m=0-m} let t:*u8=sys_mmap(24); var k:i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var j:i64=0; while j<k{b[j]=t[k-1-j];j=j+1} sys_write(1,b,k); return 0 }
8
9func gt_ws(c: i64) -> i64 { if c==32 { return 1 } if c==9 { return 1 } if c==10 { return 1 } if c==13 { return 1 } return 0 }
10func gt_iws(c: i64) -> i64 { if c==32 { return 1 } if c==9 { return 1 } return 0 }
11func gt_idstart(c: i64) -> i64 { if c>=97 { if c<=122 { return 1 } } if c>=65 { if c<=90 { return 1 } } if c==95 { return 1 } return 0 }
12func gt_idmath(c: i64) -> i64 { if gt_idstart(c)==1 { return 1 } if c>=48 { if c<=57 { return 1 } } if c==39 { return 1 } return 0 }
13func gt_idqual(c: i64) -> i64 { if gt_idmath(c)==1 { return 1 } if c==46 { return 1 } return 0 }
14
15func main() -> i64 {
16 var pass: i64 = 0
17 var m1: i64=0; var m2: i64=0; var m3: i64=0; var m4: i64=0
18 var c: i64 = 0
19 while c < 256 {
20 if nx_lex_is_ws(c) != gt_ws(c) { m1 = m1 + 1 }
21 if nx_lex_is_intraline_ws(c) != gt_iws(c) { m2 = m2 + 1 }
22 if nx_lex_is_id_cont_math(c) != gt_idmath(c) { m3 = m3 + 1 }
23 if nx_lex_is_id_cont_qualified(c) != gt_idqual(c) { m4 = m4 + 1 }
24 c = c + 1
25 }
26 if m1==0 { pass=pass+1; w("T1 is_ws (256) PASS\n" as *u8) } else { w("T1 FAIL m=" as *u8); n(m1); w("\n" as *u8) }
27 if m2==0 { pass=pass+1; w("T2 is_intraline_ws PASS\n" as *u8) } else { w("T2 FAIL m=" as *u8); n(m2); w("\n" as *u8) }
28 if m3==0 { pass=pass+1; w("T3 is_id_cont_math PASS\n" as *u8) } else { w("T3 FAIL m=" as *u8); n(m3); w("\n" as *u8) }
29 if m4==0 { pass=pass+1; w("T4 is_id_cont_qualified PASS\n" as *u8) } else { w("T4 FAIL m=" as *u8); n(m4); w("\n" as *u8) }
30 // T5: id_cont_qualified is a superset of id_cont_math (only adds '.')
31 var ok5: i64 = 1
32 c = 0; while c < 256 { if nx_lex_is_id_cont_math(c)==1 { if nx_lex_is_id_cont_qualified(c)!=1 { ok5=0 } } c=c+1 }
33 if ok5==1 { pass=pass+1; w("T5 qualified superset-of-math PASS\n" as *u8) } else { w("T5 FAIL\n" as *u8) }
34 // T6: ws is a superset of intraline_ws
35 var ok6: i64 = 1
36 c = 0; while c < 256 { if nx_lex_is_intraline_ws(c)==1 { if nx_lex_is_ws(c)!=1 { ok6=0 } } c=c+1 }
37 if ok6==1 { pass=pass+1; w("T6 ws superset-of-intraline PASS\n" as *u8) } else { w("T6 FAIL\n" as *u8) }
38
39 w("NX-LEX-KAT " as *u8); n(pass); w("/6" as *u8)
40 if pass == 6 { w(" GREEN\n" as *u8); return 0 }
41 w(" RED\n" as *u8)
42 return 1
43}