第 1 章:第一个 SML 文件
第 1 章:第一个 SML 文件
本章目标:写出一个能解析的 SML 文件,理解键值对、注释、标量类型。
1.1 最简文件
新建 hello.sml:
name: John
age: 27
就这。两行键值对,冒号分隔键和值。不需要引号、不需要花括号、不需要逗号。
在 SML 里,键永远是裸词(字母数字下划线连字符);值可以是裸词,也可以加引号。
1.2 注释
SML 支持三种行注释,随便用哪种都行:
# 井号注释(最常用)
-- 双横线注释(Soup / Lua 风格)
// 斜杠注释(C 风格)
name: John # 行尾也能写注释
还有两种块注释(可跨多行):
/* 这是块注释
可以写很多行 */
_* 这也是块注释,Soup 系习惯写法 *_
注意:字符串引号内部的
#、--不会被当成注释,放心写。
1.3 标量类型
SML 会自动识别值的类型:
| 你写的 | 识别为 | 说明 |
|---|---|---|
John / NY |
字符串 | 裸词即字符串 |
"21 2nd Street" |
字符串 | 含空格 / 特殊字符才加引号 |
27 |
整数 | |
0.75 |
浮点数 | |
true / false |
布尔 | |
null |
空值 | 等同于 JSON 的 null |
动手试:
firstName: "John Doe" # 含空格 -> 必须引号
state: NY # 单字 -> 裸词即可
age: 27 # 整数
ratio: 0.75 # 浮点
enabled: true # 布尔
note: null # 空值
chinese: 中文无需引号 # 中文裸词也行
什么时候必须加引号? 值里含有空格、冒号、方括号
[]、花括号{}、井号#等"会干扰解析"的字符时,用引号包起来。拿不准就加引号,永远不会错。
1.4 字符串:裸词 vs 引号
这是 SML 最舒服的地方。对比:
# 下面两者在解析结果里完全等价,都是字符串 "NY"
state: NY
state: "NY"
但邮箱这种带 @ 的也能直接裸写(因为 @ 不在词首时只是普通字符):
email: alice@example.com # 裸词,@ 在中间,安全
from: "SML Team <dev@mail.swebase.cn>" # 含空格 -> 引号
1.5 动手试一试
写一个简单的"个人名片":
name: 张三
title: 工程师
city: 北京
age: 30
active: true
然后用任意语言的解析器读它,会得到一棵键值树。下一章我们会把键值组织成块和数组,那才是 SML 真正强大的地方。
动手练习
读完本章,在下面的编辑器里直接修改 SML 并点“运行”,立刻看到解析结果或校验错误——有输出才能高效学习。
✍ 动手练习
用 SML 描述一个人:firstName("John Doe")、state(裸词 NY)、age(27)、ratio(0.75)、enabled(true)、note(null)。注意何时必须加引号。
💡 提示:把 firstName 的引号去掉,看裸词 NY 和引号串 "John Doe" 在结果里是否都是字符串——答案是:都是字符串,只是 NY 不需要引号。
Q1. 下面哪一行在 SML 里会把 NY 解析成字符串(而不是报错)?
SML 的裸词(bareword)默认就是字符串,state: NY 与 state: "NY" 等价。
Q2. 判断:age: 27 解析后,27 是整数而不是字符串。
没有引号的数字会被解析为数值类型(整数/浮点),age 字段是整数 27。
Q3. 下面哪个值是 SML 支持的标量类型?
SML 标量支持 bool、null、整型、浮点、字符串;日期本质是字符串,没有专门的日期类型。
Q4. 中文“你好”作为值,需要写成 "你好" 吗?
中文等非 ASCII 裸词本身就是字符串,city: 北京 是合法的,无需引号。