FsLex - разница между двумя строками

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

PNAME а также ENAME - обе строки.

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

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

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

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

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

Какие-либо предложения?

1 ответ

Решение

Если этот вопрос связан с вашими предыдущими файлами (о разборе 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 см. Статью викибук и блог Криса Смита.

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