LogoNGA 开发文档

FVV 2 的变化

FVV 1 至 2 的巨大改进

FVV 作为已经投入生产使用超过一年的语言,在它诞生的第二年,第二个大版本已经完全完成

FVV 2 是 FVV 1 的完全重构版本,在原有语法不变的基础上新增了更多语法,也完善了很多机制

具体变动内容如下:

代码优化

C++/Dart/Go/Kotlin 版本全部完整实现 解析/格式化 以及 序列化/反序列化

由于 Go 的特性,map 是无序的,在格式化时会 sort
这里的格式化指的是把 FVV 对象转为字符串,并非直接将原始 FVV 文本重新格式化

解析由原本的扁平循环判断改为词法分析与语法分析分离的递归下降解析器,代码质量大幅提高

FVV 1 在语法出错时只会硬解析,不会报错, FVV 2 引入了 异常机制,并且会有具体的行号提示,各语言实现如下:

  • C++: 解析函数会返回字符串,若非空,则为报错内容
  • Dart: 在解析出错时会直接 throw
  • Go: 在解析出错时会返回非 nilerror
  • Kotlin: 在解析出错时会直接 throw

FVV 2 在代码使用上新增了 序列化/反序列化 (from/toMarshal/Unmarshal),使用更加方便

对于 序列化/反序列化,各语言实现如下:

  • C++: 直接的基本值引用传入或在类中定义绑定函数以传入类
  • Dart: 继承基本类以定义绑定函数
  • Go: 基于 tag 的反射
  • Kotlin: 基于 kotlinx.serialization 的直接转换

语法优化

底层规则

FVV 2 在解析时能够正常处理 \r/\n/\r\n 文本,不会再强制转为 \n

并且 FVV 2 能够正常处理 转义,支持 \b/\f/\n/\r/\t/\\ 的转义

文本/注释 情况下会依情况额外支持 \"/\”\>

在 FVV 2 中,整数均以 int64 存储,而非原本的 int

值解析

FVV 2 还支持了更完善的数字机制,支持 二进制/八进制/十六进制 整数解析, 支持在十进制数字中添加 '/ 作为分隔符

八进制 支持包括 0/0o 开头

在解析布尔值时,可以忽略大小写解析

组闭合的花括号可以用来省略分隔符了({ k = v; } => { k = v }

字符串与拼接

早日列在 TODO 的字符串拼接也支持了,可通过基本值或值名称以 + 拼接

仅支持基本值拼接!列表由于有赋值展平机制,故不支持直接拼接

非字符串基本值在拼接时为自动转为字符串(而非数学运算), 在列表中也有这样的类似规则,一个混合类型的基本类型列表会类型提升为最高优先级的类型,优先级是这样的:

字符串 > 浮点数 > 整数 > 布尔值

不支持基本值与组列表混合

类型提升时是直接提升为最高类型(布尔值(true) => 字符串("true")), 而非逐级提升(布尔值(true) => 整数(1) => 浮点数(1.0) => 字符串("true"))

拼接时会以原始字符串拼接,而不会解析后再拼接 (原始值 1'0000/TRUE 拼接为字符串时仍为 1'0000/TRUE,而非 10000/true

但列表混合类型由于是解析完成后统一类型提升,是以解析后的值提升的

对于字符串本身,支持了 原始多行字符串(使用 `` 包裹), 解析时不会触发任何转义,并且解析后自动去除最小缩进与头尾空白

字符

FVV 2 支持使用 : 而非 = 来定义值(更 YAML 一点?)

全角字符

部分常见的全角字符也可在 FVV 2 使用,目前支持如下:

  • {}{}
  • [][]
  • ""“”
  • '
  • :
  • ;
  • ,

""/“” 外,其他均支持混用(因为当引号混用时,转义将更复杂)

在此页面...