Разбор
В компьютерных науках разбор , синтаксический анализ или парсификация — это процесс, который анализирует непрерывный поток входных данных ( ввод , например, прочитанный из файла или с клавиатуры ), чтобы определить правильность его структуры благодаря заданной формальной грамматике . Парсер — это программа , которая выполняет эту задачу.
Термин синтаксический анализ происходит от латинского pars , что указывает на часть более крупного дискурса.
Парсеры обычно не пишутся вручную, а строятся через генераторы парсеров .
Как правило, итальянский термин используется для обозначения распознавания грамматики и последующего построения дерева синтаксического анализа , которое показывает правила, используемые во время распознавания из ввода; затем дерево синтаксического анализа посещается (даже несколько раз) во время выполнения интерпретатора или компилятора .
Однако в большинстве языков синтаксический анализ работает с последовательностью токенов , в которой лексический синтаксический анализатор разделяет входные данные . Поэтому английский термин часто используется для обозначения всего лексического анализа и собственно синтаксического анализа.
Описание
Пример
В следующем примере показан распространенный случай разбора языка для калькулятора (или калькулятора) с двумя уровнями грамматики: лексическим и синтаксическим.
Как уже упоминалось, первым шагом является генерация токенов или лексический анализ . Например, ввод может быть следующим «12 * (3 + 4) ^ 2», в этом случае синтаксический анализатор разбивает ввод на токены следующим образом: 12, *, (, 3, +, 4,) , ^ и 2, каждый из которых представляет собой символ со значением в математическом выражении. Синтаксический анализатор может содержать правила, которые сообщают ему, что символы *, +, ^, (и) вызывают запуск новой лексемы, поэтому лексемы типа «12 *» или «(3» не будут генерироваться.
Сам синтаксический анализ получает последовательность токенов в качестве входных данных и проверяет, образуют ли токены допустимые выражения. Эта работа выполняется на основе контекстно-свободной грамматики, которая рекурсивно определяет компоненты, определяющие выражение, и порядок их появления.
Последним шагом является семантический анализ , который находит следствия только что проверенного выражения и выполняет результирующие действия. В случае с калькулятором действие заключается в вычислении выражения; компилятор, с другой стороны, может генерировать машинный язык, который выполняет функции, присутствующие в коде.
Типы парсеров
Работа синтаксического анализатора, по сути, состоит в том, чтобы определить, можно ли и как ввести входные данные из исходного символа с помощью правил формальной грамматики. Это можно сделать по существу двумя способами:
- Анализ сверху вниз — парсер может начать с ведущего символа и попытаться преобразовать его во входные данные. Интуитивно понятно, что синтаксический анализатор начинает с самого большого элемента и делит его на все более мелкие части. Парсеры LL являются примерами нисходящих парсеров.
- Анализ снизу вверх — парсер может начать с ввода и попытаться переписать его до исходного символа. Интуитивно синтаксический анализатор пытается найти самый простой символ, затем обрабатывает содержащие его элементы и так далее. Парсеры LR являются примерами восходящих парсеров.
Еще одно важное различие заключается в том, что между синтаксическими анализаторами, которые генерируют по крайнему левому производному или по самому правому производному . Парсеры LL генерируют крайнее левое производное, а синтаксические анализаторы LR — крайнее правое производное.
Языки программирования
Обычно синтаксические анализаторы используются с языками программирования , которые имеют простые и регулярные грамматики; синтаксические анализаторы этого типа, как правило, основаны на контекстно- свободных грамматиках , поскольку с помощью этих грамматик можно писать быстрые и эффективные синтаксические анализаторы.
На самом деле контекстно-свободные грамматики не могут сами по себе описать наиболее часто используемые языки программирования. Неформально причина в том, что память любого языка ограничена; грамматика не может запомнить наличие конструкции после произвольной входной длины, это необходимо например в тех языках, где можно ссылаться на имена.
Однако использование более мощных грамматик, таких как контекстно- зависимые грамматики , означает потерю эффективности. Следовательно, общепринятой стратегией является использование контекстно-свободных грамматик для «расслабленной» (с меньшим количеством ограничений) версии языка. Эти грамматики будут принимать все допустимые конструкции рассматриваемого языка, а также другие недопустимые конструкции, которые отбрасываются во время семантического разбора входных данных. Например, грамматика может принять программу, использующую ранее не объявленную переменную.
Библиография
- ( EN ) Синтаксический анализ , в Бесплатный онлайн-словарь вычислительной техники , Денис Хоу. Доступно по лицензии GFDL
- Компиляторы: принципы, техника и инструменты . Ахо, Лам, Сетхи, Ульман. Аддисон-Уэсли (2-е издание) 2006 г. ISBN 0-321-48681-1
- Формальные языки и компиляция . Креспи Региззи. Питагора Эдитрис , 2006. ISBN 978-8837116323
Связанные элементы
Нисходящий парсер
- Парсер ЛЛ
- Рекурсивный синтаксический анализатор
- Парсер пакрат
- метод Унгера
Восходящий анализатор
- Парсер LR
- Парсер SLR
- Парсер ЛАЛР
- Парсер Эрли
- Алгоритм CYK
- Алгоритм Томиты
Генераторы парсеров
Внешние ссылки
- Симулятор синтаксического анализа Этот симулятор предназначен для того, чтобы помочь учащимся во всей простоте понять различные этапы построения таблиц синтаксического анализа. Полезно для тех, кто хочет попрактиковаться в теме
- TFunctionParser Комплексный математический парсер (более 90 функций и операций)
- UCalc Fast Math Parser Парсер выражений, коммерческий
- muParser Парсер математических выражений с открытым исходным кодом
- Методы синтаксического анализа - Практическое руководство Дика Грюна и Сериэля Дж. Х. Джейкобса.
- Анализ приоритета оператора Анализатор математических выражений с открытым исходным кодом на языке C
- Парсер Туринского университета Парсер естественного языка, итальянский, с открытым исходным кодом, на языке Common Lisp (автор Леонардо Лесмо, Туринский университет)
- Стэнфордский парсер Парсер Стэнфорда