Формальное БНФ определение языка программирования Мини-Паскаль (МиП)

Рекомендованная для изучения статья Языки, грамматики, Бэкусовские нормальные формы (БНФ)
(начните с неё!) выводит на практическое использование БНФ для описания паскалеподобных ЯП.

Т.к. полное описание грамматики Паскаля было бы слишком громоздким, для иллюстрации
применения БНФ и, одновременно, знакомства с важнейшими языковыми понятиями, ограничимся
узким подмножеством Паскаля, которое назовём языком МиП ("МиниПаскаль").

То, что МиП - это подмножество Паскаля, означает следующий важный факт: любая МиП-программа, является одновременно, синтаксически правильно построенной Паскаль-программой. Так, что знакомясь с МиП и планируя в перспективе изучение Паскаля, ничего лишнего изучать и не придётся.
Итак, вот полное описание МиП:

  1. <МиП-программа> ::= <заголовок_программы>; <блок> <точка>
  2. <точка> ::= .
  3. <заголовок_программы> ::= program <имя_программы>
  4. <имя_программы> ::= <идентификатор>
  5. <идентификатор> ::= <буква> | <идентификатор> <буква> | <идентификатор> <цифра>
  6. <буква> ::= а | b | ... | y | z | A | B | ... | Y | Z | _
  7. <цифра> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
  8.  
  9. <блок> ::= <декларативная_часть><составной_оператор>
  10. <декларативная_часть> ::= <пусто> | <список_секций> ;
  11. <пусто> ::=
  12. <список_секций> ::= <секция> | <список_секций> ; <секция>
  13. <секция> ::= <секция_переменных> | <секция_констант>
  14.  
  15. <секция_переменных> ::=  var <список_описаний_переменных>
  16. <список_описаний_переменных> ::= <описание_переменных> |
  17.                        <список_описаний_переменных>;<описание_переменных>
  18. <описание_переменных> ::= <список_переменных> : <тип>
  19. <список_переменных> ::= <переменная> | <список_переменных> , <переменная>
  20. <переменная> ::= <идентификатор>
  21. <тип> ::= Byte | Word | ShortInt | Integer | LongInt
  22.  
  23. <составной_оператор> ::= begin <оп_последовательность> end
  24. <оп_последовательность> ::= <оператор> | <оп_последовательность>;<оператор>
  25. <оператор> ::= <оп_ввода> | <оп_вывода> | <оп_присваивания> | <пустой_оп>
  26.  
  27. <оп_ввода> ::= readln | readln(<список_ввода>)
  28. <список_ввода> ::= <список_переменных>
  29.  
  30. <оп_вывода> ::= writeln(<список_вывода>)
  31. <список_вывода> ::= <список_выражений>
  32.  
  33. <список_выражений> ::= <выр> | <список_выражений>,<выр>
  34. <выр> ::= <арифм_выр> | <текст_выр>
  35. <арифм_выр> ::= <целая_константа> | <переменная> | <арифм_выр> <знак_ар_оп> <арифм_выр>
  36. <знак_ар_оп> ::= + | - | * | div | mod
  37. <текст_выр> ::= <текст_константа>
  38.  
  39. <оп_присваивания> ::= <переменная> := <выр>
  40. <пустой_оп> ::= <пусто>
  41.  
  42. <секция_констант> ::= const <список_объявлений_констант>
  43. <список_объявлений_констант> ::= <объявление_константы> |
  44.                   <список_объявлений_констант> ; <объявление_константы>
  45. <объявление_константы> ::= <имя_константы> = <константа>
  46. <имя_константы> ::= <идентификатор>
  47. <константа> ::= <целая_константа> | <текст_константа>
  48.  
  49. <целая_константа> ::= <цел_без_знака> | <знак> <цел_без_знака>
  50. <цел_без_знака> ::= <цифра> |  <цел_без_знака> <цифра>
  51. <знак> ::= +|-
  52.  
  53. <текст_константа> ::= '<ascii-последовательность>'
  54. <ascii-последовательность> ::= <пусто> | <ascii-символ> |
  55.                      <ascii-последовательность> <ascii-символ>

Вот и всё, БНФ-определение ядра языка Паскаль можно считать завершённым. Добавляя новые языковые конструкции, ядро это можно расширять (вплоть до полной версии Паскаля).
Обратите внимание на одну деталь, понятие < ascii-символ> мы так и не уточнили. Причины тому чисто технические - слишком длинный список ascii-символов (всего, 256 знаков, включая все те, которые Вы видите на клавиатуре).

И ещё, запомните. Лишние пробелы и переходы на новые строки между лексемами в Паскале (и в МиП, конечно) не учитываются и могут использоваться произвольно для придания тексту любого рельефа. А вот, например, идентификаторы, обозначения констант и ключевых слов разрывать нельзя (т.к. они и есть примеры лексем). Кроме того, в идентификаторах Паскаля не различаются прописные и строчные буквы (так, например, Begin и beGiN считаются совпадающими).

ЖДУ ВОПРОСОВ!

5
Your rating: Нет Average: 5 (10 votes)

