Введение

В компьютерном программировании, "хак лексера" — распространённое решение проблем при разборе ANSI C, вызванное тем, что эталонная грамматика чувствительна к контексту. В языке C для определения, является ли последовательность символов именем переменной или именем типа, требуется учет контекста синтаксической структуры, что делает невозможным использование контекстно-свободного лексера.

Решение для взлома

Решение обычно заключается в передаче информации из таблицы семантических символов обратно в лексер. То есть, вместо функционирования как однонаправленный конвейер от лексера к парсеру, существует обратный канал от семантического анализа к лексеру. Такое смешение синтаксического и семантического анализа обычно считается неэлегантным, поэтому это называют "хаком". Без дополнительного контекста лексер не может отличить идентификаторы типов от других идентификаторов, поскольку все идентификаторы имеют одинаковый формат. Благодаря этому хаку, в приведенном выше примере, когда лексер обнаруживает идентификатор A, он должен иметь возможность классифицировать токен как идентификатор типа. Правила языка можно было бы уточнить, указав, что приведение типов требует идентификатор типа, и неоднозначность исчезла бы. Эта проблема также существует в C++, и парсеры могут использовать тот же хак. Парсер Clang обрабатывает эту ситуацию совершенно иначе, используя нереференциальную лексическую грамматику. Лексер Clang не пытается различать имена типов и имена переменных: он просто сообщает текущий токен как идентификатор. Затем парсер использует библиотеку семантического анализа Clang для определения природы идентификатора. Это обеспечивает более четкое разделение ответственности и инкапсуляцию лексера и парсера, и поэтому некоторые разработчики компиляторов считают это гораздо более элегантным решением, чем "хак лексера". Этот подход также используется в большинстве других современных языков, которые не различают различные классы идентификаторов в лексической грамматике, а вместо этого откладывают их определение на фазу синтаксического или семантического анализа, когда доступно достаточно информации.

Цитаты

http://www.cs.berkeley.edu/~smcpeak/elkhound/sources/elkhound/index.html
http://cs.nyu.edu/rgrimm/papers/pldi06.pdf
http://cens.ioc.ee/local/man/CompaqCompilers/ladebug/ladebug_manual_details.html
DOI.org

http://groups.google.com/group/comp.compilers/browse_frm/thread/db7f68e9d8b49002/fa20bf5de9c73472?lnk=st&q=%2B%22the+lexer+hack%22&rnum=1&hl=en#fa20bf5de9c73472