Язык синтаксического анализа сверху вниз - Top-down parsing language
Язык синтаксического анализа сверху вниз (TDPL) - это тип аналитический формальная грамматика разработан Александр Бирман в начале 1970-х годов, чтобы формально изучить поведение обычного класса практических нисходящие парсеры которые поддерживают ограниченную форму возврат. Бирман первоначально назвал свой формализм Схема TMG (TS), после TMG, рано генератор парсеров, но позже он получил название TDPL от Ахо и Ульман в их классической антологии Теория разбора, перевода и компиляции.
Определение грамматики TDPL
Формально Грамматика TDPL грамм представляет собой кортеж, состоящий из следующих компонентов:
- Конечное множество N из нетерминальные символы.
- Конечное множество Σ терминальные символы это не пересекается с N.
- Конечное множество п из правила производства, где правило имеет одну из следующих форм:
- А ← ε, где А нетерминал, а ε - пустая строка.
- А ← ж, куда ж выдающийся символ, представляющий безусловный отказ.
- А ← а, куда а - любой терминальный символ.
- А ← BC / D, куда B, C, и D нетерминалы.
Толкование грамматики
Грамматику TDPL можно рассматривать как чрезвычайно минималистичное формальное представление парсер рекурсивного спуска, в котором каждый из нетерминалов схематично представляет собой синтаксический анализ функция. Каждая из этих нетерминальных функций принимает в качестве входного аргумента строку, которую нужно распознать, и дает один из двух возможных результатов:
- успех, и в этом случае функция может опционально двигаться вперед или потреблять один или несколько символов входной строки, предоставленной ему, или
- отказ, и в этом случае никакие входные данные не потребляются.
Обратите внимание, что нетерминальная функция может завершиться успешно, фактически не потребляя никаких входных данных, и это считается результатом, отличным от отказа.
Нетерминальный А определяется правилом формы А ← ε всегда завершается успешно без использования каких-либо входных данных, независимо от предоставленной входной строки. И наоборот, правило вида А ← ж всегда терпит неудачу независимо от ввода. Правило формы А ← а успешно, если следующий символ во входной строке - это терминал а, и в этом случае нетерминал преуспевает и потребляет этот один терминал; если следующий входной символ не совпадает (или следующего символа нет), то нетерминал не работает.
Нетерминальный А определяется правилом формы А ← BC / D первый рекурсивно вызывает нетерминальный B, и если B успешно, вызывает C на оставшейся части входной строки, оставшейся неиспользованной B. Если оба B и C преуспеть, тогда А в свою очередь преуспевает и потребляет то же общее количество входных символов, что B и C вместе сделали. Если либо B или же C терпит неудачу, тогда А отступления в исходную точку во входной строке, где он был впервые вызван, а затем вызывает D на этой исходной строке ввода, возвращая любой результат D производит.
Примеры
Следующая грамматика TDPL описывает обычный язык состоящий из последовательности произвольной длины a и b:
S ← AS / T
Т ← BS / E
А ← а
B ← б
E ← ε
Следующая грамматика описывает контекстно-свободный язык язык скобок состоящий из строк произвольной длины с совпадающими фигурными скобками, например '{}', '{{} {{}}}' и т. д .:
S ← OT / E
Т ← SU / F
U ← CS / F
О ← {
C ← }
E ← ε
F ← ж
Приведенные выше примеры могут быть представлены эквивалентно, но гораздо более сжато в анализ грамматики выражений обозначение как S ← (a / b) * и S ← ({S}) * соответственно.
Обобщенный TDPL
Небольшая вариация TDPL, известная как Обобщенный TDPL или GTDPL, значительно увеличивает кажущуюся выразительность TDPL, сохраняя тот же минималистский подход (хотя на самом деле они эквивалентны). В GTDPL вместо рекурсивной формы правила TDPL А ← BC / D, вместо этого мы используем альтернативную форму правила А ← B [C, D], что интерпретируется следующим образом. Когда нетерминальный А вызывается для некоторой входной строки, сначала он рекурсивно вызывает B. Если B успешно, тогда А впоследствии вызывает C на оставшейся части ввода, оставшейся неиспользованной B, и возвращает результат C исходному абоненту. Если B с другой стороны, тогда А призывает D в исходной строке ввода и возвращает результат вызывающей стороне.
Важное различие между этой формой правила и А ← BC / D форма правила, используемая в TDPL, такова: C и D никогда обе вызывается в том же вызове А: то есть правило GTDPL действует больше как "чистая" конструкция if / then / else с использованием B как условие.
В GTDPL просто выразить интересные не-контекстно-свободные языки например, классический пример {aпбпcп}.
Грамматика GTDPL может быть сокращена до эквивалентной грамматики TDPL, которая распознает тот же язык, хотя этот процесс не является простым и может значительно увеличить количество требуемых правил.[1]Кроме того, и TDPL, и GTDPL можно рассматривать как очень ограниченные формы анализ грамматик выражений, все из которых представляют один и тот же класс грамматик.[1]