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}