Skip to content

语法语言 ​

入口:数据页菜单 →「语法编辑器…」。编辑器执行 PSPP 语法的一个可执行子集:命令以句点结尾,输出面板逐条给出结果,失败时标注「第 N 行」并可点回源码。

本页讲 v1.5.0 补上的语法层(注释、宏、INCLUDE、定位、.sps 往返);可执行命令清单见数据变换。

注释 ​

按 PSPP 语义,* 或 COMMENT 开头的注释不是「本行剩余部分」,而是持续到「行尾句点」或空行为止:

text
* 说明文字。
COMPUTE x = score + 1.

上面那句注释到第一个行尾句点结束,COMPUTE 照常执行。要点:

  • 只有行尾的句点结束注释:* 见 v1.2.0 说明(行内句点不结束注释). 整行都是注释;
  • COMMENT 与 * 等价,可跨多行,同样到行尾句点为止;
  • 空行同样结束注释;
  • 行内 /* … */ 会被剥掉,参数不受影响:COMPUTE x = score /* 加一 */ + 1.;
  • 整行只有 /* … */ 时按 PSPP 规则结束当前命令:
text
COMPUTE x = score + 1
/* 这条命令还没写句点,这里结束它 */
LIST.
  • 忘了句点时注释会把后面的命令一起吃掉,编辑器给出**提示(Hint)**而不是静默丢命令:
text
* 忘了加句点
LIST.

宏 ​

text
DEFINE !show(vars=!DEFAULT(pre) !TOKENS(1))
DESCRIPTIVES !vars.
!ENDDEFINE.

!show vars=post.
!show.
  • 参数:位置参数 !POSITIONAL(在宏体里用 !1、!2…)与关键字参数,取到方式有 !TOKENS(n)、!CHAREND('/')、!CMDEND,默认值 !DEFAULT(值),位置与关键字可以混用;
  • 调用:!show vars=post.(PSPP 写法)或 !sum2(pre, post).(括号形式,兼容 SPSS 习惯);
  • 宏函数:!CONCAT !QUOTE !UNQUOTE !UPCASE !LENGTH !SUBSTR !HEAD !TAIL !INDEX !EVAL !BLANKS !NULL,实参里的宏调用先展开(!CONCAT(!a, _2));
  • 流程控制:!LET 定义局部变量、!IF / !THEN / !ELSE / !ENDIF、!DO / !TO / !BY / !DOEND 循环,可嵌套;
  • 自递归有深度上限;重复 DEFINE 同名宏会覆盖旧定义;注释里的 DEFINE 不会被登记。

本版不做的构造会明确报「未支持」,不会静默忽略:!DO !v !IN (…)、!ENCLOSE、!NOEXPAND / !OFFEXPAND / !ONEXPAND。

INCLUDE ​

text
INCLUDE 'common.sps'.
INCLUDE FILE='common.sps' ENCODING='UTF-8'.
  • 被包含的文件注入当前脚本后一起执行,宏表延续:包含文件里 DEFINE 的宏对之后的命令生效;
  • 相对路径按当前 .sps 文件所在目录解析,不依赖启动目录;
  • 循环包含会报错,嵌套上限 16 层;
  • 被包含文件里出错 → 立即停止后续命令(PSPP 语义:包含文件里的错误会中止整个脚本);
  • 输出里该文件的命令标注文件名与行号,点击跳回对应位置。

定位 ​

  • 每条命令带起止位置;失败按「第 N 行」标注,点一下光标跳到源码对应行;
  • 宏展开产生的命令能回溯到原始位置(不会因为展开而丢行列信息);
  • 命令被注释符吞掉等「不是错误但结果可疑」的情况按提示显示,与失败区分。

.sps 往返 ​

  • 打开:先剥 UTF-8 BOM;非法字节替换为 U+FFFD 并提示替换数量,不静默丢内容;
  • 保存覆盖当前文件,「另存为」另选路径;写出不带 BOM 的 UTF-8,PSPP 可直接读取;
  • 编辑器顶部有命令模板条,点击插入;「附加数据集」把另一个 .sav / 工程文件挂进来(见数据变换)。

Released under the AGPL-3.0 License.