所以基本上我想使用 PEAR 包 PHP_LexerGenerator 和 PHP_ParserGenerator 生成的词法分析器/解析器来解析 PHP 中的结构 CSS 代码。我的目标是解析这样的文件:
selector, selector2 {
prop: value;
prop2 /*comment */ :
value;
subselector {
prop: value;
subsub { prop: value; }
}
}
只要我没有伪类,这一切都很好。伪类允许它向元素添加:
CSS 名称 ( [a-z][a-z0-9]*
),例如 in a.menu:visited
。有点懒惰,解析器没有有效的伪类列表,并接受类名的所有内容。
我的语法(忽略所有特殊情况和空格)如下所示:
document ::= (<rule>)*
rule ::= <selector> '{' (<content>)* '}'
content ::= <rule>
content ::= <definition>
definition ::= <name> ':' <name> ';'
// h1 .class.class2#id :visited
<selector> ::= <name> (('.'|'#') <name>)* (':' <name>)?
现在,当我尝试解析以下内容时
h1 {
test:visited {
simple: case;
}
}
解析器抱怨说,它期望 a<name>
跟在双冒号后面。所以它尝试将其读取simple:
为 a <selector>
(只需查看 SO 的语法突出显示)。
解析器无法回溯到足以尝试<definition>
规则是我的错误吗?还是柠檬不足以表达这一点?如果是这样,我该怎么做才能让解析器使用这个语法?