playbook/docs/tsl/syntax/16_lexical_structure_and_co...

9.3 KiB
Raw Blame History

TSL 词法结构与编译选项

文档类型:语法深水专题 是否可直接用于生成代码:是 是否含可直接照写示例:是 是否含不可照写反例:是 遇到不确定时:先按本页候选页继续判断;17_types_and_conversions.md11_pitfalls.md;仍不命中时回到语法路由中心 index.md;如果问题已经超出语法层,回到 TSL 总入口 ../index.md

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

本篇职责

回答“TSL 的词法层规则和编译期开关应该去哪里查,而不是把这些边界混进值、函数、类的正文里”。

智能体词法/编译选项判断流程

  1. 先判断要写注释、标识符、条件编译,还是编译选项。
  2. 注释、大小写、条件编译指令只照本页文档明确形态写。
  3. {$explicit+} 会改变变量声明要求,生成代码前先判断是否需要 var
  4. {$varByRef+} / {$varByRef-} 会影响未修饰形参传递语义,细节回看函数页。
  5. 没有对应代码块时不要发明词法/编译选项写法。

核心规则

  • 标识符大小写无关;下划线可出现在标识符中。
  • // 是行注释;首行 #! 可作为 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.md12_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;调试相关回 15_debug_and_profiler.md
LIKE 精度 likeEpslikeEpsRate 只在需要调整 like 数值近似判断阈值时使用。
类与对象 typeclassnewfindClassfindFunctionfackClasspropertyselfvirtualoverrideoverloadprotectedpublicprivatepublishedstatic 类声明、对象创建和成员规则回 08_objects_and_classes.md
外部调用约定 externalcdeclpascalstdcallsafecallfastcallregister 外部调用细节回 18_external_calls_and_threads.md
客户端远程调用与权限 rdordo2sudosetUid 平台/客户端远程调用和权限语义不作为普通本地语法模板。
TS-SQL 查询 selectvselectsselectmselectdistinctselectOptdRangeasfrommarketTableinfoTabletradeTablesqlTablehugeSqlTablekeepNulldateKeyoforderbywheredescascgrouphaving 查询语法回 14_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
  • 说明未命中的条件编译分支不会参与脚本编译

参数默认传递开关

{$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(a);
begin
    a := 9;
end;
{$varByRef-}
function TouchValue(a);
begin
    a := 8;
end;
function TouchForcedVar(var a);
begin
    a := 7;
end;
{$varByRef+}
function TouchRestored(a);
begin
    a := 6;
end;

结果说明:

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

禁止项

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

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

{$explicit+}
a := 1;

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

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

writeLn(1);

{$i "common.inc"}

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