Re: Граматика С++
От: Аноним  
Дата: 09.08.04 13:11
Оценка: +1
Народ, ну вы таки определитесь, какой язык вы собираетесь описывать, а потом будете спорить, он КС или КЗ.
Что является допустимым предложением языка?
В частности, приведённый пример с попутанным типом возвращаемого значения является допустимым предложением C++ или нет?

IMHO не является.
И аргумент, что является, т.к. удовлетворяет приведённой в стандарте грамматике не катит (http://rsdn.ru/Forum/Message.aspx?mid=753617&only=1
Автор: WolfHound
Дата: 07.08.04
). Т.е. стандарт честно признаётся, что множество допустимых предложений языка C++ определяется совсем не приведённой в этом же стандарте грамматикой.
Тогда почему является? (если кто-то так думает)
Re[15]: Граматика С++
От: mefrill Россия  
Дата: 09.08.04 13:11
Оценка:
SJA>Вот тут все резво бросаются такими терминами, как семантика и синтаксис. Нельзя ли привести их определение? По возможности более формальное.

В курсе математической логики есть понятие языка. В простейшем случае, (так называемые языки первого опорядка), язык определяется как множество констант и переменных, которые могут при этом принадлежать разным сортам (читай типам). А также, построенное из них множество выражений. Выражения строятся согласно формулам, причем индуктивно. Применительно к си++, правила потроения выражений это операции, применяемые к выражениям. Для данного языка можно определить реализацию или модель. Модель это множество объектов с отношениями между ними. Т.е. из данного множества посредством отношений выделяются некоторые подмножества, это и есть объекты — классы в си++. Экземпляр класса — элемент множества.

Строится отображение из множества констант и переменных в данную модель. Причем, опять же индуктивно, а именно, сначала определяются отбражения между константами и переменными с одной строны и элементами модели с другой. Потом, на основании синтаксических правил строится отображение выражений в некоторое подмножество модели. Построенное отображение и определяет семантику выражений языка. Синтаксически верные предложения языка отображаются в некоторые подмножества модели (эти подмножества и есть смыслы выражения) и, таким образом, определяется смысл языковых конструкций.

Применительно к языку си++, можно сказать, что стандарт языка определяет его синтаксис (грамматикой и на английском языке), т.е. множество синтаксически корректных программ. Любой же компилятор языка си++ и есть его семантическая модель. Напиример, типу int соответсвует некоторое множество чисел, каждой константе некоторое число и т.д. Поэтому, в стандарте языка си++ есть также некоторое описание семантики, т.е. ограничений, которым должны удовлетворять подмножества языка, например, касательно диапазона того же типа int.

То же самое и относительно русского языка, только его самая известная модель это весь наш мир как реальный, так и мыслимый. Можно скзать, что модель для русского языка это множество понятий, которыми оперируют люди, которые на этом языке разговаривают. Язык называется формальным, если каждому предложению языка соответствует только один элемент модели или одно множество, т.е. отображение из языка в модель однозначное. Языки программирвоания типа си или паскаль являются формальными, а вот русский язык нет. Например, выражению бить баклуши соответствуют два различных понятия — элемента множества понятий: ничего не делать, сланяться или делать топором специальные дощечки. Налицо семантическая неоднозначность и разрешить ее мы можем только из смысла предыдущих или последующих предложений. В языках программирования также есть такие неоднозначности, в си++ их много. Все здесь зависит от сложности языка, которая определяется как множество пардигм, которые данный язык выражает. Так число синтксических конструкций объективно ограниченно способностями человека, то приходится "перегружать" синтаксические конструкции так, чтобы они имели разные смысла в разных контекстах.
Re[18]: Граматика С++
От: WolfHound  
Дата: 09.08.04 13:15
Оценка:
Здравствуйте, <Аноним>, Вы писали:

SJA>>Ок. Такая строка будет синтаксически верна ?

SJA>>
SJA>>int rez = (A < B > C);
SJA>>

А>Yeah.
Без знания того что такое A, B, C ни чего сказать нельзя.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[16]: Граматика С++
От: WolfHound  
Дата: 09.08.04 13:15
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Такая функция порождается грамматиками С и С++, но не имеет смысла.

