Метасинтаксис — это синтаксис , используемый для определения синтаксиса языка программирования или формального языка . Он описывает допустимую структуру и состав фраз и предложений метаязыка , который используется для описания либо естественного языка , либо языка компьютерного программирования. [1] Некоторые из широко используемых формальных метаязыков для компьютерных языков — это форма Бэкуса–Наура (BNF), расширенная форма Бэкуса–Наура (EBNF), синтаксическая нотация Вирта (WSN) и дополненная форма Бэкуса–Наура (ABNF).
Метаязыки имеют свой собственный метасинтаксис, каждый из которых состоит из терминальных символов , нетерминальных символов и метасимволов . Терминальный символ, такой как слово или токен, является автономной структурой в определяемом языке. Нетерминальный символ представляет синтаксическую категорию, которая определяет одну или несколько допустимых фразовых или фразовых структур, состоящих из подмножества из n элементов. Метасимволы предоставляют синтаксическую информацию для денотационных целей в данном метасинтаксисе. Терминалы, нетерминалы и метасимволы не применяются во всех метаязыках.
Обычно метаязык для языков уровня токенов (формально называемых « регулярными языками ») не имеет нетерминалов, поскольку в этих регулярных языках вложение не является проблемой. Английский язык как метаязык для описания определенных языков не содержит метасимволов, поскольку все объяснения могут быть сделаны с использованием выражений на английском языке. Существуют только определенные формальные метаязыки, используемые для описания рекурсивных языков (формально называемых контекстно-свободными языками ), которые имеют терминалы, нетерминалы и метасимволы в своем метасинтаксисе.
"else"
, "if"
, "then"
,"while"
<int>
, <char>
,<boolean>
:=
, |
, {}
, , ()
, []
,*
A B
A|B
{A B}
[A B]
(A|B)
::=
в правиле вывода . Тело определения справа может состоять из нескольких альтернативных форм, при этом каждая альтернативная синтаксическая конструкция отделяется метасимволом |
. Каждая из этих альтернативных конструкций может быть как терминальной, так и нетерминальной.=
в правиле производства. Она также не требует, чтобы каждый нетерминал был явно определен. Нетерминалы, такие как <text>
и , <opt-whitespace>
неявно определены как ASCII-символ и необязательный пробел соответственно.%
, за которым следует b
или x
или d
, за которым следует числовое значение или конкатенация числовых значений, разделенных .
. Метасимвол -
помещается между двумя числовыми значениями для обозначения диапазона значений . Как и в BNF, терминалы ABNF никогда не встречаются с левой стороны метасимвола =
в правиле вывода. Метасимвол /
обозначает чередования . Для разделения элементов в теле определения используются пробелы. Метасинтаксис для повторения в ABNF имеет несколько форм. *
Предшествующий элемент обозначает элемент, который должен быть повторен ноль или более раз. Числовое значение n1 , за которым следует *
числовое значение n2 , за которым следует элемент, обозначает элемент, который должен быть повторен не менее n1 раз и не более n2 раз. Одно числовое значение n, предшествующее элементу, обозначает элемент, который будет повторен n раз. Комментарии могут быть выражены после метасимвола ;
. Как и в EBNF, квадратные скобки фразы обозначают, что фраза необязательна .Метасинтаксическое соглашение этих формальных метаязыков еще не формализовано. В справочном руководстве различных языков программирования существует множество метасинтаксических вариаций или расширений. Одним из вариантов стандартного соглашения для обозначения нетерминалов и терминалов является удаление метасимволов, таких как угловые скобки и кавычки, и применение типов шрифтов к предполагаемым словам. Например, в Ada синтаксические категории обозначаются применением шрифта sans-serif в нижнем регистре к предполагаемым словам или символам. Все терминальные слова или символы в Ada состоят из символов с кодовой позицией между 16#20# и 16#7E# (включительно). Определение для каждого набора символов отсылает к международному стандарту, описанному в ISO/IEC 10646:2003. В C и Java синтаксические категории обозначаются курсивным шрифтом , а терминальные символы обозначаются готическим шрифтом. В J его метасинтаксис вообще не применяет метасимволы для описания синтаксиса J. Вместо этого все синтаксические объяснения выполняются на метаязыке, очень похожем на английский, который называется Dictionary и который документирован исключительно для J.
Целью новых расширений является предоставление более простого и недвусмысленного метасинтаксиса. С точки зрения простоты метанотация BNF определенно не помогает сделать метасинтаксис более удобным для чтения, поскольку открытые и закрытые метасимволы появляются слишком часто. С точки зрения неоднозначности метанотация BNF создает ненужную сложность, когда кавычки, апострофы, знаки «меньше» или «больше» начинают служить терминальными символами, что они часто и делают. Расширенный метасинтаксис использует такие свойства, как регистр, шрифт и кодовая позиция символов, чтобы уменьшить ненужную вышеупомянутую сложность. Более того, некоторые метаязыки используют категории разделителей шрифтов для включения метасинтаксических функций для соглашений о компоновке, которые формально не поддерживаются BNF.