Files
playbook/skills/tsl-syntax-reference/references/15_lexical_structure_and_compile_options.md
csh 40a9885eb4 feat(tsl-syntax-reference): harden retrieval and restructure pages
- flag weak candidates (no intent/heading/identifier/tag hit) and exit 2
  when every candidate is weak: mis-hits used to be indistinguishable
  from real hits, so the retry-with-better-terms loop never fired
- accept multiple ids per --section for batch fetch, failing atomically
  on any unknown id so a partial fetch cannot pass as complete
- move query synonyms and page intent aliases to data/lexicon.json and
  enforce alias/page correspondence in --check; curation data no longer
  lives in the engine
- document the weak-hit rule, batch fetch and prelude-once guidance in
  SKILL.md, with curation discipline in data/README.md
- drop 11_pitfalls.md, renumber the trailing pages and spread retrieval
  tags across topics; lexicon keys are page filenames, so the renumbering
  and the new --check rule cannot land in separate commits
2026-07-29 15:45:47 +08:00

9.4 KiB
Raw Permalink Blame History

TSL 词法结构与编译选项

这一篇吸收语法手册里“词法层”和“编译期开关”相关内容:标识符、注释、条件编译和依赖编译选项。

本篇职责

回答“TSL 的词法层规则和编译期开关有哪些”:标识符与大小写、注释形态、保留字清单,以及 {$...} 编译开关的书写位置和作用范围。

核心规则

  • 标识符大小写无关;下划线可出现在标识符中。
  • // 是行注释;首行 #! 可作为 CGI 风格注释;{ ... }(* ... *) 是块注释。
  • 条件编译指令使用 {$define}{$undef}{$ifdef}{$ifndef}{$else}{$endif}
  • 条件编译只编译命中的分支;未命中的分支不参与脚本编译。
  • {$explicit+} 开启后,后续变量必须先用 var 声明;{$explicit-} 可以在同一源文件里重新关闭这个要求。
  • {$varByRef-}{$varByRef+} 会切换“未修饰形参”的默认传递方式,细节见 05_functions_and_calls.md
  • 保留字/关键字大小写无关,不要拿来当普通变量、函数或类名;例如 params 是函数参数访问关键字,不适合作为普通变量名。
  • {$i} / {$include} 不作为本页可生成的默认能力。
  • {$dependency ...} 这类编辑器辅助编译选项不作为本页正文事实。

保留字/关键字速查

TSL 关键字大小写无关;本表统一按文档推荐写法展示。生成代码时不要把这些名称用作普通标识符。

分类 关键字 / 保留名 生成规则
程序与函数结构 programfunctionprocedurebeginendreturnexit 默认写函数时使用 functionprocedure 只在用户明确要求时使用。
控制流 ifthenelsecaseoffortodowntostepwhiledorepeatuntilbreakcontinuegotolabel 具体语句形态见 07_control_flow.md
异常控制 tryexceptfinallyraiseexceptObject 异常语法见 07_control_flow.md
值与容器 niltruefalsenaninfarray 字面量与数组基础见 03_values_and_literals.md11_matrix_and_collections.md
运算关键字 andornotinsqlinlikeisdivmodshlshrrolror 运算符规则见 06_expressions_and_operators.md
参数访问 paramsparamCountrealParamCountvaroutconst 普通参数优先写具名形参;params / paramCount / realParamCount 只用于变参或参数个数判断。
运行时上下文 sysParamssystemdebugReturndebugRunEnvdebugRunEnvDoechoglobalstaticthisFunction_myMem__maxMem___line____stack_frame 运行时系统参数见 10_runtime_context_and_with.md;调试相关事实见 14_debug_and_profiler.md
LIKE 精度 likeEpslikeEpsRate 只在需要调整 like 数值近似判断阈值时使用。
类与对象 typeclassnewfindClassfindFunctionfackClasspropertyselfvirtualoverrideoverloadprotectedpublicprivatepublishedstatic 类声明、对象创建和成员规则见 08_objects_and_classes.md
外部调用约定 externalcdeclpascalstdcallsafecallfastcallregister 外部调用细节见 17_external_calls_and_threads.md
客户端远程调用与权限 rdordo2sudosetUid 平台/客户端远程调用和权限语义不作为普通本地语法模板。
TS-SQL 查询 selectvselectsselectmselectdistinctselectOptdRangeasfrommarketTableinfoTabletradeTablesqlTablehugeSqlTablekeepNulldateKeyoforderbywheredescascgrouphaving 查询语法见 13_ts_sql.md
TS-SQL 聚合与上下文 checksumOfcountOfsumOfmaxOfstdevOfvarOftotalVarOfnormOfmedianOfaveDevOfgeoMeanOfskewOfkurtosisOfskew2Ofkurtosis2OflargeOfpercentileOfquartileOftrimMeanOfavgOfminOfaggOfstdevpOfvarpOfmodeOfdevSqOfharMeanOfchecksum_aggOfsmallOfpercentRankOfrankOffrequencyOfproductOfrefOfrefsOfaggValuethisGroupthisRowthisRowIndexthisOrder 这些名称只在 TS-SQL 语境中生成。
TS-SQL 写入 insertinsertFieldsvaluesupdatesetdeletedeleteOptfetchFirstfetchNext 写回/变更型查询只按 TS-SQL 专题页生成。
系统保留未使用 exportsdispInterfacelibraryasmrecordresourceStringthreadVarconstructordestructorinlinepackedabstractinherited 这些名称被系统保留,不作为普通标识符使用,也不作为可写语法模板。

