Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 解析CSS样式表_C++_Css_Regex_Parsing - Fatal编程技术网

C++ 解析CSS样式表

C++ 解析CSS样式表,c++,css,regex,parsing,C++,Css,Regex,Parsing,我目前正在为一个学习项目编写一个简单的HTML类渲染器,但目前仍停留在解析部分——我知道,这有点早。我采用了“不要重新发明轮子”的方法,并使用TinyXML解析HTML文件。虽然画图有点遥远,但我计划使用OpenGL。然而,我遇到了CSS解析器部分缺少轮子的问题。有没有小型的、速度相当快的CSS解析器库可用?如果是的话,有人能指给我看吗? 如果不是这样的话,谁能给我一个简短的解释,说明用C++来解析CSS文件的方法是什么? 例如,我是否使用正则表达式 因此,总结一下: 有没有用C/C++编写的

我目前正在为一个学习项目编写一个简单的HTML类渲染器,但目前仍停留在解析部分——我知道,这有点早。我采用了“不要重新发明轮子”的方法,并使用TinyXML解析HTML文件。虽然画图有点遥远,但我计划使用OpenGL。然而,我遇到了CSS解析器部分缺少轮子的问题。有没有小型的、速度相当快的CSS解析器库可用?如果是的话,有人能指给我看吗? 如果不是这样的话,谁能给我一个简短的解释,说明用C++来解析CSS文件的方法是什么? 例如,我是否使用正则表达式

因此,总结一下:

  • 有没有用C/C++编写的小型/快速CSS解析器库
  • 如何使用regex解析一个极其简单的CSS文件(例如)
我决不想包含一个完整的CSS标准,现在只要标准的“按id”、“按类”和“按标记”CSS选择器就足够了。我期待着能对我的探索有所帮助的东西:D

我会尽可能不重新发明轮子。这是件好事。LibCSS包含一个解析和选择API,这使得它与HTML解析器的结合变得简单

然而,如果你正在谈论一个学习项目,那么编写解析器也是一件好事。我建议跳入水中。这些都很容易实现

如果我要在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++}的代码。在条件中添加所有空格字符。