Jump to content

Расширенная форма Бэкуса – Наура

В информатике обозначений , расширенная форма Бэкуса-Наура ( EBNF ) представляет собой семейство метасинтаксических любая из которых может использоваться для выражения контекстно-свободной грамматики . EBNF используется для формального описания формального языка, такого как язык компьютерного программирования . Они являются расширениями базовой нотации метасинтаксиса формы Бэкуса – Наура (BNF).

Самый ранний EBNF был разработан Никлаусом Виртом , включив в себя некоторые концепции (с другим синтаксисом и обозначениями) из синтаксической нотации Вирта . Сегодня используется множество вариантов EBNF. Международная организация по стандартизации EBNF приняла стандарт ISO/IEC 14977 в 1996 году. [ 1 ] [ 2 ] Однако, по словам Зайцева, этот стандарт «лишь добавил к хаосу еще три диалекта» и, отметив его неуспех, также отмечает, что ISO EBNF даже не используется во всех стандартах ISO. [ 3 ] Уиллер выступает против использования стандарта ISO при использовании EBNF и рекомендует рассмотреть альтернативные нотации EBNF, например, из расширяемого языка разметки W3C (XML) 1.0 (пятое издание). [ 4 ]

В этой статье используется EBNF, указанный ISO, для примеров, применимых ко всем EBNF. Другие варианты EBNF используют несколько другие синтаксические соглашения.

EBNF — это код , выражающий синтаксис формального языка. [ 5 ] EBNF состоит из терминальных символов и нетерминальных правил производства, которые представляют собой ограничения, определяющие, как терминальные символы могут быть объединены в действительную последовательность. Примеры терминальных символов включают буквенно-цифровые символы , знаки препинания и символы пробелов .

EBNF определяет правила производства , в которых последовательности символов соответственно присваиваются нетерминалу :

digit excluding zero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
digit                = "0" | digit excluding zero ;

Это производственное правило определяет нетерминальную цифру , которая находится в левой части присвоения. Вертикальная черта представляет альтернативу, а символы терминала заключаются в кавычки, за которыми следует точка с запятой в качестве завершающего символа. Следовательно, цифра — это 0 или цифра, исключая ноль , который может быть 1 , 2 или 3 и так далее до 9 .

Продукционное правило также может включать последовательность терминалов или нетерминалов, каждый из которых разделен запятой:

twelve                          = "1", "2" ;
two hundred one                 = "2", "0", "1" ;
three hundred twelve            = "3", twelve ;
twelve thousand two hundred one = twelve, two hundred one ;

Выражения, которые можно опустить или повторить, можно представить с помощью фигурных скобок { ... }:

natural number = digit excluding zero, { digit } ;

В этом случае строки 1 , 2 , ..., 10 , ..., 10000 , ... являются правильными выражениями. Чтобы представить это, все, что установлено в фигурных скобках, может повторяться сколь угодно часто, в том числе не повторяться вообще.

Опцию можно представить через квадратные скобки [...]. То есть все, что указано в квадратных скобках, может присутствовать только один раз или не присутствовать вообще:

integer = "0" | [ "-" ], natural number ;

Таким образом, целое число — это ноль ( 0 ) или натуральное число , которому может предшествовать необязательный знак минус .

EBNF также предоставляет, среди прочего, синтаксис для описания повторений (определенного количества раз), исключения некоторой части продукции и вставки комментариев в грамматику EBNF.

Таблица символов

[ редактировать ]

Ниже представлен предлагаемый стандарт ISO/IEC 14977, разработанный RS Scowen, стр. 7, таблицы 1 и 2.

Использование Обозначения Альтернатива Значение
определение =
конкатенация ,
прекращение ; .
чередование | / или !
необязательный [ ... ] (/ ... /) ни один или один раз
повторение { ... } (: ... :) ни одного или более
группировка ( ... )
терминальная строка "..." ' ... '
комментарий (* ... *)
специальная последовательность ? ... ?
исключение -


Синтаксическая диаграмма

[ редактировать ]
Одна из возможных синтаксических диаграмм EBNF
EBNF Одна из возможных синтаксических диаграмм

Даже EBNF можно описать с помощью EBNF. Рассмотрим приведенную ниже грамматику (используя такие соглашения, как «-» для обозначения дизъюнкции множеств, «+» для обозначения одного или нескольких совпадений и «?» для обозначения необязательности):

letter = "A" | "B" | "C" | "D" | "E" | "F" | "G"
       | "H" | "I" | "J" | "K" | "L" | "M" | "N"
       | "O" | "P" | "Q" | "R" | "S" | "T" | "U"
       | "V" | "W" | "X" | "Y" | "Z" | "a" | "b"
       | "c" | "d" | "e" | "f" | "g" | "h" | "i"
       | "j" | "k" | "l" | "m" | "n" | "o" | "p"
       | "q" | "r" | "s" | "t" | "u" | "v" | "w"
       | "x" | "y" | "z" ;

digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;

symbol = "[" | "]" | "{" | "}" | "(" | ")" | "<" | ">"
       | "'" | '"' | "=" | "|" | "." | "," | ";" | "-" 
       | "+" | "*" | "?" | "\n" | "\t" | "\r" | "\f" | "\b" ;

character = letter | digit | symbol | "_" | " " ;
identifier = letter , { letter | digit | "_" } ;

S = { " " | "\n" | "\t" | "\r" | "\f" | "\b" } ;

terminal = "'" , character - "'" , { character - "'" } , "'"
         | '"' , character - '"' , { character - '"' } , '"' ;

terminator = ";" | "." ;

term = "(" , S , rhs , S , ")"
     | "[" , S , rhs , S , "]"
     | "{" , S , rhs , S , "}"
     | terminal
     | identifier ;

factor = term , S , "?"
       | term , S , "*"
       | term , S , "+"
       | term , S , "-" , S , term
       | term , S ;

concatenation = ( S , factor , S , "," ? ) + ;
alternation = ( S , concatenation , S , "|" ? ) + ;

rhs = alternation ;
lhs = identifier ;

rule = lhs , S , "=" , S , rhs , S , terminator ;

grammar = ( S , rule , S ) * ;

Язык программирования, подобный Паскалю , допускающий только присваивания, можно определить в EBNF следующим образом:

 (* a simple program syntax in EBNF - Wikipedia *)
 program = 'PROGRAM', white space, identifier, white space, 
            'BEGIN', white space, 
            { assignment, ";", white space },
            'END.' ;
 identifier = alphabetic character, { alphabetic character | digit } ;
 number = [ "-" ], digit, { digit } ;
 string = '"' , { all characters - '"' }, '"' ;
 assignment = identifier , ":=" , ( number | identifier | string ) ;
 alphabetic character = "A" | "B" | "C" | "D" | "E" | "F" | "G"
                      | "H" | "I" | "J" | "K" | "L" | "M" | "N"
                      | "O" | "P" | "Q" | "R" | "S" | "T" | "U"
                      | "V" | "W" | "X" | "Y" | "Z" ;
 digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
 white space = ? white space characters ? ;
 all characters = ? all visible characters ? ;

Например, синтаксически правильная программа может выглядеть так:

 PROGRAM DEMO1
 BEGIN
   A:=3;
   B:=45;
   H:=-100023;
   C:=A;
   D123:=B34A;
   BABOON:=GIRAFFE;
   TEXT:="Hello world!";
 END.

Язык можно легко расширить за счет потоков управления , арифметических выражений и инструкций ввода/вывода. Затем будет разработан небольшой, удобный язык программирования.

Преимущества перед БНФ

[ редактировать ]

Любая грамматика, определенная в EBNF, также может быть представлена ​​в BNF, хотя представления в последнем обычно более длинные. Например, варианты и повторения не могут быть напрямую выражены в BNF и требуют использования промежуточного правила или альтернативного производства, определенного как ничего, или необязательного производства для варианта, или либо повторного производства самого себя, рекурсивно, для повторения. Те же конструкции по-прежнему можно использовать в EBNF.

BNF использует символы ( <, >, |, ::=) сам по себе, но не включает кавычки вокруг терминальных строк. Это предотвращает использование этих символов в языках и требует специального символа для пустой строки. В EBNF терминалы заключаются строго в кавычки ( "... " или '... '). Угловые скобки (" <... >") для нетерминалов можно опустить.

Синтаксис BNF может представлять правило только в одной строке, тогда как в EBNF завершающий символ, символ точки с запятой « ;» отмечает конец правила.

Кроме того, EBNF включает в себя механизмы улучшений, определяющие количество повторов, исключающие альтернативы, комментарии и т. д.

Конвенции