Грамматику С++ в студию я ее еще не видел.
А>В одном месте программист говорит, что функция ничего не возвращает, а в другом месте противоречит себе, возвращая значение. Компилятор не понимает, что хочет сказать программист, и поэтому этот код скомпилирован не будет.
Компилятор не обладает искуственным интелектом. Он может только сказать программа well-formed или нет. Данная прогрмма не well-formed следовательно не является предложением языка С++ и не может быть порождена грамматикой С++.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[17]: Граматика С++
От: Аноним  
Дата: 09.08.04 13:24
Оценка:
А>>Такая функция порождается грамматиками С и С++, но не имеет смысла.
WH>Грамматику С++ в студию я ее еще не видел.
Такими темпами и умрете в неведении! Перечитайте мой пост. Там два примера с номерами продукций и ссылка. Можете взять Страуструпа и сами вывести void var;
А>>В одном месте программист говорит, что функция ничего не возвращает, а в другом месте противоречит себе, возвращая значение. Компилятор не понимает, что хочет сказать программист, и поэтому этот код скомпилирован не будет.
WH>Компилятор не обладает искуственным интелектом. Он может только сказать программа well-formed или нет. Данная прогрмма не well-formed следовательно не является предложением языка С++ и не может быть порождена грамматикой С++.
Читайте мои обьяснения про множества. Вы путаете, то что принимает компилятор со множеством всех строк, что порождает грамматика.
Re[24]: Граматика С++
От: Sergey Россия  
Дата: 09.08.04 13:28
Оценка:
Hello, !
You wrote on Mon, 09 Aug 2004 11:44:28 GMT:

> Вот обьясните мне почему в Страуструпе и в самом стандарте по С++

> приводится "какая-то другая грамматика," выражаясь Вашим языком?

А где в Стандарте граматика C++ приводится? Там же вроде была
"gramma summary".

With best regards, Sergey.
Posted via RSDN NNTP Server 1.9 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[18]: Граматика С++
От: Sergey J. A. Беларусь  
Дата: 09.08.04 13:28
Оценка:
Здравствуйте, <Аноним>, Вы писали:

SJA>>Ок. Такая строка будет синтаксически верна ?

SJA>>
SJA>>int rez = (A < B > C);
SJA>>

А>Yeah.

Интересно.
template<class T>
class A {};

class B {};

void main(int argc, char* argv[])
{
    int rez = (A < B > C);    // (1)
}


На (1) ругаються:

VC++6.0:

Test.cpp
d:\z\test\test.cpp(8) : error C2146: syntax error : missing ')' before identifier 'C'
d:\z\test\test.cpp(8) : error C2065: 'C' : undeclared identifier
d:\z\test\test.cpp(8) : error C2059: syntax error : ')'
d:\z\test\test.cpp(8) : error C2440: 'type cast' : cannot convert from 'int' to 'class A<class B>'


VC++7.0:

d:\z\TTTT\TTTT.cpp(8): error C2146: syntax error : missing ')' before identifier 'C'
d:\z\TTTT\TTTT.cpp(8): error C2065: 'C' : undeclared identifier
d:\z\TTTT\TTTT.cpp(8): error C2059: syntax error : ')'


gcc (до версии не добрался. но не древняя)

1.cpp: In function `int main()':
1.cpp:8: parse error before `)' token


Comeau C/C++ 4.3.3:
"ComeauTest.c", line 8: error: expected a ")"
      int rez = (A < B > C);
                         ^

"ComeauTest.c", line 8: error: expected an expression
      int rez = (A < B > C);


То есть MS разработчики таки считают что имеет место синтаксическая ошибка.
gcc говорит про parse error (тоже наверное имеется в виду синтаксичесий анализ).
Comeau то же вроде запнулся на синтаксисе (скобка ему не понравилась).
И что характерно она зависит от контекста.Заменив
template<class T>
class A {};
class B {};

на
int A,B,C;

всё компилируется.

Как то странно узнать, что КС граматика зависит от контекста....
Или может разработчики компиляторов — не показатель ?
Я — свихнувшееся сознание Джо.
Re[26]: Граматика С++
От: WolfHound  
Дата: 09.08.04 13:28
Оценка:
Здравствуйте, <Аноним>, Вы писали:

Еще раз повторю что написано в стандарте:

