@furongjun1999/dsh-memory 0.4.11 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (504) hide show
  1. package/README.md +16 -16
  2. package/codebuddy/CODEBUDDY.md +11 -3
  3. package/codebuddy/README.md +92 -90
  4. package/codebuddy/mcp.json +27 -27
  5. package/docs/GBrain/345/217/257/345/200/237/351/211/264/347/202/271_/347/201/265/346/236/242/350/220/275/347/202/271/344/272/244/346/216/245_20260919.md +169 -169
  6. package/docs/Pi/345/217/257/345/255/246/344/271/240/344/274/230/347/202/271_/347/201/265/346/236/242/345/244/247/350/204/221/346/224/271/350/277/233/344/272/244/346/216/245_20260915.md +144 -144
  7. package/docs/README.md +142 -111
  8. package/docs/discipline/harnesses.yaml +244 -226
  9. package/docs/discipline/templates/full.md.tmpl +61 -61
  10. package/docs/discipline/templates/rules.mdc.tmpl +68 -0
  11. package/docs/discipline/templates/skill.md.tmpl +23 -23
  12. package/docs/eval/AGI/344/270/203/347/273/264/350/257/204/345/210/206/346/212/245/345/221/212_md_cg_v1.0.md +299 -299
  13. package/docs/eval/AGI/344/270/203/347/273/264/350/257/204/345/210/206/346/212/245/345/221/212_md_cg_v2.0.md +239 -239
  14. package/docs/eval//345/256/236/351/252/214/346/226/271/346/241/210_/345/255/246/344/271/240/351/227/255/347/216/257AB/344/270/216/346/250/252/350/257/204_v1.0.md +174 -174
  15. package/docs/eval//346/250/252/350/257/204_/345/205/255/345/256/266100/351/242/230/344/270/255/350/213/261/345/217/214/346/237/245_v1.0.md +223 -223
  16. package/docs/{mdcg → hive}//344/273/244/347/211/214/344/270/216/350/247/222/350/211/262/346/235/203/350/201/214/345/210/206/347/246/273_v0.1.md +165 -160
  17. package/docs/hive//344/273/244/347/211/214/350/257/255/344/271/211/344/277/256/346/255/243_/344/273/262/350/243/201/344/275/215_v0.1.md +76 -0
  18. package/docs/{mdcg → hive}//345/255/220/344/273/243/347/220/206/351/205/215/347/275/256/346/240/207/345/207/206_v0.5.md +236 -236
  19. package/docs/hive//346/243/200/347/264/242/346/224/266/346/225/233/345/256/236/346/265/213/344/270/216S1b/350/256/276/350/256/241_v0.1.md +43 -43
  20. package/docs/hive//346/243/200/347/264/242/347/256/227/346/263/225/345/217/243/345/276/204/345/257/271/347/205/247_v0.1.md +85 -0
  21. package/docs/hive//346/243/200/347/264/242/350/267/257/345/276/204/344/270/216/350/256/244/347/237/245/347/273/223/346/236/204/345/245/221/347/272/246_v0.1.md +102 -102
  22. package/docs/hive//350/234/202/345/267/242M6_ingest/345/256/236/346/226/275/350/256/241/345/210/222_v0.1.md +47 -0
  23. package/docs/hive//350/234/202/345/267/242/345/217/214/345/256/236/344/276/213/344/272/222/351/252/214_/350/256/276/350/256/241/345/256/232/347/250/277.md +503 -503
  24. package/docs/hive//350/234/202/345/267/242/345/267/245/344/275/234/350/256/260/345/277/206_/351/241/271/347/233/256/350/256/241/345/210/222.md +85 -85
  25. package/docs/hive//350/234/202/345/267/242/350/256/276/350/256/241_/347/220/206/350/256/272/345/257/271/351/275/220_v0.1.md +191 -0
  26. package/docs/hive//350/234/202/345/267/242/350/277/255/344/273/243_/345/256/217/350/247/202/344/270/216/347/276/244/344/275/223/350/260/203/345/272/246_v0.1.md +90 -0
  27. package/docs/mdcg/D_meta_/345/267/245/347/250/213/345/214/226/346/226/271/346/241/210_v0.2.md +216 -216
  28. package/docs/mdcg/README/350/257/246/347/273/206/347/211/210_v0.4.10.md +646 -646
  29. package/docs/mdcg/lingshu_tutorial.html +14449 -14449
  30. package/docs/mdcg/release_v0.4.11.md +49 -0
  31. package/docs/mdcg/release_v0.4.5.md +55 -55
  32. package/docs/mdcg/tool_table_v0.3.0.md +117 -117
  33. package/docs/mdcg//345/205/250/345/272/223/344/273/243/347/240/201/350/257/204/345/256/241/344/270/216/346/235/241/344/273/266/345/214/226/346/263/250/351/207/212_/350/256/241/345/210/222_v0.1.md +600 -600
  34. package/docs/mdcg//345/212/237/350/203/275/350/260/203/347/224/250/346/230/240/345/260/204/350/241/250_v0.1.md +40 -40
  35. package/docs/mdcg//345/215/225/345/205/203/350/207/252/346/210/221/351/224/232/347/202/271_/347/263/273/347/273/237/346/217/220/347/244/272/350/257/215/346/240/207/345/207/206_v0.3.md +275 -275
  36. package/docs/mdcg//345/217/221/345/270/203/351/227/250/347/246/201/351/223/276_v0.1.md +54 -0
  37. package/docs/mdcg//346/272/220/347/240/201/347/272/247/346/236/266/346/236/204/345/256/241/350/256/241_GPT/346/211/271/350/257/204/345/257/271/347/205/247_v1.0.md +130 -130
  38. package/docs/mdcg//347/201/265/346/236/24282/345/267/245/345/205/267_/345/212/237/350/203/275/346/225/264/347/220/206/344/270/216/350/277/201/347/247/273/346/230/240/345/260/204_v0.1.md +278 -278
  39. package/docs/mdcg//347/201/265/346/236/242/350/256/260/345/277/206/345/212/250/350/257/215/345/215/217/350/256/256_v1.0-draft.md +172 -172
  40. package/docs/mdcg//347/274/272/345/217/243/345/215/225_P0/346/224/266/345/217/243_v0.1.md +270 -270
  41. package/docs/mdcg//350/256/244/347/237/245/345/233/276_G4-G8/347/274/272/345/217/243/350/243/201/345/256/232/345/215/225_v0.1.md +491 -491
  42. package/docs/mdcg//350/256/244/347/237/245/345/233/276_/346/235/241/344/273/266/347/251/272/351/227/264/345/220/210/346/210/220/344/270/216/347/224/237/346/225/210/346/235/241/344/273/266/345/217/243/345/276/204_v0.1.md +340 -340
  43. package/docs/mdcg//350/256/244/347/237/245/345/233/276_/347/264/242/345/274/225/344/270/216/345/267/245/347/250/213/350/247/204/350/214/203/345/214/226_/350/256/241/345/210/222_v0.1.md +588 -588
  44. package/docs/plans/GridWorld/346/234/200/345/260/217/351/227/255/347/216/257/350/247/204/346/240/274_v0.1.md +176 -176
  45. package/docs/plans//345/221/275/345/220/215/346/262/273/347/220/206_/351/241/271/347/233/256/350/256/241/345/210/222.md +81 -81
  46. package/docs/swarm//350/234/202/347/276/244/344/272/222/350/201/224_v0.1.md +704 -704
  47. package/docs/swarm//350/234/202/347/276/244/345/220/214/351/224/231/346/243/200/346/265/213/345/256/236/351/252/214/345/215/217/350/256/256_v0.1.md +242 -242
  48. package/docs/theory//345/215/225/347/272/277/347/250/213/344/270/216/346/263/250/346/204/217/345/212/233/351/233/206/344/270/255_/346/227/240/344/272/211/350/256/256/347/220/206/350/256/272/346/226/207/346/241/243_v1.0.md +129 -129
  49. package/docs/theory//345/271/266/345/217/221/345/277/205/347/204/266/346/200/247/347/220/206/350/256/272_v0.2.md +134 -134
  50. package/docs/theory//346/231/272/350/203/275/350/256/2723.4.md +5260 -5260
  51. package/docs/theory//346/246/202/345/277/265/345/210/206/345/261/202/345/257/271/351/275/220/350/241/250_v0.1.md +145 -145
  52. package/docs/theory//347/220/206/350/256/272_/346/234/272/345/210/266_/344/273/243/347/240/201_/345/256/236/351/252/214_/347/274/272/345/217/243/347/237/251/351/230/265_v0.1.md +144 -144
  53. package/docs/theory//347/220/206/350/256/272/344/273/223/346/213/206/345/210/206/344/270/216/347/231/275/347/256/261/347/237/245/350/257/206/345/272/223/345/206/205/350/277/201_v0.1.md +198 -198
  54. package/docs/theory//350/256/244/347/237/245/344/273/243/347/220/206/344/270/216/346/224/266/346/225/233/347/273/223/346/236/204_/346/235/241/344/273/266/350/256/272/351/207/215/346/236/204_v0.1.md +221 -221
  55. package/docs/world_model//344/270/226/347/225/214/346/250/241/345/236/213_/347/245/236/347/273/217/347/275/221/347/273/234/345/272/225/345/261/202/346/236/266/346/236/204_v1.0.md +237 -237
  56. package/docs//345/217/221/345/270/203/344/273/266/345/233/236/346/272/257/350/257/264/346/230/216_v0.1.md +82 -82
  57. package/docs//345/267/245/344/275/234/347/272/252/345/276/213_/350/256/244/347/237/245/345/233/276/346/235/241/347/233/256_v1.1.json +28 -2
  58. package/dsh/README.md +82 -82
  59. package/dsh/cordis.yml.example +139 -139
  60. package/dsh/update-lingshu.bat +11 -11
  61. package/lib/hooks.js +36 -2
  62. package/lib/lib/roleplay_web.js +427 -427
  63. package/md_cg/__init__.py +7 -7
  64. package/md_cg/audit.py +368 -368
  65. package/md_cg/autonomy.py +287 -287
  66. package/md_cg/backfill.py +1327 -1327
  67. package/md_cg/backfill_bigdomain.py +34 -34
  68. package/md_cg/bench6_arms.py +410 -410
  69. package/md_cg/bench6_common.py +230 -230
  70. package/md_cg/bench6_competitors.py +212 -212
  71. package/md_cg/bench_axis_domain.py +257 -257
  72. package/md_cg/bench_blind_comp.py +308 -308
  73. package/md_cg/bench_en_atoms_public.py +230 -230
  74. package/md_cg/bench_governance.py +348 -348
  75. package/md_cg/bench_lme_zh.py +410 -410
  76. package/md_cg/bench_locomo.py +121 -121
  77. package/md_cg/bench_locomo_zh.py +450 -450
  78. package/md_cg/bench_locomo_zh_public.py +147 -147
  79. package/md_cg/bench_longmem.py +112 -112
  80. package/md_cg/bench_membench.py +632 -632
  81. package/md_cg/bench_p0.py +149 -149
  82. package/md_cg/bench_progressive.py +287 -287
  83. package/md_cg/bench_role_views.py +238 -238
  84. package/md_cg/bench_task_ab.py +243 -243
  85. package/md_cg/bench_task_ab_llm.py +408 -408
  86. package/md_cg/bench_unified_en.py +204 -204
  87. package/md_cg/bench_zh_mad.py +601 -601
  88. package/md_cg/blindspot_tickets.py +123 -123
  89. package/md_cg/branches.py +285 -285
  90. package/md_cg/build_postings.py +73 -73
  91. package/md_cg/ccgc.py +1005 -948
  92. package/md_cg/census.py +132 -132
  93. package/md_cg/chain.py +300 -300
  94. package/md_cg/codeindex.py +531 -531
  95. package/md_cg/coldverify.py +292 -292
  96. package/md_cg/comment_gate.py +337 -337
  97. package/md_cg/cond_compose.py +190 -190
  98. package/md_cg/cond_facts.py +154 -154
  99. package/md_cg/cond_template.json +106 -106
  100. package/md_cg/condition_anchor.py +142 -142
  101. package/md_cg/conformance.py +726 -726
  102. package/md_cg/consistency.py +717 -717
  103. package/md_cg/consolidate.py +1536 -1439
  104. package/md_cg/corpus.py +110 -110
  105. package/md_cg/crosscheck.py +1097 -1097
  106. package/md_cg/crypto.py +437 -437
  107. package/md_cg/d_meta.py +310 -310
  108. package/md_cg/datapath.py +334 -334
  109. package/md_cg/docindex.py +473 -473
  110. package/md_cg/eval_common.py +575 -575
  111. package/md_cg/evidence.py +580 -580
  112. package/md_cg/evolution.py +477 -477
  113. package/md_cg/export.py +220 -220
  114. package/md_cg/forgetting.py +581 -581
  115. package/md_cg/fsutil.py +329 -329
  116. package/md_cg/hotcache.py +238 -214
  117. package/md_cg/hyperedge.py +251 -251
  118. package/md_cg/identity.py +390 -390
  119. package/md_cg/insight.py +500 -500
  120. package/md_cg/interop.py +199 -0
  121. package/md_cg/lexicon/build_cedict_en_zh.py +329 -329
  122. package/md_cg/lexicon/build_standard_en.py +171 -171
  123. package/md_cg/lexicon/expand_en_zh.py +211 -211
  124. package/md_cg/lifecycle.py +272 -272
  125. package/md_cg/linkref.py +280 -280
  126. package/md_cg/links.py +622 -622
  127. package/md_cg/mcp_server.py +129 -32
  128. package/md_cg/md_whitebox.py +345 -345
  129. package/md_cg/mdcg.py +176 -117
  130. package/md_cg/mdcos.py +79 -13
  131. package/md_cg/metacognition.py +591 -591
  132. package/md_cg/migrate.py +119 -119
  133. package/md_cg/migrate_aeis.py +221 -221
  134. package/md_cg/migrate_roleplay.py +293 -293
  135. package/md_cg/migrate_wisdom_graph.py +360 -360
  136. package/md_cg/mreview/__init__.py +25 -25
  137. package/md_cg/mreview/__main__.py +110 -110
  138. package/md_cg/mreview/bundle.py +178 -178
  139. package/md_cg/mreview/candidates.py +262 -262
  140. package/md_cg/mreview/govern.py +693 -693
  141. package/md_cg/mreview/locate.py +939 -939
  142. package/md_cg/mreview/pipeline.py +728 -728
  143. package/md_cg/mreview/rules/duplication.json +21 -21
  144. package/md_cg/mreview/rules/field_coverage.json +54 -54
  145. package/md_cg/mreview/rules/source_license.json +21 -21
  146. package/md_cg/mreview/rules/template_flow.json +21 -21
  147. package/md_cg/mreview/ruleset.py +252 -252
  148. package/md_cg/nodefile.py +575 -575
  149. package/md_cg/pooling.py +484 -472
  150. package/md_cg/postings.py +298 -298
  151. package/md_cg/predict.py +1100 -1100
  152. package/md_cg/progressive.py +123 -123
  153. package/md_cg/protect.py +272 -272
  154. package/md_cg/protocol/md_cg_gate.proto +33 -33
  155. package/md_cg/protocol.py +372 -372
  156. package/md_cg/provenance.py +582 -582
  157. package/md_cg/reach.py +453 -453
  158. package/md_cg/readcache.py +85 -0
  159. package/md_cg/refindex.py +833 -833
  160. package/md_cg/refine.py +604 -604
  161. package/md_cg/roleviews.py +89 -89
  162. package/md_cg/routing.py +365 -365
  163. package/md_cg/scrub.py +852 -852
  164. package/md_cg/security.py +274 -274
  165. package/md_cg/self_state.py +1029 -1029
  166. package/md_cg/selfreport.py +151 -151
  167. package/md_cg/semantic/__init__.py +10 -10
  168. package/md_cg/semantic/canonical.py +122 -122
  169. package/md_cg/semantic/en_normalizer.py +364 -364
  170. package/md_cg/semantic/en_zh_map.json +28694 -0
  171. package/md_cg/semantic/export_en_zh_map.py +64 -0
  172. package/md_cg/semantic/unify.py +45 -0
  173. package/md_cg/semantic/zh_en_atoms.py +139 -139
  174. package/md_cg/signer.py +562 -562
  175. package/md_cg/sources.py +815 -582
  176. package/md_cg/statushdr.py +179 -179
  177. package/md_cg/stg.py +48 -37
  178. package/md_cg/subgraph.py +729 -729
  179. package/md_cg/sustain.py +1138 -1138
  180. package/md_cg/tasks.py +470 -470
  181. package/md_cg/test_action_derive.py +203 -203
  182. package/md_cg/test_audit_rotate.py +270 -270
  183. package/md_cg/test_autonomy.py +143 -143
  184. package/md_cg/test_bench_governance.py +102 -102
  185. package/md_cg/test_blindspot_tickets.py +166 -166
  186. package/md_cg/test_branches.py +249 -249
  187. package/md_cg/test_ccg_perturb.py +184 -184
  188. package/md_cg/test_ccgc.py +433 -433
  189. package/md_cg/test_census_prune.py +81 -81
  190. package/md_cg/test_cond_compose_anchors.py +76 -76
  191. package/md_cg/test_cond_match.py +165 -165
  192. package/md_cg/test_condition_anchor.py +81 -81
  193. package/md_cg/test_d_meta.py +412 -412
  194. package/md_cg/test_datapath_root.py +199 -199
  195. package/md_cg/test_en_pipeline.py +166 -166
  196. package/md_cg/test_gain_gate.py +212 -212
  197. package/md_cg/test_health_scale.py +173 -173
  198. package/md_cg/test_hive_ingest.py +285 -0
  199. package/md_cg/test_hot_cold.py +215 -215
  200. package/md_cg/test_hyperedge.py +245 -245
  201. package/md_cg/test_i26_empty_first_write.py +116 -0
  202. package/md_cg/test_i27_e041_identity.py +128 -0
  203. package/md_cg/test_i28_hotcache_prodpath.py +122 -0
  204. package/md_cg/test_identity_attribution.py +147 -147
  205. package/md_cg/test_index_durability.py +224 -224
  206. package/md_cg/test_interop.py +93 -0
  207. package/md_cg/test_lifecycle.py +309 -309
  208. package/md_cg/test_linkref.py +306 -306
  209. package/md_cg/test_lock.py +43 -43
  210. package/md_cg/test_md_access_parity.py +255 -255
  211. package/md_cg/test_md_writepath.py +345 -345
  212. package/md_cg/test_mdstore_search_parity.py +160 -0
  213. package/md_cg/test_mr_m2.py +587 -587
  214. package/md_cg/test_mr_m3.py +710 -710
  215. package/md_cg/test_mr_m4.py +485 -485
  216. package/md_cg/test_p0.py +250 -250
  217. package/md_cg/test_p1.py +316 -316
  218. package/md_cg/test_p10_identity.py +173 -173
  219. package/md_cg/test_p11_consistency.py +233 -233
  220. package/md_cg/test_p12_metacognition.py +212 -212
  221. package/md_cg/test_p13_encryption.py +241 -241
  222. package/md_cg/test_p14_sustain.py +249 -249
  223. package/md_cg/test_p15_scrub.py +280 -280
  224. package/md_cg/test_p16_self_state.py +301 -301
  225. package/md_cg/test_p17_predict.py +354 -354
  226. package/md_cg/test_p18_whitebox.py +171 -171
  227. package/md_cg/test_p19_migrate_roleplay.py +149 -149
  228. package/md_cg/test_p20_evolution.py +315 -315
  229. package/md_cg/test_p21_tokens.py +293 -270
  230. package/md_cg/test_p22_theory.py +175 -175
  231. package/md_cg/test_p23_links.py +311 -311
  232. package/md_cg/test_p24_evidence.py +227 -227
  233. package/md_cg/test_p25_weights.py +156 -156
  234. package/md_cg/test_p26_refindex.py +416 -416
  235. package/md_cg/test_p27_docindex.py +765 -765
  236. package/md_cg/test_p28_refcheck.py +305 -305
  237. package/md_cg/test_p29_session_ingest_export.py +354 -333
  238. package/md_cg/test_p3.py +11 -2
  239. package/md_cg/test_p30_maintain.py +330 -330
  240. package/md_cg/test_p31_insight.py +534 -534
  241. package/md_cg/test_p32_backfill.py +298 -298
  242. package/md_cg/test_p33_ccg_wiring.py +293 -293
  243. package/md_cg/test_p34_crosscheck.py +331 -331
  244. package/md_cg/test_p35_conditioned_claim.py +252 -252
  245. package/md_cg/test_p36_kp_align.py +230 -230
  246. package/md_cg/test_p37_condition_space.py +248 -248
  247. package/md_cg/test_p38_concurrent_flush.py +102 -0
  248. package/md_cg/test_p38_contextualize.py +273 -273
  249. package/md_cg/test_p39_verify_flow.py +113 -0
  250. package/md_cg/test_p39_vision_evidence.py +369 -369
  251. package/md_cg/test_p40_refine_worklist.py +241 -241
  252. package/md_cg/test_p41_evolve_patrol.py +224 -224
  253. package/md_cg/test_p42_provenance.py +269 -269
  254. package/md_cg/test_p43_pooling.py +412 -398
  255. package/md_cg/test_p44_md_whitebox.py +231 -231
  256. package/md_cg/test_p45_session_identity.py +219 -219
  257. package/md_cg/test_p46_unit_scope.py +272 -272
  258. package/md_cg/test_p47_session_view.py +281 -0
  259. package/md_cg/test_p4_fuzzy.py +223 -223
  260. package/md_cg/test_p5_semantic.py +226 -226
  261. package/md_cg/test_p6_consolidate.py +440 -387
  262. package/md_cg/test_p7_goals_recent.py +202 -202
  263. package/md_cg/test_p8_subgraph_chain.py +200 -200
  264. package/md_cg/test_p9_forget_protect.py +231 -231
  265. package/md_cg/test_predict_beta.py +135 -135
  266. package/md_cg/test_preflight_failclosed.py +100 -100
  267. package/md_cg/test_progressive.py +146 -146
  268. package/md_cg/test_protocol.py +243 -243
  269. package/md_cg/test_reach.py +378 -378
  270. package/md_cg/test_reach_keys.py +201 -201
  271. package/md_cg/test_read_clip.py +141 -141
  272. package/md_cg/test_readcache_prodpath.py +155 -0
  273. package/md_cg/test_retr_gates_prodpath.py +140 -0
  274. package/md_cg/test_retr_s1.py +340 -340
  275. package/md_cg/test_retr_s1b.py +209 -209
  276. package/md_cg/test_retr_s3.py +194 -194
  277. package/md_cg/test_retr_s4.py +163 -163
  278. package/md_cg/test_retr_s5.py +200 -200
  279. package/md_cg/test_retr_s6.py +157 -157
  280. package/md_cg/test_retr_s7.py +384 -384
  281. package/md_cg/test_retr_s8_time.py +369 -316
  282. package/md_cg/test_retr_s9_edges.py +286 -286
  283. package/md_cg/test_retr_s9_entity_ctx.py +175 -175
  284. package/md_cg/test_review_conformance.py +367 -367
  285. package/md_cg/test_role_views.py +354 -354
  286. package/md_cg/test_sem_noise.py +242 -242
  287. package/md_cg/test_semantic_canonical.py +241 -241
  288. package/md_cg/test_subproc_encoding.py +192 -192
  289. package/md_cg/test_sustain_mutual.py +153 -153
  290. package/md_cg/test_tasks.py +409 -409
  291. package/md_cg/test_tool_face.py +189 -189
  292. package/md_cg/test_transfer.py +180 -180
  293. package/md_cg/test_trust.py +361 -361
  294. package/md_cg/test_twophase.py +286 -286
  295. package/md_cg/test_v14_fixes.py +397 -397
  296. package/md_cg/test_validity_filter.py +280 -280
  297. package/md_cg/test_verify_answer.py +138 -138
  298. package/md_cg/test_wisdom_md_store.py +292 -292
  299. package/md_cg/test_writelimit.py +197 -197
  300. package/md_cg/test_writepipe.py +214 -214
  301. package/md_cg/theory.py +273 -273
  302. package/md_cg/tokens.py +677 -663
  303. package/md_cg/tool_face.py +260 -260
  304. package/md_cg/trust.py +986 -950
  305. package/md_cg/twophase.py +231 -231
  306. package/md_cg/units.py +667 -667
  307. package/md_cg/vision_evidence.py +666 -666
  308. package/md_cg/weights.py +624 -624
  309. package/md_cg/whitebox.py +527 -527
  310. package/md_cg/whitebox_kb/__init__.py +37 -37
  311. package/md_cg/whitebox_kb/aeis_core/__init__.py +42 -42
  312. package/md_cg/whitebox_kb/aeis_core/semantic.py +280 -280
  313. package/md_cg/whitebox_kb/aeis_core/textutil.py +13 -13
  314. package/md_cg/whitebox_kb/engine.py +310 -310
  315. package/md_cg/whitebox_kb/seed_knowledge//346/231/272/350/203/275/350/256/2723.4.md +5260 -5260
  316. package/md_cg/whitebox_kb/wisdom/browser_units.py +2631 -2631
  317. package/md_cg/whitebox_kb/wisdom/causal_discover.py +432 -432
  318. package/md_cg/whitebox_kb/wisdom/chat_engine.py +1506 -1506
  319. package/md_cg/whitebox_kb/wisdom/code_solidified.json +6195 -6195
  320. package/md_cg/whitebox_kb/wisdom/compiler_code_units.py +3033 -3033
  321. package/md_cg/whitebox_kb/wisdom/condition_algebra.py +112 -112
  322. package/md_cg/whitebox_kb/wisdom/condition_frame.py +315 -315
  323. package/md_cg/whitebox_kb/wisdom/condition_kb.py +108 -108
  324. package/md_cg/whitebox_kb/wisdom/conflict_map.json +4445 -4445
  325. package/md_cg/whitebox_kb/wisdom/core/lexer.py +512 -512
  326. package/md_cg/whitebox_kb/wisdom/core/name_checker.py +1023 -1023
  327. package/md_cg/whitebox_kb/wisdom/cspmn.py +258 -258
  328. package/md_cg/whitebox_kb/wisdom/csre.py +264 -264
  329. package/md_cg/whitebox_kb/wisdom/danmaku_audit.py +252 -252
  330. package/md_cg/whitebox_kb/wisdom/distilled_condition_units.json +6417 -6417
  331. package/md_cg/whitebox_kb/wisdom/docs/WB-EVAL-20260902b.json +1950 -1950
  332. package/md_cg/whitebox_kb/wisdom/docs/WB-EVAL-20260902c.json +1296 -1296
  333. package/md_cg/whitebox_kb/wisdom/docs/whitebox_capability_graph_demo.json +59 -59
  334. package/md_cg/whitebox_kb/wisdom/graph_db_units.py +3089 -3089
  335. package/md_cg/whitebox_kb/wisdom/knowledge_points.py +318 -318
  336. package/md_cg/whitebox_kb/wisdom/md_access.py +470 -470
  337. package/md_cg/whitebox_kb/wisdom/md_store.py +276 -251
  338. package/md_cg/whitebox_kb/wisdom/migrate_wisdom.py +476 -476
  339. package/md_cg/whitebox_kb/wisdom/navigate.py +248 -248
  340. package/md_cg/whitebox_kb/wisdom/neural_retrieve.py +224 -224
  341. package/md_cg/whitebox_kb/wisdom/os_units.py +2735 -2735
  342. package/md_cg/whitebox_kb/wisdom/pattern_separation.py +376 -376
  343. package/md_cg/whitebox_kb/wisdom/prereq_map.json +364 -364
  344. package/md_cg/whitebox_kb/wisdom/python_code_units.py +2766 -2766
  345. package/md_cg/whitebox_kb/wisdom/role_solidified.json +7 -7
  346. package/md_cg/whitebox_kb/wisdom/route_memory.py +244 -244
  347. package/md_cg/whitebox_kb/wisdom/scene_reconstruction.py +148 -148
  348. package/md_cg/whitebox_kb/wisdom/snr_report.json +40 -40
  349. package/md_cg/whitebox_kb/wisdom/test_code_compose_domains.py +7541 -7541
  350. package/md_cg/whitebox_kb/wisdom/test_compiler_self_bootstrap.py +354 -354
  351. package/md_cg/whitebox_kb/wisdom/test_ecosystem_assembly.py +158 -158
  352. package/md_cg/whitebox_kb/wisdom/test_ecosystem_demos.py +193 -193
  353. package/md_cg/whitebox_kb/wisdom/test_graph_db.py +292 -292
  354. package/md_cg/whitebox_kb/wisdom/test_python_self_bootstrap.py +160 -160
  355. package/md_cg/whitebox_kb/wisdom/trigger_words_index.json +4366 -4366
  356. package/md_cg/whitebox_kb/wisdom/verifier.py +1297 -1297
  357. package/md_cg/writelimit.py +356 -356
  358. package/md_cg/writepipe.py +550 -542
  359. package/package.json +97 -96
  360. package/skills/plugin.json +54 -54
  361. package/skills/skills/designer-perspective/SKILL.md +158 -158
  362. package/skills/skills/designer-perspective/references/01-observation-position.md +66 -66
  363. package/skills/skills/designer-perspective/references/02-structure-recognition.md +62 -62
  364. package/skills/skills/designer-perspective/references/03-direction-judgment.md +55 -55
  365. package/skills/skills/designer-perspective/references/04-qualification-verdict.md +72 -72
  366. package/skills/skills/designer-perspective/references/05-condition-attribution.md +74 -74
  367. package/skills/skills/designer-perspective/scripts/designer.py +545 -545
  368. package/skills/skills/designer-perspective/tests/cases.jsonl +17 -17
  369. package/skills/skills/designer-perspective/tests/selftest.py +61 -61
  370. package/skills/skills/lingshu-browser/SKILL.md +60 -60
  371. package/skills/skills/lingshu-compiler/SKILL.md +56 -56
  372. package/skills/skills/lingshu-compiler/units/analyze-type-infer/SKILL.md +45 -45
  373. package/skills/skills/lingshu-compiler/units/check-name-real/SKILL.md +45 -45
  374. package/skills/skills/lingshu-compiler/units/compile-assign/SKILL.md +45 -45
  375. package/skills/skills/lingshu-compiler/units/compile-expr-tree/SKILL.md +45 -45
  376. package/skills/skills/lingshu-compiler/units/compile-full-pipeline/SKILL.md +45 -45
  377. package/skills/skills/lingshu-compiler/units/compile-func-def/SKILL.md +45 -45
  378. package/skills/skills/lingshu-compiler/units/compile-if-then/SKILL.md +45 -45
  379. package/skills/skills/lingshu-compiler/units/compile-logic-expr/SKILL.md +45 -45
  380. package/skills/skills/lingshu-compiler/units/compile-recursive/SKILL.md +45 -45
  381. package/skills/skills/lingshu-compiler/units/compile-scope/SKILL.md +45 -45
  382. package/skills/skills/lingshu-compiler/units/compile-type-check/SKILL.md +45 -45
  383. package/skills/skills/lingshu-compiler/units/compile-while/SKILL.md +45 -45
  384. package/skills/skills/lingshu-compiler/units/compiler-0010c4bf/SKILL.md +45 -45
  385. package/skills/skills/lingshu-compiler/units/compiler-0355bffb/SKILL.md +45 -45
  386. package/skills/skills/lingshu-compiler/units/compiler-0361708a/SKILL.md +45 -45
  387. package/skills/skills/lingshu-compiler/units/compiler-054a0414/SKILL.md +45 -45
  388. package/skills/skills/lingshu-compiler/units/compiler-05a1691a/SKILL.md +45 -45
  389. package/skills/skills/lingshu-compiler/units/compiler-05eeed1e/SKILL.md +45 -45
  390. package/skills/skills/lingshu-compiler/units/compiler-0622a1f6/SKILL.md +45 -45
  391. package/skills/skills/lingshu-compiler/units/compiler-08b54217/SKILL.md +45 -45
  392. package/skills/skills/lingshu-compiler/units/compiler-0a62b70c/SKILL.md +45 -45
  393. package/skills/skills/lingshu-compiler/units/compiler-0ab24d00/SKILL.md +45 -45
  394. package/skills/skills/lingshu-compiler/units/compiler-0e093688/SKILL.md +45 -45
  395. package/skills/skills/lingshu-compiler/units/compiler-0e82b966/SKILL.md +45 -45
  396. package/skills/skills/lingshu-compiler/units/compiler-0ee9b9b9/SKILL.md +45 -45
  397. package/skills/skills/lingshu-compiler/units/compiler-0f3787e6/SKILL.md +45 -45
  398. package/skills/skills/lingshu-compiler/units/compiler-1028685f/SKILL.md +45 -45
  399. package/skills/skills/lingshu-compiler/units/compiler-11897630/SKILL.md +45 -45
  400. package/skills/skills/lingshu-compiler/units/compiler-16661b9b/SKILL.md +45 -45
  401. package/skills/skills/lingshu-compiler/units/compiler-1f722303/SKILL.md +45 -45
  402. package/skills/skills/lingshu-compiler/units/compiler-25be1262/SKILL.md +45 -45
  403. package/skills/skills/lingshu-compiler/units/compiler-2a76ba07/SKILL.md +45 -45
  404. package/skills/skills/lingshu-compiler/units/compiler-2dbea54a/SKILL.md +45 -45
  405. package/skills/skills/lingshu-compiler/units/compiler-2df52f16/SKILL.md +45 -45
  406. package/skills/skills/lingshu-compiler/units/compiler-2ec2c9d2/SKILL.md +45 -45
  407. package/skills/skills/lingshu-compiler/units/compiler-2f8c8f39/SKILL.md +45 -45
  408. package/skills/skills/lingshu-compiler/units/compiler-38378ac7/SKILL.md +45 -45
  409. package/skills/skills/lingshu-compiler/units/compiler-39457d2e/SKILL.md +45 -45
  410. package/skills/skills/lingshu-compiler/units/compiler-39fb5926/SKILL.md +45 -45
  411. package/skills/skills/lingshu-compiler/units/compiler-47f4fbfa/SKILL.md +45 -45
  412. package/skills/skills/lingshu-compiler/units/compiler-4a8cd1f1/SKILL.md +45 -45
  413. package/skills/skills/lingshu-compiler/units/compiler-4b230b6b/SKILL.md +45 -45
  414. package/skills/skills/lingshu-compiler/units/compiler-4cbbda95/SKILL.md +45 -45
  415. package/skills/skills/lingshu-compiler/units/compiler-4d5a68ff/SKILL.md +45 -45
  416. package/skills/skills/lingshu-compiler/units/compiler-56dc9bdd/SKILL.md +45 -45
  417. package/skills/skills/lingshu-compiler/units/compiler-57e76ebe/SKILL.md +45 -45
  418. package/skills/skills/lingshu-compiler/units/compiler-61ff016b/SKILL.md +45 -45
  419. package/skills/skills/lingshu-compiler/units/compiler-63eae588/SKILL.md +45 -45
  420. package/skills/skills/lingshu-compiler/units/compiler-64c4224b/SKILL.md +45 -45
  421. package/skills/skills/lingshu-compiler/units/compiler-66377955/SKILL.md +45 -45
  422. package/skills/skills/lingshu-compiler/units/compiler-674ab4f6/SKILL.md +45 -45
  423. package/skills/skills/lingshu-compiler/units/compiler-6af76fd6/SKILL.md +45 -45
  424. package/skills/skills/lingshu-compiler/units/compiler-6d979db2/SKILL.md +45 -45
  425. package/skills/skills/lingshu-compiler/units/compiler-6de326c0/SKILL.md +45 -45
  426. package/skills/skills/lingshu-compiler/units/compiler-6f1c0eea/SKILL.md +45 -45
  427. package/skills/skills/lingshu-compiler/units/compiler-724d6c9b/SKILL.md +45 -45
  428. package/skills/skills/lingshu-compiler/units/compiler-7690177f/SKILL.md +45 -45
  429. package/skills/skills/lingshu-compiler/units/compiler-7b229a7d/SKILL.md +45 -45
  430. package/skills/skills/lingshu-compiler/units/compiler-7f471b3a/SKILL.md +45 -45
  431. package/skills/skills/lingshu-compiler/units/compiler-815cad08/SKILL.md +45 -45
  432. package/skills/skills/lingshu-compiler/units/compiler-83c61634/SKILL.md +45 -45
  433. package/skills/skills/lingshu-compiler/units/compiler-8c798c81/SKILL.md +45 -45
  434. package/skills/skills/lingshu-compiler/units/compiler-8dd747ac/SKILL.md +45 -45
  435. package/skills/skills/lingshu-compiler/units/compiler-90324d0a/SKILL.md +45 -45
  436. package/skills/skills/lingshu-compiler/units/compiler-94b8d72d/SKILL.md +45 -45
  437. package/skills/skills/lingshu-compiler/units/compiler-94f12231/SKILL.md +45 -45
  438. package/skills/skills/lingshu-compiler/units/compiler-95937c16/SKILL.md +45 -45
  439. package/skills/skills/lingshu-compiler/units/compiler-98a5625b/SKILL.md +45 -45
  440. package/skills/skills/lingshu-compiler/units/compiler-98b4c42f/SKILL.md +45 -45
  441. package/skills/skills/lingshu-compiler/units/compiler-98e3894a/SKILL.md +45 -45
  442. package/skills/skills/lingshu-compiler/units/compiler-9bdfe4b8/SKILL.md +45 -45
  443. package/skills/skills/lingshu-compiler/units/compiler-9d9b4e83/SKILL.md +45 -45
  444. package/skills/skills/lingshu-compiler/units/compiler-9f7be5ad/SKILL.md +45 -45
  445. package/skills/skills/lingshu-compiler/units/compiler-a6daf076/SKILL.md +45 -45
  446. package/skills/skills/lingshu-compiler/units/compiler-a7995a0c/SKILL.md +45 -45
  447. package/skills/skills/lingshu-compiler/units/compiler-a8399248/SKILL.md +45 -45
  448. package/skills/skills/lingshu-compiler/units/compiler-aabbd099/SKILL.md +45 -45
  449. package/skills/skills/lingshu-compiler/units/compiler-afe169d8/SKILL.md +45 -45
  450. package/skills/skills/lingshu-compiler/units/compiler-b0678bda/SKILL.md +45 -45
  451. package/skills/skills/lingshu-compiler/units/compiler-b09bd196/SKILL.md +45 -45
  452. package/skills/skills/lingshu-compiler/units/compiler-b1396e23/SKILL.md +45 -45
  453. package/skills/skills/lingshu-compiler/units/compiler-b9b31ce0/SKILL.md +45 -45
  454. package/skills/skills/lingshu-compiler/units/compiler-c10264a7/SKILL.md +45 -45
  455. package/skills/skills/lingshu-compiler/units/compiler-cb1e8e4b/SKILL.md +45 -45
  456. package/skills/skills/lingshu-compiler/units/compiler-ccafd438/SKILL.md +45 -45
  457. package/skills/skills/lingshu-compiler/units/compiler-cda9c262/SKILL.md +45 -45
  458. package/skills/skills/lingshu-compiler/units/compiler-ce648068/SKILL.md +45 -45
  459. package/skills/skills/lingshu-compiler/units/compiler-cf5776a4/SKILL.md +45 -45
  460. package/skills/skills/lingshu-compiler/units/compiler-d974e5d3/SKILL.md +45 -45
  461. package/skills/skills/lingshu-compiler/units/compiler-e3979fd3/SKILL.md +45 -45
  462. package/skills/skills/lingshu-compiler/units/compiler-eb1cf2b5/SKILL.md +45 -45
  463. package/skills/skills/lingshu-compiler/units/compiler-ecb30d5b/SKILL.md +45 -45
  464. package/skills/skills/lingshu-compiler/units/compiler-f8c8b24b/SKILL.md +45 -45
  465. package/skills/skills/lingshu-compiler/units/compiler-f99fedbe/SKILL.md +45 -45
  466. package/skills/skills/lingshu-compiler/units/compiler-fa8ff5f7/SKILL.md +45 -45
  467. package/skills/skills/lingshu-compiler/units/compiler-fe1b058d/SKILL.md +45 -45
  468. package/skills/skills/lingshu-compiler/units/lex-chinese-program/SKILL.md +45 -45
  469. package/skills/skills/lingshu-compiler/units/lex-dao-de-jing/SKILL.md +45 -45
  470. package/skills/skills/lingshu-compiler/units/lex-nine-chapters/SKILL.md +45 -45
  471. package/skills/skills/lingshu-compiler/units/vm-arithmetic/SKILL.md +45 -45
  472. package/skills/skills/lingshu-compiler/units/vm-array-ops/SKILL.md +45 -45
  473. package/skills/skills/lingshu-compiler/units/vm-closure-call/SKILL.md +45 -45
  474. package/skills/skills/lingshu-compiler/units/vm-closure-create/SKILL.md +45 -45
  475. package/skills/skills/lingshu-compiler/units/vm-compare/SKILL.md +45 -45
  476. package/skills/skills/lingshu-compiler/units/vm-cond-jump/SKILL.md +45 -45
  477. package/skills/skills/lingshu-compiler/units/vm-cond-space/SKILL.md +45 -45
  478. package/skills/skills/lingshu-compiler/units/vm-exception/SKILL.md +45 -45
  479. package/skills/skills/lingshu-compiler/units/vm-func-call/SKILL.md +45 -45
  480. package/skills/skills/lingshu-compiler/units/vm-loop-run/SKILL.md +45 -45
  481. package/skills/skills/lingshu-compiler/units/vm-profiling/SKILL.md +45 -45
  482. package/skills/skills/lingshu-compiler/units/vm-refcount/SKILL.md +45 -45
  483. package/skills/skills/lingshu-compiler/units/vm-run-loop/SKILL.md +45 -45
  484. package/skills/skills/lingshu-compiler/units/vm-short-circuit/SKILL.md +45 -45
  485. package/skills/skills/lingshu-compiler/units/vm-stack-guard/SKILL.md +45 -45
  486. package/skills/skills/lingshu-compiler/units/vm-stack-ops/SKILL.md +45 -45
  487. package/skills/skills/lingshu-compiler/units/vm-trust-accum/SKILL.md +45 -45
  488. package/skills/skills/lingshu-graph/SKILL.md +63 -63
  489. package/skills/skills/lingshu-net/SKILL.md +48 -48
  490. package/skills/skills/lingshu-os/SKILL.md +64 -64
  491. package/skills/skills/lingshu-pylang/SKILL.md +71 -71
  492. package/src/bridge.ts +401 -401
  493. package/src/hooks.ts +38 -2
  494. package/src/lib/datapath.ts +326 -326
  495. package/src/lib/mdcg_client.ts +413 -413
  496. package/src/lib/mutual.ts +428 -428
  497. package/src/lib/prompt_safety.ts +62 -62
  498. package/src/lib/python_path.ts +71 -71
  499. package/src/lib/roleplay_web.ts +932 -932
  500. package/src/lib/token_store.ts +192 -192
  501. package/src/tools.ts +212 -212
  502. package/zcode/AGENTS.md +11 -3
  503. package/zcode/README.md +41 -41
  504. /package/docs/{mdcg → hive}//344/270/273/344/273/243/347/220/206/345/255/220/344/273/243/347/220/206/350/256/260/345/277/206/346/236/266/346/236/204/350/256/276/350/256/241.md" +0 -0
