wiki:devel:parser:test:simple_test_lexer_notes
Различия
Показаны различия между двумя версиями страницы.
| — | wiki:devel:parser:test:simple_test_lexer_notes [2025/01/16 18:36] (текущий) – создано - внешнее изменение 127.0.0.1 | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| + | ======Заметка simple test lexer====== | ||
| + | Просто привожу быстрый пример, | ||
| + | Одним из побочных продуктов [[wiki: | ||
| + | |||
| + | Сейчас я вынужден исследовать его из-за необходимости. [[http:// | ||
| + | |||
| + | Рассматриваемое регулярное выражение: | ||
| + | |||
| + | <code php> | ||
| + | $regex = '/ | ||
| + | ' | ||
| + | preg_quote(' | ||
| + | </ | ||
| + | |||
| + | Я не нашел никаких очевидных указаний на изменения в синтаксисе в руководстве PHP / CVS (любой вклад будет очень признателен). Это регулярное выражение также заставляет меня ломать голову (Джефф тоже ломает голову над этим), поэтому изучаю возможности более управляемого подхода к разбору языка выражений шаблонов. | ||
| + | |||
| + | В любом случае, | ||
| + | |||
| + | Если у меня есть такой шаблон; | ||
| + | |||
| + | <code php> | ||
| + | Начальное сообщение — {$Greeting}< | ||
| + | Последнее слово по теме — {$Closing} | ||
| + | </ | ||
| + | |||
| + | где '' | ||
| + | |||
| + | <code php> | ||
| + | <? | ||
| + | // Включить парсер | ||
| + | require_once | ||
| + | |||
| + | класс YetAnotherTemplateParser { | ||
| + | |||
| + | // Здесь размещается вывод шаблона | ||
| + | var $output = '' | ||
| + | |||
| + | // Хэш переменных для замены | ||
| + | var $phpVars = array ( ) ; | ||
| + | |||
| + | // Регистрация переменной | ||
| + | function registerVariable ( $name , $value ) { | ||
| + | $this -> phpVars [ $name ] = $value ; | ||
| + | } | ||
| + | |||
| + | // Отображение страницы | ||
| + | function display ( ) { | ||
| + | echo | ||
| + | } | ||
| + | |||
| + | /** | ||
| + | * Функция обратного вызова (или режим/ | ||
| + | * имеет дело с текстом за пределами ссылки на переменную. | ||
| + | * @param string совпадающий текст | ||
| + | * @param int состояние лексера (здесь игнорируется) | ||
| + | */ | ||
| + | function writePlainText ( $match , $state ) { | ||
| + | $this -> output .= $match ; | ||
| + | return | ||
| + | } | ||
| + | |||
| + | /** | ||
| + | * Обратный вызов для ссылок на переменные шаблона. | ||
| + | * @param string совпадающий текст | ||
| + | * @param int состояние лексера | ||
| + | */ | ||
| + | function writeVariable ( $match , $state ) { | ||
| + | switch | ||
| + | // Ввод ссылки на переменную | ||
| + | case LEXER_ENTER: | ||
| + | // Начало ссылки на переменную — пока ничего не нужно делать | ||
| + | break ; | ||
| + | |||
| + | // Содержимое переменной reference | ||
| + | case LEXER_UNMATCHED: | ||
| + | if ( isset ( $this -> phpVars [ $match ] ) ) { | ||
| + | $this -> output .= $this -> phpVars [ $match ] ; | ||
| + | } | ||
| + | break ; | ||
| + | |||
| + | // Выход из ссылки на переменную | ||
| + | case LEXER_EXIT: | ||
| + | // Конец ссылки на переменную - ничего не нужно делать - завершено | ||
| + | break ; | ||
| + | } | ||
| + | return | ||
| + | } | ||
| + | |||
| + | } | ||
| + | |||
| + | // Создаем парсер шаблона | ||
| + | $Parser = & new YetAnotherTemplateParser ( ) ; | ||
| + | |||
| + | // Регистрируем некоторые переменные шаблона для замены | ||
| + | $Parser -> registerVariable ( ' | ||
| + | | ||
| + | |||
| + | // | ||
| + | // Второй аргумент: | ||
| + | // Третий аргумент: | ||
| + | // так как шаблоны регулярных выражений не являются буквами, | ||
| + | $Lexer = &new SimpleLexer ( $Parser , ' | ||
| + | |||
| + | // Добавить ссылку на переменную, | ||
| + | // Второй аргумент: | ||
| + | // синтаксис шаблона, | ||
| + | // перехода | ||
| + | // Третий аргумент: | ||
| + | // после того, как шаблон будет найден | ||
| + | $Lexer -> addEntryPattern ( ' \{ \$ ' , ' | ||
| + | |||
| + | // Добавляем шаблон выхода для ссылок на переменные, | ||
| + | // его предыдущее состояние (использует стек состояний) | ||
| + | // Второй аргумент: | ||
| + | $Lexer -> addExitPattern ( ' \} ' , ' | ||
| + | |||
| + | $template = ' | ||
| + | Последнее слово по теме — {$Closing}' | ||
| + | |||
| + | $Lexer -> разбор ( $template ) ; | ||
| + | |||
| + | $Parser -> дисплей ( ) ; | ||
| + | ?> | ||
| + | </ | ||
| + | |||
| + | Надеюсь, | ||
| + | |||
| + | Конечно, | ||
| + | |||
| + | Примечание: | ||
| + | =====Дополнения и Файлы===== | ||
| + | [[http:// | ||
wiki/devel/parser/test/simple_test_lexer_notes.1737037851.txt.gz · Последнее изменение: (внешнее изменение)
