したがって、基本的には、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]*
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>
パーサーは、二重コロンの後に a が続くことを期待していると不平を言います。そのため、 を として読み取ろうとしますsimple:
( <selector>
SO の構文強調表示を見てください)。
<definition>
パーサーがルールを試すのに十分なバックトレースができないのは私のエラーですか? それとも、レモンはこれを表現するのに十分なほど強力ではありませんか? もしそうなら、パーサーがこの文法で動作するようにするにはどうすればよいですか?