Лексинг и синтаксический анализ CSS иерархии
.someDiv { width:100%; height:100%; ... more properties ... }
Как мне составить правило в моем парсере, которое будет соответствовать строке выше?
Кажется довольно невозможным для меня, так как вы не можете определить неограниченное количество свойств в правиле? Может ли кто-нибудь уточнить, как бы вы сделали такую вещь с FsLex
а также FsYacc
?
1 ответ
Если вы используете FsLex и FsYacc, то вы можете проанализировать свойства внутри { ... }
как список свойств. Предполагая, что у вас есть лексер, который правильно распознает все специальные символы, и у вас есть правило, которое анализирует отдельные свойства, вы можете написать что-то вроде:
declaration:
| navigators LCURLY propertyList RCURLY { Declaration($1, $3) }
| navigators LCURLY RCURLY { Declaration($1, []) }
propertyList:
| property SEMICOLON propertyList { $1::$2 }
| property { [$1] }
property:
| IDENTIFIER COLON values { Property($1, $3) }
declaration
Правило анализирует всю декларацию (вам нужно написать анализатор для различных навигаторов, которые могут быть использованы в CSS, таких как div.foo #id
и т. д.) propertyList
rule анализирует одно свойство, а затем вызывает себя рекурсивно для анализа нескольких свойств.
Значения, построенные справа, будут списком значений, представляющих индивидуальное свойство. property
правило разбирает индивидуальное присвоение свойства, например width:100%
(но вам нужно закончить разбор значений, потому что это может быть список или более сложное выражение).