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

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

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

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

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

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

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

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

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


person ebb    schedule 30.06.2011    source источник


Ответы (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) }

Для получения дополнительной информации о написании парсеров и лексеров см. статьи в Викиучебнике и блог Криса Смита.

person Tomas Petricek    schedule 30.06.2011
comment
Ах, теперь это имеет гораздо больше смысла. Спасибо! (снова) ^^ - person ebb; 01.07.2011