В формальных языках терминальные и нетерминальные символы являются лексическими элементами , используемыми для указания правил производства, составляющих формальную грамматику . Терминальные символы являются элементарными символами языка, определенными как часть формальной грамматики. Нетерминальные символы (или синтаксические переменные ) заменяются группами терминальных символов в соответствии с правилами производства.
Терминалы и нетерминалы конкретной грамматики находятся в двух совершенно отдельных наборах .
Терминальные символы — это символы, которые могут появляться в выходных данных правил производства формальной грамматики и которые не могут быть изменены с помощью правил грамматики. Рекурсивное применение правил к исходной строке символов обычно приводит к конечной выходной строке, состоящей только из терминальных символов.
Рассмотрим грамматику, определенную двумя правилами. В этой грамматике символ Б
является терминальным символом и Ψ
одновременно нетерминальным символом и начальным символом. Правила создания строк следующие:
Ψ
может статьБ
Ψ
Ψ
может статьБ
Вот Б
терминальный символ, потому что не существует правила, которое могло бы изменить его во что-то другое. С другой стороны, Ψ
имеет два правила, которые могут изменить его, поэтому он нетерминальный. Формальный язык , определенный или сгенерированный определенной грамматикой, — это набор строк, которые могут быть созданы грамматикой и которые состоят только из терминальных символов . Диаграмма 1 иллюстрирует строку, которая может быть создана с помощью этой грамматики.
Нетерминальные символы — это те символы, которые можно заменить. Их также можно назвать просто синтаксическими переменными . Формальная грамматика включает начальный символ — обозначенный член множества нетерминалов, из которого все строки в языке могут быть получены путем последовательного применения правил производства. Фактически, язык, определяемый грамматикой, — это именно множество терминальных строк, которые могут быть получены таким образом.
Контекстно-свободные грамматики — это те грамматики, в которых левая часть каждого правила производства состоит только из одного нетерминального символа. Это ограничение нетривиально; не все языки могут быть сгенерированы контекстно-свободными грамматиками. Те, которые могут, называются контекстно-свободными языками. Это именно те языки, которые могут быть распознаны недетерминированным push down автоматом . Контекстно-свободные языки являются теоретической основой для синтаксиса большинства языков программирования .
Грамматика определяется правилами продукции (или просто «продукцией»), которые указывают, какие символы могут заменять какие другие символы; эти правила могут использоваться для генерации строк или для их разбора. Каждое такое правило имеет голову , или левую часть, которая состоит из строки, которая может быть заменена, и тело , или правую часть, которая состоит из строки, которая может ее заменить. Правила часто записываются в форме голова → тело ; например, правило a → b указывает, что a может быть заменено на b .
В классической формализации генеративных грамматик, впервые предложенной Ноамом Хомским в 1950-х годах, [2] [3] грамматика G состоит из следующих компонентов:
Грамматика формально определяется как упорядоченная четверка . Такая формальная грамматика часто называется в литературе системой переписывания или грамматикой фразовой структуры . [4] [5]
Форма Бэкуса–Наура — это нотация для выражения определенных грамматик. Например, следующие правила производства в форме Бэкуса–Наура используются для представления целого числа (которое может быть знаковым):
< цифра > ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' < целое число > ::= ['-'] < цифра > { < цифра > }
В этом примере символы ( -,0,1,2,3,4,5,6,7,8,9 ) являются терминальными символами, а <digit>
и <integer>
являются нетерминальными символами. [примечание 2]
Другой пример:
В этом примере символы a,b,c,d являются терминальными символами, а S,A — нетерминальными символами.