C++ 解析CSS样式表
我目前正在为一个学习项目编写一个简单的HTML类渲染器,但目前仍停留在解析部分——我知道,这有点早。我采用了“不要重新发明轮子”的方法,并使用TinyXML解析HTML文件。虽然画图有点遥远,但我计划使用OpenGL。然而,我遇到了CSS解析器部分缺少轮子的问题。有没有小型的、速度相当快的CSS解析器库可用?如果是的话,有人能指给我看吗? 如果不是这样的话,谁能给我一个简短的解释,说明用C++来解析CSS文件的方法是什么? 例如,我是否使用正则表达式 因此,总结一下:C++ 解析CSS样式表,c++,css,regex,parsing,C++,Css,Regex,Parsing,我目前正在为一个学习项目编写一个简单的HTML类渲染器,但目前仍停留在解析部分——我知道,这有点早。我采用了“不要重新发明轮子”的方法,并使用TinyXML解析HTML文件。虽然画图有点遥远,但我计划使用OpenGL。然而,我遇到了CSS解析器部分缺少轮子的问题。有没有小型的、速度相当快的CSS解析器库可用?如果是的话,有人能指给我看吗? 如果不是这样的话,谁能给我一个简短的解释,说明用C++来解析CSS文件的方法是什么? 例如,我是否使用正则表达式 因此,总结一下: 有没有用C/C++编写的
- 有没有用C/C++编写的小型/快速CSS解析器库
- 如何使用regex解析一个极其简单的CSS文件(例如)
如果我要在pSuedoC++代码中编写一个简单的解析器,它看起来像:
enum Type {
ID, // #
CLASS, // .
IDENTIFIER, // [a-zA-Z][a-zA-Z0-9-_]
LWING, // {
RWING, // }
COLON, // :
SEMI, // ;
}
struct Token {
std::string value;
Type type;
}
bool has_next_token();
bool has_next_token(Type type);
Token next_token();
Token expect_token(Type type) {
Token token = next_token();
if (token.type != type) {
std::runtime_error("Error: expected another type");
}
}
void parse() {
while (has_next_token()) {
parse_rule();
}
}
void parse_rule() {
parse_selector();
expect_token(Type.LWING);
while (!has_next_token(Type.RWING)) {
parse_assignment();
}
expect_token(Type.RWING);
}
void parse_selector() {
if (has_next_token(Type.CLASS)) {
parse_class();
} else if (has_next_token(Type.ID)) {
parse_id();
} else {
parse_tag();
}
}
void parse_class() {
expect_token(Type.CLASS);
Token token = expect_token(Type.IDENTIFIER);
std::string class_name = token.value;
// Do something with class_name
}
void parse_id(); // Almost the same as parse_class
void parse_tag(); // You know the drill
void parse_assignment() {
expect(Type.IDENTIFIER);
expect(Type.COLON);
parse_value();
expect(Type.SEMI);
}
void parse_value(); // I'll leave this one to you
您使用的是什么库?fast是什么意思?框架是什么?到目前为止,我只使用TinyXML和TinyXPath,并计划使用GLEW/GLFW/OpenGL进行绘图。好的,你介意使用boost吗?HTML不是XML,它可以在测试用例上工作/解析,但在野外不会。看看外面可怕的标记(HTML和XHTML),没有XML解析器允许或能够处理它,HTML解析器是非常宽容的东西。请原谅我的提问,但是如果可能的话,您能提供一个简单的CSS示例吗?递归下降解析器的来源千差万别,一个实现与另一个实现有很大的不同。@calcyss我添加了一个简单的解析器示例。你需要填补这些空白。还请注意,我没有测试它。请记住,这会忽略空白,您将需要跳过标记函数中的空白。嗯,在im解析字符串时立即删除空白不是一个好主意吗?哦,等等。那么选择器就不能正常工作了。哈哈。@calcyss真的。为了跳过空白,您可以编写类似于while(source[pos]=''| | | source[pos]='\t'){pos++}的代码。在条件中添加所有空格字符。