Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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
使用Boost Spirit X3解析多个CSS选择器_Boost_Boost Spirit X3 - Fatal编程技术网

使用Boost Spirit X3解析多个CSS选择器

使用Boost Spirit X3解析多个CSS选择器,boost,boost-spirit-x3,Boost,Boost Spirit X3,我试图用Boost Spirit X3解析多个CSS选择器。例如,如果我有适用于多个ID选择器的以下CSS规则: ID1,ID2,ID3{color:000000;} 其中ID1、ID2、ID3为选择器,颜色:000000;是声明块,同一声明块适用于所有3个选择器。并假设规则、选择器和声明块的结构如下所示: 结构规则{ 选择器; DeclationBlock声明块; } 结构选择器{ std::字符串目标; } 结构声明块{ std::向量声明; } 我已经有了选择器和声明块的Spirit规则:

我试图用Boost Spirit X3解析多个CSS选择器。例如,如果我有适用于多个ID选择器的以下CSS规则:

ID1,ID2,ID3{color:000000;} 其中ID1、ID2、ID3为选择器,颜色:000000;是声明块,同一声明块适用于所有3个选择器。并假设规则、选择器和声明块的结构如下所示:

结构规则{ 选择器; DeclationBlock声明块; } 结构选择器{ std::字符串目标; } 结构声明块{ std::向量声明; } 我已经有了选择器和声明块的Spirit规则:

自动选择器=x3::规则{selector}; 自动声明块=x3::规则{声明块}; 单个选择器的解析规则应该是直截了当的:

自动规则=x3::规则{rule}=selector>>声明块; 自动规则=x3::规则{rules}=*规则;
但是,我的问题是,如何为多个选择器解析同一声明块?我试图使用语义操作基本上复制所有选择器的声明块,但我不知道这是否是最好的方法。

我不确定是否可以对多个选择器使用声明块解析器的属性。很可能不是

我宁愿以反映实际代码的方式更改AST和解析器:

结构规则{ std::向量选择器;//为什么不? DeclationBlock声明块; } 自动常量选择器=选择器%,; 如果您希望选择器和declarationBlock之间有1:1的对应关系,那么在如上所述定义规则后,应该可以在另一个解析器中使用它,如下所示:

结构单规则 { 选择器; DeclationBlock声明块; }; 自动展开=[]自动和ctx { //遍历所有选择器 //并将它们与链接的 //声明块 对于自动常量(&s):\u attrctx.selectors _valctx.push_backSingleRule{s,_attrctx.declarationBlock}; }; 自动常量展开规则 =x3::规则 =规则[展开]; 但我不确定这是个好主意。也许,从解析器中抛出尽可能接近和最简单的AST,然后在以后进行所有的简化和优化更容易


另外,已经有一个使用Boost.Spirit.X3的书面版本。您可以尝试将其用作参考或灵感。

我更倾向于第二个选项,因为有更复杂的CSS选择器可能会嵌套,例如,但我还不满意此解决方案。我看过skui的CSS解析器,但它还不完整,而且它不处理复杂的选择器。还有一个CSS解析器是用旧版本的Boost Spirit编写的