Должен ли я использовать / написать шаблон лексера - PullRequest
3 голосов
/ 18 августа 2011

Я использую шаблонизатор PHP, который я написал некоторое время назад. Он использует регулярные выражения для создания кэшированного файла PHP. Некоторые примеры синтаксиса:

{$foo} - regular variable
{$foo.bar} - variable foo that uses the array key 'bar'
{$foo|uppercase} - modifier 'uppercase' that takes 'foo' and applies some method to it

{iteration:users}
    Hi there {$users.name}
{/iteration: users}

Список можно продолжить ... Для анализа всего этого достаточно много неприятных регулярных выражений. Обратите внимание, что итерация может быть внутри другой итерации и т. Д.

Недавно я видел шаблоны шаблонов, такие как twig, smarty3, которые используют лексер шаблонов. У меня есть несколько вопросов по этому поводу: - В целом, разве лексер не медленнее, чем использование нескольких регулярных выражений для создания кэшированного шаблона php? - Есть ли хорошие ресурсы о том, как написать свой собственный лексер для интерпретации какого-либо (шаблонного) языка (я не смог найти ничего, что я понимаю в Google) - Должен ли я продолжать использовать регулярные выражения или стоит изучить лексер?

1 Ответ

5 голосов
/ 19 августа 2011

Я предлагаю написать Разбор грамматик выражений (PEG) и посмотреть этот ответ для библиотеки PEG в PHP.

PEG очень похожи на регулярные выражения, по своей природе они жадные и никогда не бывают двусмысленными: отлично подходит для языка, специфичного для предметной области (DSL).

В общем случае лексер не медленнее, чем использование нескольких регулярных выражений для создания кэшированного шаблона php?

Нет: скорость регулярных выражений зависит от реализации механизма регулярных выражений. Как правило, каждый раз, когда вы используете регулярное выражение, оно должно быть проанализировано само по себе, а затем с данной моделью оно должно использовать общий сопоставитель , который работает со всеми возможными регулярными выражениями.

Имея лексер, вы точно настраиваете сопоставление: вы получаете определенное сопоставление , которое работает только для вашей предварительно определенной грамматики. Один выигрыш в случае начальной загрузки: нет необходимости компилировать регулярное выражение. Еще одним преимуществом является его меньшая сложность из-за особого соответствия, которое имеет тенденцию работать быстрее.

Существуют ли хорошие ресурсы о том, как написать свой собственный лексер для интерпретации какого-либо (шаблонного) языка (я не могу найти ничего, что понимаю в Google)?

Лексеры довольно сложные. Для того, чтобы написать свой собственный, вы должны будете знать, что такое конечные автоматы , обычная грамматика , context-free или безконтекстных грамматик и т. д.

Требуются некоторые фундаментальные знания в области компьютерных наук, прежде чем его легко понять.

Должен ли я продолжать использовать регулярные выражения или стоит изучить лексер?

Стоит отметить возможности обнаружения ошибок хорошо спроектированных лексеров (например, сообщение об ошибке: «ожидается ;, но найдено ), в строке 64:38.»)

...