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 см. Статью викибук и блог Криса Смита.