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