[ редактировать ]
  1. Согласно разделу 4 стандарта ISO/IEC 14977 используются следующие условные обозначения:
    • Каждый метаидентификатор расширенного BNF записывается как одно или несколько слов, соединенных дефисами . Однако соединение слов, похоже, применимо только к ссылкам на метаидентификаторы вне самого метаязыка, как видно из примеров стандарта.
    • Метаидентификатор, заканчивающийся на -symbol, представляет собой имя терминального символа расширенного BNF.
  2. Обычный символ, представляющий каждый оператор расширенного BNF и его подразумеваемый приоритет (наивысший приоритет вверху):
     * repetition-symbol
     - except-symbol
     , concatenate-symbol
     | definition-separator-symbol
     = defining-symbol
     ; terminator-symbol
     . terminator-symbol
    
  3. Обычный приоритет переопределяется следующими парами скобок:
     (* start-comment-symbol          end-comment-symbol *)
     '  first-quote-symbol            first-quote-symbol  '
     (  start-group-symbol              end-group-symbol  )
     [  start-option-symbol            end-option-symbol  ]
     {  start-repeat-symbol            end-repeat-symbol  }
     ?  special-sequence-symbol  special-sequence-symbol  ?
     "  second-quote-symbol          second-quote-symbol  "
    
    Символом первой кавычки является апостроф , определенный в ISO/IEC 646:1991, то есть Unicode U+0027 ( '); шрифт, используемый в ISO/IEC 14977:1996(E), очень похож на острый шрифт Unicode U+00B4 ( ´), поэтому иногда возникает путаница. Однако стандарт ISO Extended BNF использует ISO/IEC 646:1991, «7-битный набор кодированных символов ISO для обмена информацией», в качестве нормативной ссылки и не упоминает какие-либо другие наборы символов, поэтому формально нет путаницы с Символы Юникода вне 7-битного диапазона ASCII.

В качестве примеров следующие синтаксические правила иллюстрируют возможности выражения повторения:

aa = "A";
bb = 3 * aa, "B";
cc = 3 * [aa], "C";
dd = {aa}, "D";
ee = aa, {aa}, "E";
ff = 3 * aa, 3 * [aa], "F";
gg = {3 * aa}, "G";
hh = (aa | bb | cc), "H";

Терминальные строки, определенные этими правилами, следующие:

aa: A
bb: AAAB
cc: C AC AAC AAAC
dd: D AD AAD AAAD AAAAD etc.
ee: AE AAE AAAE AAAAE AAAAAE etc.
ff: AAAF AAAAF AAAAAF AAAAAAF
gg: G AAAG AAAAAAG etc.
hh: AH AAABH CH ACH AACH AAACH

Расширяемость

[ редактировать ]

Согласно стандарту ISO 14977, EBNF должен быть расширяемым, и упоминаются две возможности. Первый — это часть грамматики EBNF, специальная последовательность, представляющая собой произвольный текст, заключенный в вопросительные знаки. Интерпретация текста внутри специальной последовательности выходит за рамки стандарта EBNF. Например, символ пробела можно определить по следующему правилу:

 space = ? ASCII character 32 ?;

Второе средство расширения использует тот факт, что круглые скобки в EBNF нельзя размещать рядом с идентификаторами (они должны быть объединены с ними). Действителен следующий EBNF:

 something = foo, ( bar );

Следующее не является допустимым EBNF:

 something = foo ( bar );

Следовательно, расширение EBNF может использовать это обозначение. Например, в грамматике Лиспа применение функции может быть определено следующим правилом:

 function application = list( symbol, { expression } );
[ редактировать ]
  • W3C . EBNF нотацию публикует
  • W3C другой использовал EBNF для определения синтаксиса XML .
  • Британский институт стандартов опубликовал стандарт EBNF: BS 6154 в 1981 году.
  • IETF ( ABNF использует расширенный BNF ), указанный в РФК   5234 .

См. также

[ редактировать ]
  1. ^ Роджер С. Скоуэн: Расширенный BNF — общий базовый стандарт. Симпозиум по стандартам разработки программного обеспечения, 1993 г.
  2. ^ Международный стандарт ( ISO 14977 ), который является одним из многих форматов EBNF, теперь доступен бесплатно как PDF-файл, сжатый в формате Zip .
  3. ^ Зайцев, Вадим (26–30 марта 2012 г.). «Здесь был BNF: что мы сделали с ненужным разнообразием обозначений синтаксических определений?» (PDF) . Материалы 27-го ежегодного симпозиума ACM по прикладным вычислениям (SAC '12) . Рива дель Гарда, Италия. п. 1.
  4. ^ Уилер, Дэвид А. (2019). «Не используйте расширенную форму Бэкуса-Наура (EBNF) ISO/IEC 14977» . Проверено 26 февраля 2021 г.
  5. ^ Паттис, Ричард Э. «EBNF: обозначение для описания синтаксиса» (PDF) . ICS.UCI.edu . Калифорнийский университет в Ирвайне . п. 1 . Проверено 26 февраля 2021 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 1e305aeff45bcebdf832008195bfdf31__1718363640
URL1:https://arc.ask3.ru/arc/aa/1e/31/1e305aeff45bcebdf832008195bfdf31.html
Заголовок, (Title) документа по адресу, URL1:
Extended Backus–Naur form - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)