FsLex - разница между двумя строками - PullRequest
0 голосов
/ 30 июня 2011

У меня есть пара токенов:

PNAME и ENAME - оба являются строками.

Теперь я хочу установить 2 правила в моем лексере, чтобы соответствовать этим токенам.

Первое правило (PNAME) должно совпадать, когда строка состоит из символов a-z и необязательного специального символы @ / ().

Второе правило (ENAME) должно совпадать, когда строка состоит из символов a-z и необязательного префикса (# /.).

Теперь, как мне составить правило в моем файле лексера, которое будет соответствовать только ENAME - Даже если префикса нет?

Если это имеет какое-либо значение, тогда ENAME будет иметь { после строки, например: (prefix)eName { - Однако эта скобка не должна передаваться в синтаксический анализатор ...

Есть предложения?

1 Ответ

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

Если этот вопрос относится к вашему предыдущему вопросу (о разборе CSS) файлов, то вам, вероятно, следует использовать другой подход.

Лексер должен идентифицировать только простые токены, такие как # и . (имена токенов HASH и DOT), фигурные скобки (токены LCURLY и RCURLY для { и } соответственно) и любой идентификатор IDENT с использованием регулярного выражения, которое принимает любую последовательность символов a-zA-Z.

Остальная обработка (например, определение правил CSS .foo { ... }) должна выполняться в парсере. В моем предыдущем ответе я описал, как анализировать список имен свойств - предполагается, что у вас есть navigators, который является синтаксическим элементом, который определяет элементы HTML, такие как #name или #name .class. Вы можете написать отдельные правила разбора для них:

navigators = 
  | navigator            { [$1] }
  | navigator navigators { $1::$2 }
navigator = 
  | HASH IDENT   { SelectByID($2) }
  | DOT IDENT    { SelectByClass($1) }

Дополнительную информацию о парсерах и лексерах wirting смотрите в статьях викибукс и блог Криса Смита .

...