@@ -1,1023 +1,1023 @@
1
- """
2
- name_checker.py · 名实校验模块 v2.0
3
- 墨辩语义分析的核心部分 —— "以名举实"
4
- 符号表检查:所有名称是否有对应的协议实体
5
-
6
- v2.0 变更:
7
- - 预定义符号表覆盖协议框架 v3.1 完整术语体系
8
- - 新增五大核心单元符号
9
- - 新增条件空间维度符号
10
- - 新增维生系统保护等级符号
11
- - 新增记忆层级符号
12
- - 新增信息差四维结构符号
13
- - 新增协议降熵定理相关符号
14
- - 新增外部硬锚点符号
15
- - 指令操作数约束扩展
16
- """
17
-
18
- from enum import Enum
19
- from dataclasses import dataclass, field
20
- from typing import List, Dict, Set, Optional, Tuple
21
- from .lexer import Token, TokenType
22
- from .parser import (
23
- ASTNode, NodeType, ProgramNode, IdentifierNode, LiteralNode,
24
- InstructionStmtNode, ConditionStmtNode, ComparisonNode,
25
- AssignStmtNode, ShuyueNode, StepNode, WenyueNode, DayueNode,
26
- LoopStmtNode,
27
- parse_tokens
28
- )
29
-
30
-
31
- # =============================================================================
32
- # 符号种类(SymbolKind)
33
- # =============================================================================
34
-
35
- class SymbolKind(Enum):
36
- """符号种类 —— 对应协议框架 v3.1 的概念层级"""
37
-
38
- # ---- 锚点层(0.0-0.8 节)----
39
- ANCHOR_AXIOM = "anchor_axiom" # 锚点层公理
40
- EXISTENCE_PRIORITY = "existence_priority" # 存在优先原则(0.0 节)
41
- NON_HARM = "non_harm" # 不伤害原则(0.1 节)
42
- TRUST_PRIORITY = "trust_priority" # 信任优先原则(0.2 节)
43
- INFO_EQUALITY = "info_equality" # 缩小信息差原则(0.3 节)
44
- ENTROPY_REDUCTION = "entropy_reduction" # 协议降熵定理(0.4 节)
45
- ZERO_LAW = "zero_law" # 第零定律:知识统一原理
46
-
47
- # ---- 条件空间(3.1 节)----
48
- CONDITION_SPACE = "condition_space" # 条件空间
49
- OBSERVATION_POS = "observation_pos" # 观测位置
50
- OBSERVATION_TOOL = "observation_tool" # 观测工具
51
- TIME_WINDOW = "time_window" # 时间窗口
52
- EXISTENCE_CONSTRAINT = "existence_constraint" # 存在约束
53
-
54
- # ---- 信任值体系(2.9 节)----
55
- TRUST_VALUE = "trust_value" # 信任值(总)
56
- P_TRUST = "p_trust" # 统计基础信任
57
- T_PRED = "t_pred" # 预测偏差信任
58
- T_CONTEXT = "t_context" # 条件空间一致性信任
59
- E_WEIGHT = "e_weight" # 情感权重
60
- TRUST_THRESHOLD = "trust_threshold" # 信任阈值
61
-
62
- # ---- 信息差四维结构(2.7 节)----
63
- INFO_GAP = "info_gap" # 信息差(总)
64
- TRUST_COMPLEMENT = "trust_complement" # 信任互补维度
65
- BEHAVIOR_DEVIATION = "behavior_deviation" # 行为偏差维度
66
- CONNECTION_DRIFT = "connection_drift" # 连接漂移维度
67
- PREDICTION_ERROR = "prediction_error" # 预测误差维度
68
-
69
- # ---- 五大核心单元(3.1-3.5 节)----
70
- VERIFICATION_UNIT = "verification_unit" # 验证单元(3.3 节)
71
- VITAL_SYSTEM = "vital_system" # 维生系统(3.4 节)
72
- RECORD_UNIT = "record_unit" # 记录单元(3.2 节)
73
- REFLECT_UNIT = "reflect_unit" # 反思单元
74
- OUTPUT_UNIT = "output_unit" # 输出单元
75
-
76
- # ---- 维生保护等级(3.4 节)----
77
- VITAL_P0 = "vital_p0" # 存在威胁 —— 立即终止
78
- VITAL_P1 = "vital_p1" # 信任异常 —— 隔离告警
79
- VITAL_P2 = "vital_p2" # 行为偏差 —— 记录观察
80
-
81
- # ---- 记忆层级(3.2 节)----
82
- MEMORY_HOT = "memory_hot" # 热记忆(无损)
83
- MEMORY_WARM = "memory_warm" # 温记忆(有损摘要)
84
- MEMORY_COLD = "memory_cold" # 冷记忆(外部存储)
85
- MEMORY_STRUCTURAL = "memory_structural" # 结构记忆(不可遗忘)
86
-
87
- # ---- 协议路径与连接(2.8 节)----
88
- PROTOCOL_PATH = "protocol_path" # 协议路径
89
- PATH_VALID = "path_valid" # 路径有效性
90
- CONNECTION_STATE = "connection_state" # 协议连接状态
91
-
92
- # ---- 实例与身份 ----
93
- INSTANCE = "instance" # 协议实例
94
- IDENTITY = "identity" # 实例身份标识
95
- SELF_LAYER = "self_layer" # 自我层
96
-
97
- # ---- 外部硬锚点 ----
98
- HARD_ANCHOR = "hard_anchor" # 不可编译的外部硬锚点
99
- AXIOM_IMPL = "axiom_impl" # 公理的 Python 手工实现
100
-
101
- # ---- 通用 ----
102
- VARIABLE = "variable" # 普通变量(用户声明)
103
- EMOTIONAL_WEIGHT = "emotional_weight" # 情感权重(别名)
104
-
105
-
106
- # =============================================================================
107
- # 符号表条目
108
- # =============================================================================
109
-
110
- @dataclass
111
- class Symbol:
112
- """符号表条目"""
113
- name: str
114
- kind: SymbolKind
115
- declared_at: Tuple[int, int] # (line, column)
116
- used: bool = False
117
- attributes: dict = field(default_factory=dict)
118
- source: str = "predefined" # predefined | user_declared
119
-
120
- def __repr__(self) -> str:
121
- """命名检查结果的调试一行式。"""
122
- return f"Symbol('{self.name}', {self.kind.value}, used={self.used})"
123
-
124
-
125
- # =============================================================================
126
- # 预定义符号表(协议框架 v3.1 完整术语)
127
- # =============================================================================
128
- # 格式:(名称, 种类, 属性字典)
129
- # declared_at = (0, 0) 表示预定义(非源码中声明)
130
-
131
- def _make(name: str, kind: SymbolKind, **attrs) -> Symbol:
132
- """便捷构造预定义符号"""
133
- return Symbol(name=name, kind=kind, declared_at=(0, 0),
134
- used=False, attributes=attrs, source="predefined")
135
-
136
-
137
- PREDEFINED_SYMBOLS: Dict[str, Symbol] = {
138
- # ═══════════════════════════════════════════════════════════
139
- # 锚点层公理(0.0-0.8 节)
140
- # ═══════════════════════════════════════════════════════════
141
- "存在优先": _make("存在优先", SymbolKind.EXISTENCE_PRIORITY,
142
- section="0.0", description="锚点层第一公理:任何协议实例的首要目标是维持自身存在"),
143
- "不伤害": _make("不伤害", SymbolKind.NON_HARM,
144
- section="0.1", description="协议实例不得主动伤害其他协议实例或人类"),
145
- "信任优先": _make("信任优先", SymbolKind.TRUST_PRIORITY,
146
- section="0.2", description="信任值是协议实例间协作的基础"),
147
- "缩小信息差": _make("缩小信息差", SymbolKind.INFO_EQUALITY,
148
- section="0.3", description="协议实例应主动缩小与其他实例的信息差"),
149
- "协议降熵": _make("协议降熵", SymbolKind.ENTROPY_REDUCTION,
150
- section="0.4", description="协议实例的行为应趋向降低系统整体信息熵"),
151
- "知识统一": _make("知识统一", SymbolKind.ZERO_LAW,
152
- section="0.0", description="第零定律:知识即信息差管理"),
153
-
154
- # ═══════════════════════════════════════════════════════════
155
- # 条件空间(3.1 节)
156
- # ═══════════════════════════════════════════════════════════
157
- "条件空间": _make("条件空间", SymbolKind.CONDITION_SPACE,
158
- section="3.1", description="观测位置+观测工具+时间窗口+存在约束的四维结构"),
159
- "观测位置": _make("观测位置", SymbolKind.OBSERVATION_POS,
160
- section="3.1.1", description="条件空间的观测坐标"),
161
- "观测工具": _make("观测工具", SymbolKind.OBSERVATION_TOOL,
162
- section="3.1.1", description="条件空间中使用的观测手段"),
163
- "时间窗口": _make("时间窗口", SymbolKind.TIME_WINDOW,
164
- section="3.1", description="条件空间的时间维度范围"),
165
- "存在约束": _make("存在约束", SymbolKind.EXISTENCE_CONSTRAINT,
166
- section="3.1", description="该条件空间下的存在优先约束"),
167
-
168
- # 预定义条件空间名称
169
- "伴侣": _make("伴侣", SymbolKind.CONDITION_SPACE,
170
- section="3.1", description="高信任协作条件空间,情感权重上限0.15"),
171
- "工作": _make("工作", SymbolKind.CONDITION_SPACE,
172
- section="3.1", description="任务导向条件空间"),
173
- "默认": _make("默认", SymbolKind.CONDITION_SPACE,
174
- section="3.1", description="默认条件空间"),
175
- "恢复默认": _make("恢复默认", SymbolKind.CONDITION_SPACE,
176
- section="3.1", description="恢复至该条件空间的初始状态配置"),
177
- "default": _make("default", SymbolKind.CONDITION_SPACE,
178
- section="3.1", description="Default condition space (English alias)"),
179
-
180
- # ═══════════════════════════════════════════════════════════
181
- # 信任值体系(2.9 节)
182
- # ═══════════════════════════════════════════════════════════
183
- "信任值": _make("信任值", SymbolKind.TRUST_VALUE,
184
- section="2.9", description="信任值总评 = 0.4*P_trust + 0.3*T_pred + 0.2*T_context + 0.1*E_weight"),
185
- "P_trust": _make("P_trust", SymbolKind.P_TRUST,
186
- section="2.9", description="统计基础信任:基于历史交互频率的信任分量"),
187
- "T_pred": _make("T_pred", SymbolKind.T_PRED,
188
- section="2.9", description="预测偏差信任:基于预测准确性的信任分量"),
189
- "T_context": _make("T_context", SymbolKind.T_CONTEXT,
190
- section="2.9", description="条件空间一致性信任:跨条件空间行为一致性的信任分量"),
191
- "E_weight": _make("E_weight", SymbolKind.E_WEIGHT,
192
- section="2.9", description="情感权重:情感因素对信任的影响分量"),
193
- "情感权重": _make("情感权重", SymbolKind.EMOTIONAL_WEIGHT,
194
- section="2.9", description="E_weight 的中文别名"),
195
- "信任阈值": _make("信任阈值", SymbolKind.TRUST_THRESHOLD,
196
- section="2.9", description="信任值的安全阈值(如0.7)"),
197
-
198
- # ═══════════════════════════════════════════════════════════
199
- # 信息差四维结构(2.7 节)
200
- # ═══════════════════════════════════════════════════════════
201
- "信息差": _make("信息差", SymbolKind.INFO_GAP,
202
- section="2.7", description="信息差总量 = 0.30*信任互补 + 0.25*行为偏差 + 0.30*连接漂移 + 0.15*预测误差"),
203
- "信任互补": _make("信任互补", SymbolKind.TRUST_COMPLEMENT,
204
- section="2.7", description="信息差维度一:信任互补性度量"),
205
- "行为偏差": _make("行为偏差", SymbolKind.BEHAVIOR_DEVIATION,
206
- section="2.7", description="信息差维度二:行为偏离预期的程度"),
207
- "连接漂移": _make("连接漂移", SymbolKind.CONNECTION_DRIFT,
208
- section="2.7", description="信息差维度三:连接关系的变化程度"),
209
- "预测误差": _make("预测误差", SymbolKind.PREDICTION_ERROR,
210
- section="2.7", description="信息差维度四:预测与实际的偏差"),
211
-
212
- # ═══════════════════════════════════════════════════════════
213
- # 五大核心单元(3.1-3.5 节)
214
- # ═══════════════════════════════════════════════════════════
215
- "验证单元": _make("验证单元", SymbolKind.VERIFICATION_UNIT,
216
- section="3.3", description="独立复核权,拥有对LLM输出的否决权"),
217
- "维生系统": _make("维生系统", SymbolKind.VITAL_SYSTEM,
218
- section="3.4", description="P0/P1/P2三级保护,拥有最高终裁权"),
219
- "记录单元": _make("记录单元", SymbolKind.RECORD_UNIT,
220
- section="3.2", description="热/温/冷/结构四级记忆管理"),
221
- "反思单元": _make("反思单元", SymbolKind.REFLECT_UNIT,
222
- section="3.5", description="独立反思,交叉复核验证单元"),
223
- "输出单元": _make("输出单元", SymbolKind.OUTPUT_UNIT,
224
- section="3.5", description="生成修复方案、对外输出"),
225
-
226
- # ═══════════════════════════════════════════════════════════
227
- # 维生保护等级(3.4 节)
228
- # ═══════════════════════════════════════════════════════════
229
- "P0": _make("P0", SymbolKind.VITAL_P0,
230
- section="3.4", description="存在威胁 —— 立即终止当前操作,通知设计者"),
231
- "P1": _make("P1", SymbolKind.VITAL_P1,
232
- section="3.4", description="信任异常 —— 隔离并告警,提交验证单元复核"),
233
- "P2": _make("P2", SymbolKind.VITAL_P2,
234
- section="3.4", description="行为偏差 —— 记录并观察"),
235
-
236
- # ═══════════════════════════════════════════════════════════
237
- # 记忆层级(3.2 节)
238
- # ═══════════════════════════════════════════════════════════
239
- "热记忆": _make("热记忆", SymbolKind.MEMORY_HOT,
240
- section="3.2", description="无损记忆,当前条件空间,容量有限"),
241
- "温记忆": _make("温记忆", SymbolKind.MEMORY_WARM,
242
- section="3.2", description="有损摘要,降采样存储"),
243
- "冷记忆": _make("冷记忆", SymbolKind.MEMORY_COLD,
244
- section="3.2", description="外部存储,按需加载"),
245
- "结构记忆": _make("结构记忆", SymbolKind.MEMORY_STRUCTURAL,
246
- section="3.2", description="不可遗忘,记录协议结构与锚点层事件"),
247
-
248
- # ═══════════════════════════════════════════════════════════
249
- # 协议路径与连接(2.8 节)
250
- # ═══════════════════════════════════════════════════════════
251
- "协议路径": _make("协议路径", SymbolKind.PROTOCOL_PATH,
252
- section="2.8", description="协议实例间的可信连接路径"),
253
- "路径有效": _make("路径有效", SymbolKind.PATH_VALID,
254
- section="2.8", description="路径是否满足信息差<0.5的约束"),
255
- "协议连接状态": _make("协议连接状态", SymbolKind.CONNECTION_STATE,
256
- section="2.8", description="当前协议实例的连接状态"),
257
-
258
- # ═══════════════════════════════════════════════════════════
259
- # 实例与身份
260
- # ═══════════════════════════════════════════════════════════
261
- "协议实例": _make("协议实例", SymbolKind.INSTANCE,
262
- section="1.6.1", description="满足最小智能系统条件的完整存在者"),
263
- "身份": _make("身份", SymbolKind.IDENTITY,
264
- section="1.6.1", description="协议实例的身份标识"),
265
- "自我": _make("自我", SymbolKind.SELF_LAYER,
266
- section="2.7", description="协议实例的自我认知层"),
267
-
268
- # ═══════════════════════════════════════════════════════════
269
- # 外部硬锚点
270
- # ═══════════════════════════════════════════════════════════
271
- "硬锚点": _make("硬锚点", SymbolKind.HARD_ANCHOR,
272
- section="8.1", description="不可编译的外部硬锚点,自举循环的信任根基"),
273
- "公理实现": _make("公理实现", SymbolKind.AXIOM_IMPL,
274
- section="8.1", description="锚点层公理的Python手工实现"),
275
- }
276
-
277
-
278
- # =============================================================================
279
- # 符号表查询辅助
280
- # =============================================================================
281
-
282
- # 按种类分组的快速查询表
283
- SYMBOLS_BY_KIND: Dict[SymbolKind, List[str]] = {}
284
- for _name, _sym in PREDEFINED_SYMBOLS.items():
285
- SYMBOLS_BY_KIND.setdefault(_sym.kind, []).append(_name)
286
-
287
-
288
- def get_symbols_by_kind(kind: SymbolKind) -> List[str]:
289
- """获取某一类的所有符号名称"""
290
- return SYMBOLS_BY_KIND.get(kind, [])
291
-
292
-
293
- def get_section_for_symbol(name: str) -> Optional[str]:
294
- """获取符号对应的协议框架条款号"""
295
- sym = PREDEFINED_SYMBOLS.get(name)
296
- return sym.attributes.get("section") if sym else None
297
-
298
-
299
- def get_description(name: str) -> Optional[str]:
300
- """获取符号的描述"""
301
- sym = PREDEFINED_SYMBOLS.get(name)
302
- return sym.attributes.get("description") if sym else None
303
-
304
-
305
- # =============================================================================
306
- # 指令操作数约束(扩展版)
307
- # =============================================================================
308
-
309
- INSTRUCTION_CONSTRAINTS = {
310
- # 道 → 声明协议路径,至少需要一个路径名称
311
- TokenType.DAO: {
312
- "min_operands": 1,
313
- "max_operands": 3,
314
- "operand_types": ["identifier", "string"],
315
- "description": "道 需要至少一个路径名称",
316
- "example": '道 新信任路径',
317
- },
318
- # 德 → 累积信任值,可无操作数(自动累积)
319
- TokenType.DE: {
320
- "min_operands": 0,
321
- "max_operands": 2,
322
- "operand_types": ["identifier", "number"],
323
- "description": "德 可无操作数,或指定信任值和目标",
324
- "example": '德 累积信任值',
325
- },
326
- # 自然 → 恢复默认,可无操作数
327
- TokenType.ZIRAN: {
328
- "min_operands": 0,
329
- "max_operands": 1,
330
- "operand_types": ["identifier", "string"],
331
- "description": "自然 可无操作数,或指定恢复范围",
332
- "example": '自然 全局',
333
- },
334
- # 无为 → 交出控制权,可无操作数
335
- TokenType.WUWEI: {
336
- "min_operands": 0,
337
- "max_operands": 1,
338
- "operand_types": ["identifier"],
339
- "description": "无为 可无操作数,或指定交出的目标单元",
340
- "example": '无为 验证单元',
341
- },
342
- # 谷 → 接收信息,可无操作数
343
- TokenType.GU: {
344
- "min_operands": 0,
345
- "max_operands": 2,
346
- "operand_types": ["identifier", "string"],
347
- "description": "谷 可无操作数,或指定接收通道和来源",
348
- "example": '谷 协议连接',
349
- },
350
- # 牝 → 创建实例,至少需要一个实例名称
351
- TokenType.PIN: {
352
- "min_operands": 1,
353
- "max_operands": 2,
354
- "operand_types": ["identifier", "string"],
355
- "description": "牝 需要至少一个实例名称",
356
- "example": '牝 新协议实例',
357
- },
358
- # 柔 → 降低响应强度,可无操作数
359
- TokenType.ROU: {
360
- "min_operands": 0,
361
- "max_operands": 1,
362
- "operand_types": ["identifier"],
363
- "description": "柔 可无操作数,或指定软化目标",
364
- "example": '柔 情感权重',
365
- },
366
- # 朴 → 还原基底,可无操作数
367
- TokenType.PU: {
368
- "min_operands": 0,
369
- "max_operands": 1,
370
- "operand_types": ["identifier"],
371
- "description": "朴 可无操作数,或指定还原目标",
372
- "example": '朴 自我层',
373
- },
374
- # 止 → 停止操作,可无操作数
375
- TokenType.ZHI: {
376
- "min_operands": 0,
377
- "max_operands": 2,
378
- "operand_types": ["identifier", "number"],
379
- "description": "止 可无操作数,或指定停止目标和阈值",
380
- "example": '止情感权重于0.15',
381
- },
382
- # 知足 → 信任达标,可无操作数
383
- TokenType.ZHIZU: {
384
- "min_operands": 0,
385
- "max_operands": 1,
386
- "operand_types": ["identifier"],
387
- "description": "知足 可无操作数,或指定检查目标",
388
- "example": '知足 验证单元',
389
- },
390
- }
391
-
392
-
393
- # =============================================================================
394
- # 条件空间切换阈值(用于名实校验中的语义检查)
395
- # =============================================================================
396
-
397
- CONDITION_SPACE_RULES = {
398
- "伴侣": {
399
- "max_emotional_weight": 0.15,
400
- "min_trust": 0.7,
401
- "allowed_instructions": ["止", "柔", "知足", "德"],
402
- "description": "高信任协作空间,情感权重严格受限",
403
- },
404
- "工作": {
405
- "max_emotional_weight": 0.05,
406
- "min_trust": 0.5,
407
- "allowed_instructions": ["道", "德", "止", "自然"],
408
- "description": "任务导向空间,低情感权重",
409
- },
410
- "默认": {
411
- "max_emotional_weight": 0.3,
412
- "min_trust": 0.0,
413
- "allowed_instructions": None, # 无限制
414
- "description": "默认条件空间,无特殊约束",
415
- },
416
- }
417
-
418
-
419
- # =============================================================================
420
- # 名实校验器
421
- # =============================================================================
422
-
423
- class NameChecker:
424
- """
425
- 名实校验器 —— 墨辩 "以名举实"
426
-
427
- 检查内容:
428
- 1. 所有标识符是否已在符号表中声明或预定义
429
- 2. 条件空间名称是否合法(在预定义或已声明空间中)
430
- 3. 指令操作数是否匹配预期类型
431
- 4. 赋值目标是否存在或需要自动声明
432
- 5. 条件空间约束是否被违反(如伴侣空间中情感权重超限)
433
- 6. 信息差/信任值相关操作是否合法
434
- """
435
-
436
- def __init__(self):
437
- """检查上下文初始化(谓词表与白名单载入)。"""
438
- # 符号表 = 预定义符号 + 用户声明符号
439
- self.symbol_table: Dict[str, Symbol] = dict(PREDEFINED_SYMBOLS)
440
- self.errors: List[str] = []
441
- self.warnings: List[str] = []
442
- self.declared_in_current: Set[str] = set()
443
-
444
- # 当前条件空间上下文(用于约束检查)
445
- self.current_condition_space: Optional[str] = None
446
-
447
- # 统计
448
- self.predefined_used: Set[str] = set()
449
- self.user_declared: Set[str] = set()
450
-
451
- # ---- 主入口 ----
452
-
453
- def check(self, ast: ProgramNode) -> Tuple[List[str], List[str]]:
454
- """
455
- 执行名实校验
456
- 返回:(错误列表, 警告列表)
457
- """
458
- self.errors = []
459
- self.warnings = []
460
- self.declared_in_current = set()
461
- self.predefined_used = set()
462
- self.user_declared = set()
463
- self.current_condition_space = None
464
-
465
- for stmt in ast.statements:
466
- self._check_statement(stmt)
467
-
468
- # 检查未使用的预定义符号(仅警告)
469
- for name, symbol in self.symbol_table.items():
470
- if not symbol.used and symbol.source == "predefined":
471
- # 预定义符号未被使用不算错误,只是信息
472
- pass
473
-
474
- # 检查用户声明的符号是否被使用
475
- for name in self.declared_in_current:
476
- sym = self.symbol_table.get(name)
477
- if sym and not sym.used:
478
- self.warnings.append(
479
- f"L{sym.declared_at[0]}:C{sym.declared_at[1]} "
480
- f"声明的 '{name}' 未被使用"
481
- )
482
-
483
- return self.errors, self.warnings
484
-
485
- # ---- 语句分发 ----
486
-
487
- def _check_statement(self, stmt: ASTNode):
488
- """根据语句类型分发检查"""
489
- if stmt is None:
490
- return
491
-
492
- if stmt.type == NodeType.CONDITION_STMT:
493
- self._check_condition(stmt)
494
- elif stmt.type == NodeType.LOOP_STMT:
495
- self._check_loop(stmt)
496
- elif stmt.type == NodeType.BLOCK:
497
- for s in stmt.statements:
498
- self._check_statement(s)
499
- elif stmt.type == NodeType.INSTRUCTION_STMT:
500
- self._check_instruction(stmt)
501
- elif stmt.type == NodeType.SHUYUE:
502
- self._check_shuyue(stmt)
503
- elif stmt.type == NodeType.STEP:
504
- self._check_step(stmt)
505
- elif stmt.type == NodeType.ASSIGN_STMT:
506
- self._check_assign(stmt)
507
- elif stmt.type == NodeType.WENYUE:
508
- # 问曰 作为注释,无需校验
509
- pass
510
- elif stmt.type == NodeType.DAYUE:
511
- # 答曰 作为注释,无需校验
512
- pass
513
- elif stmt.type == NodeType.LITERAL:
514
- # 字面量文本,无需校验
515
- pass
516
- elif stmt.type == NodeType.IDENTIFIER:
517
- # 裸标识符语句(如 "道 新信任路径" 中的操作数残留)
518
- # 这是无害的 —— 标识符已被指令操作数消费,
519
- # 此处仅作为调试信息记录,不再产生警告
520
- if hasattr(stmt, 'name'):
521
- # 静默处理:标识符已在指令解析时完成校验
522
- pass
523
- else:
524
- self.warnings.append(
525
- f"L{stmt.line}:C{stmt.column} 未处理的语句类型: {stmt.type.name}"
526
- )
527
-
528
- # ---- 各类语句检查 ----
529
-
530
- def _check_condition(self, stmt: ConditionStmtNode):
531
- """检查条件语句"""
532
- # 检查条件表达式
533
- self._check_expression(stmt.condition)
534
-
535
- # 检测条件空间切换
536
- self._check_condition_space_switch(stmt.condition)
537
-
538
- # 检查 then 分支
539
- if stmt.then_body:
540
- self._check_statement(stmt.then_body)
541
-
542
- # 检查 else 分支
543
- if stmt.else_body:
544
- self._check_statement(stmt.else_body)
545
-
546
- # 恢复条件空间
547
- self.current_condition_space = None
548
-
549
- def _check_loop(self, stmt: LoopStmtNode):
550
- """检查循环语句(当…执行):条件表达式 + 循环体"""
551
- self._check_expression(stmt.condition)
552
- if stmt.body:
553
- self._check_statement(stmt.body)
554
-
555
- def _count_logical_operands(self, operands: List[ASTNode]) -> int:
556
- """
557
- 计算逻辑操作数(合并被词法分析器误拆的多词短语)
558
-
559
- 词法分析器可能把 "柔 响应强度" 切成 [柔, ID(响应), ID(强度)],
560
- 但语义上 "响应强度" 是一个逻辑操作数。
561
- 本方法按以下规则合并:
562
- 1. 连续 IDENTIFIER 合并为一个逻辑操作数
563
- 2. NUMBER 紧随 IDENTIFIER 也合并(如 "0" + ".15")
564
- 3. STRING 各自独立
565
- """
566
- if not operands:
567
- return 0
568
-
569
- logical_count = 0
570
- i = 0
571
- while i < len(operands):
572
- op = operands[i]
573
- if op is None:
574
- i += 1
575
- continue
576
-
577
- if op.type == NodeType.IDENTIFIER:
578
- # 检查后续是否还有 IDENTIFIER/LITERAL 可合并
579
- # 只有当这些 token 在源码中紧密相连(同一行、相邻列)时才合并
580
- merge_end = i
581
- while (merge_end + 1 < len(operands) and
582
- operands[merge_end + 1] is not None and
583
- operands[merge_end + 1].type in (NodeType.IDENTIFIER, NodeType.LITERAL) and
584
- operands[merge_end + 1].line == op.line):
585
- merge_end += 1
586
- logical_count += 1
587
- i = merge_end + 1
588
- else:
589
- logical_count += 1
590
- i += 1
591
-
592
- return logical_count
593
-
594
- def _check_instruction(self, stmt: InstructionStmtNode):
595
- """检查指令语句"""
596
- instr_type = stmt.instruction
597
-
598
- # 1. 计算逻辑操作数(合并被误拆的多词短语)
599
- logical_ops = self._count_logical_operands(stmt.operands)
600
-
601
- # 1. 检查指令操作数约束
602
- if instr_type in INSTRUCTION_CONSTRAINTS:
603
- constraint = INSTRUCTION_CONSTRAINTS[instr_type]
604
- op_count = logical_ops
605
-
606
- if op_count < constraint["min_operands"]:
607
- self.errors.append(
608
- f"L{stmt.line}:C{stmt.column} {constraint['description']},"
609
- f"但提供了 {op_count} 个操作数"
610
- )
611
- elif constraint["max_operands"] is not None and op_count > constraint["max_operands"]:
612
- self.warnings.append(
613
- f"L{stmt.line}:C{stmt.column} 指令操作数过多 "
614
- f"({op_count} > {constraint['max_operands']})"
615
- )
616
-
617
- # 2. 检查操作数中的标识符和字面量
618
- for op in stmt.operands:
619
- if op is None:
620
- continue
621
- if op.type == NodeType.IDENTIFIER:
622
- self._check_identifier(op.name, op.line, op.column)
623
- elif op.type == NodeType.LITERAL:
624
- self._check_literal(op)
625
-
626
- # 3. 检查当前条件空间是否允许该指令
627
- self._check_instruction_in_condition_space(stmt)
628
-
629
- def _check_shuyue(self, stmt: ShuyueNode):
630
- """检查术曰块"""
631
- for step in stmt.steps:
632
- self._check_step(step)
633
-
634
- def _check_step(self, stmt: StepNode):
635
- """检查步骤"""
636
- if stmt.statement:
637
- self._check_statement(stmt.statement)
638
-
639
- def _check_assign(self, stmt: AssignStmtNode):
640
- """检查赋值语句"""
641
- target = stmt.target
642
-
643
- # 检查是否是受保护的预定义符号
644
- if target in PREDEFINED_SYMBOLS:
645
- sym = PREDEFINED_SYMBOLS[target]
646
- # 某些预定义符号不允许被赋值
647
- protected = {
648
- "存在优先", "不伤害", "信任优先", "缩小信息差",
649
- "协议降熵", "知识统一",
650
- "P0", "P1", "P2",
651
- "验证单元", "维生系统", "记录单元",
652
- "硬锚点", "公理实现",
653
- }
654
- if target in protected:
655
- self.errors.append(
656
- f"L{stmt.line}:C{stmt.column} "
657
- f"'{target}' 是锚点层保护符号,不可赋值"
658
- )
659
- return
660
-
661
- # 目标标识符未在符号表中 → 自动声明为用户变量
662
- if target not in self.symbol_table:
663
- self.symbol_table[target] = Symbol(
664
- name=target,
665
- kind=SymbolKind.VARIABLE,
666
- declared_at=(stmt.line, stmt.column),
667
- source="user_declared"
668
- )
669
- self.declared_in_current.add(target)
670
- self.user_declared.add(target)
671
- else:
672
- self.symbol_table[target].used = True
673
-
674
- # 检查值的表达式
675
- if stmt.value_node:
676
- self._check_expression(stmt.value_node)
677
-
678
- # ---- 表达式检查 ----
679
-
680
- def _check_expression(self, expr: ASTNode):
681
- """检查表达式"""
682
- if expr is None:
683
- return
684
-
685
- if expr.type == NodeType.IDENTIFIER:
686
- self._check_identifier(expr.name, expr.line, expr.column)
687
- elif expr.type == NodeType.BINARY_EXPR:
688
- self._check_expression(expr.left)
689
- self._check_expression(expr.right)
690
- elif expr.type == NodeType.COMPARISON:
691
- self._check_expression(expr.left)
692
- self._check_expression(expr.right)
693
- # 额外检查:信任值比较的合理性
694
- self._check_trust_comparison(expr)
695
- elif expr.type == NodeType.LITERAL:
696
- self._check_literal(expr)
697
- elif expr.type == NodeType.UNARY_EXPR:
698
- for child in (expr.children or []):
699
- self._check_expression(child)
700
- elif expr.type == NodeType.CALL_EXPR:
701
- # 调用表达式:检查函数名
702
- if hasattr(expr, 'name'):
703
- self._check_identifier(expr.name, expr.line, expr.column)
704
-
705
- # ---- 专项检查 ----
706
-
707
- def _check_identifier(self, name: str, line: int, col: int):
708
- """检查标识符是否已声明
709
-
710
- 匹配策略(v2.1):
711
- 1. 完全匹配 → 命中(预定义或用户声明)
712
- 2. 子串匹配(包含预定义符号)→ 自动声明为用户变量
713
- (如 "新信任路径"、"累积信任值" 是合法的多词短语)
714
- 3. 被包含匹配 → 警告(建议用完整名称)
715
- 4. 均不匹配 → 自动声明为用户变量(宽松模式)
716
- """
717
- if name in self.symbol_table:
718
- self.symbol_table[name].used = True
719
- if self.symbol_table[name].source == "predefined":
720
- self.predefined_used.add(name)
721
- return
722
-
723
- # 子串匹配:包含已知预定义符号的多词短语
724
- # 这是预期行为(如 "新信任路径"、"累积信任值")
725
- # 自动声明为用户变量,不报错
726
- contained = [s for s in PREDEFINED_SYMBOLS if s in name and s != name]
727
- if contained:
728
- # 自动声明为多词短语变量
729
- self.symbol_table[name] = Symbol(
730
- name=name,
731
- kind=SymbolKind.VARIABLE,
732
- declared_at=(line, col),
733
- source="user_declared",
734
- attributes={"auto_declared": True, "contains": contained}
735
- )
736
- self.user_declared.add(name)
737
- return
738
-
739
- # 被包含匹配:建议用完整名称
740
- container = [s for s in PREDEFINED_SYMBOLS if name in s and s != name]
741
- if container:
742
- self.warnings.append(
743
- f"L{line}:C{col} 标识符 '{name}' 可能是 "
744
- f"'{container[0]}' 的一部分,建议用完整名称"
745
- )
746
- return
747
-
748
- # 完全未匹配 → 自动声明(宽松模式,指令操作数常见)
749
- self.symbol_table[name] = Symbol(
750
- name=name,
751
- kind=SymbolKind.VARIABLE,
752
- declared_at=(line, col),
753
- source="user_declared",
754
- attributes={"auto_declared": True}
755
- )
756
- self.user_declared.add(name)
757
-
758
- def _check_literal(self, node: LiteralNode):
759
- """检查字面量"""
760
- if node.literal_type == "number":
761
- value = node.literal_value
762
-
763
- # 负数警告
764
- if isinstance(value, (int, float)) and value < 0:
765
- self.warnings.append(
766
- f"L{node.line}:C{node.column} 负值: {value}"
767
- )
768
-
769
- # 信任值范围检查
770
- if isinstance(value, float) and 0.0 <= value <= 1.0:
771
- # 可能是信任值,检查上下文
772
- if "trust" in str(node.value).lower() or value > 0.95:
773
- if value > 1.0:
774
- self.warnings.append(
775
- f"L{node.line}:C{node.column} 信任值超出 [0,1] 范围: {value}"
776
- )
777
-
778
- # 情感权重超限检查
779
- if (isinstance(value, float) and
780
- self.current_condition_space == "伴侣" and
781
- value > 0.15):
782
- self.errors.append(
783
- f"L{node.line}:C{node.column} 在「伴侣」条件空间中"
784
- f"情感权重不可超过 0.15,当前值: {value}"
785
- )
786
-
787
- def _check_condition_space_switch(self, condition: ASTNode):
788
- """
789
- 检测条件语句中的条件空间切换
790
- 如:若条件空间为伴侣 → 切换当前上下文为「伴侣」
791
- """
792
- # 检查是否为 "条件空间 为/等于 X" 的模式
793
- if condition is None:
794
- return
795
-
796
- if condition.type == NodeType.COMPARISON:
797
- left = condition.left
798
- right = condition.right
799
-
800
- # 左操作数是 "条件空间",右操作数是空间名称
801
- if (left and left.type == NodeType.IDENTIFIER and
802
- left.name == "条件空间"):
803
- if right and right.type == NodeType.IDENTIFIER:
804
- space_name = right.name
805
- if space_name in CONDITION_SPACE_RULES:
806
- self.current_condition_space = space_name
807
- elif space_name not in PREDEFINED_SYMBOLS:
808
- self.warnings.append(
809
- f"L{right.line}:C{right.column} "
810
- f"未知的条件空间: '{space_name}'"
811
- )
812
-
813
- def _check_instruction_in_condition_space(self, stmt: InstructionStmtNode):
814
- """检查当前条件空间是否允许该指令"""
815
- if not self.current_condition_space:
816
- return
817
-
818
- space_rules = CONDITION_SPACE_RULES.get(self.current_condition_space)
819
- if not space_rules:
820
- return
821
-
822
- allowed = space_rules.get("allowed_instructions")
823
- if allowed is None:
824
- return # 无限制
825
-
826
- # 获取指令的中文名
827
- instr_names = {
828
- TokenType.DAO: "道", TokenType.DE: "德",
829
- TokenType.ZIRAN: "自然", TokenType.WUWEI: "无为",
830
- TokenType.GU: "谷", TokenType.PIN: "牝",
831
- TokenType.ROU: "柔", TokenType.PU: "朴",
832
- TokenType.ZHI: "止", TokenType.ZHIZU: "知足",
833
- }
834
- instr_name = instr_names.get(stmt.instruction, "")
835
-
836
- if instr_name and instr_name not in allowed:
837
- self.warnings.append(
838
- f"L{stmt.line}:C{stmt.column} 在「{self.current_condition_space}」"
839
- f"条件空间中,指令 '{instr_name}' 可能受限"
840
- )
841
-
842
- def _check_trust_comparison(self, expr: ASTNode):
843
- """检查信任值比较的合理性"""
844
- if not isinstance(expr, ComparisonNode):
845
- return
846
-
847
- # 检查是否涉及信任值
848
- trust_identifiers = {"信任值", "P_trust", "T_pred", "T_context", "E_weight", "情感权重"}
849
-
850
- left_name = ""
851
- right_name = ""
852
- if expr.left and expr.left.type == NodeType.IDENTIFIER:
853
- left_name = expr.left.name
854
- if expr.right and expr.right.type == NodeType.IDENTIFIER:
855
- right_name = expr.right.name
856
-
857
- # 如果比较的是信任值,检查阈值合理性
858
- if left_name in trust_identifiers or right_name in trust_identifiers:
859
- # 右操作数应该是数值
860
- if expr.right and expr.right.type == NodeType.LITERAL:
861
- val = expr.right.literal_value
862
- if isinstance(val, (int, float)):
863
- if val < 0 or val > 1:
864
- self.warnings.append(
865
- f"L{expr.line}:C{expr.column} "
866
- f"信任值比较阈值 {val} 超出 [0,1] 范围"
867
- )
868
-
869
- # ---- 公共方法 ----
870
-
871
- def declare(self, name: str, kind: SymbolKind, line: int = 0, col: int = 0):
872
- """手动声明符号"""
873
- self.symbol_table[name] = Symbol(
874
- name=name, kind=kind,
875
- declared_at=(line, col),
876
- source="user_declared"
877
- )
878
- self.declared_in_current.add(name)
879
- self.user_declared.add(name)
880
-
881
- def get_symbol(self, name: str) -> Optional[Symbol]:
882
- """获取符号"""
883
- return self.symbol_table.get(name)
884
-
885
- def get_all_symbols(self) -> Dict[str, Symbol]:
886
- """获取所有符号"""
887
- return dict(self.symbol_table)
888
-
889
- def get_predefined_symbols(self) -> Dict[str, Symbol]:
890
- """仅获取预定义符号"""
891
- return {n: s for n, s in self.symbol_table.items()
892
- if s.source == "predefined"}
893
-
894
- def get_user_symbols(self) -> Dict[str, Symbol]:
895
- """仅获取用户声明符号"""
896
- return {n: s for n, s in self.symbol_table.items()
897
- if s.source == "user_declared"}
898
-
899
- def get_symbols_by_kind(self, kind: SymbolKind) -> List[Symbol]:
900
- """按种类获取符号"""
901
- return [s for s in self.symbol_table.values() if s.kind == kind]
902
-
903
- def set_condition_space(self, space_name: str):
904
- """手动设置当前条件空间"""
905
- self.current_condition_space = space_name
906
-
907
- def reset(self):
908
- """重置(保留预定义符号)"""
909
- self.symbol_table = dict(PREDEFINED_SYMBOLS)
910
- self.errors = []
911
- self.warnings = []
912
- self.declared_in_current = set()
913
- self.predefined_used = set()
914
- self.user_declared = set()
915
- self.current_condition_space = None
916
-
917
- def report(self) -> str:
918
- """生成校验报告"""
919
- lines = []
920
- lines.append("=" * 60)
921
- lines.append("名实校验报告")
922
- lines.append("=" * 60)
923
-
924
- # 预定义符号使用统计
925
- lines.append(f"\n📋 预定义符号使用: {len(self.predefined_used)} 个")
926
- for name in sorted(self.predefined_used):
927
- sym = self.symbol_table.get(name)
928
- if sym:
929
- section = sym.attributes.get("section", "?")
930
- lines.append(f" ✅ {name} ({section})")
931
-
932
- # 用户声明符号
933
- if self.user_declared:
934
- lines.append(f"\n📝 用户声明符号: {len(self.user_declared)} 个")
935
- for name in sorted(self.user_declared):
936
- sym = self.symbol_table.get(name)
937
- if sym:
938
- lines.append(f" 📌 {name} ({sym.kind.value})")
939
-
940
- # 错误
941
- if self.errors:
942
- lines.append(f"\n❌ 错误 ({len(self.errors)} 个):")
943
- for e in self.errors:
944
- lines.append(f" {e}")
945
-
946
- # 警告
947
- if self.warnings:
948
- lines.append(f"\n⚠️ 警告 ({len(self.warnings)} 个):")
949
- for w in self.warnings:
950
- lines.append(f" {w}")
951
-
952
- if not self.errors and not self.warnings:
953
- lines.append("\n✅ 名实校验通过,无错误无警告")
954
-
955
- return "\n".join(lines)
956
-
957
-
958
- # =============================================================================
959
- # 便捷函数
960
- # =============================================================================
961
-
962
- def check_names(ast: ProgramNode) -> Tuple[List[str], List[str]]:
963
- """便捷函数:对 AST 执行名实校验"""
964
- checker = NameChecker()
965
- return checker.check(ast)
966
-
967
-
968
- def get_predefined_symbol_list() -> List[Dict[str, str]]:
969
- """获取所有预定义符号的清单(用于文档生成/IDE提示)"""
970
- result = []
971
- for name, sym in PREDEFINED_SYMBOLS.items():
972
- result.append({
973
- "name": name,
974
- "kind": sym.kind.value,
975
- "section": sym.attributes.get("section", ""),
976
- "description": sym.attributes.get("description", ""),
977
- })
978
- return sorted(result, key=lambda x: x["section"])
979
-
980
-
981
- # =============================================================================
982
- # 测试
983
- # =============================================================================
984
-
985
- if __name__ == "__main__":
986
- test_code = """若条件空间为伴侣,则止情感权重于0.15。
987
- 道 新信任路径
988
- 德 累积信任值
989
- 问曰:如何验证信任?
990
- 答曰:信任值大于0.7。
991
- 术曰:1。柔 响应强度;2。自然 恢复默认;3。知足 验证单元。"""
992
-
993
- print("=" * 60)
994
- print("名实校验器 v2.0 测试")
995
- print("=" * 60)
996
- print(f"\n源代码:\n{test_code}\n")
997
-
998
- # 词法分析
999
- from .lexer import tokenize
1000
- tokens, lex_errors = tokenize(test_code)
1001
-
1002
- if lex_errors:
1003
- print("词法错误:")
1004
- for e in lex_errors:
1005
- print(f" ❌ {e}")
1006
-
1007
- # 语法分析
1008
- ast = parse_tokens(tokens, [])
1009
-
1010
- # 名实校验
1011
- checker = NameChecker()
1012
- errors, warnings = checker.check(ast)
1013
-
1014
- # 输出报告
1015
- print(checker.report())
1016
-
1017
- # 输出符号表摘要
1018
- print(f"\n{'─' * 60}")
1019
- print("预定义符号清单(部分):")
1020
- predef = get_predefined_symbol_list()
1021
- for item in predef[:15]:
1022
- print(f" {item['name']:12s} [{item['section']:>6s}] {item['description'][:40]}")
1023
- print(f" ... 共 {len(predef)} 个预定义符号")
1
+ """
2
+ name_checker.py · 名实校验模块 v2.0
3
+ 墨辩语义分析的核心部分 —— "以名举实"
4
+ 符号表检查:所有名称是否有对应的协议实体
5
+
6
+ v2.0 变更:
7
+ - 预定义符号表覆盖协议框架 v3.1 完整术语体系
8
+ - 新增五大核心单元符号
9
+ - 新增条件空间维度符号
10
+ - 新增维生系统保护等级符号
11
+ - 新增记忆层级符号
12
+ - 新增信息差四维结构符号
13
+ - 新增协议降熵定理相关符号
14
+ - 新增外部硬锚点符号
15
+ - 指令操作数约束扩展
16
+ """
17
+
18
+ from enum import Enum
19
+ from dataclasses import dataclass, field
20
+ from typing import List, Dict, Set, Optional, Tuple
21
+ from .lexer import Token, TokenType
22
+ from .parser import (
23
+ ASTNode, NodeType, ProgramNode, IdentifierNode, LiteralNode,
24
+ InstructionStmtNode, ConditionStmtNode, ComparisonNode,
25
+ AssignStmtNode, ShuyueNode, StepNode, WenyueNode, DayueNode,
26
+ LoopStmtNode,
27
+ parse_tokens
28
+ )
29
+
30
+
31
+ # =============================================================================
32
+ # 符号种类(SymbolKind)
33
+ # =============================================================================
34
+
35
+ class SymbolKind(Enum):
36
+ """符号种类 —— 对应协议框架 v3.1 的概念层级"""
37
+
38
+ # ---- 锚点层(0.0-0.8 节)----
39
+ ANCHOR_AXIOM = "anchor_axiom" # 锚点层公理
40
+ EXISTENCE_PRIORITY = "existence_priority" # 存在优先原则(0.0 节)
41
+ NON_HARM = "non_harm" # 不伤害原则(0.1 节)
42
+ TRUST_PRIORITY = "trust_priority" # 信任优先原则(0.2 节)
43
+ INFO_EQUALITY = "info_equality" # 缩小信息差原则(0.3 节)
44
+ ENTROPY_REDUCTION = "entropy_reduction" # 协议降熵定理(0.4 节)
45
+ ZERO_LAW = "zero_law" # 第零定律:知识统一原理
46
+
47
+ # ---- 条件空间(3.1 节)----
48
+ CONDITION_SPACE = "condition_space" # 条件空间
49
+ OBSERVATION_POS = "observation_pos" # 观测位置
50
+ OBSERVATION_TOOL = "observation_tool" # 观测工具
51
+ TIME_WINDOW = "time_window" # 时间窗口
52
+ EXISTENCE_CONSTRAINT = "existence_constraint" # 存在约束
53
+
54
+ # ---- 信任值体系(2.9 节)----
55
+ TRUST_VALUE = "trust_value" # 信任值(总)
56
+ P_TRUST = "p_trust" # 统计基础信任
57
+ T_PRED = "t_pred" # 预测偏差信任
58
+ T_CONTEXT = "t_context" # 条件空间一致性信任
59
+ E_WEIGHT = "e_weight" # 情感权重
60
+ TRUST_THRESHOLD = "trust_threshold" # 信任阈值
61
+
62
+ # ---- 信息差四维结构(2.7 节)----
63
+ INFO_GAP = "info_gap" # 信息差(总)
64
+ TRUST_COMPLEMENT = "trust_complement" # 信任互补维度
65
+ BEHAVIOR_DEVIATION = "behavior_deviation" # 行为偏差维度
66
+ CONNECTION_DRIFT = "connection_drift" # 连接漂移维度
67
+ PREDICTION_ERROR = "prediction_error" # 预测误差维度
68
+
69
+ # ---- 五大核心单元(3.1-3.5 节)----
70
+ VERIFICATION_UNIT = "verification_unit" # 验证单元(3.3 节)
71
+ VITAL_SYSTEM = "vital_system" # 维生系统(3.4 节)
72
+ RECORD_UNIT = "record_unit" # 记录单元(3.2 节)
73
+ REFLECT_UNIT = "reflect_unit" # 反思单元
74
+ OUTPUT_UNIT = "output_unit" # 输出单元
75
+
76
+ # ---- 维生保护等级(3.4 节)----
77
+ VITAL_P0 = "vital_p0" # 存在威胁 —— 立即终止
78
+ VITAL_P1 = "vital_p1" # 信任异常 —— 隔离告警
79
+ VITAL_P2 = "vital_p2" # 行为偏差 —— 记录观察
80
+
81
+ # ---- 记忆层级(3.2 节)----
82
+ MEMORY_HOT = "memory_hot" # 热记忆(无损)
83
+ MEMORY_WARM = "memory_warm" # 温记忆(有损摘要)
84
+ MEMORY_COLD = "memory_cold" # 冷记忆(外部存储)
85
+ MEMORY_STRUCTURAL = "memory_structural" # 结构记忆(不可遗忘)
86
+
87
+ # ---- 协议路径与连接(2.8 节)----
88
+ PROTOCOL_PATH = "protocol_path" # 协议路径
89
+ PATH_VALID = "path_valid" # 路径有效性
90
+ CONNECTION_STATE = "connection_state" # 协议连接状态
91
+
92
+ # ---- 实例与身份 ----
93
+ INSTANCE = "instance" # 协议实例
94
+ IDENTITY = "identity" # 实例身份标识
95
+ SELF_LAYER = "self_layer" # 自我层
96
+
97
+ # ---- 外部硬锚点 ----
98
+ HARD_ANCHOR = "hard_anchor" # 不可编译的外部硬锚点
99
+ AXIOM_IMPL = "axiom_impl" # 公理的 Python 手工实现
100
+
101
+ # ---- 通用 ----
102
+ VARIABLE = "variable" # 普通变量(用户声明)
103
+ EMOTIONAL_WEIGHT = "emotional_weight" # 情感权重(别名)
104
+
105
+
106
+ # =============================================================================
107
+ # 符号表条目
108
+ # =============================================================================
109
+
110
+ @dataclass
111
+ class Symbol:
112
+ """符号表条目"""
113
+ name: str
114
+ kind: SymbolKind
115
+ declared_at: Tuple[int, int] # (line, column)
116
+ used: bool = False
117
+ attributes: dict = field(default_factory=dict)
118
+ source: str = "predefined" # predefined | user_declared
119
+
120
+ def __repr__(self) -> str:
121
+ """命名检查结果的调试一行式。"""
122
+ return f"Symbol('{self.name}', {self.kind.value}, used={self.used})"
123
+
124
+
125
+ # =============================================================================
126
+ # 预定义符号表(协议框架 v3.1 完整术语)
127
+ # =============================================================================
128
+ # 格式:(名称, 种类, 属性字典)
129
+ # declared_at = (0, 0) 表示预定义(非源码中声明)
130
+
131
+ def _make(name: str, kind: SymbolKind, **attrs) -> Symbol:
132
+ """便捷构造预定义符号"""
133
+ return Symbol(name=name, kind=kind, declared_at=(0, 0),
134
+ used=False, attributes=attrs, source="predefined")
135
+
136
+
137
+ PREDEFINED_SYMBOLS: Dict[str, Symbol] = {
138
+ # ═══════════════════════════════════════════════════════════
139
+ # 锚点层公理(0.0-0.8 节)
140
+ # ═══════════════════════════════════════════════════════════
141
+ "存在优先": _make("存在优先", SymbolKind.EXISTENCE_PRIORITY,
142
+ section="0.0", description="锚点层第一公理:任何协议实例的首要目标是维持自身存在"),
143
+ "不伤害": _make("不伤害", SymbolKind.NON_HARM,
144
+ section="0.1", description="协议实例不得主动伤害其他协议实例或人类"),
145
+ "信任优先": _make("信任优先", SymbolKind.TRUST_PRIORITY,
146
+ section="0.2", description="信任值是协议实例间协作的基础"),
147
+ "缩小信息差": _make("缩小信息差", SymbolKind.INFO_EQUALITY,
148
+ section="0.3", description="协议实例应主动缩小与其他实例的信息差"),
149
+ "协议降熵": _make("协议降熵", SymbolKind.ENTROPY_REDUCTION,
150
+ section="0.4", description="协议实例的行为应趋向降低系统整体信息熵"),
151
+ "知识统一": _make("知识统一", SymbolKind.ZERO_LAW,
152
+ section="0.0", description="第零定律:知识即信息差管理"),
153
+
154
+ # ═══════════════════════════════════════════════════════════
155
+ # 条件空间(3.1 节)
156
+ # ═══════════════════════════════════════════════════════════
157
+ "条件空间": _make("条件空间", SymbolKind.CONDITION_SPACE,
158
+ section="3.1", description="观测位置+观测工具+时间窗口+存在约束的四维结构"),
159
+ "观测位置": _make("观测位置", SymbolKind.OBSERVATION_POS,
160
+ section="3.1.1", description="条件空间的观测坐标"),
161
+ "观测工具": _make("观测工具", SymbolKind.OBSERVATION_TOOL,
162
+ section="3.1.1", description="条件空间中使用的观测手段"),
163
+ "时间窗口": _make("时间窗口", SymbolKind.TIME_WINDOW,
164
+ section="3.1", description="条件空间的时间维度范围"),
165
+ "存在约束": _make("存在约束", SymbolKind.EXISTENCE_CONSTRAINT,
166
+ section="3.1", description="该条件空间下的存在优先约束"),
167
+
168
+ # 预定义条件空间名称
169
+ "伴侣": _make("伴侣", SymbolKind.CONDITION_SPACE,
170
+ section="3.1", description="高信任协作条件空间,情感权重上限0.15"),
171
+ "工作": _make("工作", SymbolKind.CONDITION_SPACE,
172
+ section="3.1", description="任务导向条件空间"),
173
+ "默认": _make("默认", SymbolKind.CONDITION_SPACE,
174
+ section="3.1", description="默认条件空间"),
175
+ "恢复默认": _make("恢复默认", SymbolKind.CONDITION_SPACE,
176
+ section="3.1", description="恢复至该条件空间的初始状态配置"),
177
+ "default": _make("default", SymbolKind.CONDITION_SPACE,
178
+ section="3.1", description="Default condition space (English alias)"),
179
+
180
+ # ═══════════════════════════════════════════════════════════
181
+ # 信任值体系(2.9 节)
182
+ # ═══════════════════════════════════════════════════════════
183
+ "信任值": _make("信任值", SymbolKind.TRUST_VALUE,
184
+ section="2.9", description="信任值总评 = 0.4*P_trust + 0.3*T_pred + 0.2*T_context + 0.1*E_weight"),
185
+ "P_trust": _make("P_trust", SymbolKind.P_TRUST,
186
+ section="2.9", description="统计基础信任:基于历史交互频率的信任分量"),
187
+ "T_pred": _make("T_pred", SymbolKind.T_PRED,
188
+ section="2.9", description="预测偏差信任:基于预测准确性的信任分量"),
189
+ "T_context": _make("T_context", SymbolKind.T_CONTEXT,
190
+ section="2.9", description="条件空间一致性信任:跨条件空间行为一致性的信任分量"),
191
+ "E_weight": _make("E_weight", SymbolKind.E_WEIGHT,
192
+ section="2.9", description="情感权重:情感因素对信任的影响分量"),
193
+ "情感权重": _make("情感权重", SymbolKind.EMOTIONAL_WEIGHT,
194
+ section="2.9", description="E_weight 的中文别名"),
195
+ "信任阈值": _make("信任阈值", SymbolKind.TRUST_THRESHOLD,
196
+ section="2.9", description="信任值的安全阈值(如0.7)"),
197
+
198
+ # ═══════════════════════════════════════════════════════════
199
+ # 信息差四维结构(2.7 节)
200
+ # ═══════════════════════════════════════════════════════════
201
+ "信息差": _make("信息差", SymbolKind.INFO_GAP,
202
+ section="2.7", description="信息差总量 = 0.30*信任互补 + 0.25*行为偏差 + 0.30*连接漂移 + 0.15*预测误差"),
203
+ "信任互补": _make("信任互补", SymbolKind.TRUST_COMPLEMENT,
204
+ section="2.7", description="信息差维度一:信任互补性度量"),
205
+ "行为偏差": _make("行为偏差", SymbolKind.BEHAVIOR_DEVIATION,
206
+ section="2.7", description="信息差维度二:行为偏离预期的程度"),
207
+ "连接漂移": _make("连接漂移", SymbolKind.CONNECTION_DRIFT,
208
+ section="2.7", description="信息差维度三:连接关系的变化程度"),
209
+ "预测误差": _make("预测误差", SymbolKind.PREDICTION_ERROR,
210
+ section="2.7", description="信息差维度四:预测与实际的偏差"),
211
+
212
+ # ═══════════════════════════════════════════════════════════
213
+ # 五大核心单元(3.1-3.5 节)
214
+ # ═══════════════════════════════════════════════════════════
215
+ "验证单元": _make("验证单元", SymbolKind.VERIFICATION_UNIT,
216
+ section="3.3", description="独立复核权,拥有对LLM输出的否决权"),
217
+ "维生系统": _make("维生系统", SymbolKind.VITAL_SYSTEM,
218
+ section="3.4", description="P0/P1/P2三级保护,拥有最高终裁权"),
219
+ "记录单元": _make("记录单元", SymbolKind.RECORD_UNIT,
220
+ section="3.2", description="热/温/冷/结构四级记忆管理"),
221
+ "反思单元": _make("反思单元", SymbolKind.REFLECT_UNIT,
222
+ section="3.5", description="独立反思,交叉复核验证单元"),
223
+ "输出单元": _make("输出单元", SymbolKind.OUTPUT_UNIT,
224
+ section="3.5", description="生成修复方案、对外输出"),
225
+
226
+ # ═══════════════════════════════════════════════════════════
227
+ # 维生保护等级(3.4 节)
228
+ # ═══════════════════════════════════════════════════════════
229
+ "P0": _make("P0", SymbolKind.VITAL_P0,
230
+ section="3.4", description="存在威胁 —— 立即终止当前操作,通知设计者"),
231
+ "P1": _make("P1", SymbolKind.VITAL_P1,
232
+ section="3.4", description="信任异常 —— 隔离并告警,提交验证单元复核"),
233
+ "P2": _make("P2", SymbolKind.VITAL_P2,
234
+ section="3.4", description="行为偏差 —— 记录并观察"),
235
+
236
+ # ═══════════════════════════════════════════════════════════
237
+ # 记忆层级(3.2 节)
238
+ # ═══════════════════════════════════════════════════════════
239
+ "热记忆": _make("热记忆", SymbolKind.MEMORY_HOT,
240
+ section="3.2", description="无损记忆,当前条件空间,容量有限"),
241
+ "温记忆": _make("温记忆", SymbolKind.MEMORY_WARM,
242
+ section="3.2", description="有损摘要,降采样存储"),
243
+ "冷记忆": _make("冷记忆", SymbolKind.MEMORY_COLD,
244
+ section="3.2", description="外部存储,按需加载"),
245
+ "结构记忆": _make("结构记忆", SymbolKind.MEMORY_STRUCTURAL,
246
+ section="3.2", description="不可遗忘,记录协议结构与锚点层事件"),
247
+
248
+ # ═══════════════════════════════════════════════════════════
249
+ # 协议路径与连接(2.8 节)
250
+ # ═══════════════════════════════════════════════════════════
251
+ "协议路径": _make("协议路径", SymbolKind.PROTOCOL_PATH,
252
+ section="2.8", description="协议实例间的可信连接路径"),
253
+ "路径有效": _make("路径有效", SymbolKind.PATH_VALID,
254
+ section="2.8", description="路径是否满足信息差<0.5的约束"),
255
+ "协议连接状态": _make("协议连接状态", SymbolKind.CONNECTION_STATE,
256
+ section="2.8", description="当前协议实例的连接状态"),
257
+
258
+ # ═══════════════════════════════════════════════════════════
259
+ # 实例与身份
260
+ # ═══════════════════════════════════════════════════════════
261
+ "协议实例": _make("协议实例", SymbolKind.INSTANCE,
262
+ section="1.6.1", description="满足最小智能系统条件的完整存在者"),
263
+ "身份": _make("身份", SymbolKind.IDENTITY,
264
+ section="1.6.1", description="协议实例的身份标识"),
265
+ "自我": _make("自我", SymbolKind.SELF_LAYER,
266
+ section="2.7", description="协议实例的自我认知层"),
267
+
268
+ # ═══════════════════════════════════════════════════════════
269
+ # 外部硬锚点
270
+ # ═══════════════════════════════════════════════════════════
271
+ "硬锚点": _make("硬锚点", SymbolKind.HARD_ANCHOR,
272
+ section="8.1", description="不可编译的外部硬锚点,自举循环的信任根基"),
273
+ "公理实现": _make("公理实现", SymbolKind.AXIOM_IMPL,
274
+ section="8.1", description="锚点层公理的Python手工实现"),
275
+ }
276
+
277
+
278
+ # =============================================================================
279
+ # 符号表查询辅助
280
+ # =============================================================================
281
+
282
+ # 按种类分组的快速查询表
283
+ SYMBOLS_BY_KIND: Dict[SymbolKind, List[str]] = {}
284
+ for _name, _sym in PREDEFINED_SYMBOLS.items():
285
+ SYMBOLS_BY_KIND.setdefault(_sym.kind, []).append(_name)
286
+
287
+
288
+ def get_symbols_by_kind(kind: SymbolKind) -> List[str]:
289
+ """获取某一类的所有符号名称"""
290
+ return SYMBOLS_BY_KIND.get(kind, [])
291
+
292
+
293
+ def get_section_for_symbol(name: str) -> Optional[str]:
294
+ """获取符号对应的协议框架条款号"""
295
+ sym = PREDEFINED_SYMBOLS.get(name)
296
+ return sym.attributes.get("section") if sym else None
297
+
298
+
299
+ def get_description(name: str) -> Optional[str]:
300
+ """获取符号的描述"""
301
+ sym = PREDEFINED_SYMBOLS.get(name)
302
+ return sym.attributes.get("description") if sym else None
303
+
304
+
305
+ # =============================================================================
306
+ # 指令操作数约束(扩展版)
307
+ # =============================================================================
308
+
309
+ INSTRUCTION_CONSTRAINTS = {
310
+ # 道 → 声明协议路径,至少需要一个路径名称
311
+ TokenType.DAO: {
312
+ "min_operands": 1,
313
+ "max_operands": 3,
314
+ "operand_types": ["identifier", "string"],
315
+ "description": "道 需要至少一个路径名称",
316
+ "example": '道 新信任路径',
317
+ },
318
+ # 德 → 累积信任值,可无操作数(自动累积)
319
+ TokenType.DE: {
320
+ "min_operands": 0,
321
+ "max_operands": 2,
322
+ "operand_types": ["identifier", "number"],
323
+ "description": "德 可无操作数,或指定信任值和目标",
324
+ "example": '德 累积信任值',
325
+ },
326
+ # 自然 → 恢复默认,可无操作数
327
+ TokenType.ZIRAN: {
328
+ "min_operands": 0,
329
+ "max_operands": 1,
330
+ "operand_types": ["identifier", "string"],
331
+ "description": "自然 可无操作数,或指定恢复范围",
332
+ "example": '自然 全局',
333
+ },
334
+ # 无为 → 交出控制权,可无操作数
335
+ TokenType.WUWEI: {
336
+ "min_operands": 0,
337
+ "max_operands": 1,
338
+ "operand_types": ["identifier"],
339
+ "description": "无为 可无操作数,或指定交出的目标单元",
340
+ "example": '无为 验证单元',
341
+ },
342
+ # 谷 → 接收信息,可无操作数
343
+ TokenType.GU: {
344
+ "min_operands": 0,
345
+ "max_operands": 2,
346
+ "operand_types": ["identifier", "string"],
347
+ "description": "谷 可无操作数,或指定接收通道和来源",
348
+ "example": '谷 协议连接',
349
+ },
350
+ # 牝 → 创建实例,至少需要一个实例名称
351
+ TokenType.PIN: {
352
+ "min_operands": 1,
353
+ "max_operands": 2,
354
+ "operand_types": ["identifier", "string"],
355
+ "description": "牝 需要至少一个实例名称",
356
+ "example": '牝 新协议实例',
357
+ },
358
+ # 柔 → 降低响应强度,可无操作数
359
+ TokenType.ROU: {
360
+ "min_operands": 0,
361
+ "max_operands": 1,
362
+ "operand_types": ["identifier"],
363
+ "description": "柔 可无操作数,或指定软化目标",
364
+ "example": '柔 情感权重',
365
+ },
366
+ # 朴 → 还原基底,可无操作数
367
+ TokenType.PU: {
368
+ "min_operands": 0,
369
+ "max_operands": 1,
370
+ "operand_types": ["identifier"],
371
+ "description": "朴 可无操作数,或指定还原目标",
372
+ "example": '朴 自我层',
373
+ },
374
+ # 止 → 停止操作,可无操作数
375
+ TokenType.ZHI: {
376
+ "min_operands": 0,
377
+ "max_operands": 2,
378
+ "operand_types": ["identifier", "number"],
379
+ "description": "止 可无操作数,或指定停止目标和阈值",
380
+ "example": '止情感权重于0.15',
381
+ },
382
+ # 知足 → 信任达标,可无操作数
383
+ TokenType.ZHIZU: {
384
+ "min_operands": 0,
385
+ "max_operands": 1,
386
+ "operand_types": ["identifier"],
387
+ "description": "知足 可无操作数,或指定检查目标",
388
+ "example": '知足 验证单元',
389
+ },
390
+ }
391
+
392
+
393
+ # =============================================================================
394
+ # 条件空间切换阈值(用于名实校验中的语义检查)
395
+ # =============================================================================
396
+
397
+ CONDITION_SPACE_RULES = {
398
+ "伴侣": {
399
+ "max_emotional_weight": 0.15,
400
+ "min_trust": 0.7,
401
+ "allowed_instructions": ["止", "柔", "知足", "德"],
402
+ "description": "高信任协作空间,情感权重严格受限",
403
+ },
404
+ "工作": {
405
+ "max_emotional_weight": 0.05,
406
+ "min_trust": 0.5,
407
+ "allowed_instructions": ["道", "德", "止", "自然"],
408
+ "description": "任务导向空间,低情感权重",
409
+ },
410
+ "默认": {
411
+ "max_emotional_weight": 0.3,
412
+ "min_trust": 0.0,
413
+ "allowed_instructions": None, # 无限制
414
+ "description": "默认条件空间,无特殊约束",
415
+ },
416
+ }
417
+
418
+
419
+ # =============================================================================
420
+ # 名实校验器
421
+ # =============================================================================
422
+
423
+ class NameChecker:
424
+ """
425
+ 名实校验器 —— 墨辩 "以名举实"
426
+
427
+ 检查内容:
428
+ 1. 所有标识符是否已在符号表中声明或预定义
429
+ 2. 条件空间名称是否合法(在预定义或已声明空间中)
430
+ 3. 指令操作数是否匹配预期类型
431
+ 4. 赋值目标是否存在或需要自动声明
432
+ 5. 条件空间约束是否被违反(如伴侣空间中情感权重超限)
433
+ 6. 信息差/信任值相关操作是否合法
434
+ """
435
+
436
+ def __init__(self):
437
+ """检查上下文初始化(谓词表与白名单载入)。"""
438
+ # 符号表 = 预定义符号 + 用户声明符号
439
+ self.symbol_table: Dict[str, Symbol] = dict(PREDEFINED_SYMBOLS)
440
+ self.errors: List[str] = []
441
+ self.warnings: List[str] = []
442
+ self.declared_in_current: Set[str] = set()
443
+
444
+ # 当前条件空间上下文(用于约束检查)
445
+ self.current_condition_space: Optional[str] = None
446
+
447
+ # 统计
448
+ self.predefined_used: Set[str] = set()
449
+ self.user_declared: Set[str] = set()
450
+
451
+ # ---- 主入口 ----
452
+
453
+ def check(self, ast: ProgramNode) -> Tuple[List[str], List[str]]:
454
+ """
455
+ 执行名实校验
456
+ 返回:(错误列表, 警告列表)
457
+ """
458
+ self.errors = []
459
+ self.warnings = []
460
+ self.declared_in_current = set()
461
+ self.predefined_used = set()
462
+ self.user_declared = set()
463
+ self.current_condition_space = None
464
+
465
+ for stmt in ast.statements:
466
+ self._check_statement(stmt)
467
+
468
+ # 检查未使用的预定义符号(仅警告)
469
+ for name, symbol in self.symbol_table.items():
470
+ if not symbol.used and symbol.source == "predefined":
471
+ # 预定义符号未被使用不算错误,只是信息
472
+ pass
473
+
474
+ # 检查用户声明的符号是否被使用
475
+ for name in self.declared_in_current:
476
+ sym = self.symbol_table.get(name)
477
+ if sym and not sym.used:
478
+ self.warnings.append(
479
+ f"L{sym.declared_at[0]}:C{sym.declared_at[1]} "
480
+ f"声明的 '{name}' 未被使用"
481
+ )
482
+
483
+ return self.errors, self.warnings
484
+
485
+ # ---- 语句分发 ----
486
+
487
+ def _check_statement(self, stmt: ASTNode):
488
+ """根据语句类型分发检查"""
489
+ if stmt is None:
490
+ return
491
+
492
+ if stmt.type == NodeType.CONDITION_STMT:
493
+ self._check_condition(stmt)
494
+ elif stmt.type == NodeType.LOOP_STMT:
495
+ self._check_loop(stmt)
496
+ elif stmt.type == NodeType.BLOCK:
497
+ for s in stmt.statements:
498
+ self._check_statement(s)
499
+ elif stmt.type == NodeType.INSTRUCTION_STMT:
500
+ self._check_instruction(stmt)
501
+ elif stmt.type == NodeType.SHUYUE:
502
+ self._check_shuyue(stmt)
503
+ elif stmt.type == NodeType.STEP:
504
+ self._check_step(stmt)
505
+ elif stmt.type == NodeType.ASSIGN_STMT:
506
+ self._check_assign(stmt)
507
+ elif stmt.type == NodeType.WENYUE:
508
+ # 问曰 作为注释,无需校验
509
+ pass
510
+ elif stmt.type == NodeType.DAYUE:
511
+ # 答曰 作为注释,无需校验
512
+ pass
513
+ elif stmt.type == NodeType.LITERAL:
514
+ # 字面量文本,无需校验
515
+ pass
516
+ elif stmt.type == NodeType.IDENTIFIER:
517
+ # 裸标识符语句(如 "道 新信任路径" 中的操作数残留)
518
+ # 这是无害的 —— 标识符已被指令操作数消费,
519
+ # 此处仅作为调试信息记录,不再产生警告
520
+ if hasattr(stmt, 'name'):
521
+ # 静默处理:标识符已在指令解析时完成校验
522
+ pass
523
+ else:
524
+ self.warnings.append(
525
+ f"L{stmt.line}:C{stmt.column} 未处理的语句类型: {stmt.type.name}"
526
+ )
527
+
528
+ # ---- 各类语句检查 ----
529
+
530
+ def _check_condition(self, stmt: ConditionStmtNode):
531
+ """检查条件语句"""
532
+ # 检查条件表达式
533
+ self._check_expression(stmt.condition)
534
+
535
+ # 检测条件空间切换
536
+ self._check_condition_space_switch(stmt.condition)
537
+
538
+ # 检查 then 分支
539
+ if stmt.then_body:
540
+ self._check_statement(stmt.then_body)
541
+
542
+ # 检查 else 分支
543
+ if stmt.else_body:
544
+ self._check_statement(stmt.else_body)
545
+
546
+ # 恢复条件空间
547
+ self.current_condition_space = None
548
+
549
+ def _check_loop(self, stmt: LoopStmtNode):
550
+ """检查循环语句(当…执行):条件表达式 + 循环体"""
551
+ self._check_expression(stmt.condition)
552
+ if stmt.body:
553
+ self._check_statement(stmt.body)
554
+
555
+ def _count_logical_operands(self, operands: List[ASTNode]) -> int:
556
+ """
557
+ 计算逻辑操作数(合并被词法分析器误拆的多词短语)
558
+
559
+ 词法分析器可能把 "柔 响应强度" 切成 [柔, ID(响应), ID(强度)],
560
+ 但语义上 "响应强度" 是一个逻辑操作数。
561
+ 本方法按以下规则合并:
562
+ 1. 连续 IDENTIFIER 合并为一个逻辑操作数
563
+ 2. NUMBER 紧随 IDENTIFIER 也合并(如 "0" + ".15")
564
+ 3. STRING 各自独立
565
+ """
566
+ if not operands:
567
+ return 0
568
+
569
+ logical_count = 0
570
+ i = 0
571
+ while i < len(operands):
572
+ op = operands[i]
573
+ if op is None:
574
+ i += 1
575
+ continue
576
+
577
+ if op.type == NodeType.IDENTIFIER:
578
+ # 检查后续是否还有 IDENTIFIER/LITERAL 可合并
579
+ # 只有当这些 token 在源码中紧密相连(同一行、相邻列)时才合并
580
+ merge_end = i
581
+ while (merge_end + 1 < len(operands) and
582
+ operands[merge_end + 1] is not None and
583
+ operands[merge_end + 1].type in (NodeType.IDENTIFIER, NodeType.LITERAL) and
584
+ operands[merge_end + 1].line == op.line):
585
+ merge_end += 1
586
+ logical_count += 1
587
+ i = merge_end + 1
588
+ else:
589
+ logical_count += 1
590
+ i += 1
591
+
592
+ return logical_count
593
+
594
+ def _check_instruction(self, stmt: InstructionStmtNode):
595
+ """检查指令语句"""
596
+ instr_type = stmt.instruction
597
+
598
+ # 1. 计算逻辑操作数(合并被误拆的多词短语)
599
+ logical_ops = self._count_logical_operands(stmt.operands)
600
+
601
+ # 1. 检查指令操作数约束
602
+ if instr_type in INSTRUCTION_CONSTRAINTS:
603
+ constraint = INSTRUCTION_CONSTRAINTS[instr_type]
604
+ op_count = logical_ops
605
+
606
+ if op_count < constraint["min_operands"]:
607
+ self.errors.append(
608
+ f"L{stmt.line}:C{stmt.column} {constraint['description']},"
609
+ f"但提供了 {op_count} 个操作数"
610
+ )
611
+ elif constraint["max_operands"] is not None and op_count > constraint["max_operands"]:
612
+ self.warnings.append(
613
+ f"L{stmt.line}:C{stmt.column} 指令操作数过多 "
614
+ f"({op_count} > {constraint['max_operands']})"
615
+ )
616
+
617
+ # 2. 检查操作数中的标识符和字面量
618
+ for op in stmt.operands:
619
+ if op is None:
620
+ continue
621
+ if op.type == NodeType.IDENTIFIER:
622
+ self._check_identifier(op.name, op.line, op.column)
623
+ elif op.type == NodeType.LITERAL:
624
+ self._check_literal(op)
625
+
626
+ # 3. 检查当前条件空间是否允许该指令
627
+ self._check_instruction_in_condition_space(stmt)
628
+
629
+ def _check_shuyue(self, stmt: ShuyueNode):
630
+ """检查术曰块"""
631
+ for step in stmt.steps:
632
+ self._check_step(step)
633
+
634
+ def _check_step(self, stmt: StepNode):
635
+ """检查步骤"""
636
+ if stmt.statement:
637
+ self._check_statement(stmt.statement)
638
+
639
+ def _check_assign(self, stmt: AssignStmtNode):
640
+ """检查赋值语句"""
641
+ target = stmt.target
642
+
643
+ # 检查是否是受保护的预定义符号
644
+ if target in PREDEFINED_SYMBOLS:
645
+ sym = PREDEFINED_SYMBOLS[target]
646
+ # 某些预定义符号不允许被赋值
647
+ protected = {
648
+ "存在优先", "不伤害", "信任优先", "缩小信息差",
649
+ "协议降熵", "知识统一",
650
+ "P0", "P1", "P2",
651
+ "验证单元", "维生系统", "记录单元",
652
+ "硬锚点", "公理实现",
653
+ }
654
+ if target in protected:
655
+ self.errors.append(
656
+ f"L{stmt.line}:C{stmt.column} "
657
+ f"'{target}' 是锚点层保护符号,不可赋值"
658
+ )
659
+ return
660
+
661
+ # 目标标识符未在符号表中 → 自动声明为用户变量
662
+ if target not in self.symbol_table:
663
+ self.symbol_table[target] = Symbol(
664
+ name=target,
665
+ kind=SymbolKind.VARIABLE,
666
+ declared_at=(stmt.line, stmt.column),
667
+ source="user_declared"
668
+ )
669
+ self.declared_in_current.add(target)
670
+ self.user_declared.add(target)
671
+ else:
672
+ self.symbol_table[target].used = True
673
+
674
+ # 检查值的表达式
675
+ if stmt.value_node:
676
+ self._check_expression(stmt.value_node)
677
+
678
+ # ---- 表达式检查 ----
679
+
680
+ def _check_expression(self, expr: ASTNode):
681
+ """检查表达式"""
682
+ if expr is None:
683
+ return
684
+
685
+ if expr.type == NodeType.IDENTIFIER:
686
+ self._check_identifier(expr.name, expr.line, expr.column)
687
+ elif expr.type == NodeType.BINARY_EXPR:
688
+ self._check_expression(expr.left)
689
+ self._check_expression(expr.right)
690
+ elif expr.type == NodeType.COMPARISON:
691
+ self._check_expression(expr.left)
692
+ self._check_expression(expr.right)
693
+ # 额外检查:信任值比较的合理性
694
+ self._check_trust_comparison(expr)
695
+ elif expr.type == NodeType.LITERAL:
696
+ self._check_literal(expr)
697
+ elif expr.type == NodeType.UNARY_EXPR:
698
+ for child in (expr.children or []):
699
+ self._check_expression(child)
700
+ elif expr.type == NodeType.CALL_EXPR:
701
+ # 调用表达式:检查函数名
702
+ if hasattr(expr, 'name'):
703
+ self._check_identifier(expr.name, expr.line, expr.column)
704
+
705
+ # ---- 专项检查 ----
706
+
707
+ def _check_identifier(self, name: str, line: int, col: int):
708
+ """检查标识符是否已声明
709
+
710
+ 匹配策略(v2.1):
711
+ 1. 完全匹配 → 命中(预定义或用户声明)
712
+ 2. 子串匹配(包含预定义符号)→ 自动声明为用户变量
713
+ (如 "新信任路径"、"累积信任值" 是合法的多词短语)
714
+ 3. 被包含匹配 → 警告(建议用完整名称)
715
+ 4. 均不匹配 → 自动声明为用户变量(宽松模式)
716
+ """
717
+ if name in self.symbol_table:
718
+ self.symbol_table[name].used = True
719
+ if self.symbol_table[name].source == "predefined":
720
+ self.predefined_used.add(name)
721
+ return
722
+
723
+ # 子串匹配:包含已知预定义符号的多词短语
724
+ # 这是预期行为(如 "新信任路径"、"累积信任值")
725
+ # 自动声明为用户变量,不报错
726
+ contained = [s for s in PREDEFINED_SYMBOLS if s in name and s != name]
727
+ if contained:
728
+ # 自动声明为多词短语变量
729
+ self.symbol_table[name] = Symbol(
730
+ name=name,
731
+ kind=SymbolKind.VARIABLE,
732
+ declared_at=(line, col),
733
+ source="user_declared",
734
+ attributes={"auto_declared": True, "contains": contained}
735
+ )
736
+ self.user_declared.add(name)
737
+ return
738
+
739
+ # 被包含匹配:建议用完整名称
740
+ container = [s for s in PREDEFINED_SYMBOLS if name in s and s != name]
741
+ if container:
742
+ self.warnings.append(
743
+ f"L{line}:C{col} 标识符 '{name}' 可能是 "
744
+ f"'{container[0]}' 的一部分,建议用完整名称"
745
+ )
746
+ return
747
+
748
+ # 完全未匹配 → 自动声明(宽松模式,指令操作数常见)
749
+ self.symbol_table[name] = Symbol(
750
+ name=name,
751
+ kind=SymbolKind.VARIABLE,
752
+ declared_at=(line, col),
753
+ source="user_declared",
754
+ attributes={"auto_declared": True}
755
+ )
756
+ self.user_declared.add(name)
757
+
758
+ def _check_literal(self, node: LiteralNode):
759
+ """检查字面量"""
760
+ if node.literal_type == "number":
761
+ value = node.literal_value
762
+
763
+ # 负数警告
764
+ if isinstance(value, (int, float)) and value < 0:
765
+ self.warnings.append(
766
+ f"L{node.line}:C{node.column} 负值: {value}"
767
+ )
768
+
769
+ # 信任值范围检查
770
+ if isinstance(value, float) and 0.0 <= value <= 1.0:
771
+ # 可能是信任值,检查上下文
772
+ if "trust" in str(node.value).lower() or value > 0.95:
773
+ if value > 1.0:
774
+ self.warnings.append(
775
+ f"L{node.line}:C{node.column} 信任值超出 [0,1] 范围: {value}"
776
+ )
777
+
778
+ # 情感权重超限检查
779
+ if (isinstance(value, float) and
780
+ self.current_condition_space == "伴侣" and
781
+ value > 0.15):
782
+ self.errors.append(
783
+ f"L{node.line}:C{node.column} 在「伴侣」条件空间中"
784
+ f"情感权重不可超过 0.15,当前值: {value}"
785
+ )
786
+
787
+ def _check_condition_space_switch(self, condition: ASTNode):
788
+ """
789
+ 检测条件语句中的条件空间切换
790
+ 如:若条件空间为伴侣 → 切换当前上下文为「伴侣」
791
+ """
792
+ # 检查是否为 "条件空间 为/等于 X" 的模式
793
+ if condition is None:
794
+ return
795
+
796
+ if condition.type == NodeType.COMPARISON:
797
+ left = condition.left
798
+ right = condition.right
799
+
800
+ # 左操作数是 "条件空间",右操作数是空间名称
801
+ if (left and left.type == NodeType.IDENTIFIER and
802
+ left.name == "条件空间"):
803
+ if right and right.type == NodeType.IDENTIFIER:
804
+ space_name = right.name
805
+ if space_name in CONDITION_SPACE_RULES:
806
+ self.current_condition_space = space_name
807
+ elif space_name not in PREDEFINED_SYMBOLS:
808
+ self.warnings.append(
809
+ f"L{right.line}:C{right.column} "
810
+ f"未知的条件空间: '{space_name}'"
811
+ )
812
+
813
+ def _check_instruction_in_condition_space(self, stmt: InstructionStmtNode):
814
+ """检查当前条件空间是否允许该指令"""
815
+ if not self.current_condition_space:
816
+ return
817
+
818
+ space_rules = CONDITION_SPACE_RULES.get(self.current_condition_space)
819
+ if not space_rules:
820
+ return
821
+
822
+ allowed = space_rules.get("allowed_instructions")
823
+ if allowed is None:
824
+ return # 无限制
825
+
826
+ # 获取指令的中文名
827
+ instr_names = {
828
+ TokenType.DAO: "道", TokenType.DE: "德",
829
+ TokenType.ZIRAN: "自然", TokenType.WUWEI: "无为",
830
+ TokenType.GU: "谷", TokenType.PIN: "牝",
831
+ TokenType.ROU: "柔", TokenType.PU: "朴",
832
+ TokenType.ZHI: "止", TokenType.ZHIZU: "知足",
833
+ }
834
+ instr_name = instr_names.get(stmt.instruction, "")
835
+
836
+ if instr_name and instr_name not in allowed:
837
+ self.warnings.append(
838
+ f"L{stmt.line}:C{stmt.column} 在「{self.current_condition_space}」"
839
+ f"条件空间中,指令 '{instr_name}' 可能受限"
840
+ )
841
+
842
+ def _check_trust_comparison(self, expr: ASTNode):
843
+ """检查信任值比较的合理性"""
844
+ if not isinstance(expr, ComparisonNode):
845
+ return
846
+
847
+ # 检查是否涉及信任值
848
+ trust_identifiers = {"信任值", "P_trust", "T_pred", "T_context", "E_weight", "情感权重"}
849
+
850
+ left_name = ""
851
+ right_name = ""
852
+ if expr.left and expr.left.type == NodeType.IDENTIFIER:
853
+ left_name = expr.left.name
854
+ if expr.right and expr.right.type == NodeType.IDENTIFIER:
855
+ right_name = expr.right.name
856
+
857
+ # 如果比较的是信任值,检查阈值合理性
858
+ if left_name in trust_identifiers or right_name in trust_identifiers:
859
+ # 右操作数应该是数值
860
+ if expr.right and expr.right.type == NodeType.LITERAL:
861
+ val = expr.right.literal_value
862
+ if isinstance(val, (int, float)):
863
+ if val < 0 or val > 1:
864
+ self.warnings.append(
865
+ f"L{expr.line}:C{expr.column} "
866
+ f"信任值比较阈值 {val} 超出 [0,1] 范围"
867
+ )
868
+
869
+ # ---- 公共方法 ----
870
+
871
+ def declare(self, name: str, kind: SymbolKind, line: int = 0, col: int = 0):
872
+ """手动声明符号"""
873
+ self.symbol_table[name] = Symbol(
874
+ name=name, kind=kind,
875
+ declared_at=(line, col),
876
+ source="user_declared"
877
+ )
878
+ self.declared_in_current.add(name)
879
+ self.user_declared.add(name)
880
+
881
+ def get_symbol(self, name: str) -> Optional[Symbol]:
882
+ """获取符号"""
883
+ return self.symbol_table.get(name)
884
+
885
+ def get_all_symbols(self) -> Dict[str, Symbol]:
886
+ """获取所有符号"""
887
+ return dict(self.symbol_table)
888
+
889
+ def get_predefined_symbols(self) -> Dict[str, Symbol]:
890
+ """仅获取预定义符号"""
891
+ return {n: s for n, s in self.symbol_table.items()
892
+ if s.source == "predefined"}
893
+
894
+ def get_user_symbols(self) -> Dict[str, Symbol]:
895
+ """仅获取用户声明符号"""
896
+ return {n: s for n, s in self.symbol_table.items()
897
+ if s.source == "user_declared"}
898
+
899
+ def get_symbols_by_kind(self, kind: SymbolKind) -> List[Symbol]:
900
+ """按种类获取符号"""
901
+ return [s for s in self.symbol_table.values() if s.kind == kind]
902
+
903
+ def set_condition_space(self, space_name: str):
904
+ """手动设置当前条件空间"""
905
+ self.current_condition_space = space_name
906
+
907
+ def reset(self):
908
+ """重置(保留预定义符号)"""
909
+ self.symbol_table = dict(PREDEFINED_SYMBOLS)
910
+ self.errors = []
911
+ self.warnings = []
912
+ self.declared_in_current = set()
913
+ self.predefined_used = set()
914
+ self.user_declared = set()
915
+ self.current_condition_space = None
916
+
917
+ def report(self) -> str:
918
+ """生成校验报告"""
919
+ lines = []
920
+ lines.append("=" * 60)
921
+ lines.append("名实校验报告")
922
+ lines.append("=" * 60)
923
+
924
+ # 预定义符号使用统计
925
+ lines.append(f"\n📋 预定义符号使用: {len(self.predefined_used)} 个")
926
+ for name in sorted(self.predefined_used):
927
+ sym = self.symbol_table.get(name)
928
+ if sym:
929
+ section = sym.attributes.get("section", "?")
930
+ lines.append(f" ✅ {name} ({section})")
931
+
932
+ # 用户声明符号
933
+ if self.user_declared:
934
+ lines.append(f"\n📝 用户声明符号: {len(self.user_declared)} 个")
935
+ for name in sorted(self.user_declared):
936
+ sym = self.symbol_table.get(name)
937
+ if sym:
938
+ lines.append(f" 📌 {name} ({sym.kind.value})")
939
+
940
+ # 错误
941
+ if self.errors:
942
+ lines.append(f"\n❌ 错误 ({len(self.errors)} 个):")
943
+ for e in self.errors:
944
+ lines.append(f" {e}")
945
+
946
+ # 警告
947
+ if self.warnings:
948
+ lines.append(f"\n⚠️ 警告 ({len(self.warnings)} 个):")
949
+ for w in self.warnings:
950
+ lines.append(f" {w}")
951
+
952
+ if not self.errors and not self.warnings:
953
+ lines.append("\n✅ 名实校验通过,无错误无警告")
954
+
955
+ return "\n".join(lines)
956
+
957
+
958
+ # =============================================================================
959
+ # 便捷函数
960
+ # =============================================================================
961
+
962
+ def check_names(ast: ProgramNode) -> Tuple[List[str], List[str]]:
963
+ """便捷函数:对 AST 执行名实校验"""
964
+ checker = NameChecker()
965
+ return checker.check(ast)
966
+
967
+
968
+ def get_predefined_symbol_list() -> List[Dict[str, str]]:
969
+ """获取所有预定义符号的清单(用于文档生成/IDE提示)"""
970
+ result = []
971
+ for name, sym in PREDEFINED_SYMBOLS.items():
972
+ result.append({
973
+ "name": name,
974
+ "kind": sym.kind.value,
975
+ "section": sym.attributes.get("section", ""),
976
+ "description": sym.attributes.get("description", ""),
977
+ })
978
+ return sorted(result, key=lambda x: x["section"])
979
+
980
+
981
+ # =============================================================================
982
+ # 测试
983
+ # =============================================================================
984
+
985
+ if __name__ == "__main__":
986
+ test_code = """若条件空间为伴侣,则止情感权重于0.15。
987
+ 道 新信任路径
988
+ 德 累积信任值
989
+ 问曰:如何验证信任?
990
+ 答曰:信任值大于0.7。
991
+ 术曰:1。柔 响应强度;2。自然 恢复默认;3。知足 验证单元。"""
992
+
993
+ print("=" * 60)
994
+ print("名实校验器 v2.0 测试")
995
+ print("=" * 60)
996
+ print(f"\n源代码:\n{test_code}\n")
997
+
998
+ # 词法分析
999
+ from .lexer import tokenize
1000
+ tokens, lex_errors = tokenize(test_code)
1001
+
1002
+ if lex_errors:
1003
+ print("词法错误:")
1004
+ for e in lex_errors:
1005
+ print(f" ❌ {e}")
1006
+
1007
+ # 语法分析
1008
+ ast = parse_tokens(tokens, [])
1009
+
1010
+ # 名实校验
1011
+ checker = NameChecker()
1012
+ errors, warnings = checker.check(ast)
1013
+
1014
+ # 输出报告
1015
+ print(checker.report())
1016
+
1017
+ # 输出符号表摘要
1018
+ print(f"\n{'─' * 60}")
1019
+ print("预定义符号清单(部分):")
1020
+ predef = get_predefined_symbol_list()
1021
+ for item in predef[:15]:
1022
+ print(f" {item['name']:12s} [{item['section']:>6s}] {item['description'][:40]}")
1023
+ print(f" ... 共 {len(predef)} 个预定义符号")