Если вы используете 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
анализирует одно свойство и затем вызывает себя рекурсивно разобрать несколько свойств.
Значения, построенные справа, будут списком значений, представляющих отдельное свойство. Правило property
анализирует индивидуальное присвоение свойства, например, width:100%
(но вам нужно закончить анализ значений, потому что это может быть список или более сложное выражение).