Синтаксические диаграммы (или железнодорожные диаграммы ) - это способ представления контекстно-свободной грамматики . Они представляют собой графическую альтернативу форме Бэкуса – Наура , EBNF , расширенной форме Бэкуса – Наура и другим основанным на тексте грамматикам как метаязыкам . Ранние книги, использующие синтаксические диаграммы, включают «Руководство пользователя Паскаля», написанное Никлаусом Виртом [1] (диаграммы начинаются на странице 47), и « Руководство Берроуза по CANDE» . [2]В поле компиляции обычно предпочтительны текстовые представления, такие как BNF или его варианты. BNF основан на тексте и используется разработчиками компиляторов и генераторами парсеров. Диаграммы железных дорог являются наглядными и могут быть более понятны непрофессионалам, иногда они включаются в графический дизайн. Канонический источник, определяющий формат обмена данными JSON , представляет собой еще один пример популярного современного использования этих диаграмм.
Принцип синтаксических диаграмм
Представление грамматики - это набор синтаксических диаграмм. Каждая диаграмма определяет нетерминал. Существует основная диаграмма, которая определяет язык следующим образом: чтобы принадлежать языку, слово должно описывать путь на главной диаграмме.
Каждая диаграмма имеет точку входа и точку окончания. Схема описывает возможные пути между этими двумя точками, проходя через другие нетерминалы и терминалы. Исторически терминалы были представлены круглыми коробками, а нетерминалы - прямоугольными, но официального стандарта не существует.
Пример
В качестве примера мы используем арифметические выражения в различных грамматических форматах.
BNF:
< выражение > :: = < термин > | < термин > "+" < выражение > < термин > :: = < коэффициент > | < коэффициент > "*" < термин > < коэффициент > :: = < константа > | < переменная > | "(" < выражение > ")" < переменная > :: = "x" | "у" | "z" < константа > :: = < цифра > | < цифра > < константа > < цифра > :: = "0" | «1» | «2» | «3» | «4» | «5» | «6» | «7» | «8» | «9»
EBNF:
выражение = термин , [ "+" , выражение ]; термин = коэффициент , [ "*" , срок ]; коэффициент = константа | переменная | "(" , выражение , ")" ; переменная = "x" | "у" | "z" ; константа = цифра , { цифра }; цифра = "0" | «1» | «2» | «3» | «4» | «5» | «6» | «7» | «8» | «9» ;
ABNF:
выражение = термин [ "+" выражение ] термин = коэффициент [ "*" термин ] коэффициент = константа / переменная / "(" выражение ")" переменная = "x" / "y" / "z" константа = 1 * цифра ЦИФРА = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9"
Обратите внимание, что ABNF также поддерживает диапазоны, например DIGIT =% x30-39 , но здесь он не используется для согласованности с другими примерами.
Red_ (programming_language) Разобрать диалект:
выражение: [термин opt ["+" выражение]] термин: [фактор opt ["*" термин]] коэффициент: [константа | переменная | "(" выражение ")"] переменная: ["x" | "у" | "z"] константа: [некоторая цифра] цифра: ["0" | «1» | «2» | «3» | «4» | «5» | «6» | «7» | «8» | «9»]
Обратите внимание, что этот формат также поддерживает диапазоны, например digit: charset [# "0" - # "9"] , но он не используется здесь для согласованности с другими примерами.
Одна возможная синтаксическая диаграмма для примеров грамматик приведена ниже. Обратите внимание, что хотя синтаксис для текстовых грамматик отличается, синтаксическая диаграмма для всех из них может быть одинаковой, потому что это метаязык .
Смотрите также
Рекомендации
Примечание: первая ссылка иногда блокируется сервером за пределами своего домена, но она доступна на archive.org . Файл также был скопирован на standardpascal.org .
Внешние ссылки
- Веб-сайт JSON, включая синтаксические диаграммы
- Генератор от EBNF
- Из EBNF в файл postscript с диаграммами
- Анализатор и рендерер EBNF
- Генератор синтаксических диаграмм SQLite для SQL
- Онлайн-генератор железнодорожных диаграмм
- Грамматики расширенных синтаксических диаграмм (ASD)
- (ASD) Демонстрационный сайт приложения с расширенной синтаксической диаграммой
- Представление синтаксической диаграммы SRFB с помощью функции Basis + генерация svg