This summary of C++ syntax is intended to be an aid to comprehension. It is not an exact statement of the language...

Следовательно вся ваша демагогия о том что приведенная в стандарте грамматика точная ни чего не стоит.
В данном случае вы спорите не со мной, а со стандартом языка С++.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[19]: Граматика С++
От: mefrill Россия  
Дата: 09.08.04 13:54
Оценка:
SJA>Интересно.
SJA>
SJA>template<class T>
SJA>class A {};

SJA>class B {};

SJA>void main(int argc, char* argv[])
SJA>{
SJA>    int rez = (A < B > C);    // (1)
SJA>}
SJA>


SJA>На (1) ругаються:


Нет, здесь посложнее немного...

SJA>VC++6.0:

SJA>

SJA>Test.cpp
SJA>d:\z\test\test.cpp(8) : error C2146: syntax error : missing ')' before identifier 'C'
SJA>d:\z\test\test.cpp(8) : error C2065: 'C' : undeclared identifier
SJA>d:\z\test\test.cpp(8) : error C2059: syntax error : ')'
SJA>d:\z\test\test.cpp(8) : error C2440: 'type cast' : cannot convert from 'int' to 'class A<class B>'


В данном случае используется тот факт, что в круглых скобках может быть только выражение. И поэтому, когда компилятор находит токен '(', то начинает строить в дереве разбора выражение, начинающиеся со скобок. Потом встречает "A < B >" — выводит тип и идет дальше и входит в единственную синтаксически правильную конструкцию с типом — преоразования в стиле си. Поэтому он ждет ")", ее нет, отсюда и сообщение об ошибке. Дальше непродекларированный идентификатор С. Выдается ошибка, токен С пропускается и встречается ")". Выражение в скобках (A < B >); (если не считать пропущенного С) верное, это преобразование типа. Поэтому идет дальше и находит конец выражения. Сигналит об ошибке, эта ошибка выводится в контексте компилятора, а он сейчас анализирует выражение в круглых скобках, вот и выдается третье сообщение. Потом, по тупому пытается таки преобразовать из целого (! видимо, тип по умолчанию для выражения) и находит несоответствие типа (интересно, а если поставить в класс А конструктор с целым типом, что шестая студия скажет?), а потом откатывает до предыдущего предложения, т.е. поросту пропускает данную строку. Седьмой компилятор умнее, при невалидном выражении он откатывает сразу. И, конечно, нормально сделанный компилятор комеа говорит о причине ошибки.

SJA>VC++7.0:

SJA>

SJA>d:\z\TTTT\TTTT.cpp(8): error C2146: syntax error : missing ')' before identifier 'C'
SJA>d:\z\TTTT\TTTT.cpp(8): error C2065: 'C' : undeclared identifier
SJA>d:\z\TTTT\TTTT.cpp(8): error C2059: syntax error : ')'


SJA>gcc (до версии не добрался. но не древняя)

SJA>

SJA>1.cpp: In function `int main()':
SJA>1.cpp:8: parse error before `)' token


SJA>Comeau C/C++ 4.3.3:

SJA>
SJA>"ComeauTest.c", line 8: error: expected a ")"
SJA>      int rez = (A < B > C);
SJA>                         ^

SJA>"ComeauTest.c", line 8: error: expected an expression
SJA>      int rez = (A < B > C);
SJA>
Re[27]: Граматика С++
От: Аноним  
Дата: 09.08.04 13:54
Оценка:
WH>Еще раз повторю что написано в стандарте:
WH>

WH>This summary of C++ syntax is intended to be an aid to comprehension. It is not an exact statement of the language...

WH>Следовательно вся ваша демагогия о том что приведенная в стандарте грамматика точная ни чего не стоит.
WH>В данном случае вы спорите не со мной, а со стандартом языка С++.
Да ну! Это уж в стандарте и не точная?!! Вы так и не ответили по какой грамматике пишут компиляторы профессионалы!

Демагогию о точности и неточности разводите Вы! Вы даже ни одного предложения не попробовали вывести! Ни разу не составляли своей грамматики! Какой с вами может быть разговор?
Re[28]: Граматика С++
От: Sergey Россия  
Дата: 09.08.04 13:59
Оценка:
Hello, !
You wrote on Mon, 09 Aug 2004 13:54:41 GMT:

