所以基本上我想在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 {...}'表示法。沒有規則處理'以逗號分隔的選擇器列表'。 –
你的問題提到'雙冒號',但在示例輸入中沒有'::',也沒有任何處理語法中的雙冒號的東西。 –