所以基本上我想在PHP中使用由PEAR包生成的词法分析器/解析器PHP_LexerGenerator和PHP_ParserGenerator来解析结构CSS代码。我的目标是解析这样的文件:Lemon Parser Generator的模糊语法
selector, selector2 {
prop: value;
prop2 /*comment */ :
value;
subselector {
prop: value;
subsub { prop: value; }
}
}
只要我没有伪类,这就好了。伪类允许它向元素添加:
和CSS名称([a-z][a-z0-9]*
),如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;
}
}
解析器抱怨,它预期<name>
遵循双冒号。所以它试图读取simple:
作为<selector>
(看看SO的语法突出显示)。
是我的错误,解析器不能回溯到足以尝试<definition>
规则?还是柠檬只是没有足够强大来表达这一点?如果是这样,我能做些什么来获得解析器使用这个语法?
你的语法不会处理'select1,select2 {...}'表示法。没有规则处理'以逗号分隔的选择器列表'。 –
你的问题提到'双冒号',但在示例输入中没有'::',也没有任何处理语法中的双冒号的东西。 –