WH>> Еще раз повторю что написано в стандарте:

WH>>

WH>> This summary of C++ syntax is intended to be an aid to comprehension.
WH>> It is not an exact statement of the
WH>> language
...

Следовательно вся ваша демагогия о том что

WH>> приведенная в стандарте грамматика точная ни чего не стоит. В данном
WH>> случае вы спорите не со мной, а со стандартом языка С++.
> Да ну! Это уж в стандарте и не точная?!!

Еще раз — в стандарте грамматика C++ приводится только косвенно, собственно
говоря, ею является весь текст стандарта.

> Вы так и не ответили по какой грамматике пишут компиляторы профессионалы!


Это ты у них спрашивай

With best regards, Sergey.
Posted via RSDN NNTP Server 1.9 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[28]: Граматика С++
От: WolfHound  
Дата: 09.08.04 14:44
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Да ну! Это уж в стандарте и не точная?!!

Вы читать умеете? А быть может вы просто английский не знаете? Так и быть поработаю переводчиком

Annex A//Дополнение те это уже не стандарт
(informative)
Grammar summary//Краткое описание грамматики

This summary of C++ syntax is intended to be an aid to comprehension.
Это краткое описание синтаксиса С++ предназначено для помощи в понимании.
It is not an exact statement of the language.
Это не точное определение языка
In particular, the grammar described here accepts a superset of valid C++ constructs.
В частности представленная здесь грамматика допускает надмножество допустимых конструкций С++.
...

А>Вы так и не ответили по какой грамматике пишут компиляторы профессионалы!
Re[24]: Граматика С++
Автор: WolfHound
Дата: 09.08.04

Как раз распознование по точной грамматике требует огромного колличества ресурсов ибо она КЗ. По этому все пользуются очень простым трюком: Задают КС грамматику порождающею максимально близкое к языку надмножество предложений и используют не формалные правила для отсечения предложений которые не входят в язык. Это трюк позволяет уменьшить время с экспоненциального до полиномиального что дает огромный прирост скорости.

А в качестве этой не точной КС грамматики каждый использует ту грамматику которая ему удобней.

А>Вы даже ни одного предложения не попробовали вывести!

Для того чтобы что-то выводить нужна грамматика. Грамматику С++ вы так и не привели.
А>Ни разу не составляли своей грамматики!
Вы уверены? Хотя если вы про точную грамматику С++ то и не собираюсь.
А>Какой с вами может быть разговор?
Еще одна попытка перехода на личности и у меня закончится терпение.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[19]: Граматика С++
От: WeCom Беларусь  
Дата: 09.08.04 15:03
Оценка:
Здравствуйте, WolfHound, Вы писали:

>>Язык С++ — context free language!

WH>Итого: Это утверждение строится на отрициании того что множество всех well-formed программ на языке С++ является множеством всех предложений языка С++.
Это утверждение согласуется с тем, что множество всех well-formed программ на языке С++ не одно и то же что и множество всех (синтаксических) предложений языка С++.
Раз ты так любишь букву то:
1.3.14. well-formed program
a C++ program constructed according to the syntax rules, diagnosable semantic rules, and the One Definition Rule

И сразу вопрос на засыпку: Почему "One Definition Rule" вынесено в отдельную категорию? Что в нем такого особенного? Или авторы текста просто не знакомы с формальной теорией?..
Re[20]: Граматика С++
От: mefrill Россия  
Дата: 09.08.04 15:07
Оценка:
WC>Раз ты так любишь букву то:
WC>1.3.14. well-formed program
WC>a C++ program constructed according to the syntax rules, diagnosable semantic rules, and the One Definition Rule

А что такое the syntax rules и diagnosable semantic rules в данном предложении?
Re[27]: Граматика С++
От: WeCom Беларусь  
Дата: 09.08.04 15:20
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, <Аноним>, Вы писали:


WH>Еще раз повторю что написано в стандарте:

WH>

WH>This summary of C++ syntax is intended to be an aid to comprehension. It is not an exact statement of the language...

WH>Следовательно вся ваша демагогия о том что приведенная в стандарте грамматика точная ни чего не стоит.
WH>В данном случае вы спорите не со мной, а со стандартом языка С++.

