PostgreSQL: Документация: 15: 52.3. Этап парсера
- 52.3.1. Парсер
- 52.3.2. Процесс трансформации
Этап анализатора состоит из двух частей:
52.3.1. Анализатор
Анализатор должен проверить строку запроса (которая поступает в виде обычного текста) на допустимый синтаксис. Если синтаксис правильный, дерево синтаксического анализа создается и передается обратно; в противном случае возвращается ошибка. Парсер и лексер реализованы с помощью известных Unix-инструментов bison и flex.
Лексер определен в файле scan.l
и отвечает за распознавание идентификаторов , ключевых слов SQL и т. д. Для каждого найденного ключевого слова или идентификатора генерируется токен и передан парсеру.
Анализатор определен в файле gram.y
и состоит из набора грамматических правил и действий , которые выполняются всякий раз, когда правило срабатывает. Код действий (который на самом деле является кодом C) используется для построения дерева синтаксического анализа.
Файл scan.l
преобразуется в исходный файл C scan.c
с помощью программы flex, а gram.y
преобразуется в gram.c
с помощью bison. После выполнения этих преобразований для создания синтаксического анализатора можно использовать обычный компилятор C. Никогда не вносите никаких изменений в сгенерированные файлы C, так как они будут перезаписаны при следующем вызове flex или bison.
Примечание
Упомянутые преобразования и компиляции обычно выполняются автоматически с помощью Makefiles поставляются с исходным кодом PostgreSQL.
Подробное описание бизона или правил грамматики, приведенных в gram.y
, выходит за рамки данного руководства. Есть много книг и документов, посвященных flex и bison. Вы должны быть знакомы с bison, прежде чем начнете изучать грамматику, данную в gram. y
, иначе вы не поймете, что там происходит.
52.3.2. Процесс преобразования
Этап синтаксического анализатора создает дерево синтаксического анализа с использованием только фиксированных правил синтаксической структуры SQL. Он не выполняет поиск в системных каталогах, поэтому нет возможности понять детальную семантику запрошенных операций. После завершения синтаксического анализа 9Процесс преобразования 0009 принимает дерево, возвращенное синтаксическим анализатором, в качестве входных данных и выполняет семантическую интерпретацию, необходимую для понимания того, на какие таблицы, функции и операторы ссылается запрос. Структура данных, созданная для представления этой информации, называется деревом запросов .
Причина отделения необработанного синтаксического анализа от семантического анализа заключается в том, что поиск в системном каталоге может выполняться только в рамках транзакции, и мы не хотим начинать транзакцию сразу после получения строки запроса. Этапа необработанного синтаксического анализа достаточно для идентификации команд управления транзакциями ( BEGIN
, ROLLBACK
и т. д.), после чего они могут быть правильно выполнены без дальнейшего анализа. Как только мы узнаем, что имеем дело с фактическим запросом (например, SELECT
или UPDATE
), можно начать транзакцию, если мы еще не в ней. Только после этого можно запустить процесс преобразования.
Дерево запросов, созданное в процессе преобразования, в большинстве случаев структурно похоже на необработанное дерево синтаксического анализа, но имеет много отличий в деталях. Например, Узел FuncCall
в дереве синтаксического анализа представляет нечто, что синтаксически выглядит как вызов функции. Это может быть преобразовано либо в узел FuncExpr
, либо в узел Aggref
, в зависимости от того, оказывается ли указанное имя обычной функцией или агрегатной функцией. Также в дерево запросов добавляется информация о фактических типах данных столбцов и результатов выражений.
Выбор группы и зависимости | Лукас Кохорст
Избирательный округ против разбора зависимостей | Лукас Кохорст | Средний 6 мин чтения·
13 декабря 2019 г.Разбор предложений может помочь понять смысл, структуру и синтаксические отношения в предложениях. Двумя распространенными типами являются синтаксический анализ зависимостей и групп, который также известен как синтаксический анализ. Анализ зависимостей — это процесс определения грамматической структуры предложения путем перечисления каждого слова в виде узла и отображения ссылок на его зависимые элементы. Проанализированное дерево избирательных округов отображает синтаксический…
Автор: Лукас Кохорст
588 Подписчики
@foundryservices
Еще от Лукаса Кохорста
На пути к науке о данных
Прогнозирование цен на акции с помощью Python
В 100 строках кода
7 минут чтения · 9 ноября 2018 г.
Лукас Кохорст
в
На пути к науке о данных
Децентрализация вашего веб-сайта
IPFS + ENS
Чтение за 6 мин·13 января 2020 г.
Лукас Кохорст
Продажа коллов и путов на Uniswap V3
9001 1Эмуляция выплат по опционам на uniswap v3, а также разница в премиях и сроках действия
Чтение: 6 мин·17 августа 2021 г.
Lucas Kohorst
in
Около 15% Твиттер состоит из ботов, и мне захотелось попробовать свои силы. Я погуглил, как создать бота для Twitter, и наткнулся на…
5 минут чтения·8 апреля 2018 г.
Посмотреть все от Лукаса Кохорста
Рекомендовано на Medium
Андреа Д’Агостино
в
Навстречу науке о данных
Как обучить модель Word2Vec с нуля с помощью Gensim
В этой статье мы рассмотрим Gensim, очень популярную библиотеку Python для обучения моделей машинного обучения на основе текста, для обучения Word2Vec…0011
в
Искусственный угол
Вы используете ChatGPT неправильно! Вот как опередить 99% пользователей ChatGPT
Овладейте ChatGPT, изучив технику быстрого доступа.
·7 мин чтения·17 мартаСписки
Истории, которые помогут вам расти как разработчику программного обеспечения
19 историй·158 сохранений
Общие знания по программированию
20 историй·45 сохранений s
Публикации на средних носителях, принимающие статьи
145 историй·192 сохранения
New_Reading_List
173 истории·8 сохранений
Любовь Шарма
в
Dev Genius
901 01 Схема проектирования системы: полное руководство
Разработка надежной, масштабируемой и эффективной система может быть пугающей. Тем не менее, понимание ключевых концепций и компонентов может сделать…
· 9 минут чтения · 20 апреляНеподходящий