code wiki / _hdl_build / nx_doc_kwscan_gate.nx

nx_doc_kwscan_gate.nx source

↩ module page · 66 lines · 4105 B

1import "nx_gate_gn.nx" 2// nx_doc_kwscan_gate.nx -- liar-kill gate for the Doctor's reserved-keyword diagnosis. MUST-DETECT: a reserved 3// keyword used as a parameter name and as a declared binding name, with the right keyword + byte offset. MUST-NOT- 4// FALSE-POSITIVE: a clean source, a source using common keywords correctly (while/return), and -- the honesty KAT 5// -- `let type` (type is NOT a lexer keyword, so it is a valid identifier and must NOT be flagged). expect_exit: 0 6import "nx_syscalls.nx" 7import "nx_doc_kwscan.nx" 8import "nx_gate_verdict.nx" 9 10func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 11func slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n } 12func seq(a: *u8, b: *u8) -> i64 { var i: i64=0; while a[i]!=(0 as u8){ if a[i]!=b[i]{return 0} i=i+1 } if b[i]!=(0 as u8){return 0} return 1 } 13 14func main() -> i64 { 15 gp("=== nx_doc_kwscan_gate: Doctor reserved-keyword diagnosis (detect + pinpoint + suggest; no blind rewrite) ===\n" as *u8) 16 let kw: *u8 = sys_mmap(64) 17 let pos: *i64 = sys_mmap(16) as *i64 18 var pass: i64 = 0; var fail: i64 = 0 19 20 // KAT1 reserved kw as a PARAMETER name: func q(match: i64) ... -> hit, kw=match, offset of 'match' = 7 21 let s1: *u8 = "func q(match: i64) -> i64 { return match + 1 }" as *u8 22 pos[0] = 0-9 23 let r1: i64 = kws_scan(s1, slen(s1), kw, pos) 24 if r1 == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat1-not-detected\n" as *u8) } 25 if seq(kw, "match" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat1-wrong-kw=" as *u8); gp(kw); gp("\n" as *u8) } 26 if pos[0] == 7 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat1-wrong-pos=" as *u8); gn(pos[0]); gp("\n" as *u8) } 27 28 // KAT2 reserved kw as a DECLARED name: let match: i64 = 0 -> hit, kw=match, offset = 4 29 let s2: *u8 = "let match: i64 = 0" as *u8 30 pos[0] = 0-9 31 let r2: i64 = kws_scan(s2, slen(s2), kw, pos) 32 if r2 == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat2-not-detected\n" as *u8) } 33 if seq(kw, "match" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat2-wrong-kw\n" as *u8) } 34 if pos[0] == 4 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat2-wrong-pos=" as *u8); gn(pos[0]); gp("\n" as *u8) } 35 36 // KAT3 clean source -> no hit 37 let s3: *u8 = "func ok(x: i64) -> i64 { let y: i64 = 5; return y }" as *u8 38 let r3: i64 = kws_scan(s3, slen(s3), kw, pos) 39 if r3 == 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat3-false-positive\n" as *u8) } 40 41 // KAT4 common keywords used CORRECTLY (while/return) -> no false positive 42 let s4: *u8 = "func u(x: i64) -> i64 { while x > 0 { x = x - 1 } return x }" as *u8 43 let r4: i64 = kws_scan(s4, slen(s4), kw, pos) 44 if r4 == 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat4-keyword-use-flagged\n" as *u8) } 45 46 // KAT5 HONESTY: `type` is NOT a lexer keyword -> a valid identifier -> must NOT be flagged 47 let s5: *u8 = "let type: i64 = 0" as *u8 48 let r5: i64 = kws_scan(s5, slen(s5), kw, pos) 49 if r5 == 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat5-type-wrongly-flagged (type is not reserved)\n" as *u8) } 50 51 // KAT6 suggested rename: match -> match_ 52 let sug: *u8 = sys_mmap(64) 53 kws_suggest("match" as *u8, sug) 54 if seq(sug, "match_" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat6-bad-suggest=" as *u8); gp(sug); gp("\n" as *u8) } 55 56 gp("DOC-KWSCAN-GATE pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail) 57 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check 58 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled 59 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify. 60 let ctr__dry: *i64 = gv_ctr() 61 ctr__dry[0] = pass 62 ctr__dry[1] = pass + fail 63 let rc__dry: i64 = gv_verdict("DOC-KWSCAN-GATE" as *u8, ctr__dry, "reserved-kw-as-identifier detected+pinpointed; clean/keyword-use/`type` not flagged; rename suggested)" as *u8) 64 sys_exit(rc__dry) 65 return rc__dry 66}