Лексинг и синтаксический анализ 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% (но вам нужно закончить разбор значений, потому что это может быть список или более сложное выражение).

Другие вопросы по тегам