如果要实现一个特定文件格式的词法解析器,一定要了解该文件的词法特征,根据文件的词法特征抽象出分类规则,然后才能编码实现词法解析功能。因此本小节来了解一下Doom3引擎中的文本文件的相关规则,使用如下一段具有普遍性的文本字符串:
numMeshes 5
/*
* joints关键字定义了骨骼动画的bindPose
*/
joints {
"origin" -1 ( 0 0 0 ) ( -0.5 -0.5 -0.5 )
"Body" 0 ( -12.1038131714 0 79.004776001 ) ( -0.5 -0.5 -0.5 ) // origin
}
例如numMeshes、joints等没有双引号的单词,作为关键字处理,也就是Doom3引擎预先定义好的,具有特定含义的一些词,它们具有唯一性,不可更改性。
例如 "origin"、"Body"这些具有双引号的单词,作为标识符处理,这些标识符并非由Doom3引擎预先定义,而是美术设计等相关人员或者模型制作动画师定义的名称。
在/*和*/之间的文字被Doom3引擎的词法解析器视为注释,和TypeScript一样,表示多行注释。斜杠//后的文字则被视为单行注释,这也和TypeScript的单行注释保持一样性。
大括号对{ }表示一个块状模块,你可以将其视为一个区块分组,和TypeScript作用域类似。小括号对( )内部是使用浮点数表示的矢量或矩阵数据,你可以将其看成数组表示,需要注意的一点是,数组元素之间不是使用逗号分隔,而是使用空格符号进行分隔。
Doom3文本文件中的数据类型其实就两种:字符串和数字,其中关键字和标识符都可以看成字符串类型,而数字可以分为整数和浮点数两种类型。
上述几条,基本囊括了Doom3文本文件格式的关键之处,还有一些隐藏在深处的规则,则由源码实现的过程中进行描述。