可直接照写示例

标识符、注释与条件编译

大小写无关与下划线标识符:

代码块身份:可直接照写示例

my_var := 7;
writeLn(my_var);
writeLn(MY_VAR);

结果说明:

  • 依次输出 77
  • 说明标识符大小写无关,下划线可以出现在标识符中

代码块身份:输出片段

7
7

注释与条件编译:

代码块身份:可直接照写示例

#! shebang style comment

a := 1; // line comment
{
    (* nested comment marker *)
}
writeLn(a);
{$define FLAG}
{$ifdef FLAG}
writeLn(10);
{$else}
writeLn(20);
{$endif}
{$undef FLAG}
{$ifndef FLAG}
writeLn(30);
{$else}
writeLn(40);
{$endif}

结果说明:

  • 依次输出 11030
  • 说明首行 #!//{ ... }(* ... *) 都属于文档明确注释形态
  • 说明 define / undef / ifdef / ifndef / else / endif 这一组条件编译指令可以正常生效

显式变量声明开关

{$explicit+} 的文档明确形态:

代码块身份:可直接照写示例

{$explicit+}
var a;
a := 1;
writeLn(a);

结果说明:

  • 输出 1
  • 说明 {$explicit+} 开启后,配合 var 声明可以正常通过

{$explicit-} 可以在同一源文件里关掉显式声明要求:

代码块身份:可直接照写示例

{$explicit+}
var a;
a := 1;
{$explicit-}
b := 2;
writeLn(a + b);

结果说明:

  • 输出 3
  • 说明 {$explicit-} 会从出现位置开始取消“变量必须先声明”的限制

条件编译分支边界

条件编译不会去编译未命中的坏代码分支:

代码块身份:可直接照写示例

{$undef NEVER}
{$ifdef NEVER}
MissingFunction(
{$else}
writeLn(1);
{$endif}

结果说明:

  • 输出 1
  • 说明未命中的条件编译分支不会参与脚本编译

{$CompileOption} 编译选项

{$CompileOption} 用于设置编译期开关,改变编译器的默认行为:

代码块身份:可直接照写示例

{$CompileOption optimize=1}
echo 1 + 1;

代码块身份:输出片段

2

说明:

  • {$CompileOption optimize=1} 开启优化
  • 编译选项从出现位置开始生效,直到源文件结束或被其他选项覆盖
  • 常见选项包括 optimizebuffermodeDebugInfo
  • 编译选项细节以项目工具链和实际编译命令为准。

参数默认传递开关

{$varByRef-}{$varByRef+}

代码块身份:可直接照写示例

x := 1;
TouchDefault(x);
writeLn(x);
y := 1;
TouchValue(y);
writeLn(y);
z := 1;
TouchForcedVar(z);
writeLn(z);
r := 1;
TouchRestored(r);
writeLn(r);

function TouchDefault(value);
begin
    value := 9;
end;
{$varByRef-}
function TouchValue(value);
begin
    value := 8;
end;
function TouchForcedVar(var value);
begin
    value := 7;
end;
{$varByRef+}
function TouchRestored(value);
begin
    value := 6;
end;

结果说明:

  • 依次输出 9176
  • 说明默认模式下,未修饰参数仍会写回调用方
  • 说明 {$varByRef-} 下,未修饰参数会改成按值传递
  • 说明 var 形参在 {$varByRef-} 下仍保持引用语义
  • 也说明 {$varByRef+} 可以把默认语义重新切回可写回模式

禁止项

  • 不要在 {$explicit+} 后继续直接使用未声明变量。
  • 不要把 {$i ...} / {$include ...} 包含文件写法当成可用能力。
  • 不要把 反例 / 不可照写 代码块复制进正向示例。

代码块身份:反例 / 不可照写

{$explicit+}
a := 1;

上面这种写法不作为可写事实;{$explicit+} 后必须先声明再使用变量。

代码块身份:反例 / 不可照写

writeLn(1);

{$i "common.inc"}

上面这种包含文件写法不作为本页可生成的默认能力。