简介
glsl-parser 是一款用于解析 GLSL 代码的 npm 包。GLSL(OpenGL Shading Language)是一种用于 OpenGL ES 渲染管道中的顶点和像素着色器的 C 风格语言。该 npm 包可以让开发者将 GLSL 代码转换为 JavaScript 对象表示形式,方便在前端领域中利用。
安装
在使用该包之前,需要先安装 Node.js 环境。在 Node.js 环境下,在命令行中输入以下命令进行安装:
npm install glsl-parser
使用
引入 glsl-parser 包:
const glslparser = require('glsl-parser');
将 GLSL 代码转换为 JavaScript 对象:
-- -------------------- ---- ------- ----- -------- - - --------- ----- ------ --------- ---- --------- ------- ---- ----------------- ------- ---- ----------- ------- ---- ------------ ---- ------ - ----------- - ---------------- - ---------- - ----------- - -------------- ----- - -- ----- ------------ - ---------------------------
此时,shaderObject 就是一个 JavaScript 对象,它的结构与 GLSL 代码对应的 AST(抽象语法树)结构一致。
深入
AST(抽象语法树)
glsl-parser 输出的 JavaScript 对象是一个代表 AST 的根节点对象。该对象具有以下属性:
- type: string - 节点类型。例如:identifier, binary, ifStatement。
- loc: SourceLocation - 节点所在位置。
- range: Array.<number> - 包含节点范围的数组。
- comments: Array.<string> - 与节点相关的注释。
- leadingComments: Array.<string> - 与节点前置空白行相关的注释。
- trailingComments: Array.<string> - 与节点结束位置之后的空白行相关的注释。
除了根节点外的节点也具有以下属性:
- type: 和父节点相同。
其中,type 属性用于标识节点类型,其具体取值如下:
- identifier: 标识符
- literal: 字面量,例如:数字、字符串、布尔值等。
- binary: 二元运算符
- unary: 一元运算符
- array: 数组
- member: 成员访问,例如:object.property
- assignment: 赋值运算
- ifStatement: if 语句
- blockStatement: 块语句
- expressionStatement: 表达式语句
- variableDeclaration: 变量声明
- variableDeclarator: 变量声明符
- functionDeclaration: 函数声明
- returnStatement: return 语句
- callExpression: 函数调用
示例
以 GLSL 中常见的向量加法运算为例,该运算符在 GLSL 中的表示为:
vec3 a = vec3(1.0, 2.0, 3.0); vec3 b = vec3(4.0, 5.0, 6.0); vec3 c = a + b;
使用 glsl-parser 将 GLSL 代码解析为 AST,其结果如下:
-- -------------------- ---- ------- - ------- ---------- ------ - -------- - ------- -- --------- - -- ------ - ------- -- --------- - - -- -------- - -- -- -- ------- - - ------- ---------------------- --------------- - - ------- --------------------- ----- - ------- ------------- ------- ---- ------ - -------- - ------- -- --------- - -- ------ - ------- -- --------- - - -- -------- - -- - - -- ------- - ------- ----------------- --------- - ------- ------------- ------- ------- ------ - -------- - ------- -- --------- - -- ------ - ------- -- --------- -- - -- -------- - -- -- - -- ------------ - - ------- ---------- -------- -- ------ ------ ------ - -------- - ------- -- --------- -- -- ------ - ------- -- --------- -- - -- -------- - --- -- - -- - ------- ---------- -------- -- ------ ------ ------ - -------- - ------- -- --------- -- -- ------ - ------- -- --------- -- - -- -------- - --- -- - -- - ------- ---------- -------- -- ------ ------ ------ - -------- - ------- -- --------- -- -- ------ - ------- -- --------- -- - -- -------- - --- -- - - -- ------ - -------- - ------- -- --------- - -- ------ - ------- -- --------- -- - -- -------- - -- -- - -- ------ - -------- - ------- -- --------- - -- ------ - ------- -- --------- -- - -- -------- - -- -- - - -- ------- ------ ------ - -------- - ------- -- --------- - -- ------ - ------- -- --------- -- - -- -------- - -- -- - -- - ------- ---------------------- --------------- - - ------- --------------------- ----- - ------- ------------- ------- ---- ------ - -------- - ------- -- --------- - -- ------ - ------- -- --------- - - -- -------- - --- -- - -- ------- - ------- ----------------- --------- - ------- ------------- ------- ------- ------ - -------- - ------- -- --------- - -- ------ - ------- -- --------- -- - -- -------- - --- -- - -- ------------ - - ------- ---------- -------- -- ------ ------ ------ - -------- - ------- -- --------- -- -- ------ - ------- -- --------- -- - -- -------- - --- -- - -- - ------- ---------- -------- -- ------ ------ ------ - -------- - ------- -- --------- -- -- ------ - ------- -- --------- -- - -- -------- - --- -- - -- - ------- ---------- -------- -- ------ ------ ------ - -------- - ------- -- --------- -- -- ------ - ------- -- --------- -- - -- -------- - --- -- - - -- ------ - -------- - ------- -- --------- - -- ------ - ------- -- --------- -- - -- -------- - --- -- - -- ------ - -------- - ------- -- --------- - -- ------ - ------- -- --------- -- - -- -------- - --- -- - - -- ------- ------ ------ - -------- - ------- -- --------- - -- ------ - ------- -- --------- -- - -- -------- - --- -- - -- - ------- ---------------------- --------------- - - ------- --------------------- ----- - ------- ------------- ------- ---- ------ - -------- - ------- -- --------- - -- ------ - ------- -- --------- - - -- -------- - --- -- - -- ------- - ------- --------- ----------- ---- ------- - ------- ------------- ------- ---- ------ - -------- - ------- -- --------- - -- ------ - ------- -- --------- - - -- -------- - --- -- - -- -------- - ------- ------------- ------- ---- ------ - -------- - ------- -- --------- -- -- ------ - ------- -- --------- -- - -- -------- - --- -- - -- ------ - -------- - ------- -- --------- - -- ------ - ------- -- --------- -- - -- -------- - --- -- - -- ------ - -------- - ------- -- --------- - -- ------ - ------- -- --------- -- - -- -------- - --- -- - - -- ------- ------ ------ - -------- - ------- -- --------- - -- ------ - ------- -- --------- -- - -- -------- - --- -- - - -- ------------- -------- -
可以通过该对象找到 GLSL 中相应的节点:
- a 节点:declarations[0].init
- b 节点:declarations[1].init
- c 节点:declarations[2].init
其中,a、b 节点的 init 属性都是一个类型为 callExpression 的节点,表示对 vec3 构造函数的调用。该节点的 arguments 属性为一个类型为 literal 的数组,包含了向量的各个分量。c 节点的 init 属性是一个类型为 binary 的节点,表示加法运算符的左右操作数。
总结
glsl-parser 是一款解析 GLSL 代码的 npm 包,可以将 GLSL 代码转换为 JavaScript 对象表示形式,方便在前端领域中利用。通过对 glsl-parser 输出对象的分析,可以更好地理解 GLSL 代码的结构,并进一步进行相关的开发和应用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/5f532f3f8250f93ef890045b