Имхо негоже модератору так часто обвинять других в демагогии, попутно занимаясь ей же (касаемо вопроса wellformed программы) ...
Re[29]: Граматика С++
От: WeCom Беларусь  
Дата: 09.08.04 16:25
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Вы читать умеете? А быть может вы просто английский не знаете? Так и быть поработаю переводчиком


Раз уж я начал, то продолжу в ответ за анонима работать гуглом

Как тебе кажется, вот это правило (правда из стандарта C но это ведь не суть важно, правда?) к какому типу правил относится? Похоже на синтаксис, да? И почему только стандарт думает иначе?...

6.7.1/5 The declaration of an identifier for a function that has block scope shall have no explicit
storage-class specifier other than extern.
Re[20]: Граматика С++
От: WolfHound  
Дата: 09.08.04 16:28
Оценка:
Здравствуйте, WeCom, Вы писали:

WC>Это утверждение согласуется с тем, что множество всех well-formed программ на языке С++ не одно и то же что и множество всех (синтаксических) предложений языка С++.

Согласен. Я не много погорячился. Понятие well-formed program несколько шире чем я тут имел в виду и включает в себя также некоторые требования времени выполнения. Но в данной теме мы эти правила не рассамтриваем.
Что касается ODR то кто сказал что предложение языка С++ состоит только из одной единицы трансляции?
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[28]: Граматика С++
От: WolfHound  
Дата: 09.08.04 16:29
Оценка:
Здравствуйте, WeCom, Вы писали:

WC>Имхо негоже модератору так часто обвинять других в демагогии, попутно занимаясь ей же (касаемо вопроса wellformed программы) ...

1)Где тут демагогия? Тут только ссылка на стандарт.
2)Это я писал не как модератор, а как посетитель форума.
3)А вот это уже слова модератора: Обсуждать действия модератора можно только тут moderator@rsdn.ru если у вас есть претензии то пишите туда. Все дальнейшие попытки обсуждать модератора в публичном форуме будут пресекаться.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[17]: Граматика С++
От: Шахтер Интернет  
Дата: 09.08.04 16:41
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, <Аноним>, Вы писали:


А>>Такая функция порождается грамматиками С и С++, но не имеет смысла.

WH>Грамматику С++ в студию я ее еще не видел.

Стандарт C++ даёт определение некоторой грамматики языка, но это определение не определяет какой-то "грамматики C++". Оно используется исключительно как средство определения языка в совокупности с набором правил, выраженных на английском языке.

А>>В одном месте программист говорит, что функция ничего не возвращает, а в другом месте противоречит себе, возвращая значение. Компилятор не понимает, что хочет сказать программист, и поэтому этот код скомпилирован не будет.

WH>Компилятор не обладает искуственным интелектом. Он может только сказать программа well-formed или нет. Данная прогрмма не well-formed следовательно не является предложением языка С++ и не может быть порождена грамматикой С++.

Да нет, это разные вещи. Программа может быть порождена "грамматикой C++"(если понимать под нею грамматику, приведённую в стандарте), но не быть при этом well-formed.

На всякий случай.

1.3.14 well-formed program

a C++ program constructed according to the syntax rules, diagnosable semantic rules, and the One Definition Rule (3.2).

3.4 Name lookup

1 The name lookup rules apply uniformly to all names (including typedefnames(7.1.3), namespacenames(7.3) and classnames(9.1)) wherever the grammar allows such names in the context discussed by a particular rule. Name lookup associates the use of a name with a declaration (3.1) of that name. Name lookup shall find an unambiguous declaration for the name (see 10.2).
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[21]: Граматика С++
От: Шахтер Интернет  
Дата: 09.08.04 16:41
Оценка:
Здравствуйте, mefrill, Вы писали:


WC>>Раз ты так любишь букву то:

WC>>1.3.14. well-formed program
WC>>a C++ program constructed according to the syntax rules, diagnosable semantic rules, and the One Definition Rule

M>А что такое the syntax rules и diagnosable semantic rules в данном предложении?


Это все те правила, из которых, собственно, и состоит стандарт.

The set of diagnosable rules consists of all syntactic and semantic rules in this International Standard

except for those rules containing an explicit notation that “no diagnostic is required” or which are described as resulting in “undefined behavior.”
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.