Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2011, 22:04   #1
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию Страуструп Язык программирования С++ специальное издание 2010

При прочтении данного материала возникает множество вопросов. Прошу Вашей помощи, думаю что некоторые из следующих вопросов встречались не только мне.
Вопрос №1. 6.1 Калькулятор
Код:
program:
    END                                         // END это конец ввода
    expr_list END

expr_list:
    expression PRINT                    // PRINT это точка с запятой
    expression PRINT expr_list

expression:                                 // выражение
    expression + term
    expression  - term
    term

term:
    term  / primary
    term * primary
    primary

primary:                                     // первичное выражение
    NUMBER                                 // число
    NAME                                     // имя
    NAME = expression
    - primary
    (expression)
В книге написано что это формальная грамматика программы. Итак вопрос что означает этот "набор символов английского алфавита"? Правильно ли я понимаю что expression это алгебраическое выражение, а term это один из его элементов? Благодарю за внимание, Алексей.
KemanSR вне форума Ответить с цитированием
Старый 26.12.2011, 22:48   #2
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Формальная грамматика определяет, в соответствии с какими правилами будет производиться синтаксический анализ текста, то есть построение АСД. Подробнее могу объяснить в Skype/Jabber голосом (обращайтесь), ибо здесь пояснений не на один абзац.
Ищете информацию по C++?
cplusplus.com

Последний раз редактировалось Сtrl; 26.12.2011 в 22:53.
Сtrl вне форума Ответить с цитированием
Старый 27.12.2011, 01:06   #3
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

KemanSR

Итак вопрос что означает этот "набор символов английского алфавита"?

http://ru.wikipedia.org/wiki/%D0%A4%...83%D1%80%D0%B0
Rififi вне форума Ответить с цитированием
Старый 27.12.2011, 20:07   #4
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
Сообщение от Rififi Посмотреть сообщение
Страуструп использует далеко не РБНФ.
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 28.12.2011, 20:05   #5
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию

Цитата:
Сообщение от Сtrl Посмотреть сообщение
Страуструп использует далеко не РБНФ.
Думаю именно ее он и использует, по крайней мере применив эту форму кое-что стало для меня понятно. Вообще для себя решил изучить книгу "без пробелов", вот дошел до программы-калькулятора и запнулся. Страуструп пишет что книга "в том числе" и для новичков, выходит я по иерархии ниже чем они. Если кто нибудь уделит мне пять минут и поможет упорядочить мысли, буду крайне благодарен.

Для Ctrl: А вдруг еще кто-то заинтересуется данным вопросом, хотелось бы разьяснить его в формате форума.

С уважением, Алексей.
KemanSR вне форума Ответить с цитированием
Старый 01.04.2012, 20:17   #6
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию

Добрый день!
До меня искренне не может дойти что означает эта форма представления. Неужели ни кто не читал эту книгу? Неужели, если кто-нибудь все-таки читал, то ни кто не понял? А если все-таки понял, неужели трудно помочь человеку разобраться?
Вопросы:
1. Строчка "program" - это основная часть программы, типа "main"?
2. Строчка "END" - означает что прога начинается с конца ввода?
KemanSR вне форума Ответить с цитированием
Старый 01.04.2012, 21:30   #7
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Код:
program:
    END                                         // END это конец ввода
    expr_list END
Означает, что программа может состоять либо из одного командного слова END, либо из expr_list, за которым следует END.
В свою очередь expr_list определяется следующими правилами:
Код:
expr_list:
    expression PRINT                    // PRINT это точка с запятой
    expression PRINT expr_list
То есть оно может состоять либо из (expression, за которым следует точка с запятой), либо из (expression, за которым следует точка с запятой, а затем - expr_list). Последнее означает, что вместо expr_list может быть любой из определенных ранее вариантов. Такой здесь один - expression с последующей точкой с запятой. Из этих правил по индукции мы можем вывести, что expr_list может иметь следующий вид:
Код:
expression PRINT

либо, согласно второму правилу

expression PRINT expression PRINT

либо еще больше последовательных expression PRINT
Самый простой случай, когда правил всего два:
Код:
A:
B
B A
по сути означает, что A может состоять из любого числа последовательно идущих B. Т.к. B является одним из случаев A, то вторым вариантом (B A) является B B. Раз B B является этим A, то мы можем во второе правило вместо A подставить B B и получим B B B. И так далее.

В свою очередь, expression имеет следующие варианты:
Код:
expression:                                 // выражение
    expression + term
    expression  - term
    term
здесь возможностей уже больше. Во-первых, term является элементарным expression. Во-вторых, согласно первому правилу, expression + term - тоже expression. Как мы уже знаем, вместо expression можно подставить term - получим, что еще один вариант expression - это term + term. Аналогично, term - term это тоже expression. Теперь подставляя и эти варианты в первые два правила, мы получим, что term + term + term и term - term + term является expression, а также term + term - term и term - term - term. Говоря простым языком, expression - это комбинация всевозможным сумм и разностей term.
Те, в свою очередь, являются комбинациями произведений и частных primary. А вот уже те могут представлять собой числа, имена, выражения типа "NAME = expression", любой из предыдущих вариантов со знаком минус перед ним, а также expression, заключенный в скобки.

Теперь, зачем все это делается. Эти правила задают приоритет операций. Т.е. то, что expression является суммами и разностями term, означает, что term является первичным по отношению к expression. Т.е. вычисляется раньше: вначале мы вычисляем произведения и частные, и только потом можем складывать результаты.

Вот чуть более подробное объяснение. Думаю, оно немного запутанное, но должно все-таки прояснить общий туман. Сам помню, как пытался разобраться во всем этом. Со временем дошло, чего и вам желаю
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Язык программирования D russian-stalker Свободное общение 2 07.02.2011 20:51
Язык программирования С++ Jasper92 Свободное общение 2 09.11.2009 13:51
Язык программирования C Jasper92 Свободное общение 17 06.09.2009 11:13
язык программирования Си Ruslan0990kz Общие вопросы C/C++ 1 03.06.2009 22:01