@furongjun1999/dsh-memory 0.4.11 → 0.5.1
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.
- package/README.md +552 -465
- package/codebuddy/CODEBUDDY.md +11 -3
- package/codebuddy/README.md +92 -90
- package/codebuddy/mcp.json +27 -27
- 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
- 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
- package/docs/README.md +143 -111
- package/docs/discipline/harnesses.yaml +244 -226
- package/docs/discipline/templates/full.md.tmpl +61 -61
- package/docs/discipline/templates/rules.mdc.tmpl +68 -0
- package/docs/discipline/templates/skill.md.tmpl +23 -23
- 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
- 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
- package/docs/eval/bench_lingshu_self/bench_self.py +140 -0
- package/docs/eval/bench_lingshu_self/self_bench_result.json +404 -0
- package/docs/eval/bench_lingshu_self//347/201/265/346/236/242/350/207/252/345/272/223/347/253/257/345/210/260/347/253/257/346/243/200/347/264/242/345/256/236/346/265/213_v1.0.md +38 -0
- package/docs/eval//344/270/215/345/217/257/351/235/240/346/200/247/350/220/275/345/234/260_P0_v1.0.md +185 -0
- 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
- package/docs/eval//346/225/205/351/232/234/346/263/250/345/205/245/345/256/236/346/265/213_v1.0.md +422 -0
- 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
- package/docs/eval//347/253/257/345/210/260/347/253/257LoCoMoQA/345/220/214/345/217/243/345/276/204/345/257/271/347/205/247_v1.0.md +100 -0
- package/docs/eval//347/253/257/345/210/260/347/253/257/345/271/262/346/211/260/346/261/240/350/257/204/346/265/213_/347/241/256/345/256/232/346/200/247/350/243/201/345/206/263vsLLM_judge_v1.1.md +197 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v1.md +156 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v10.md +210 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v11.md +227 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v12.md +203 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v13.md +233 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v14.md +191 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v15.md +213 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v16.md +214 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v17.md +199 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v2.md +156 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v3.md +152 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v4.md +128 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v5.md +114 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v6.md +192 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v7.md +187 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v8.md +207 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v9.md +203 -0
- 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
- 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
- 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
- package/docs/hive//345/256/211/345/205/250/345/256/241/350/256/241/345/256/236/351/224/232_v0.1.md +202 -0
- 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
- 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
- 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
- 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
- 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 +519 -503
- 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
- 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
- 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
- package/docs/images/lingshu-moonlight-covenant-poster-preview.jpg +0 -0
- package/docs/images/lingshu-moonlight-covenant-poster.png +0 -0
- 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
- package/docs/mdcg/README/350/257/246/347/273/206/347/211/210_v0.4.10.md +646 -646
- package/docs/mdcg/lingshu_tutorial.html +14449 -14449
- package/docs/mdcg/release_v0.4.11.md +49 -0
- package/docs/mdcg/release_v0.4.5.md +55 -55
- package/docs/mdcg/tool_table_v0.3.0.md +117 -117
- 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
- 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
- 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
- package/docs/mdcg//345/217/221/345/270/203/351/227/250/347/246/201/351/223/276_v0.1.md +54 -0
- 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
- 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
- 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
- package/docs/mdcg//347/274/272/345/217/243/345/215/225_P0/346/224/266/345/217/243_v0.1.md +270 -270
- 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
- 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
- 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
- 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
- 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
- package/docs/swarm//350/234/202/347/276/244/344/272/222/350/201/224_v0.1.md +704 -704
- 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
- package/docs/theory//344/270/215/345/217/257/351/235/240/345/256/232/347/220/206/344/270/216/345/244/261/346/225/210/344/274/230/345/205/210/346/241/206/346/236/266_v0.3.md +365 -0
- 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
- 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
- package/docs/theory//346/231/272/350/203/275/350/256/2723.4.md +5260 -5260
- 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
- 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
- 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
- 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
- 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
- package/docs//344/270/215/345/217/257/351/235/240/346/200/247/347/220/206/350/256/272_v0.1.md +343 -0
- 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
- 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
- package/dsh/README.md +82 -82
- package/dsh/cordis.yml.example +139 -139
- package/dsh/update-lingshu.bat +11 -11
- package/lib/bridge.d.ts +9 -0
- package/lib/bridge.js +35 -0
- package/lib/hooks.js +36 -2
- package/lib/index.js +7 -1
- package/lib/lib/roleplay_web.js +116 -29
- package/lib/lib/token_store.d.ts +7 -1
- package/lib/lib/token_store.js +12 -3
- package/md_cg/__init__.py +7 -7
- package/md_cg/audit.py +379 -368
- package/md_cg/autonomy.py +287 -287
- package/md_cg/backfill.py +1328 -1327
- package/md_cg/backfill_bigdomain.py +34 -34
- package/md_cg/backfill_bucket_zh.py +35 -0
- package/md_cg/bench6_arms.py +410 -410
- package/md_cg/bench6_common.py +230 -230
- package/md_cg/bench6_competitors.py +212 -212
- package/md_cg/bench_axis_domain.py +257 -257
- package/md_cg/bench_blind_comp.py +308 -308
- package/md_cg/bench_e2e_judge.py +532 -0
- package/md_cg/bench_e2e_locomo_qa.py +368 -0
- package/md_cg/bench_e2e_qa.py +256 -0
- package/md_cg/bench_en_atoms_public.py +230 -230
- package/md_cg/bench_governance.py +348 -348
- package/md_cg/bench_lme_zh.py +410 -410
- package/md_cg/bench_locomo.py +121 -121
- package/md_cg/bench_locomo_zh.py +450 -450
- package/md_cg/bench_locomo_zh_public.py +147 -147
- package/md_cg/bench_longmem.py +112 -112
- package/md_cg/bench_membench.py +632 -632
- package/md_cg/bench_p0.py +149 -149
- package/md_cg/bench_progressive.py +287 -287
- package/md_cg/bench_role_views.py +238 -238
- package/md_cg/bench_task_ab.py +243 -243
- package/md_cg/bench_task_ab_llm.py +408 -408
- package/md_cg/bench_unified_en.py +204 -204
- package/md_cg/bench_zh_mad.py +601 -601
- package/md_cg/blindspot_tickets.py +123 -123
- package/md_cg/branches.py +301 -285
- package/md_cg/build_postings.py +73 -73
- package/md_cg/ccgc.py +1006 -948
- package/md_cg/census.py +132 -132
- package/md_cg/chain.py +315 -300
- package/md_cg/codeindex.py +531 -531
- package/md_cg/coldverify.py +292 -292
- package/md_cg/comment_gate.py +337 -337
- package/md_cg/cond_compose.py +190 -190
- package/md_cg/cond_facts.py +154 -154
- package/md_cg/cond_template.json +106 -106
- package/md_cg/condition_anchor.py +142 -142
- package/md_cg/conformance.py +726 -726
- package/md_cg/consistency.py +717 -717
- package/md_cg/consolidate.py +1537 -1439
- package/md_cg/corpus.py +110 -110
- package/md_cg/crosscheck.py +1098 -1097
- package/md_cg/crypto.py +3 -1
- package/md_cg/d_meta.py +310 -310
- package/md_cg/datapath.py +78 -18
- package/md_cg/docindex.py +473 -473
- package/md_cg/eval_common.py +575 -575
- package/md_cg/evidence.py +4 -2
- package/md_cg/evolution.py +477 -477
- package/md_cg/export.py +222 -220
- package/md_cg/forgetting.py +581 -581
- package/md_cg/fsutil.py +377 -329
- package/md_cg/hotcache.py +48 -7
- package/md_cg/hyperedge.py +251 -251
- package/md_cg/identity.py +390 -390
- package/md_cg/insight.py +500 -500
- package/md_cg/interop.py +338 -0
- package/md_cg/judgment_manifest.py +177 -0
- package/md_cg/lexicon/build_cedict_en_zh.py +329 -329
- package/md_cg/lexicon/build_standard_en.py +171 -171
- package/md_cg/lexicon/expand_en_zh.py +211 -211
- package/md_cg/lifecycle.py +272 -272
- package/md_cg/linkref.py +280 -280
- package/md_cg/links.py +140 -107
- package/md_cg/mcp_server.py +403 -55
- package/md_cg/md_whitebox.py +345 -345
- package/md_cg/mdcg.py +783 -233
- package/md_cg/mdcos.py +500 -70
- package/md_cg/metacognition.py +591 -591
- package/md_cg/migrate.py +119 -119
- package/md_cg/migrate_aeis.py +221 -221
- package/md_cg/migrate_roleplay.py +293 -293
- package/md_cg/migrate_wisdom_graph.py +360 -360
- package/md_cg/mreview/__init__.py +25 -25
- package/md_cg/mreview/__main__.py +110 -110
- package/md_cg/mreview/bundle.py +178 -178
- package/md_cg/mreview/candidates.py +262 -262
- package/md_cg/mreview/govern.py +694 -693
- package/md_cg/mreview/locate.py +939 -939
- package/md_cg/mreview/pipeline.py +728 -728
- package/md_cg/mreview/rules/duplication.json +21 -21
- package/md_cg/mreview/rules/field_coverage.json +54 -54
- package/md_cg/mreview/rules/source_license.json +21 -21
- package/md_cg/mreview/rules/template_flow.json +21 -21
- package/md_cg/mreview/ruleset.py +252 -252
- package/md_cg/nodefile.py +575 -575
- package/md_cg/pooling.py +484 -472
- package/md_cg/postings.py +300 -298
- package/md_cg/predict.py +1100 -1100
- package/md_cg/progressive.py +123 -123
- package/md_cg/protect.py +272 -272
- package/md_cg/protocol/md_cg_gate.proto +33 -33
- package/md_cg/protocol.py +372 -372
- package/md_cg/provenance.py +582 -582
- package/md_cg/reach.py +453 -453
- package/md_cg/readcache.py +143 -0
- package/md_cg/reconcile.py +228 -0
- package/md_cg/refindex.py +833 -833
- package/md_cg/refine.py +604 -604
- package/md_cg/review_cli.py +170 -0
- package/md_cg/roleviews.py +89 -89
- package/md_cg/routing.py +393 -365
- package/md_cg/run_tests.py +211 -0
- package/md_cg/scrub.py +13 -3
- package/md_cg/security.py +128 -18
- package/md_cg/self_state.py +1029 -1029
- package/md_cg/selfreport.py +152 -151
- package/md_cg/semantic/__init__.py +10 -10
- package/md_cg/semantic/canonical.py +122 -122
- package/md_cg/semantic/en_normalizer.py +364 -364
- package/md_cg/semantic/en_zh_map.json +28694 -0
- package/md_cg/semantic/export_en_zh_map.py +64 -0
- package/md_cg/semantic/unify.py +45 -0
- package/md_cg/semantic/zh_en_atoms.py +139 -139
- package/md_cg/signer.py +7 -4
- package/md_cg/sources.py +816 -582
- package/md_cg/statushdr.py +179 -179
- package/md_cg/stg.py +54 -37
- package/md_cg/subgraph.py +729 -729
- package/md_cg/sustain.py +35 -5
- package/md_cg/tasks.py +470 -470
- package/md_cg/test_access_hints.py +147 -0
- package/md_cg/test_action_derive.py +203 -203
- package/md_cg/test_audit_rotate.py +270 -270
- package/md_cg/test_autonomy.py +143 -143
- package/md_cg/test_bench_governance.py +102 -102
- package/md_cg/test_blindspot_tickets.py +166 -166
- package/md_cg/test_branch_discard_tombstone.py +136 -0
- package/md_cg/test_branches.py +13 -3
- package/md_cg/test_ccg_perturb.py +184 -184
- package/md_cg/test_ccgc.py +433 -433
- package/md_cg/test_census_prune.py +81 -81
- package/md_cg/test_chain_read_isolate.py +168 -0
- package/md_cg/test_cond_compose_anchors.py +76 -76
- package/md_cg/test_cond_match.py +165 -165
- package/md_cg/test_condition_anchor.py +81 -81
- package/md_cg/test_d_meta.py +412 -412
- package/md_cg/test_datapath_device_name.py +203 -0
- package/md_cg/test_datapath_root.py +199 -199
- package/md_cg/test_emit_negtail_cache.py +156 -0
- package/md_cg/test_en_pipeline.py +22 -2
- package/md_cg/test_gain_gate.py +212 -212
- package/md_cg/test_govern_directread.py +421 -0
- package/md_cg/test_health_scale.py +173 -173
- package/md_cg/test_hive_ingest.py +285 -0
- package/md_cg/test_hot_cold.py +215 -215
- package/md_cg/test_hyperedge.py +245 -245
- package/md_cg/test_i26_empty_first_write.py +116 -0
- package/md_cg/test_i27_e041_identity.py +128 -0
- package/md_cg/test_i28_hotcache_prodpath.py +122 -0
- package/md_cg/test_i32_hotcache_env_key.py +218 -0
- package/md_cg/test_identity_attribution.py +96 -15
- package/md_cg/test_index_durability.py +17 -3
- package/md_cg/test_interop.py +95 -0
- package/md_cg/test_interop_judgment.py +228 -0
- package/md_cg/test_issue39_utf8_stdio.py +273 -0
- package/md_cg/test_lifecycle.py +309 -309
- package/md_cg/test_linkref.py +306 -306
- package/md_cg/test_links_concurrent_write.py +188 -0
- package/md_cg/test_lock.py +43 -43
- package/md_cg/test_md_access_parity.py +255 -255
- package/md_cg/test_md_writepath.py +345 -345
- package/md_cg/test_mdstore_search_parity.py +160 -0
- package/md_cg/test_merge_upsert.py +168 -0
- package/md_cg/test_mr_m2.py +587 -587
- package/md_cg/test_mr_m3.py +710 -710
- package/md_cg/test_mr_m4.py +485 -485
- package/md_cg/test_n123_derive_expiry_chain.py +205 -0
- package/md_cg/test_n130_verify_falsified_protect.py +185 -0
- package/md_cg/test_n131_merge_gate.py +205 -0
- package/md_cg/test_p0.py +250 -250
- package/md_cg/test_p1.py +316 -316
- package/md_cg/test_p10_identity.py +173 -173
- package/md_cg/test_p11_consistency.py +233 -233
- package/md_cg/test_p12_metacognition.py +212 -212
- package/md_cg/test_p13_encryption.py +241 -241
- package/md_cg/test_p14_sustain.py +249 -249
- package/md_cg/test_p15_scrub.py +280 -280
- package/md_cg/test_p16_self_state.py +301 -301
- package/md_cg/test_p17_predict.py +354 -354
- package/md_cg/test_p18_whitebox.py +171 -171
- package/md_cg/test_p19_migrate_roleplay.py +149 -149
- package/md_cg/test_p1x_ref_root.py +160 -0
- package/md_cg/test_p20_evolution.py +315 -315
- package/md_cg/test_p21_tokens.py +293 -270
- package/md_cg/test_p22_theory.py +175 -175
- package/md_cg/test_p23_links.py +311 -311
- package/md_cg/test_p24_evidence.py +227 -227
- package/md_cg/test_p25_weights.py +156 -156
- package/md_cg/test_p26_refindex.py +416 -416
- package/md_cg/test_p27_docindex.py +16 -7
- package/md_cg/test_p28_refcheck.py +305 -305
- package/md_cg/test_p29_session_ingest_export.py +354 -333
- package/md_cg/test_p2_mcp.py +3 -0
- package/md_cg/test_p3.py +11 -2
- package/md_cg/test_p30_maintain.py +330 -330
- package/md_cg/test_p31_insight.py +534 -534
- package/md_cg/test_p32_backfill.py +7 -1
- package/md_cg/test_p33_ccg_wiring.py +293 -293
- package/md_cg/test_p34_crosscheck.py +331 -331
- package/md_cg/test_p35_conditioned_claim.py +252 -252
- package/md_cg/test_p36_kp_align.py +230 -230
- package/md_cg/test_p37_condition_space.py +248 -248
- package/md_cg/test_p38_concurrent_flush.py +102 -0
- package/md_cg/test_p38_contextualize.py +273 -273
- package/md_cg/test_p39_verify_flow.py +153 -0
- package/md_cg/test_p39_vision_evidence.py +369 -369
- package/md_cg/test_p40_refine_worklist.py +241 -241
- package/md_cg/test_p41_evolve_patrol.py +224 -224
- package/md_cg/test_p42_provenance.py +269 -269
- package/md_cg/test_p43_pooling.py +412 -398
- package/md_cg/test_p44_md_whitebox.py +231 -231
- package/md_cg/test_p45_session_identity.py +219 -219
- package/md_cg/test_p46_unit_scope.py +272 -272
- package/md_cg/test_p47_session_view.py +316 -0
- package/md_cg/test_p4_fuzzy.py +223 -223
- package/md_cg/test_p5_semantic.py +226 -226
- package/md_cg/test_p6_consolidate.py +440 -387
- package/md_cg/test_p7_goals_recent.py +202 -202
- package/md_cg/test_p8_subgraph_chain.py +200 -200
- package/md_cg/test_p9_forget_protect.py +231 -231
- package/md_cg/test_predict_beta.py +135 -135
- package/md_cg/test_preflight_failclosed.py +100 -100
- package/md_cg/test_progressive.py +146 -146
- package/md_cg/test_propose_tail_index.py +157 -0
- package/md_cg/test_protocol.py +243 -243
- package/md_cg/test_reach.py +378 -378
- package/md_cg/test_reach_keys.py +201 -201
- package/md_cg/test_read_clip.py +141 -141
- package/md_cg/test_read_scope_b27.py +277 -0
- package/md_cg/test_readcache_default_on.py +168 -0
- package/md_cg/test_readcache_precise_inval.py +270 -0
- package/md_cg/test_readcache_prodpath.py +203 -0
- package/md_cg/test_reconcile_v0.py +294 -0
- package/md_cg/test_retr_gates_prodpath.py +140 -0
- package/md_cg/test_retr_s1.py +344 -340
- package/md_cg/test_retr_s1b.py +276 -209
- package/md_cg/test_retr_s3.py +194 -194
- package/md_cg/test_retr_s4.py +163 -163
- package/md_cg/test_retr_s5.py +200 -200
- package/md_cg/test_retr_s6.py +157 -157
- package/md_cg/test_retr_s7.py +392 -384
- package/md_cg/test_retr_s8_time.py +369 -316
- package/md_cg/test_retr_s9_edges.py +286 -286
- package/md_cg/test_retr_s9_entity_ctx.py +9 -3
- package/md_cg/test_retr_score_once.py +208 -0
- package/md_cg/test_review_conformance.py +367 -367
- package/md_cg/test_review_onepass.py +170 -0
- package/md_cg/test_role_views.py +354 -354
- package/md_cg/test_rrf_graph_seed_cache.py +154 -0
- package/md_cg/test_security_audit.py +155 -0
- package/md_cg/test_security_audit_b26.py +161 -0
- package/md_cg/test_security_audit_v21.py +250 -0
- package/md_cg/test_sem_noise.py +242 -242
- package/md_cg/test_semantic_canonical.py +16 -2
- package/md_cg/test_session_isolation.py +168 -0
- package/md_cg/test_snapshot_autoclose.py +187 -0
- package/md_cg/test_subproc_encoding.py +192 -192
- package/md_cg/test_sustain_mutual.py +153 -153
- package/md_cg/test_tail_watermark_race.py +208 -0
- package/md_cg/test_tasks.py +409 -409
- package/md_cg/test_tenant_env_override_warn.py +139 -0
- package/md_cg/test_tenant_registry_corrupt_warn.py +151 -0
- package/md_cg/test_tool_face.py +189 -189
- package/md_cg/test_transfer.py +180 -180
- package/md_cg/test_trust.py +361 -361
- package/md_cg/test_twophase.py +286 -286
- package/md_cg/test_v14_fixes.py +38 -20
- package/md_cg/test_validity_filter.py +280 -280
- package/md_cg/test_verify_answer.py +138 -138
- package/md_cg/test_verify_dirty_reconcile.py +157 -0
- package/md_cg/test_wisdom_md_store.py +292 -292
- package/md_cg/test_writelimit.py +197 -197
- package/md_cg/test_writepipe.py +214 -214
- package/md_cg/theory.py +6 -3
- package/md_cg/tokens.py +85 -14
- package/md_cg/tool_face.py +260 -260
- package/md_cg/trust.py +986 -950
- package/md_cg/twophase.py +231 -231
- package/md_cg/units.py +668 -667
- package/md_cg/vision_evidence.py +667 -666
- package/md_cg/weights.py +624 -624
- package/md_cg/whitebox.py +527 -527
- package/md_cg/whitebox_kb/__init__.py +37 -37
- package/md_cg/whitebox_kb/aeis_core/__init__.py +42 -42
- package/md_cg/whitebox_kb/aeis_core/semantic.py +280 -280
- package/md_cg/whitebox_kb/aeis_core/textutil.py +13 -13
- package/md_cg/whitebox_kb/engine.py +310 -310
- package/md_cg/whitebox_kb/seed_knowledge//346/231/272/350/203/275/350/256/2723.4.md +5260 -5260
- package/md_cg/whitebox_kb/wisdom/browser_units.py +2631 -2631
- package/md_cg/whitebox_kb/wisdom/causal_discover.py +432 -432
- package/md_cg/whitebox_kb/wisdom/chat_engine.py +1506 -1506
- package/md_cg/whitebox_kb/wisdom/compiler_code_units.py +3033 -3033
- package/md_cg/whitebox_kb/wisdom/condition_algebra.py +112 -112
- package/md_cg/whitebox_kb/wisdom/condition_frame.py +315 -315
- package/md_cg/whitebox_kb/wisdom/condition_kb.py +108 -108
- package/md_cg/whitebox_kb/wisdom/conflict_map.json +4445 -4445
- package/md_cg/whitebox_kb/wisdom/core/lexer.py +512 -512
- package/md_cg/whitebox_kb/wisdom/core/name_checker.py +1023 -1023
- package/md_cg/whitebox_kb/wisdom/cspmn.py +258 -258
- package/md_cg/whitebox_kb/wisdom/csre.py +264 -264
- package/md_cg/whitebox_kb/wisdom/danmaku_audit.py +252 -252
- package/md_cg/whitebox_kb/wisdom/distilled_condition_units.json +6417 -6417
- package/md_cg/whitebox_kb/wisdom/docs/WB-EVAL-20260902b.json +1950 -1950
- package/md_cg/whitebox_kb/wisdom/docs/WB-EVAL-20260902c.json +1296 -1296
- package/md_cg/whitebox_kb/wisdom/docs/whitebox_capability_graph_demo.json +59 -59
- package/md_cg/whitebox_kb/wisdom/graph_db_units.py +3089 -3089
- package/md_cg/whitebox_kb/wisdom/knowledge_points.py +318 -318
- package/md_cg/whitebox_kb/wisdom/md_access.py +470 -470
- package/md_cg/whitebox_kb/wisdom/md_store.py +276 -251
- package/md_cg/whitebox_kb/wisdom/migrate_wisdom.py +476 -476
- package/md_cg/whitebox_kb/wisdom/multilang_ir.py +128 -124
- package/md_cg/whitebox_kb/wisdom/navigate.py +248 -248
- package/md_cg/whitebox_kb/wisdom/neural_retrieve.py +224 -224
- package/md_cg/whitebox_kb/wisdom/os_units.py +2735 -2735
- package/md_cg/whitebox_kb/wisdom/pattern_separation.py +376 -376
- package/md_cg/whitebox_kb/wisdom/prereq_map.json +364 -364
- package/md_cg/whitebox_kb/wisdom/python_code_units.py +2766 -2766
- package/md_cg/whitebox_kb/wisdom/role_solidified.json +7 -7
- package/md_cg/whitebox_kb/wisdom/route_memory.py +244 -244
- package/md_cg/whitebox_kb/wisdom/scene_reconstruction.py +148 -148
- package/md_cg/whitebox_kb/wisdom/snr_report.json +40 -40
- package/md_cg/whitebox_kb/wisdom/test_code_compose_domains.py +7541 -7541
- package/md_cg/whitebox_kb/wisdom/test_compiler_self_bootstrap.py +354 -354
- package/md_cg/whitebox_kb/wisdom/test_ecosystem_assembly.py +158 -158
- package/md_cg/whitebox_kb/wisdom/test_ecosystem_demos.py +193 -193
- package/md_cg/whitebox_kb/wisdom/test_graph_db.py +292 -292
- package/md_cg/whitebox_kb/wisdom/test_python_self_bootstrap.py +160 -160
- package/md_cg/whitebox_kb/wisdom/trigger_words_index.json +4366 -4366
- package/md_cg/whitebox_kb/wisdom/verifier.py +1297 -1297
- package/md_cg/writelimit.py +356 -356
- package/md_cg/writepipe.py +20 -8
- package/package.json +101 -96
- package/skills/plugin.json +54 -54
- package/skills/skills/designer-perspective/SKILL.md +158 -158
- package/skills/skills/designer-perspective/references/01-observation-position.md +66 -66
- package/skills/skills/designer-perspective/references/02-structure-recognition.md +62 -62
- package/skills/skills/designer-perspective/references/03-direction-judgment.md +55 -55
- package/skills/skills/designer-perspective/references/04-qualification-verdict.md +72 -72
- package/skills/skills/designer-perspective/references/05-condition-attribution.md +74 -74
- package/skills/skills/designer-perspective/scripts/designer.py +545 -545
- package/skills/skills/designer-perspective/tests/cases.jsonl +17 -17
- package/skills/skills/designer-perspective/tests/selftest.py +61 -61
- package/skills/skills/lingshu-browser/SKILL.md +60 -60
- package/skills/skills/lingshu-compiler/SKILL.md +56 -56
- package/skills/skills/lingshu-compiler/units/analyze-type-infer/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/check-name-real/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compile-assign/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compile-expr-tree/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compile-full-pipeline/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compile-func-def/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compile-if-then/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compile-logic-expr/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compile-recursive/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compile-scope/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compile-type-check/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compile-while/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-0010c4bf/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-0355bffb/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-0361708a/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-054a0414/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-05a1691a/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-05eeed1e/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-0622a1f6/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-08b54217/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-0a62b70c/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-0ab24d00/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-0e093688/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-0e82b966/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-0ee9b9b9/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-0f3787e6/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-1028685f/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-11897630/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-16661b9b/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-1f722303/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-25be1262/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-2a76ba07/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-2dbea54a/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-2df52f16/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-2ec2c9d2/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-2f8c8f39/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-38378ac7/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-39457d2e/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-39fb5926/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-47f4fbfa/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-4a8cd1f1/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-4b230b6b/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-4cbbda95/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-4d5a68ff/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-56dc9bdd/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-57e76ebe/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-61ff016b/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-63eae588/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-64c4224b/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-66377955/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-674ab4f6/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-6af76fd6/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-6d979db2/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-6de326c0/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-6f1c0eea/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-724d6c9b/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-7690177f/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-7b229a7d/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-7f471b3a/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-815cad08/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-83c61634/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-8c798c81/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-8dd747ac/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-90324d0a/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-94b8d72d/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-94f12231/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-95937c16/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-98a5625b/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-98b4c42f/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-98e3894a/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-9bdfe4b8/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-9d9b4e83/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-9f7be5ad/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-a6daf076/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-a7995a0c/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-a8399248/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-aabbd099/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-afe169d8/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-b0678bda/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-b09bd196/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-b1396e23/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-b9b31ce0/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-c10264a7/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-cb1e8e4b/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-ccafd438/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-cda9c262/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-ce648068/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-cf5776a4/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-d974e5d3/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-e3979fd3/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-eb1cf2b5/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-ecb30d5b/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-f8c8b24b/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-f99fedbe/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-fa8ff5f7/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/compiler-fe1b058d/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/lex-chinese-program/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/lex-dao-de-jing/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/lex-nine-chapters/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-arithmetic/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-array-ops/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-closure-call/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-closure-create/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-compare/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-cond-jump/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-cond-space/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-exception/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-func-call/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-loop-run/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-profiling/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-refcount/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-run-loop/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-short-circuit/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-stack-guard/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-stack-ops/SKILL.md +45 -45
- package/skills/skills/lingshu-compiler/units/vm-trust-accum/SKILL.md +45 -45
- package/skills/skills/lingshu-graph/SKILL.md +63 -63
- package/skills/skills/lingshu-net/SKILL.md +48 -48
- package/skills/skills/lingshu-os/SKILL.md +64 -64
- package/skills/skills/lingshu-pylang/SKILL.md +71 -71
- package/src/bridge.ts +33 -0
- package/src/hooks.ts +38 -2
- package/src/index.ts +526 -518
- package/src/lib/datapath.ts +326 -326
- package/src/lib/mdcg_client.ts +413 -413
- package/src/lib/mutual.ts +428 -428
- package/src/lib/prompt_safety.ts +62 -62
- package/src/lib/python_path.ts +71 -71
- package/src/lib/roleplay_web.ts +116 -29
- package/src/lib/token_store.ts +13 -3
- package/src/tools.ts +212 -212
- package/zcode/AGENTS.md +11 -3
- package/zcode/README.md +41 -41
- /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)} 个预定义符号")
|