Лексинг и синтаксический анализ CSS иерархии - PullRequest
4 голосов
/ 30 июня 2011
.someDiv { width:100%; height:100%; ... more properties ... }

Как мне составить правило в моем парсере, которое будет соответствовать строке выше?

Кажется довольно невозможным для меня, поскольку вы не можете определить неограниченное количество свойств в правиле?Может кто-нибудь уточнить, как бы вы поступили с FsLex и FsYacc?

1 Ответ

2 голосов
/ 30 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...