【发布时间】:2013-02-17 20:34:53
【问题描述】:
我想在 OpenGL 着色语言 (GLSL) 代码中解析自定义标签,这是一种非常类似于 C 的语言。一般用例如下所示:
#version 150
@bind ProjectionMatrix
uniform mat4 projMatrix;
@bind ViewMatrix
uniform mat4 viewMatrix;
in vec4 position;
in vec3 color;
out vec3 Color;
void main()
{
Color = color;
gl_Position = projMatrix * viewMatrix * position;
}
我想用@bind 标记“注释”变量,以便我可以将它们连接到我的实际应用程序中的变量(即我可以将值从我的应用程序传递到 glsl)。所以我会解析glsl代码,每当我找到@bind标签时,我就会将ProjectionMatrix(或ViewMatrix)解析为从c++传递给glsl的变量,然后解析projMatrix(或viewMatrix) 作为应该存储从 c++ 发送的值的变量。
我想知道的是 - 使用增强波或精神会更好吗?这些是我正在寻找解决这个问题的两个库。
我已经让 boost wave lexer 工作了,因为它会遍历所有标记。所以我必须编写代码来解析返回的令牌并寻找模式。
我不确定我将如何使用 Spirit 来做到这一点,但它似乎是一个更强大的词法分析器/解析器。
大家有什么建议吗?
【问题讨论】:
-
Boost.Wave 是一个 C++ 预处理器。 GLSL 不是 C++。虽然它确实与 C++ 有一些象征性的相似之处,但它很有可能会在它到达 GLSL 的第一行时窒息。由于 GLSL 的第一行是
#version,这不是合法的 C++ 预处理器指令。你的 GLSL 的第一行 是#version,对吧? -
是的 - 但这不是问题。我只是覆盖 boost.wave 的“未知指令”方法,并接受 glsl 指令。但我并不担心指令方面的预处理,我更关心解析 glsl 代码并挑选某些模式的最佳方法。
-
Jarret,你为什么不告诉我们你想要建立的具体任务是什么。我可以“猜测”你一个我认为适合你写的两行示例的语法,但我不知道你想从解析中得到什么
-
嘿@sehe,抱歉我不够清楚。我已尝试编辑我的帖子以使其更清晰。
标签: c++ boost glsl boost-spirit