Комментарии

Здравствуйте , я не понял 9 и

Здравствуйте , я не понял 9 и 10 строчку что такое <декларативная_часть>, объясните пожалуйста

Николай,

<декларативная_часть> - это область объявления идентификаторов, используемых в программе;

Декларативная часть:

  • {$} - область директив компилятора;
  • uses - список используемых модулей;
  • Label - описание меток;
  • Const - описание констант;
  • Type - описание типов;
  • Var - описание переменных;
  • Procedure - описание процедур;
  • Function - описание функций;

спасибо

спасибо

Николай, Никита, да и другие ...

Относительно декларативной части категорически не соглашусь с Никитой, который пытается объяснить СМЫСЛ этого понятия, что само по себе не верно, употребляя, к тому же "туманные" пока термины (uses, label, procedure и т.д.), которые не имеют никакого отношения к описываемому языку.
А смыслы здесь совсем непричём, т.к. описывается СИНТАКСИС - формальная структура всех слов определяемого языка (МиП), а не их семантика.

БНФ не работает со смыслами, он работает с формами!

Выбранные обозначения нетерминальных символов (такие как <блок>, <декларативная_часть> и все другие, заключённые в угловые скобки) не существенны. Даже если Вы их замените на совершенно другие, "невыразительные" (такие, например, как < A>, < B> и т.п.) дело не пострадает и корректность описание структуры всех правильно построенных МиП-программ не нарушится.
Вот Вы, Николай, спрашиваете, например, что такое <декларативная_часть>. Но ведь в 10-й строке мы видим:

<декларативная_часть> ::= <пусто> | <список_секций> ;

Этим сказано, что <декларативная_часть> это такая штука, которая то же самое, что и <пусто> или <список_секций>, за которым следует знак ";".
Всё! Вопрос о том, что такое <декларативная_часть> снят!
Теперь зато появилось два новых вопроса: что такое <пусто> и что такое <список_секций>. Но и эти понятия расшифровываются в последующих описаниях. Двигаясь так дальше и дальше мы расписываем структуру МиП-программ детальней и детальней, пока не дайдём до уровня терминальных символов (тогда не останется никаких вопросов).
Изучите мою статью о БНФ и разберите примеры (с языком чётных двоичных чисел, с языком палиндромов и др.). На сайте примеров, в том числе и о МиП предостаточно.

Задание №1а от 18.09.2014

Определить все вещественные числа с плавающей и с фиксированной точкой в базовой БНФ

  1. <пусто>               ::=
  2. <точка>               ::= .
  3. <экспонента>          ::= E | e
  4. <знак>                ::= + | | -
  5. <цифра>               ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
  6. <целое_без_знака>     ::= <цифра> | <целое_без_знака><цифра>
  7. <целое>               ::= <знак><целое_без_знака>
  8. <вещественное_число>  ::= <целое>.<целое_без_знака> | <целое>.<целое_без_знака><экспонента><целое>

Все замечания с радостью принимаются.

P.S. Не уверен в правильности возможной постановки пробелов, внутри я понимаю нельзя ставить, а внешне не уверен.

Пара замечаний, Александр.

Всё правильно, Александр, но покрывается всё не всё. В Паскале перед экспонентой может стоять и ЦЕЛОЕ (например, допустимо писать 1e-20). Впрочем, это легко учесть.
И ещё, не обязательно вводить столько мелких понятий. Например, < точка> или < экспонента> сразу могут быть заменены на терминалы.
Кстати, если всё же пользоваться общепринятой терминологией, "экспонентой" обычно называют не просто букву E(e), а эту букву, вместе со следующим за ним целым. А то, что всему этому предшествует называют мантиссой. В этих терминах, наши константы имеют общий вид: < мантисса>< экспанента>.

Внимательно прочел ваш пост,

Внимательно прочел ваш пост, прочитал понятие мантиссы и экспоненты в энциклопедиях, сделал выводы:

  1. <экспонента>          ::= E<целое>  | e<целое>
  2. <вещественное_число>  ::= <целое>.<целое_без_знака> | <целое>.<целое_без_знака><экспонента> | <целое><экспонента>

Таким образом покрывается все множество вещественных чисел.

P.S. Просто задание было дано о числах с точкой, и я не учел первоначально что само число может представляться без точки, подразумевая ее наличие.

Теперь всё так, Александр.

Теперь всё так, Александр.

Задачи о БНФ в группах

А на текущей странице вы найдёте синтаксис МиП. Кстати, обратите внимание на мой обширный комментарий (Втр, 24/09/2013 - 21:24) на этой странице. Прочтите его внимательно.

Сафронова Мария аватар

Не совсем понятны,последнии

  1. Не совсем понятны,последнии строчки.
  2.  
  3. 53. <текст_константа> ::= '<ascii-последовательность>'
  4. 54. <ascii-последовательность> ::= <пусто> | <ascii-символ> |  <ascii-последовательность> <ascii-символ>
  5.  
  6.  Что означает <ascii-символ>???
  7. И почему выражение  '<ascii-последовательность>' в апострофах ???