Хомский, человек, который ввел понятие генеративной грамматики, определил ее как множество G={N,T,P,S} из четырех элементов: N — нетерминальные символы? T — терминальные, P — правила и S — начальный символ грамматики. Терминальные смиволы это слова языка, в си++ это, различные лексемы, типа идентификатор, слово, которое начинается с буквы и потом может идти ряд цифр или букв, ри этом символ подчеркивания считается буквой, и т.д. В стандарте все эти лексемы определены. нетерминальные мимволы явно в языке не существуют, они как бы нызывают некие совокупности слов, т.е. терминалов языка. Например, описание функции можно назвать нетерминалом Function_Description. Правила, понятно, позволяют задать соответствие между нетерминальными символами и терминалами языка, например: Function_Description --> Type ID '(' list_of_parameters ')' ';' Здесб все — терминалы языка, за исключением нетерминала list_of_parameters. Хомский также ввел различные типы грамматик, нас здесь как раз интересуют грамматики типа 1 и 2, т.е. контекстно-зависимые (КЗ) и контекстно-независимые или контекстно-свободные (КС) типы. КН задается правилами вида: alpha A beta --> alpha B beta, где alpha и beta строки, состоящие как из терминалов, так и из нетерминалов языка. Они могут быть пустыми. Смысл здесь состоит в том, что нетерминал A может значить либо, например B, как в нашем правиле, либо какой-нибудь C, как в правиле alpha1 A beta1 --> alpha1 С beta1, в зависимости от строк alpha и beta, т.е. от контекста, в котором этот нетерминал встретился. А в КС-грамматиках такого нет, нетерминал всегда значит одно и то же, поэтому там все правила имеют вид A --> alpha B beta, что можно обозначить просто как A --> alpha, т.к. alpha это строка нетерминальных и терминальных символов.
Си++, как и большинство других языков программирования, контекстно зависим. Любая операция, где присутствует тип, является контестно зависимой. Действительно, если мы определяем функцию как void foo( int, char ) и потом вызываем foo( a, b ), то этот вызов будет законным только тогда, когда типы фактических параметров подходят под типы формальных. А это как раз контекстная зависимость. Просто, обычно все КЗ вещи убирают из грамматики языка, не давая работать с ними синтаксическому анализатору. КЗ конструкции языка тогда называют семантикой языка и разрешают эти проблемы вручную. Если язык достаточно сложный, как си++, то это сделать сложно, приходится извращаться изменяя грамматику, подгоняя ее под какй-либо алгоритм синтаксического анализа и, в результате, исходная грамматика, та, что в стандарте, изменяется очень сильно. Для конкретной конструкции x(); можно задать правила:
Fun_call --> ID '(' list_of_params ')' ';'
Constructor --> ID '(' list_of_params ')' ';'
Эта конструкция неоднозначна, надо как-то решить при вызове x(); что это есть. Можно идти от типа x, и разрешить все на семантическом уровне, задавая правила:
Type ID '(' list_of_params ')' ';' --> Type Fun_name '(' list_of_params ')' ';'
И для Type_name то же самое, только целую кучу правил, как для встроенных типов, так и для определяемых самыми различными способами, программистом. Вот это правило как раз и есть КЗ.
Вопрос для языка также состояит в том, что, так как для конкретного языка, существует куча разных грамматик, которые этот язык определяют, то есть ли КС грамматика, которая этот язык определяет? Интуитивно должно быть понятно, что в случае описываемой выше конструкции, такая КС-грамматика не найдется. В си мы могли бы увести вызов функции на семантический уровень, а в си++, ввиду неоднозначности конструкции x(); приходится вытаскивать эту конструкцию обратно на синтаксический уровень. Доказать это формально не просто, но можно, существуют специальные методы для этого.
Вообще, интересно, на кокой стадии усложнения язык становится настолько сложным, что его нельзя описать КС-грамматикой? Известно, что естественные языки типа русского и английского — КЗ языки. Си++ получается тоже КЗ язык. Что надо убрать из языка, чтобы он стал КС языком?
АТ>Ну это уже зависит от того, что же понимать под термином "грамматика" языка С++. Если то и только то, что приводится в соответствующем разделе стандарта ("грамматика" в узком толковании термина) — то эта грамматика очевидным образом КС.
АТ>Затем можно досыпать к этому еще набор очевидно чисто грамматических правил, которые в стандарте языка изложены "на словах", и получить "грамматику" в широком толковании термина. Например, правило, запрещающее пустые декларации. В принципе, я думаю, такие правила можно было внести в грамматику (в узком толковании) и при этом сохранить ее как КС, но это черезмерно бы ее усложнило. Поэтому эти дополнительные правила было решено изложить "на словах" (что, как известно, привело к тому, что многие компиляторы забывают эти правила проверять).
АТ>Ну и наконец ко всему этому можно еще обавить еще и такие правила, как требования объявления перед использованием и контроля типов, и получить "грамматику" в супершироком толковании термина (ни о каком КС при этом, разумеется, уже речи быть не может), но мне это кажется уже перебором.
Привет Андрей,
Попытаюсь пояснить свою позицию, так сказать, с самого начала.
Начнем с того, что такое язык в теории формальных языков. Имея дело с языком, мы прежде всего задаем алфавит, некотрое КОНЕЧНОЕ множество символов — слов. Под языком понимается множество строк (предложений, цепочек), составленных из символов алфавита. Очевидно, что предложений языка, в общем случае, может быть бесконечно (счетно) много. Под предложением языка мы понимаем не любую цепочку, составленную из символов алфавита, а только некоторые из таких цепочек. Второй вопрос, который сразу же возникает, это: каким образом можно задать язык? Есть два принципиально различных способа задания языка: создать устройство, которое генерирует (выписывает) цепочки символов языка — предложения языка, т.е. устройство генерации, и создать устройство, на вход которого подаются всевозможные строки, составленные из символов алфавита, и это устройство говорит о каждой поданной на вход строке, принадлежит она языку или нет, это называется устройством равспознавания. Заметим, что человек совмещает в себе оба типа устройств, так сказать, два в одном — сила природы.
Хомский предложил в качестве устройства распознавания использовать так называемую генеративную или порождающую грамматику. Таким образом, порождающая грамматика по Хомскому это устройство (!) для порождения правильных цепочек языка (предложений). Порождающая грамматика не является алгоритмом, так как в ней нет детерминированости, но предписанием. Что такое порождающая грамматика как устройство? Это четверка множеств G={N,T,P,S}, где N — множество нетерминальных символов грамматики, которые, вообще говоря, никакого отношения к языку не имеют, T — множество терминальных символов грамматики, которое совпадает с алфавитом языка, который данной грамматикой порождается, P — множество так называемых правил вывода вида (N U T)* N+ (N U T)* --> (N U T)*. Т.е. это правила переписывания, где строка в левой части заменяется на строку в правой части правила, при этом слева должен присутствовать хотя бы один нетерминал. Кстати, это ограничение не является фундаментальным, вполне возможно определить правила так, чтобы слева только терминалы языка находились, и такая грамматика будет порождать тот же язык, что и исходная, так определены правила, например, в книжке Гладкого по формальным языкам. S — это множество из одного символа S, принадлежащего N. каким же образом происходит порождение предложений языка L(G), т.е. языка, определяемого грамматикой G? Очень просто, начиная со стартового символа грамматики S, затем меняем его в соответствии с правилами языка на строку в правой части, затем меняем все нетерминалы в получившейся строке и т.д... Конечно, в этом процессе можно зациклиться, кроме того, если у нас, для данной строки в левой части правила, есть несколько альтернатив, то надо выбрать какую альтернативу применить. Вот поэтому мы и говорим о том, что порождающая грамматика Хомского не является алгоритмом, а лишь предписанием. этот способ порождения предложений языка называется выводом.
Итак, имея порождающую грамматику G={N,T,P,S}, мы, таким образом, задаем некоторый язык L(G). Хомский выделил несколько типов грамматик, причем не произвольно, с бухты-барахты, а произвел абстракцию от существующих в языке человека сущностей. Потом оказалось, что для каждого типа порождающей грамматики можно задать соответствующее по вычислительной мощности устройство рапознавания, т.е. использовать второй способ задания языка. Хомский вводил все это для описания человеческих языков и эта абстракция, как потом выяснилось, слишком формальна, чтобы охватить все стороны человеческого языка. Поэтому Хомский после ввел ограничения-дополнения к этому определению, потом их наши лингвисты опровергли, Хомский ввел еще большие ограничения и т.д. В общем, наука в развитии, от теории к теории. Кстати, теория Хомского в СССР не прижилась как противоречащая принципам диалектического материализма, была целая компания, охота на ведьм, на которой многие себе капитал нажили. Но это все не имеет отношения к программированию. В программирование эта теория пришла в начале 60-х, когд заметили, что способ задания языка, известный как форма Бакуса-Наура, представляет собой ни что иное, как порождающую грамматику Хомского. Что было важно для этой грамматики, это тот факт, что по грамматике Хомского можно построить алгоритм гененерации\распознавания, детерминированно моделируя недетерминированные правила порождения. Были также математически выведены методы разбора предложений языка, основанные только на входной грамматике и, что самое главное, их корректность была математически доказана. Все это вместе превратило посторение компилятора из шаманского камлания в относительно простую, можно сказать, рутинную опреацию. Из теории же формальных языков пришли в программирование такие понятия как контекстно-свободный (КС) язык и контекстно-зависимый (КЗ) язык. Заметим, что до сих пор мы не упоминали такого понятия как сеантика языка потому, что в теории формальных языков его просто нет. Итак, язык называется КС, если существует хотя-бы одна КС-грамматика, порождающая данный язык. Порождающая в сымысле, котрый мы определили выше. Аналогично, язык называется КЗ, если существует хотя бы одна КЗ-грамматика, порождающая данный язык и не существует КС-грамматики, порождающей этот язык. Прцедурные языки программирования не являются КС, из-за требования предварительного объявления имен до их использования. Мощности КС-грамматики не хватает, чтобы это свойство определить. Это доказано математически. Но существует также много хороших методов, созданных для разбора КС языков, как их использовать? Очень просто, для данного языка выделить его подмножество, которое можно описать с помощью КС-грамматики, т.е. КС подможество, а точнее говоря, надмножесто, потому что КС язык, получаемый в результате, чаще всего содержит исходный. Остальную часть языка реализовать вручную, без помощи такого понятия как порождающая грамматика. Все это, очевидно, не делает сам язык КС, так как грамматики, которая его порождает, мы так и не определили. Таким образом, понятие "семантика языка" пришло из другой теории, которая по отношению к теории формальных языков является метатеорией. Понятие же КС и КЗ языка есть понятие теории формальных языков и, следовательно, пытаясь применить оперировать этими понятиями, мы должны оставаться в рамках искомой теории.
Здравствуйте, mefrill, Вы писали:
M>Си++, как и большинство других языков программирования, контекстно зависим. Любая операция, где присутствует тип, является контестно зависимой.
M>...
M>Вопрос для языка также состояит в том, что, так как для конкретного языка, существует куча разных грамматик, которые этот язык определяют, то есть ли КС грамматика, которая этот язык определяет? Интуитивно должно быть понятно, что в случае описываемой выше конструкции, такая КС-грамматика не найдется. В си мы могли бы увести вызов функции на семантический уровень, а в си++, ввиду неоднозначности конструкции x(); приходится вытаскивать эту конструкцию обратно на синтаксический уровень. Доказать это формально не просто, но можно, существуют специальные методы для этого.
Все это хорошо, но тем не менне не имеет никакого отношения к исходному вопросу. Вопрос был о том, является ли грамматика языка С++ контекстно зависимой. Ответ однозначен — не является. Грамматика языка С++ является контекстно свободной по определению, т.к. в левой части каждого правила этой грамматики стоит ровно один нетерминал. Все.
Все остальные рассуждения и примеры, которые тут обильно привдятся, на самом деле не имеют никакого отношения к грамматике языка С++.
А>Курсивом выделены нетерминалы, темным — терминалы. Из этой, частичной граматики, неужели нельзя понять где обьявляется обьект а где вызывается функция? Для простоты, argument-list выводит как минимум один аргумент.
Нет, конечно нельзя понять. Где здесь указано, что x является типом или именем функции или переменной? В самой грамматике этого нет. Я же постарался объяснить почему нет. А нет потому, что типизированные конструкции, вместе с их объявлениями и определениями, КЗ по своей природе. Именно поэтому эти конструкции синтаксически не описаны, а перенесены на "семантический" уровень. Если попытаться описать си++ грамматикой (не его КС подмножество, или даже LARL(1) подмножество, как это делается в Bison например), то придется как-то отличать друг от друга имена пременных, функций, их типы и т.д. А сейчас у нас есть один лексический ID и таблица имен (точнее их несколько), которая эту контекстную зависимость и обрабатывает. Говорить же о грамматике языка си++ что она КС на основании приведенной выше иерархии, это все равно, что говорить, что грамматика си++ регулярная, на основании следующей "грамматики":
Программа --> Текст_Программы точка_с_запятой
Где и Текст_Программы и точка_с_запятой явяляются терминальными символами языка, а весь разбор происходит на этапе лексичекого (читай семантического!) анализа.
На остальные аргументы я не считаю нужным отвечать просто потому, что это не аргументы. Мы сами с Вами говорим на разных языках . Относительно сложности реализации компилятора си++ через КС грамматику я могу отослать Вас к двум диссертациям Зуева и Кротова, посвященным как раз проблемам реализации языка. Но Вы, к сожалению, врядли их прочитаете. И могу Ва уверить также, что под неоднозначностью я понимал именно то, что имеется ввиду в теории формальных языков.
Ну и написано, однако! Я так и не осилил. M>Си++, как и большинство других языков программирования, контекстно зависим. Любая операция, где присутствует тип, является контестно зависимой. Действительно, если мы определяем функцию как void foo( int, char ) и потом вызываем foo( a, b ), то этот вызов будет законным только тогда, когда типы фактических параметров подходят под типы формальных. А это как раз контекстная зависимость.
Не путайте контекстную зависимость в теории формальных языков, с требованием, чтобы типы данных аргументов и параметров совпадали. Это разные вещи. Грамматика всего лишь пораждает предложения языка и за их смысловую нагрузку не отвечает! Согласно грамматике, мы можем передать в функцию ноль, один, два, ..., тысячу аргументов, и синтаксический анализатор все равно найдет нужную продукцию, согласно которой было выведено это предложение. Другое дело семантические рутины, которые как раз и заявят о несоответствии типов, количиств аргументов и т.д.
M>Просто, обычно все КЗ вещи убирают из грамматики языка, не давая работать с ними синтаксическому анализатору. КЗ конструкции языка тогда называют семантикой языка и разрешают эти проблемы вручную. Если язык достаточно сложный, как си++, то это сделать сложно, приходится извращаться изменяя грамматику, подгоняя ее под какй-либо алгоритм синтаксического анализа и, в результате, исходная грамматика, та, что в стандарте, изменяется очень сильно.
Это что ж там меняется?
M>Для конкретной конструкции x(); можно задать правила: M>Fun_call --> ID '(' list_of_params ')' ';' M>Constructor --> ID '(' list_of_params ')' ';'
M>Эта конструкция неоднозначна, надо как-то решить при вызове x(); что это есть. Можно идти от типа x, и разрешить все на семантическом уровне, задавая правила:
M>Fun_call --> Fun_name '(' list_of_params ')' ';' M>Constructor --> Type_name '(' list_of_params ')' ';'
M>Type ID '(' list_of_params ')' ';' --> Type Fun_name '(' list_of_params ')' ';'
M>И для Type_name то же самое, только целую кучу правил, как для встроенных типов, так и для определяемых самыми различными способами, программистом. Вот это правило как раз и есть КЗ.
Это неверно и продукции какие-то кривые.
M>Вопрос для языка также состояит в том, что, так как для конкретного языка, существует куча разных грамматик, которые этот язык определяют, то есть ли КС грамматика, которая этот язык определяет? Интуитивно должно быть понятно, что в случае описываемой выше конструкции, такая КС-грамматика не найдется.
Опять рассуждения основаны на неправильных продукциях.
M>В си мы могли бы увести вызов функции на семантический уровень, а в си++, ввиду неоднозначности конструкции x(); приходится вытаскивать эту конструкцию обратно на синтаксический уровень. Доказать это формально не просто, но можно, существуют специальные методы для этого.
Да уж! Конструкция х() "неоднозначна" (кстати, поосторожнее с этим термином — в теории формальных языков это не то, что Вы имеете здесь в виду), поэтому мы "опять возвращаемся на синтаксический уровень и там ее разбираем!" Вы хоть думаете, что говорите?
M>Вообще, интересно, на кокой стадии усложнения язык становится настолько сложным, что его нельзя описать КС-грамматикой? Известно, что естественные языки типа русского и английского — КЗ языки. Си++ получается тоже КЗ язык. Что надо убрать из языка, чтобы он стал КС языком?
А ничего и не надо убирать! Грамматика С++ — контекстно-свободная грамматика, и потому, этот язык сам и является контекстно-свободным.
Курсивом выделены нетерминалы, темным — терминалы. Из этой, частичной граматики, неужели нельзя понять где обьявляется обьект а где вызывается функция? Для простоты, argument-list выводит как минимум один аргумент.
Здравствуйте, davenger, Вы писали:
D>Здравствуйте, Sergey J. A., Вы писали:
SJA>>Здравствуйте, _Winnie, Вы писали:
_W>>>Здравствуйте, Sergey J. A., Вы писали:
SJA>>>>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ? SJA>>>>Мне кажется, что да, и пример — x(); неясно вызов это функции x или создание объекта типа x. Но я не уверен...
_W>>>Я думаю, что нет... вот сходу еще придумалось. SJA>>"Нет" — то есть граматика С++ контекстно не зависима ?
SJA>>
_W>>>int main()
_W>>>{
_W>>> X x(); <- декларация фунции или переменная x ?
_W>>>}
SJA>>
SJA>>Может я неправильно понимаю термин контекстнозависимый, но мне казалось, что данный пример как раз и говорит о контекстной зависимости: SJA>>в зависимости от контекста строка может быть декларацией фунции или переменной.
D>Нет, это всегда декларация функции.
Эта строка является объявлением функции только тогда, когда она появляется в Global Scope, иначе это — вызов конструктора по умолчанию для объекта класса.
... << Rsdn@Home 1.1.4 beta 1 >>
HgLab: Mercurial Server and Repository Management for Windows
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, <Аноним>, Вы писали:
А>>А вообще, откройте Страуструпа и убедитесь, что непонравившаяся Вам функция выводится грамматикой С++! WH>Ты сам то его читал?
Читал, и только в оригинале приведенное тобой издание!
Зачем влазить в разговор, не имея ни малейшего понятия о теории формальных языков?!! Владимир хоть знает теорию да просто заблуждается в одном месте... Ты же совсем не знаешь теории, судя по твоим ответам!
Это тебе не классы на С++ штамповать. Это именно те знания, которые делают программиста программистом!
WH>Итого: Это утверждение строится на отрициании того что множество всех well-formed программ на языке С++ является множеством всех предложений языка С++. WH>Также вы отрицаете оговорки приведенные в стандарте, у Страуструпа и в красном драконе что их грамматики не являются точными грамматиками языка С++. И как следствие используя их нельзя породить все предложения языка С++ и только предложения языка С++.
Нет. Это утверждение строится на знании теории, которую Вы, к сожалению, не знаете. Я Вам уже указал глупые ошибки в Ваших утверждениях про стандарт и Страуструпа, я вывел при помощи грамматики ту функцию, что Вам не понравилась, показал, что при помощи грамматики можно обьявить переменную void var; . Вы же все проигнорировали!!!
Вы же с мефриллом основывали свои факты только на ГОЛОСЛОВНЫХ утверждениях. Вы НЕ показали мне правил в грамматике, которые требуют, чтобы переменная была обьявлена до использования. Вы НЕ показали мне правила, которое требует, чтобы main() была в программе! И до сих пор ВЫ утверждаете, что в стандарте по С++ приведена "какая-то другая грамматика, которое порождает надмножество предложений С++." Ну-ну...
Выше, Андрей Тарасевич кратко сказал почему грамматика С++ — КС грамматика. Лаптев, преподаватель в ВУЗе, подтвердил, что языки программирования описываются КС грамматиками. После этого Вы будете продолжать спорить?
WH>Думаю разговор на этом можно считать оконченым.
Да. Невозможно говорить с тем, кто не понимает основ. No further responses are necessary or required!
LVV>Я! Я прочитаю! Пошлите меня, пожалуйста по указанному адресу!!!
Зуевская диссертация лежит здесь: http://www.interstron.ru/publications.html. А насчет диссертации Александра Кротова надо наверное попростить его самого или кого-то из Интерстрона, чтобы выслали.
Очень хорошо все изложено, но в конце последнего параграфа у Вас заблуждение. "Прцедурные языки программирования не являются КС, из-за требования предварительного объявления имен до их использования." Кто Вам такое сказал? Каким тогда должен быть язык, чтобы выполнялось требование, чтобы имя было обьявлено только один раз (и не более)?
Как Вы сами уже заметили, граматика выводит предложения языка, и понятия семантики в теории формальных языков нет. Это верно. Подумайте сами. Граматика только выводит предложения языка согласно установленым правилам, но насколько осмыслены эти предложения она не отвечает. Этим занимается семантика. Граматика только отвечает за синтаксически-корректные предложения, которые могут и не иметь смысла (семантики).
Мы можем написать
void f()
{
int i;
int i;
int i;
.
.
. // И так много обьявлений одной и той же переменной
i = 0;
}
или так
void f()
{
i = 0; // Ни одного обьявления переменной
}
и оба фрагмента кода будут синтаксические корректны, но некорректны семантически! Синтаксис языка, как Вам уже говорили, очень хорошо поддается формализации, а вот семантика — нет. Все что мы можем тут сделать, это неформально выразиться: "каждое имя в программе должно быть обьявлено перед использованием."
M>Прцедурные языки программирования не являются КС, из-за требования предварительного объявления имен до их использования. Мощности КС-грамматики не хватает, чтобы это свойство определить. Это доказано математически. Но существует также много хороших методов, созданных для разбора КС языков, как их использовать? Очень просто, для данного языка выделить его подмножество, которое можно описать с помощью КС-грамматики, т.е. КС подможество, а точнее говоря, надмножесто, потому что КС язык, получаемый в результате, чаще всего содержит исходный. Остальную часть языка реализовать вручную, без помощи такого понятия как порождающая грамматика. Все это, очевидно, не делает сам язык КС, так как грамматики, которая его порождает, мы так и не определили. Таким образом, понятие "семантика языка" пришло из другой теории, которая по отношению к теории формальных языков является метатеорией. Понятие же КС и КЗ языка есть понятие теории формальных языков и, следовательно, пытаясь применить оперировать этими понятиями, мы должны оставаться в рамках искомой теории.
Компилятор это нечто большое чем простой распознователь цепочек языка, и это сбивает Вас с толку.
Re[7]: Грамматика С++: Блин, забыл имя поставить в ответе.
Вот относительно семантики языка я, кажется, в пылу спора немного палку перегнул. Под семантикой языка можно понимать две вещи: первая, это то, о чем мы говорили, в процессе описания языка некоторые его свойства, которые трудно или невозможно описать КС-грамматикой, описываются другими способами. Вторая — это понимание языковых структур людьми, т.е. как мы говорим, смысл языка, как мы его пониманием. Различие между этими двумя трактовками иногда очень небольшое и зависит только от точки зрения, с которорой мы данное свойство рассматриваем. Мы говорили о КЗ и КС языках и поэтому рассматривали языки в терминах теории Хомского, поэтому и трактовали семантику таким образом. Лингвисты часто спрашивают: изобретено ли колесо в лингвистике? Т.е. в природных способах передвижения колеса нет, его придумал человек и колесо неплохо выполняет свои функции, хотя не имеет никакого отношения к тому, как сам человек передвигается. В лингвистике роль колеса играет как раз порождающая грамматика Хомского. С помощью этой теории мы можем производить разбор (слушать и понимать речь собеседника) и генерировать предложения языка (разговаривать), но все таки это никакого отношения к тому, как сам человек это делает, не имеет. Не знаю относительно других, но мне, когда я впервые понял идею Хомского о гененрации языка посредством порождающей грамматики, стало как-то не по себе. Какое-то ощущение неживого, чуждого, копируещего поведение живого... Жутко как-то стало. Я задумался, почему я так себя ощущал и, кажется понял. Видимо, здесь дело в том, что человеческая мысль многомерна по своей сути, но, так как выражается посредством языка, как бы каждый раз ужимается в одномерную последовательность. Мы к этому явлению привыкли и воспринимаем его как должное, мы априори подразумевавем, что собеседник эту нашу выраженную последовательность знаков разложит в многомерную субстанцию, необходимую ему для понимания. Хотя предложения и одномерны, плоски, по факту они таковыми не являются, это как-бы проекции многих координат нашего мышления на линию предложений языка. А вот если этого не происходит, как в случае порождающей грамматики Хомского и мы пытаемся это явление в себе воспроизвезти, то наше сознание вынуждено ужиматься. От этого и возникает неприятное ощущение. Здесь как раз и проявляется различие между тек как мы понимаем себя и окружающую действительность (а этого мы сами не знаем) и как мы выражаем это понимание посредством языка. Это выражение плоско по своей сути и имеет мало отношения к нашему действительному пониманию. Вот, наверное, в этом и проявляется отличие живого от неживого.
Вообще, не каждый язык может быть выражен порождающей грамматикой. Это легко доказать: так как алфавит языка конечен, то всевозможных последовательностей, которые можно из этого алфавита составить, счетное множество, т.е. множество мощности алеф нуль или мощности множества натуральных чисел. Это множество есть язык и есть также максимальный по количеству строк язык. Каждый язык, как множество строк символов этого алфавита, есть некоторое подмножество максимального языка. Поэтому, множество всех языков, которые могут быть образованы от данного алфавита, можно рассматривать как совокупность всех подмножеств множества мощности алеф нуль. Т.е. множество всех языков над данным алфавитом имеет мощность два в степени алеф нуль, т.е. несчетно. А вот множество всех грамматик, которые могут генерировать язык от данного алфавита, очевидно, счетно. Получается, что грамматик меньше чем языков, и не каждый язык можно описать соответствующей грамматикой. Но си++ конечно можно описать порождающей грамматикой.
Грамматики подразделены на типы в ссответствии с их выразительной мощностью. Самые выразительные это грамматики типа 0, потом типа 1 и т.д. В великолепной книге двух голландских авторов (фамилий не помню, в их голландских именах сам черт ногу сломит), называется она Parsing Technics, есть четыре рисунка розы, в сооветствии с типами грамматик, использованных для рисования. Эти рисунки отличаются по выразительным возможностям. При использовании грамматики типа 3 имеется только грубый рисунок, где только угадывается силуэт розы. при использовании КС-грамматики та же роза изображена более точно, некорые линии прочерчены тоньше, силуэт выглядит изящнее. Но, точное изображение получается только при использовании грамматики типа 0. Относительно си++ эту мысль также можно выразить следующим образом: под корректными предложениями языка можно, с некоторым упрощением, понимать программу написанную на языке си++. Таким образом, если грамматика языка си++ и существует, то она должна уметь генерировать любую корректную программу на си++ и, кроме того, не должна генерировать ни одной некорректной программы. КС-грамматика, описывающая си++, генерирует множество корректных программ на си++, но также генерирует и некорректные. Например, как это было указано выше
А>void f() А>>{ А>> i = 0; // Ни одного обьявления переменной А>>}
таким образом, нам необходимо наложить некоторые дополнительные ограничения, чтобы выразить в грамматике свойство обязательного объявления имени до его использования в программе, т.е. чтобы грамматика не генерировала программы описанного выше вида. Так вот, КС-грамматикой это сделать не удается. Здесь полная аналагия с рисунком розы, какие-то тонкие свойства языка не выразимы посредством КС-грамматики. Конечно, еще вопрос, можно ли эти свойства выразить с помощью Кз-грамматики, но оказывается можно. Чтобы уидеть это, лучше всего использовать более близкие человеческому мышлению автоматы для генерации или распознавания. Для КС-грамматики всегда найдется автомат с магазинной памятью, генерирующий или распознающий тот же язык, что и данная КС-грамматика. Магазин значит, что мы имеем доступ только к элементу на вершине магазина. Поэтому, так как для проверки того, объявлено или нет данное имя в программе, необходимо посмотреть по программе множество объявлений, т.е. вернуться назад, магазин использовать не получится. В случае КЗ-грамматик мы имеем устройство, в котором символы записываются на ленте, по которой, в случае необходимости, мы можем двигаться и в обратном направлении, не выталкивая символы, как это приходится делать в магазине. Вот, в данном случае, мы объяление имени проверить сможем.
Здравствуйте, Sergey J. A., Вы писали:
SJA>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ? SJA>Мне кажется, что да, и пример — x(); неясно вызов это функции x или создание объекта типа x. Но я не уверен...
На самом деле, язык C++ не может быть задан даже контекстно-зависимой грамматикой. Дело в том, что есть такая штука, как метапрограммирование. Известно, что средства метапрограммирования вычислительно полны по Тьюрингу. Это значит, что любая распознающая машинка языка C++ должна быть вычислительно полна по Тьюрингу (мы сейчас отвлекаемся от того обстоятельства, что в реальных компиляторах есть ограничение на уровень вложенности инстантинации шаблонов). В соответсвтии с известными теоремами из теории формальных грамматик Хомского, для задания C++ недостаточно грамматики типа 1. Т.е. C++ не является даже КЗ языком.
И шо ? Может, в понятиях непонимание ? Декларация функции — она же Function Declaration — предложение, связывающее идентификатор с относящейся к нему информацией; в некоторых случаях может быть одновременно и описанием (Definition, конструкция, размещающая в памяти и инициализирующая переменную, функцию или класс).
Здесь же просто создание объекта класса X, это эквивалентно
int main(int argc, char* argv[])
{
X x;
return 0;
}
WC>>Это утверждение согласуется с тем, что множество всех well-formed программ на языке С++ не одно и то же что и множество всех (синтаксических) предложений языка С++. WH>Согласен. Я не много погорячился. Понятие well-formed program несколько шире чем я тут имел в виду и включает в себя также некоторые требования времени выполнения. Но в данной теме мы эти правила не рассамтриваем.
Я бы сказал, что не немного.
Забудь про well-formed programs! Они из другой оперы!
WH>Что касается ODR то кто сказал что предложение языка С++ состоит только из одной единицы трансляции?
А ты пробовал разбить одну функцию на несколько файлов?
ЗЫ. Хватит наездов и угроз. Английский я знаю получше тебя.
Вот относительно семантики языка я, кажется, в пылу спора немного палку перегнул. Под семантикой языка можно понимать две вещи: первая, это то, о чем мы говорили, в процессе описания языка некоторые его свойства, которые трудно или невозможно описать КС-грамматикой, описываются другими способами. Вторая — это понимание языковых структур людьми, т.е. как мы говорим, смысл языка, как мы его пониманием. Различие между этими двумя трактовками иногда очень небольшое и зависит только от точки зрения, с которорой мы данное свойство рассматриваем. Мы говорили о КЗ и КС языках и поэтому рассматривали языки в терминах теории Хомского, поэтому и трактовали семантику таким образом. Лингвисты часто спрашивают: изобретено ли колесо в лингвистике? Т.е. в природных способах передвижения колеса нет, его придумал человек и колесо неплохо выполняет свои функции, хотя не имеет никакого отношения к тому, как сам человек передвигается. В лингвистике роль колеса играет как раз порождающая грамматика Хомского. С помощью этой теории мы можем производить разбор (слушать и понимать речь собеседника) и генерировать предложения языка (разговаривать), но все таки это никакого отношения к тому, как сам человек это делает, не имеет. Не знаю относительно других, но мне, когда я впервые понял идею Хомского о гененрации языка посредством порождающей грамматики, стало как-то не по себе. Какое-то ощущение неживого, чуждого, копируещего поведение живого... Жутко как-то стало. Я задумался, почему я так себя ощущал и, кажется понял. Видимо, здесь дело в том, что человеческая мысль многомерна по своей сути, но, так как выражается посредством языка, как бы каждый раз ужимается в одномерную последовательность. Мы к этому явлению привыкли и воспринимаем его как должное, мы априори подразумевавем, что собеседник эту нашу выраженную последовательность знаков разложит в многомерную субстанцию, необходимую ему для понимания. Хотя предложения и одномерны, плоски, по факту они таковыми не являются, это как-бы проекции многих координат нашего мышления на линию предложений языка. А вот если этого не происходит, как в случае порождающей грамматики Хомского и мы пытаемся это явление в себе воспроизвезти, то наше сознание вынуждено ужиматься. От этого и возникает неприятное ощущение. Здесь как раз и проявляется различие между тек как мы понимаем себя и окружающую действительность (а этого мы сами не знаем) и как мы выражаем это понимание посредством языка. Это выражение плоско по своей сути и имеет мало отношения к нашему действительному пониманию. Вот, наверное, в этом и проявляется отличие живого от неживого.
Вообще, не каждый язык может быть выражен порождающей грамматикой. Это легко доказать: так как алфавит языка конечен, то всевозможных последовательностей, которые можно из этого алфавита составить, счетное множество, т.е. множество мощности алеф нуль или мощности множества натуральных чисел. Это множество есть язык и есть также максимальный по количеству строк язык. Каждый язык, как множество строк символов этого алфавита, есть некоторое подмножество максимального языка. Поэтому, множество всех языков, которые могут быть образованы от данного алфавита, можно рассматривать как совокупность всех подмножеств множества мощности алеф нуль. Т.е. множество всех языков над данным алфавитом имеет мощность два в степени алеф нуль, т.е. несчетно. А вот множество всех грамматик, которые могут генерировать язык от данного алфавита, очевидно, счетно. Получается, что грамматик меньше чем языков, и не каждый язык можно описать соответствующей грамматикой. Но си++ конечно можно описать порождающей грамматикой.
Грамматики подразделены на типы в ссответствии с их выразительной мощностью. Самые выразительные это грамматики типа 0, потом типа 1 и т.д. В великолепной книге двух голландских авторов (фамилий не помню, в их голландских именах сам черт ногу сломит), называется она Parsing Technics, есть четыре рисунка розы, в сооветствии с типами грамматик, использованных для рисования. Эти рисунки отличаются по выразительным возможностям. При использовании грамматики типа 3 имеется только грубый рисунок, где только угадывается силуэт розы. при использовании КС-грамматики та же роза изображена более точно, некорые линии прочерчены тоньше, силуэт выглядит изящнее. Но, точное изображение получается только при использовании грамматики типа 0. Относительно си++ эту мысль также можно выразить следующим образом: под корректными предложениями языка можно, с некоторым упрощением, понимать программу написанную на языке си++. Таким образом, если грамматика языка си++ и существует, то она должна уметь генерировать любую корректную программу на си++ и, кроме того, не должна генерировать ни одной некорректной программы. КС-грамматика, описывающая си++, генерирует множество корректных программ на си++, но также генерирует и некорректные. Например, как это было указано выше
void f() А>{ А> i = 0; // Ни одного обьявления переменной А>}
таким образом, нам необходимо наложить некоторые дополнительные ограничения, чтобы выразить в грамматике свойство обязательного объявления имени до его использования в программе, т.е. чтобы грамматика не генерировала программы описанного выше вида. Так вот, КС-грамматикой это сделать не удается. Здесь полная аналагия с рисунком розы, какие-то тонкие свойства языка не выразимы посредством КС-грамматики. Конечно, еще вопрос, можно ли эти свойства выразить с помощью Кз-грамматики, но оказывается можно. Чтобы уидеть это, лучше всего использовать более близкие человеческому мышлению автоматы для генерации или распознавания. Для КС-грамматики всегда найдется автомат с магазинной памятью, генерирующий или распознающий тот же язык, что и данная КС-грамматика. Магазин значит, что мы имеем доступ только к элементу на вершине магазина. Поэтому, так как для проверки того, объявлено или нет данное имя в программе, необходимо посмотреть по программе множество объявлений, т.е. вернуться назад, магазин использовать не получится. В случае КЗ-грамматик мы имеем устройство, в котором символы записываются на ленте, по которой, в случае необходимости, мы можем двигаться и в обратном направлении, не выталкивая символы, как это приходится делать в магазине. Вот, в данном случае, мы объяление имени проверить сможем.
Здравствуйте, Nick_, Вы писали:
LVV>>А он и не порождается! В том то и дело, что грамматика используется только для распознавания синтаксически правильных конструкций. А контекстные зависимости, о которых тут все время говорили (единственность объявления, "сначала объяви — потом используй), обрабатываются НЕФОРМАЛЬНЫМИ способами (таблица имен).
N_>У вас какая-то каша в голове. N_>В приведенном мною выше примере на языке Си, как раз и есть синтаксическая контекстная зависимость! N_>вы не можете написать:
N_>
N_>while(free(ptr));
N_>
N_>Если перед этим был typedef int free;
N_>Возникнет СИНТАКСИЧЕСКАЯ ошибка.
N_>А то что вы говорите про "сначала объяви — потом используй" — это уже семантическая ошибка, которая обнаруживается не во время синтаксического анализа, а уже после того как дерево разбора будет построено.
Подобные сорта деления на синтаксические (лучше было бы сказать -- грамматические, поскольку они возникают из-за несоответствия грамматике) и семантические ошибки имеют смысл только в контексте какого-то определённого способа компиляции языка. К самому языку это прямого отношения не имеет.
Здравствуйте, Sergey J. A., Вы писали:
SJA>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ? SJA>Мне кажется, что да, и пример — x(); неясно вызов это функции x или создание объекта типа x. Но я не уверен...
Ни один из современных языков программирования на практике не описывается контекстно-зависимыми грамматиками, исключительно контестно-свободными (из соображений эффективности, кстати. Распознавание контекстно-зависимых языков требует экспоненциального времени, тогда как КС-языки распознаются в общем случае за полиномиальное время). Но помимо этого, конечно, в каждом компиляторе проверяются не контекстно-свободные характеристики, к которым относятся, например, требование единственности объявления или "сначала объяви, потом используй". Единственный язык, в котором использовалась не КС-грамматика — Алгол-68. Ван Вейнгартен изобрел для него специальные двухуровневые грамматики — видимо без этого невозможно было описать введение новых операций в процессе выполнения программы.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
SJA>А можно примеры извесных контекстно свободных языков ?
Самый известный пример, наверное, это язык арифметических выражений без переменных (или можно с переменными, но без их предварительного объявления, скрипт короче).
Выражение --> Число
Выражение --> Число + Число
Выражение --> Число — Число
Выражение --> Число * Число
Выражение --> Число / Число
Число, +, -, * и / — терминалы грамматики, Выражение — ее единственный нетерминал, который также является стартовым (S в определении грамматики).
Конечно, эта грамматика не отражает приоритета операций, чтобы отражала, необходимо ввести еще один нетерминал, заставляющий сначала разбирать умножение и деление но, в принципе, является вполне фунгкциональной. Зависимость от контекста можно выразить как невозможность определить в языке, что данный нетерминал означает ВСЕГДА, где бы он в предложении не встретился, одно и тоже, причем заранее определенное одно и тоже. Выражение в языке выше не означает одно и тоже, а целых пять различных кончтрукций, но, встетив Выражение при разборе предложения языка мы не должны смотреть ни назад, ни заглядывать вперед, чтобы определить какую конструкцию использовать при разборе, т.е. не должны рассматирвать контекст, в котором встретился данный нетерминал.
SJA>Но непонятно, как из IDENTIFIER перейти к type или variable. Нужны доп. данные. SJA>Как для данного выражения построить КС ?
Можно так показать контекстную зависимость языка с предварительными объявлениями. Для каждого типа грамматики существует свой тип рапознавателя — математической абстракции, моделирующеймашину для распознавания языка, который заддается этой грамматикой:
Тип 0 (грамматики без ограничений) — машина Тьюринга
Тип 1 (КЗ грамматики) — линейно ограниченный автомат
Тип 2 (КС грамматики) — автомат с магазинной памятью (стеком)
Тип 3 (регулярные грамматики) — конечный автомат
Вот отсюда можно увидеть, что при предварительном объявлении некоторого имени, далее, при разборе предложения языка, при встрече некоторого имени мы должны как бы откатиться назад и пройти по всем объявлениям имен, чтобы узнать, было ли объявлено данной имя или нет. Очевидно, что при организации памяти распознавателя в виде магазина это невозможно. А вот записывая объявления на ленте, по которой мы можем ходить также и в обратном направлении, это вполне возможно. Конечно, для этого придется расширить грамматику так, чтобы лексический анализатор не возвращал безликий ID, а сделать ID нетерминалом. Определить ID можно например так:
Тогда, в процессе разбора, у нас при объявлении, допустим, имени x где-то в программе будет исполнено правило ID --> x и при встрече переменной далее в предложении, мы попытаемся найти все такие правила, записанные на ленте, и таким образом, узнать было ли такое объявление. Аналогично, можно поступить с типизированными именами, а также именами типов. Вот это, с большой натяжкой конечно и неформально, можно считать доказательством контесктной зависимости языка с предварительными объявлениями имен.
Распознавание контекстно-зависимых языков требует экспоненциального времени, тогда как КС-языки распознаются в общем случае за полиномиальное время.
Алгоритм Эрли и алгоритм Кока-Янгера-Касами распознают КС языки за кубическое время, а однозначные языки вообще за квадратичное. Валиант в 1975 году придумал оптимизацию алгоритма Кока-Янгера-Касами посредством битового массива, поиск по которому дает логорифмическое время. Так что, теперь, по последним данным, анализ строки длиной N для я зыка, заданного КС-грамматикой, может быть произведен за время N * N * log N.
>>> А ничего и не надо убирать! Грамматика С++ — контекстно-свободная грамматика, и потому, этот >>> язык сам и является контекстно-свободным.
АГ>>Хм. В таком случае, как разобрать выражение x * y не зная контекста (классика жанра)?
АТ> А в чем проблема? Если это относительно полное [под]выраждение, то очень просто:
АТ>
АТ> *
АТ> / \
АТ> / \
АТ> x y
АТ>
Полное выражение:
x * y;
В случае
int x;
int y;
x * y;
очень просто, как показано у тебя выше, а вот в случае
typedef int x;
x * y;
я сомневаюсь, что будет построено именно это дерево.
А в случае x * y, z; все еще несколько усложняется.
Грамматика С++ — контекстно-свободная! Все языки программирования описываются контекстно-свободными грамматиками! Даже те, в которых надо обьявлять переменную до использования, .
M>Мы же это уже обсуждали выше. То, о чем ты говоришь, конечно КС-грамматика, но она си++ не определяет, а только его подмножество, т.е. немного другой язык. Ведь в данной грамматике никак не выражена необходимость объявлять имя до его использования? Верно? Значит, грамматика язык не полностью определяет. Так часто делается, часть языка выражается грамматикой, другая — КЗ часть, парсится вручную и это называется семантикой языка. Мы же говорим о свойстве самого языка си++, какой он? Т.е. найдется ли КС грамматика, полностью описывающая весь язык полностью? Я утверждаю, что нет. Что в моем рассуждении неверно?
Все Ваши неверные выводы и рассуждения основаны на непонимании, что есть грамматика. Грамматика — это формальный способ описания синтаксиса языка! Утверждение же, что переменная должна быть обьявлена до использования — неформальное требование, которое грамматикой языка не описывается! К примеру, как Вы формально обьясните, что делает for (int i = 0; i < 5; ++i)? НИКАК! Такие [семантические] конструкции описываются неформально! Точно также неформально и описывается требование обьявлять переменную заранее!
Если Вы так уверены, что С++ контекстно-зависимый язык, то продукции, которые "требуют обьявления переменной до использования" — в студию!
Здравствуйте, mefrill, Вы писали:
M>анализ строки длиной N для я зыка, заданного КС-грамматикой, может быть произведен за время N * N * log N.
моя школьная учительница по физике, увидев бы ваше сообщение, непременно б возразила:
— это в "колбасках" все величины? существует ведь единая система измерения СИ, сколько то можно?
Ш>Да нет, это у вас непонимание элементарных вещей. Есть язык C++, есть множество well-formed программ на этом языке, которое представляет из себя некоторое множество конечных цепочек букв.
Может дадите определение ваших "well-formed программ на этом языке?"
Пришла зима. Нестерпимая жара установилась на дворе. Грамматика С++ — контекстно-свободная! В этом форуме куча тем. Кто из нас всех прав? Опять пришла зима и т.д.
Это пример из русского языка. Как видите, с точки зрения русской грамматики параграф и все предложения верны, но тем не менее смысла они не имеют. Точно также и с С++. Даже Лаптев, вон, выше заметил, что языки описываются КС грамматиками.
Ш>Так вот, это множество не может быть определено через КС грамматику.
Кто вам это сказал?
Ш>Это и означает, что C++ не контекстно свободный язык.
Ваш вывод (неверный, кстати) основан на вашем же и утверждении.
Ш>Будем спорить, что 2+2==4?
Не въехал...
Может все-таки откроете грамматику С++ и предоставите доказательства? (ака правила, которые требуют, чтобы переменная была обьявлена один и только один раз)
Ш>Читайте стандарт. По простому, well-formed программа -- это то, что компилятор C++, написанный в соответствии со стандартом, должен пропустить через себя и сгенерировать некоторый объектный код.
Слышал Шахтер звон да так и не понял где он!
Используя грамматику С++, можно вывести следующую функцию:
void foo()
{
int i;
return i;// Все синтаксически здесь верно!!!
}
но нельзя вывести эту функцию:
void foo()
}{// Скобки перепутали местами...
Ш>Это доказано. Математически строго. Ш>Читайте этот тред, а так же специальную литературу.
Это Вам надо посоветовать перечитать этот тред и запастись специальной литературой.
Ш>Вы пытаетесь оспорить, что 2+2==4. Таких людей обычно посылают в дет. сад.
Это Вы пытаетесь оспорить то, о чем совсем не имеете понятия!
ЗЫ. Хватит голословности! Может все-таки приведете мне какие-нибудь правила из грамматики С++, уличающие этот язык в контекстно-зависимости?!! Ы?
Ш>Вы пытаетесь оспорить, что 2+2==4. Таких людей обычно посылают в дет. сад.
Не говорите мне куда идти если не хотите быть посланным по одному всем известному адресу!
WH>Это не есть well-formed программа на языке С++. Грамматика языка должна описывать все well-formed программы и только well-formed программы. Если грамматика описывает все well-formed и еще множество не well-formed программ то это не грамматика данного языка. Исключить множество не well-formed программ языка С++ можно только при помощи КЗ грамматики. WH>Но тк КЗ грамматика это очень сложно то используют компромисный вариант. Создают КС грамматику которая описывает язык являющеяси над множеством данного языка и создают допольнительные правила для отсечения не well-formed программ. И сделано это не по тому что грамматика языка КС, а по тому что построение КЗ грамматики во первых очень сложный процесс сам по себе во вторых парсер получается ну ооочееень медленный.
WolfHound, ну зачем говорить о чем не имеешь представления?
WH>Это не есть well-formed программа на языке С++.
А никто и не говорил, что это well-formed программа. Если взять грамматику С++, построить ее распознователь (а не компилятор!!!), то он скажет: "Да, эта функция была выведена грамматикой С++!"
WH>Грамматика языка должна описывать все well-formed программы и только well-formed программы.
Опять, кто это сказал? Грамматика должна описывать все синтаксически верные программы! Учите теорию. Чуете разницу между лексикой, синтаксисом и семантикой?
А вообще, откройте Страуструпа и убедитесь, что непонравившаяся Вам функция выводится грамматикой С++!
M>Так дискуссию вести невозможно, аргументы игнорируются, очевидные факты отвергаются.
Да-да-да... Аргументы игнорируются и очевидные факты отвергаются, но не мной а Вами!!!
M>Языком является множество строк, сформированных из символов данного алфавита. Порождающая грамматика Хомского — это устройство для порождения данных строк и только их. Язык может описываться не только порождающей грамматикой Хомского, а также и другими, каковых сущесвтует великое множество, как порождающих, так и не порождающих.
Ну не надо мне толкать все эти определения! Теорию формальных языков и трансляции я знаю и без Вас! Более того, из Ваших ответов видно, что Вы недопонимаете простые вещи, хотя теория Вам в целом ясна!
Примеры не порождающих грамматик — в студию!
M>кроме того, язык может быть описан без всякой грамматики. Например, предложение "множество сттрок, состоящих из нуля и более символов а" великолепно описывает язык, который задает грамматика: M>S --> aS | пустая строка
Ну вот. Говорим о языке, который "может быть описан без всякой грамматики" и толкаем пример регулярной грамматики с использованием рекурсии (ака КС элемента)!!! Удивительная у Вас способность описывать простые грамматики более сложными!!! Неудивительно, что для языков программирования Вам нужна КЗ грамматика!
M>Здесь ГДЕ-НИБУДЬ о семантике хоть слово было произнесено?
Это Вы смешиваете чисто семантическая понятия с синтаксическими!
M>Семанитка языка (в ее настоящем смысле, т.е. интепретация строк языка человеком) не имеет никакого отношения к описанию структуры строк языка (его предложений). Этим занимает синтаксис. Например, мы могли бы интерпретировать описанный выше язык так: символ а значит произнесение звука а в течении одной секунды. Тогда строка ааа обозначала бы, что некий человек пропел а-а-а... три секунды подряд.
Долой абстрактные примеры и голословность! Все что от Вас требовалось — привести правила, которые требуют обьявления переменных один и только один раз! ВЫ ИХ НЕ ПРИВЕЛИ!
M>То же самое и в си++. Множество предложений данного языка это (с некоторым обобщением) множество правильных программ, написанных на языке си++.
Достает это уже. Повторюсь еще раз... Грамматика описывает только синтаксис языка, и ПРОГРАММА МОЖЕТ БЫТЬ СИНТАКСИЧЕСКИ ВЕРНОЙ, НО НЕВЕРНОЙ СЕМАНТИЧЕСКИ! Выше я уже привел два примера!
M>Вот и встает задача: описать это множество программ, используя ТОЛЬКО порождающую грамматику Хомского. Это сделать можно, как возможно описать любые структурные построения (например, множество музыкальных этюдов).
M>Но, КС-грамматика для этого не подойдет из-за свойства языка: каждое имя должно быть описано перед его использованием. Как я уже писал выше, данное свойство не может быть выражено КС-грамматикой.
Да кто Вам сказал, что требование, что имя должно быть описано до использования вообще должно быть выраженно через грамматику?!! ТРЕБОВАНИЕ, ЧТОБЫ ИМЯ БЫЛО ОБЬЯВЛЕНО ДО ИСПОЛЬЗОВАНИЯ — НЕФОРМАЛЬНО, И НЕ МОЖЕТ БЫТЬ ВЫРАЖЕННО ГРАММАТИКАМИ!!!
M>Так что все просто. Разумеется, язык можно описывать и не используя порождающие грамматики, а как-нибудь по другому. Например, как это делается в стандарте языка си++.
M>Чать описывается КС-грамматикой. Но такое описание позволяет породить и неверные программы на си++.
Повторюсь еще раз! Все программы, описанные грамматикой С++ будут синтаксически верны т.к. грамматика описывает только синтаксис (случай с КС грамматикой) и лексику (случай с регулярной грамматикой)! Это, однако, не значит, что программа будет верна семантически!!!
Как Вы опишите формально, что делает for loop? НИКАК! Точно также нельзя формально требовать, чтобы имена были обьявлены заранее. Это делается НЕФОРМАЛЬНО!
M>Поэтому, вводятся еще ограничения, причем в виде так называемых "семантических" правил. Это делать можно, но почему же при этом говорить, что КС-грамматика, описывающая часть языка, описывает весь язык!? С таким же успехом, я могу описать часть языка регулярной грамматикой, а остальную часть неформально на русском языке и сказать, что граматика языка си++ регулярна. Но это не так, конечно.
Ну да! Давайте вообще выбросим всю формализацию к черту и обьявим, что язык С++ вообще можно описать только словами (неформально)!
Именно эти и "семантические правила," которые неформальны, и требуют, чтобы имя было обьявлено. Все! Не путайте язык программирования с формальным языком!
M>Именно, понимание выразительной способности разных классов грамматик и составляет понимание идеи Хомского. Еще раз, в книге "Техники парсинга" есть такой рисунок:
Ну и зачем нам этот рисунок? Опять абстракция! Без него и так ясно, что существуют классы грамматик, которые описывают больше языков, чем другие, и сложность расспознавания которых выше. Вот и вся теория.
M>Владимир.
Учите теорию, Владимир, лучше!
Ну и аспиранты пошли... Грустно...
ЗЫ, Приведите правила из грамматики, подтверждающие, что язык С++ — КЗ язык! Хватит голословности и абстрактных размышлений!
WH>Ответьте на два вопроса
Мне следует задать эти вопросы т.к. Вы путаете разницу между формальным языком и грамматикой.
WH>1)Может ли порождающая грамматика языка порождать предложения не входящие в данный язык?
Глупый вопрос. Разумеется не может! Вопрос в том, что для Вас означают предложения языка С++. Ответьте сами на этот вопрос. Если Вы скажете, что это, что скомпилирует компилятор, то Вы ошибаетесь! Я уже привел пример функции с переставлеными скобками — это нелегальное предложение т.к. нет продукций, которые бы вывели эту строку. С другой стороны, та функция, что Вам не понравилась выводится грамматикой С++, и если взять книгу Страуструпа и написать по его грамматике распознаватель этого языка, то он подтвердит, что это легальное предложение. Тем не менее, компилятор его не скомпилирует т.к. компилятор это нечто большее чем простой расспознаватель.
WH>2)Что вы понимаете под предложением на языке С++?
Вопрос тоже не очень. Строка, которую можно вывести из грамматики С++, и, опять-таки, эта строка может не скомпилироваться компилятором. Не забывайте, грамматика просто порождает предложения языка, которые могут и не иметь смысла (и поэтому их компилятор и не скомпилирует). Для русского языка я привел уже параграф с простым набором предложений. Для С++ — функцию, return type которой void, но которая все равно возвращает int.
У нас замкнутый круг получается, т.к. для Вас легальные предложения С++ это то, что скомпилирует компилятор. Но, тем не менее, это не так! Предложение это то, что выводится грамматикой, а не то, что компилирует компилятор.
WH>Наезды поскипаны.
Это не наезды. Я вижу, что Вы совсем не знакомы с теорией формальных языков и трансляции.
Здравствуйте, <Аноним>, Вы писали:
WH>>1)Может ли порождающая грамматика языка порождать предложения не входящие в данный язык? А>Разумеется не может!
Следовательно если при помощи данной грамматики нам удасться получить предложение не относящаяся к данному языку то данная грамматика не является грамматикой данного языка. А>Вопрос в том, что для Вас означают предложения языка С++. Ответьте сами на этот вопрос.
well-formed программа. Не отдельная функция и тем болие не отдельный стейтмент, а все программа целиком.
Не well-formed программа не является предложением на языке С++. Грамматика которая порождает не well-formed программы не является грамматикой С++. А>Если Вы скажете, что это, что скомпилирует компилятор, то Вы ошибаетесь!
Правда?! А>Я уже привел пример функции с переставлеными скобками — это нелегальное предложение т.к. нет продукций, которые бы вывели эту строку. С другой стороны, та функция, что Вам не понравилась выводится грамматикой С++, и если взять книгу Страуструпа и написать по его грамматике распознаватель этого языка, то он подтвердит, что это легальное предложение.
Еще раз процитирую Страуструпа
Приведенное ниже описание синтаксиса С++ должно помочь пониманию языка. Оно не является точным определением языка С++. В частности, описаная здесь грамматика допускает надмножество допустимых конструкций С++.
Он сам говорит что это эта грамматика может порождать предложения не являющаюся предложениями языка С++ те это не грамматика С++.
Точно такие же оговорки есть в стандарте и красном драконе. А>Тем не менее, компилятор его не скомпилирует т.к. компилятор это нечто большее чем простой расспознаватель.
Компилятор это ни что иное как распознователь языка.(про то что он еще и объектный код генерирует можно забыть это к делу не относится) И он должен распознать все предложения языка и только предложения языка.
WH>>2)Что вы понимаете под предложением на языке С++? А>Вопрос тоже не очень. Строка, которую можно вывести из грамматики С++, и, опять-таки, эта строка может не скомпилироваться компилятором.
Вот именно что из грамматики С++ НО ни у Страуструпа ни в стандарте ни в краснтом драконе грамматики С++ нет. Там грамматики других языков подмножеством которых является С++. А>Не забывайте, грамматика просто порождает предложения языка, которые могут и не иметь смысла (и поэтому их компилятор и не скомпилирует). А>Для русского языка я привел уже параграф с простым набором предложений.
Для русского языка вы привели несколько предложений. Каждое из которых является предложением русского языка но вместе они ни как не связаны. А>Для С++ — функцию, return type которой void, но которая все равно возвращает int.
Нет это предложение из другого языка. Для С++ вся программа это одно предложение. Если на С++ написать граффический редактор и архиватор то и то и другое будут отдельными предложениями на языке С++ и ни кого не удивляет почему у них нет ни чего общего.
Аналогом связанных предложений являются например N-tier системы где несколько предложений (возможно на разных языка) связанны друг с другом смыслом.
Что касается без смысленных предложений то вот два безсмысленных предложения одно на русском другое на С++.
Лом съел скалку.
int main()
{
int a, b, c;
a*b-c/a;
}
Еще раз повторю то что вы приводили в качестве безсмысленного С++ предложения не является предложением на С++.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
WH>>>1)Может ли порождающая грамматика языка порождать предложения не входящие в данный язык? А>>Разумеется не может! WH>Следовательно если при помощи данной грамматики нам удасться получить предложение не относящаяся к данному языку то данная грамматика не является грамматикой данного языка.
Ну разумеется, сударь! Толькто кто Вам сказал, что не понравившаяся Вам функция не выводится грамматикой С++? Она очень даже выводится, хоть и не имеет смысла!
ВНИМАНИЕ! Попытаюсь теперь более доходчиво обьяснить, что же происходит на самом деле!
Допустим множество строк А порождается грамматикой С++. Среди всех этих строк есть строгое подмножество В, строки которого не имеют смысла! Точно также, есть строгое подмножество С, строки которого имеют смысл в языке С++. Имея грамматику С++, задача компилятора и состоит определить является ли данная функция элементом множества С, и если да, то скомпилировать ее код. Примерами функций подмножества В является та функция, которая Вам уже не понравилась или функция, в которой не описана локальная переменная до ее использования. В множестве С находятся функции, в которых тип возвращаемого значения соответсвует типу функции, в котором локальные переменные обьявлены и т.д.
А>>Вопрос в том, что для Вас означают предложения языка С++. Ответьте сами на этот вопрос. WH>well-formed программа. Не отдельная функция и тем болие не отдельный стейтмент, а все программа целиком. WH>Не well-formed программа не является предложением на языке С++. Грамматика которая порождает не well-formed программы не является грамматикой С++.
Ну-ну... Замените ту функцию, что я привел на main():
void main()
{
return 8;
}
Как видите, это отдельная функция, которая является и целой программой. Синтаксически она верна. Семантически — нет. Ключевое слово здесь синтаксис т.к. грамматика описывает синтаксис языка.
А>>Если Вы скажете, что это, что скомпилирует компилятор, то Вы ошибаетесь! WH>Правда?!
Правда!
А>>Я уже привел пример функции с переставлеными скобками — это нелегальное предложение т.к. нет продукций, которые бы вывели эту строку. С другой стороны, та функция, что Вам не понравилась выводится грамматикой С++, и если взять книгу Страуструпа и написать по его грамматике распознаватель этого языка, то он подтвердит, что это легальное предложение. WH>Еще раз процитирую Страуструпа WH>
WH>Приведенное ниже описание синтаксиса С++ должно помочь пониманию языка. Оно не является точным определением языка С++. В частности, описаная здесь грамматика допускает надмножество допустимых конструкций С++.
Упасть можно. Даже сам Страуструп толкует об этом! Грамматика С++ порождает множество А выше, и это он имеет в виду. Все предложения, порожденные его грамматикой, будут синтаксически верными, но часть из них не скомпилируется т.к. не будет иметь смысла.
WH>Он сам говорит что это эта грамматика может порождать предложения не являющаюся предложениями языка С++ те это не грамматика С++.
Вы хоть думаете, что говорите?!! Сам Страуструп в своей книге приводит грамматику С++, которая, однако не является грамматикой С++!!! Это как по-вашему?
WH>Точно такие же оговорки есть в стандарте и красном драконе.
Вот именно!!! Все грамматики порождают предложения множества А, в то время как компилятору нужно выявить элементы подмножества С. Поэтому Драконова книга и Стандарт и Страуструп так говорят! Поймите, что грамматика описывает синтаксис языка, но не каждая синтаксически верная программа имеет смысл и может быть скомпилирована!
А>>Тем не менее, компилятор его не скомпилирует т.к. компилятор это нечто большее чем простой расспознаватель. WH>Компилятор это ни что иное как распознователь языка.(про то что он еще и объектный код генерирует можно забыть это к делу не относится) И он должен распознать все предложения языка и только предложения языка.
Опять-таки, компилятор это нечто большее и сложное чем простой распознаватель грамматики. Распознаватель приймет любою строку из множества А, в то время как компилятор должен определить принадлежит ли данная строка подмножеству С. Обычный расспознаватель не строит синтаксическое дерево программы; ему все равно, какими продукциями была выведена данная строка. Компилятор же должен построить синтаксическое дерево, выявив какие именно продукции были использованны при выводе.
WH>>>2)Что вы понимаете под предложением на языке С++? А>>Вопрос тоже не очень. Строка, которую можно вывести из грамматики С++, и, опять-таки, эта строка может не скомпилироваться компилятором.
WH>Вот именно что из грамматики С++ НО ни у Страуструпа ни в стандарте ни в краснтом драконе грамматики С++ нет. Там грамматики других языков подмножеством которых является С++.
Угу. В стандарте по С++ дана грамматика какого-то друго языка, подмножеством, которого является С++. Я сейчас упаду. Подумайте над своими словами.
Опять Вы недопонимаете. Грамматика описывает синтаксис языка!!! Часть предложений, порожденной грамматикой из стандарта не будут иметь смысла (хотя, опять-таки, синтаксически они все будут верны), и поэтому будут отвергнуты компилятором! Та функция, что Вам не понравилась и есть пример!!!
А>>Не забывайте, грамматика просто порождает предложения языка, которые могут и не иметь смысла (и поэтому их компилятор и не скомпилирует). А>>Для русского языка я привел уже параграф с простым набором предложений. WH>Для русского языка вы привели несколько предложений. Каждое из которых является предложением русского языка но вместе они ни как не связаны.
Вот именно! Синтаксически, они вместе все верны, но вот семантически — нет. Грамматика определяет только синтаксис языка!
А>>Для С++ — функцию, return type которой void, но которая все равно возвращает int. WH>Нет это предложение из другого языка. Для С++ вся программа это одно предложение. Если на С++ написать граффический редактор и архиватор то и то и другое будут отдельными предложениями на языке С++ и ни кого не удивляет почему у них нет ни чего общего.
См. пример с одной функцией main(). Кстати, где в грамматике С++ написано, что должна быть функция main()? Прошу не игнорировать этот вопрос.
WH>
WH>int main()
WH>{
WH> int a, b, c;
WH> a*b-c/a;
WH>}
WH>
Очень даже осмысленное предложение на С++ и будет скомпилировано компилятором (хоть результаты вычисления и отбрасываются)!
WH>Еще раз повторю то что вы приводили в качестве безсмысленного С++ предложения не является предложением на С++.
Как раз такие является! Оно является предложением С++, но которое, тем не менее, не имеет смысла. А вот Ваша функция выше — имеет смысл и является предложением С++.
Продукции, которые расширяют expression не привожу т.к. их много (достало меня уже!), но вконце expression ведет к продукциям 213, 215, 219 и т.д. Так что не надо говорить, что "моя" функция не может быть выведена грамматикой!
Здравствуйте, <Аноним>, Вы писали:
А>Язык С++ — context free language!
Итого: Это утверждение строится на отрициании того что множество всех well-formed программ на языке С++ является множеством всех предложений языка С++.
Также вы отрицаете оговорки приведенные в стандарте, у Страуструпа и в красном драконе что их грамматики не являются точными грамматиками языка С++. И как следствие используя их нельзя породить все предложения языка С++ и только предложения языка С++.
Думаю разговор на этом можно считать оконченым.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, <Аноним>, Вы писали:
А>Я тоже так думаю. Обратите внимание на кавычки в "грамматика."
Ага там во всем посте кавычки. В том числе и в той его части которая описывает грамматику в вашем понимании. А>И вообще, хватит заниматься демагогией.
Поддерживаю. Рассуждения про кавычки это и есть демагогия.
Отрицание выделеного фрагмента
Приведенное ниже описание синтаксиса С++ должно помочь пониманию языка. Оно не является точным определением языка С++. В частности, описаная здесь грамматика допускает надмножество допустимых конструкций С++.
это тоже демагогия. Ибо тут четко написано что приведенная грамматика не является точной. И как следствие не является грамматикой С++. А>Вы еще не ответили ни на одну просьбу о продукциях и не обьяснили почему мои примеры выводятся грамматикой С++.
Вы сначала найдите точную грамматику С++ (читыйте найдите грамматику С++) вот тогда и поговорим. А пока все ваши утверждения на основании не точных грамматик (читайте грамматик других языков) ни чего не стоят.
Тут вы опять начнете рассуждать о том что такое предложения языка С++ так вот: Множество всех предложений на языке С++ является множеством всех well-formed программ на С++. Не больше и не меньше.
Убедить меня в обратном вам не удасться и как следствие не удасться убедить меня в том что грамматика порождающая не well-formed программы является грамматикой С++.
А>Языки не описываются КЗ грамматиками т.к. КС грамматики достаточно для описания языка.
Еще раз читайте пост Лаптева. Там написано почему используют формальные КС грамматики и почему КЗ храктеристики проверяются не формально.
Распознавание контекстно-зависимых языков требует экспоненциального времени, тогда как КС-языки распознаются в общем случае за полиномиальное время
Это главная причина почему полную грамматику языка разбивают на формальное КС надмножество и не формальные КЗ правила которые вы называете сенематикой.
Вторая причина это то что построение точной формальной грамматики для современных языков (и С++ в особенности вы только вслушаейтесь в эти страшные слова ШАБЛОНЫ, SFINAE, ADL жуть мне уже страшно от того что придется сделать для того чтобы описать это формально ) является очень трудной задачей. И ни один вменяемый человек не станет тратить гигантское колличество ресурсов на то чтобы создать грамматику которая еще и распозноваться будет за экспоненциальное время. И так компиляторы еле ворочаются.
И если вы думаете что я все брошу и потрачу кучу времени на то чтобы создать точную грамматику С++ только ради того чтобы вам что-то доказать то вы ошибаетесь.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Народ, ну вы таки определитесь, какой язык вы собираетесь описывать, а потом будете спорить, он КС или КЗ.
Что является допустимым предложением языка?
В частности, приведённый пример с попутанным типом возвращаемого значения является допустимым предложением C++ или нет?
). Т.е. стандарт честно признаётся, что множество допустимых предложений языка C++ определяется совсем не приведённой в этом же стандарте грамматикой.
Тогда почему является? (если кто-то так думает)
Здравствуйте, mefrill, Вы писали:
M>Вот теперь, действительно, в последний раз.
Раз уж решили ответить, теперь не торопитесь, пожалуйста. Тем более, что Вам захочется ответить мне, еще как минимум один раз.
M>А с чего Вы взяли, что я не могу построить грамматику для Вашего языка???
Тат я немного о другом... Знаете, когда жена в досаде мужу говорит "Ну почему ты даже мусор вынести не можешь?!!"
M>Почему я не привел грамматику для Вашего языка? Да просто потому, что здесь не курсы по (такой простой) теории формальных языков. Я Вам попытался это объяснить, но вместо ответа получил обвинения в некомпетентности.
Понимаете ли, вопрос Вашей компетентности или некомпетентности для меня важен только опосредованно. Мне сейчас (и всё больше) интересен вопрос возможности построения КЗ-грамматики для wellformed С++ языка (буду добавлять wellformed, чтобы не путать с синтаксическим языком С++). С недостаточностью КС — понятно.
Попутно к этому меня заинтересовала фраза анонима о неформализуемости требования "определение перед использованием". Причем, если он ошибается, то мне интересно не просто узнать это и точка, а понять в чем конкретно ошибка и откуда ноги растут у такого заявления.
Аноним, если сейчас читаете, проясните пожалуйста по ногам?
M>Ниже приведена (и объяснена!) грамматика для Вашего языка: M>S --> A 0 S | A M>A --> B A C | B 0 C M>Эти правила позволяют генерировать последовательности вида BBB 0 CCC 0 BB 0 CC.
Вот какие уже на этом месте меня посетили мысли:
1.Какую из двух предложенных альтернатив языка выбрал мой оппонент?
По примеру (и другим примерам далее) выглядит, что условие "ровно два одинаковых", но с другой стороны те же правила генерируют и BBB 0 CCC 0 BBB 0 CCC. Значит выбрано "два и более одинаковых". Да, но тогда у нас выпадает строка BBB 0 CCC 0 ССС (или некий ее аналог), так что цепочки с нечетным колличеством одинаковых идентификаторов грамматика точно не распознает.
2.Дальше я пока, извините, недостаточно внимательно анилизировал (но конечно же обязательно это сделаю, как только смогу), потому что все мои мысли заняла вот какая гиппотеза:
А может быть ошибка утверждения анонима в том, что вместо правила "определение перед использованием" должно бы было указано правило "одного описания" (One Definition Rule). Может быть его нельзя выразить порождающей грамматикой? Если бы это было так, то тогда стало бы понятно почему в самом Стандарте это правило идет особняком (этот вопрос тоже у меня отложился и пока правильного ответа нет). В общем я твердо понял, что мне нужно эту гиппотезу проверить.
3.Я изменил язык своей грамматики на "идентификаторы без повторений" и попытался придумать схему (логику) грамматики. Можно было бы разбираться с языком "ровно два одинаковых", но лучше ведь упрощать, чтобы оставалась и была видна суть проблемы и решения, правильно? Попытки мои окончились безуспешно — мне не удалось построить такую грамматику. При попытке доказать или опровергнуть тезис существования такой грамматики я понял, что здесь моего уровня знаний без обращения к специальной литературе, которой у меня нет, точно недостаточно...
Если Вы строили грамматику для "два и более одинаковых":
По моим прикидкам, доработать первые два правила вполне возможно (укажите, если я ошибаюсь). Тогда, правда, вопрос об "One Definition Rule" пока останется для меня открытым, но я надеюсь в специальной литературе ссылки на которую Вы мне дадите, я смогу на него найти ответ.
Если Вы строили грамматику для "ровно два одинаковых":
Это бы было интересней пердыдущего случая. Тогда Вы, думаю, и без моей дополнительной просьбы сами или подтвердите или опровергните мою гиппотезу, потому что исправлять некорректную грамматику то надо.
M>Все ли здесь понятно мудрому белорусскому вьюноше?
И не надейтесь
Как видите вопросы начались уже с первых строк.
Без внимания не оставлю и все остальное, все непонятности буду формулировать.
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, LaptevVV, Вы писали:
LVV>>Здравствуйте, Nick_, Вы писали:
N_>>>Контекстно зависимой является даже грамматика простого Си! LVV>>Еще раз повторяю: грамматика — контекстно-свободная, а язык — контекстно-зависимый! И не надо путать.
А>Я не знаю, что такое контекстно-зависимый язык в Вашем понимании. Но контекстно-зависимый язык в определении А.Ахо и Дж.Ульмана не может быть порожден контекстно-свободной грамматикой.
Контекстно-зависимый язык -- это язык, который может быть порожден контекстно-свободной грамматикой и не может быть порожден контекстно-свободной. И нет никакого другого понимания.
Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ?
Мне кажется, что да, и пример — x(); неясно вызов это функции x или создание объекта типа x. Но я не уверен...
Здравствуйте, Sergey J. A., Вы писали:
SJA>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ? SJA>Мне кажется, что да, и пример — x(); неясно вызов это функции x или создание объекта типа x. Но я не уверен...
правильно не уверены%) потому что это может быть экземпляр класса с перегруженным оператором ()
Здравствуйте, Sergey J. A., Вы писали:
SJA>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ? SJA>Мне кажется, что да, и пример — x(); неясно вызов это функции x или создание объекта типа x. Но я не уверен...
Я думаю, что нет... вот сходу еще придумалось.
void f1()
{
int a,b,c;
a < b > c;
}
template <class> struct a {};
void f2()
{
typedef int b;
a< b > c;
}
struct X { X() {} };
int main()
{
X x(); <- декларация фунции или переменная x ?
}
Правильно работающая программа — просто частный случай Undefined Behavior
Здравствуйте, dimitry_dimitry, Вы писали:
_>Здравствуйте, Sergey J. A., Вы писали:
SJA>>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ? SJA>>Мне кажется, что да, и пример — x(); неясно вызов это функции x или создание объекта типа x. Но я не уверен... _>правильно не уверены%) потому что это может быть экземпляр класса с перегруженным оператором ()
Так что правильно-то ? Я не уверен, что грамматика С++ контекстнозависима. Она контекстно независима ?
Или мой пример не верен ?
Здравствуйте, _Winnie, Вы писали:
_W>Здравствуйте, Sergey J. A., Вы писали:
SJA>>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ? SJA>>Мне кажется, что да, и пример — x(); неясно вызов это функции x или создание объекта типа x. Но я не уверен...
_W>Я думаю, что нет... вот сходу еще придумалось.
"Нет" — то есть граматика С++ контекстно не зависима ?
_W>int main()
_W>{
_W> X x(); <- декларация фунции или переменная x ?
_W>}
Может я неправильно понимаю термин контекстнозависимый, но мне казалось, что данный пример как раз и говорит о контекстной зависимости:
в зависимости от контекста строка может быть декларацией фунции или переменной.
Здравствуйте, Sergey J. A., Вы писали:
SJA>Здравствуйте, _Winnie, Вы писали:
_W>>Здравствуйте, Sergey J. A., Вы писали:
SJA>>>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ? SJA>>>Мне кажется, что да, и пример — x(); неясно вызов это функции x или создание объекта типа x. Но я не уверен...
_W>>Я думаю, что нет... вот сходу еще придумалось. SJA>"Нет" — то есть граматика С++ контекстно не зависима ?
SJA>
_W>>int main()
_W>>{
_W>> X x(); <- декларация фунции или переменная x ?
_W>>}
SJA>
SJA>Может я неправильно понимаю термин контекстнозависимый, но мне казалось, что данный пример как раз и говорит о контекстной зависимости: SJA>в зависимости от контекста строка может быть декларацией фунции или переменной.
Здравствуйте, Sergey J. A., Вы писали:
SJA>Здравствуйте, dimitry_dimitry, Вы писали:
_>>Здравствуйте, Sergey J. A., Вы писали:
SJA>>>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ? SJA>>>Мне кажется, что да, и пример — x(); неясно вызов это функции x или создание объекта типа x. Но я не уверен... _>>правильно не уверены%) потому что это может быть экземпляр класса с перегруженным оператором ()
SJA>Так что правильно-то ? Я не уверен, что грамматика С++ контекстнозависима. Она контекстно независима ?
нет. поэтому этот замечательный язык иногда является объектом нападок%) SJA>Или мой пример не верен ?
Здравствуйте, Sergey J. A., Вы писали:
SJA>Так что правильно-то ? Я не уверен, что грамматика С++ контекстнозависима. Она контекстно независима ? SJA>Или мой пример не верен ?
Определение понятия "контекстная зависимость" в студию.
Здравствуйте, dimitry_dimitry, Вы писали:
SJA>>>>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ? SJA>>>>Мне кажется, что да, и пример — x(); неясно вызов это функции x или создание объекта типа x. Но я не уверен... _>>>правильно не уверены%) потому что это может быть экземпляр класса с перегруженным оператором ()
SJA>>Так что правильно-то ? Я не уверен, что грамматика С++ контекстнозависима. Она контекстно независима ? _>нет. поэтому этот замечательный язык иногда является объектом нападок%)
То есть в таком случае я был "правильно уверен" ?
Здравствуйте, dimitry_dimitry, Вы писали:
SJA>>>>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ? SJA>>>>Мне кажется, что да, и пример — x(); неясно вызов это функции x или создание объекта типа x. Но я не уверен... _>>>правильно не уверены%) потому что это может быть экземпляр класса с перегруженным оператором ()
SJA>>Так что правильно-то ? Я не уверен, что грамматика С++ контекстнозависима. Она контекстно независима ? _>нет. поэтому этот замечательный язык иногда является объектом нападок%) SJA>>Или мой пример не верен ?
Тогда как это стыкуется с примером:
x();
Что тут x ? Тип или переменная (с переопределённым оператором () ) ? Вроде есть зависимость от контекста... ?
Здравствуйте, Sir Wiz, Вы писали:
SJA>>Так что правильно-то ? Я не уверен, что грамматика С++ контекстнозависима. Она контекстно независима ? SJA>>Или мой пример не верен ? SW>Определение понятия "контекстная зависимость" в студию.
SW>А то я его в стандарте C++ не нашел
Сам бы хотел услышать формальное определение контекстнозависимой грамматики.
Предполагаю, что это такая граматика в которой для разбора нужны некоторые дополнительные данные, собранные раньше в процессе разбора....
Яснее выразить не могу...
Здравствуйте, Sergey J. A., Вы писали:
SJA>Здравствуйте, dimitry_dimitry, Вы писали:
SJA>>>>>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ? SJA>>>>>Мне кажется, что да, и пример — x(); неясно вызов это функции x или создание объекта типа x. Но я не уверен... _>>>>правильно не уверены%) потому что это может быть экземпляр класса с перегруженным оператором ()
SJA>>>Так что правильно-то ? Я не уверен, что грамматика С++ контекстнозависима. Она контекстно независима ? _>>нет. поэтому этот замечательный язык иногда является объектом нападок%) SJA>То есть в таком случае я был "правильно уверен" ?
рискуя повториться в третий раз, скажу ДА.
SJA>>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ? SJA>>Мне кажется, что да, и пример — x(); неясно вызов это функции x или создание объекта типа x. SJA>>Но я не уверен...
W> Я думаю, что нет... вот сходу еще придумалось.
W>
W> void f1()
W> {
W> int a,b,c;
W> a < b > c;
W> }
W> template <class> struct a {};
W> void f2()
W> {
W> typedef int b;
W> a< b > c;
W> }
W>
Этот пример как раз иллюстрирует зависимость от контекста.
Здравствуйте, Sergey J. A., Вы писали:
SJA>Сам бы хотел услышать формальное определение контекстнозависимой грамматики. SJA>Предполагаю, что это такая граматика в которой для разбора нужны некоторые дополнительные данные, собранные раньше в процессе разбора.... SJA>Яснее выразить не могу...
Тогда да, конечно да. Я просто уверен, что да.
Простейшее: корректность выражения x = 1; зависит от того, был ли ранее и как продекларирован x.
Можно открыть стандарт и ввести поиск слова context. Найдется много замечаний насчет context-dependent и context-independent выражениях.
Здравствуйте, dimitry_dimitry, Вы писали:
SJA>>>>>>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ? SJA>>>>>>Мне кажется, что да, и пример — x(); неясно вызов это функции x или создание объекта типа x. Но я не уверен... _>>>>>правильно не уверены%) потому что это может быть экземпляр класса с перегруженным оператором ()
SJA>>>>Так что правильно-то ? Я не уверен, что грамматика С++ контекстнозависима. Она контекстно независима ? _>>>нет. поэтому этот замечательный язык иногда является объектом нападок%) SJA>>То есть в таком случае я был "правильно уверен" ? _>рискуя повториться в третий раз, скажу ДА.
Здравствуйте, Sergey J. A., Вы писали:
SJA>Здравствуйте, dimitry_dimitry, Вы писали:
SJA>>>>>>>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ? SJA>>>>>>>Мне кажется, что да, и пример — x(); неясно вызов это функции x или создание объекта типа x. Но я не уверен... _>>>>>>правильно не уверены%) потому что это может быть экземпляр класса с перегруженным оператором ()
SJA>>>>>Так что правильно-то ? Я не уверен, что грамматика С++ контекстнозависима. Она контекстно независима ? _>>>>нет. поэтому этот замечательный язык иногда является объектом нападок%) SJA>>>То есть в таком случае я был "правильно уверен" ? _>>рискуя повториться в третий раз, скажу ДА.
SJA>Первых два раза было больше похоже на "нет"
вы уж простите. я от Re[2]: char, потоки
Здравствуйте, Sir Wiz, Вы писали:
SJA>>Сам бы хотел услышать формальное определение контекстнозависимой грамматики. SJA>>Предполагаю, что это такая граматика в которой для разбора нужны некоторые дополнительные данные, собранные раньше в процессе разбора.... SJA>>Яснее выразить не могу... SW>Тогда да, конечно да. Я просто уверен, что да.
SW>Простейшее: корректность выражения x = 1; зависит от того, был ли ранее и как продекларирован x.
Вроде не совсем так. При разборе данного выражения нет неоднозначности — x должно быть переменной. А определена она или нет — это уже мне кажется ошибка другого рода... То есть если будет граматика типа :
expr: var operator const | var operator var | const operator const;
variable : IDENTIFIER;
const : NUMBER;
NUMBER : [0..9];
IDENTIFIER : [a..z_][a..z0-9_]*;
То можно однозначно построить дерево разбора.
А вот для x(); и граматики:
tmp_obj : type "(' ')';
par_operator : variable "(' ')';
type : IDENTIFIER; (1)
variable : IDENTIFIER; (2)
IDENTIFIER : [a..z_][a..z0-9_]*;
Нельзя точно сказать что такое x — type или variable. Поэтому при "подъёме" из IDENTIFIER в type или variable нужны контекстные данные для выбора. Вот.
Всё это только предположения... зря я не прочитал Ахо до конца...
SW>Можно открыть стандарт и ввести поиск слова context. Найдется много замечаний насчет context-dependent и context-independent выражениях.
отойти не могу.
Всё просто. Когда я вижу априоритивное, бездоказательное и нетерпящее возражений утверждение относительно весьма неоднозначных вещей, я становлюсь очень зол, у меня встаёт дыбом шерсть, из носа бьет пар, отрастают и немедленно начинают взбивать землю копыта, а шёлкаюшему хвосту позавидует кнут Барлога. Зверь дикий вобщем, наверное у меня детство тяжёлое было.
Здравствуйте, Андрей Галюзин, Вы писали:
SW>> Определение понятия "контекстная зависимость" в студию.
АГ>С++ (как и С) является контекстно-зависимым языком. Т.е. конструкцию языка не всегда можно распознать без знания ее более широкого контекста.
Меня вот ещё смущает такой вопрос... Ведь граматику можно построить упрощённую. Например:
Теперь выражение x(); будет распознано однозначно. Нельзя ли написать для C/C++ такую простенькую контекстно свободную граматику ? А если можно, то как должен определяться порог "сложности" или "детальности" грамматики ?
Ведь я могу написать грамматику
program : TEXT;
TEXT : .*
?
Здравствуйте, Sir Wiz, Вы писали:
SW>Здравствуйте, dimitry_dimitry, Вы писали:
SJA>>>Первых два раза было больше похоже на "нет" _>>вы уж простите. я от Re[2]: char, потоки
отойти не могу. SW>Всё просто. Когда я вижу априоритивное, бездоказательное и нетерпящее возражений утверждение относительно весьма неоднозначных вещей, я становлюсь очень зол, у меня встаёт дыбом шерсть, из носа бьет пар, отрастают и немедленно начинают взбивать землю копыта, а шёлкаюшему хвосту позавидует кнут Барлога. Зверь дикий вобщем, наверное у меня детство тяжёлое было.
SW>Очень хорошее слово "ИМХО". SW>Вот и +1 за выдающуюся самокритику
улетел
да у меня тоже децтво не сахар было.
и не люблю я ссылки и С++ ИО-потоки, с ссылками я кстати объяснил почему.
а с потоками — из недавнего — человек сделал код с потоками — посмотрел по библиотекам — прицепилось еще 2 длл. ужос!!
и УБЛЮДОЧНО вы уж простите выглядит конструкция с потоками.
я ничего не имею против оператора << но в данном случае ...ну неудобно.
то ли дело printf. а?
а я себя не критиковал. я вас спросил.
_W>>>>int main()
_W>>>>{
_W>>>> X x(); <- декларация фунции или переменная x ?
_W>>>>}
SJA>>>
D>>Нет, это всегда декларация функции.
Н>Эта строка является объявлением функции только тогда, когда она появляется в Global Scope, иначе это — вызов конструктора по умолчанию для объекта класса.
Предлагаю Вам самому убедиться в обратном:
#include <iostream>
class X
{
X()
{
std::cout << "X::X() called";
}
};
int main(int argc, char* argv[])
{
X x();
return 0;
}
Здравствуйте, mefrill, Вы писали: M>Си++, как и большинство других языков программирования, контекстно зависим.
А можно примеры извесных контекстно свободных языков ?
Здравствуйте, Sergey J. A., Вы писали:
SJA>Здравствуйте, Андрей Галюзин, Вы писали:
SW>>> Определение понятия "контекстная зависимость" в студию. АГ>>С++ (как и С) является контекстно-зависимым языком. Т.е. конструкцию языка не всегда можно распознать без знания ее более широкого контекста.
Насколько я помню курс Линвистики — Грамматика является контекстно независимой, если для проверки правильности программы (написанной по этой грамматике) достаточно выполнить синтаксический разбор. Т.е. грамматика калькулятора — контекстно независима, а грамматика языка С++ — контекстно зависима (требуется семантический разбор).
Здравствуйте, davenger, Вы писали:
D>Здравствуйте, Нахлобуч, Вы писали:
D>Вы пробовали запускать приведённый код? Что он вывел на экран?
VC++ 2003 выдал свой Compiler Warning (level 1) C4930, а у Comeau все нормально. Но тогда почему
int x();
прокатывает?
... << Rsdn@Home 1.1.4 beta 1 >>
HgLab: Mercurial Server and Repository Management for Windows
Re[3]: Граматика С++
От:
Аноним
Дата:
27.07.04 09:22
Оценка:
SJA>А можно примеры извесных контекстно свободных языков ?
C, C++, Java, C#, you name it! Все языки программирования описываются контекстно-свободными грамматиками.
Re[9]: Граматика С++
От:
Аноним
Дата:
27.07.04 09:25
Оценка:
Н>VC++ 2003 выдал свой Compiler Warning (level 1) C4930, а у Comeau все нормально. Но тогда почему
Н>
Н>int x();
Н>
Н>прокатывает?
Да потому что это обьявление функции х, которая возвращает инт и не принимает аргументов!
Re[7]: Граматика С++
От:
Аноним
Дата:
27.07.04 09:37
Оценка:
G> Насколько я помню курс Линвистики — Грамматика является контекстно независимой, если для проверки правильности программы (написанной по этой грамматике) достаточно выполнить синтаксический разбор. Т.е. грамматика калькулятора — контекстно независима, а грамматика языка С++ — контекстно зависима (требуется семантический разбор).
Неправильно Вы помните, хотя бы потому, что существуют четыре вида грамматик по Хомскому, и для каждой грамматики существует свой распознаватель. Разница заключается только в том, что каждый распознаватель имеет свою вычислительную сложность.
А>Курсивом выделены нетерминалы, темным — терминалы. Из этой, частичной граматики, неужели нельзя понять где обьявляется обьект а где вызывается функция? Для простоты, argument-list выводит как минимум один аргумент.
Но у меня в примере было немного по другому. x(); — x — тип (вызов функции или конструирование объекта) или x — переменная (вызов оператора () ). Как для такого варианта построить контекстно свободную граматику ?
Вот мой вариант КЗ:
(терминалы БОЛЬШИМИ БУКВАМИ и 'в кавычках')
statement : type '(' ')' | variable '(' ')' ;
type : IDENTIFIER;
variable : IDENTIFIER;
где
IDENTIFIER -> [a-z_][a-z0-9_]*
Но непонятно, как из IDENTIFIER перейти к type или variable. Нужны доп. данные.
Как для данного выражения построить КС ?
Я — свихнувшееся сознание Джо.
Re[4]: Граматика С++
От:
Аноним
Дата:
27.07.04 09:52
Оценка:
SJA>Но у меня в примере было немного по другому. x(); — x — тип (вызов функции или конструирование объекта) или x — переменная (вызов оператора () ). Как для такого варианта построить контекстно свободную граматику ?
Дайте лучше другой пример или в более полном контексте (не путать с контекстной грамматикой!) или загляните в Страуструпа. Непонятна эта фраза — x(); — x — тип (вызов функции или конструирование объекта) или x — переменная (вызов оператора () )
SJA>Вот мой вариант КЗ: SJA>(терминалы БОЛЬШИМИ БУКВАМИ и 'в кавычках')
SJA>statement : type '(' ')' | variable '(' ')' ; SJA>type : IDENTIFIER; SJA>variable : IDENTIFIER; SJA>где SJA>IDENTIFIER -> [a-z_][a-z0-9_]*
SJA>Но непонятно, как из IDENTIFIER перейти к type или variable. Нужны доп. данные. SJA>Как для данного выражения построить КС ?
Терминалы большими буквами да еще и продукция для IDENTIFIER? И вопрос последний тоже непонятен.
Здравствуйте, <Аноним>, Вы писали:
SJA>>Но у меня в примере было немного по другому. x(); — x — тип (вызов функции или конструирование объекта) или x — переменная (вызов оператора () ). Как для такого варианта построить контекстно свободную граматику ? А>Дайте лучше другой пример или в более полном контексте (не путать с контекстной грамматикой!) или загляните в Страуструпа. Непонятна эта фраза — x(); — x — тип (вызов функции или конструирование объекта) или x — переменная (вызов оператора () )
А что тут непонятного ?
Вот полный пример:
class X {
public:
int operator()() {
return 666;
};
};
int x() {
return 999;
};
int main(int argc, char* argv[])
{
{
X x;
int i = x(); //(1)
}
{
int i = x(); //(2)
}
return 0;
}
Строки 1 и 2 одинаковые на вид, но в одном случае x это тип (функция), а в другом случае — переменная.
И без доп. данных это невозможно определить.
SJA>>Вот мой вариант КЗ: SJA>>(терминалы БОЛЬШИМИ БУКВАМИ и 'в кавычках')
SJA>>statement : type '(' ')' | variable '(' ')' ; SJA>>type : IDENTIFIER; SJA>>variable : IDENTIFIER; SJA>>где SJA>>IDENTIFIER -> [a-z_][a-z0-9_]*
SJA>>Но непонятно, как из IDENTIFIER перейти к type или variable. Нужны доп. данные. SJA>>Как для данного выражения построить КС ? А>Терминалы большими буквами да еще и продукция для IDENTIFIER?
Я имел в виду, что терминалы обозначены большими буквами и символами в кавычках (так я в bison-е видел).
А продукция для IDENTIFIER: это я просто употребил неверный символ наверное "->"
Я имел в виду, что IDENTIFIER это последовательность букв, цифр и _ начинающаяся с _ или буквы.
А>И вопрос последний тоже непонятен.
Эт потому, что я и сам с трудом понимаю что говорю
Здравствуйте, mefrill, Вы писали:
M>На остальные аргументы я не считаю нужным отвечать просто потому, что это не аргументы. Мы сами с Вами говорим на разных языках . Относительно сложности реализации компилятора си++ через КС грамматику я могу отослать Вас к двум диссертациям Зуева и Кротова, посвященным как раз проблемам реализации языка. Но Вы, к сожалению, врядли их прочитаете.
Я! Я прочитаю! Пошлите меня, пожалуйста по указанному адресу!!!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, mefrill, Вы писали:
LVV>>Я! Я прочитаю! Пошлите меня, пожалуйста по указанному адресу!!!
M>Зуевская диссертация лежит здесь: http://www.interstron.ru/publications.html. А насчет диссертации Александра Кротова надо наверное попростить его самого или кого-то из Интерстрона, чтобы выслали.
Большое спасибо, Владимир! Пока прочитаю Зуева. Это не его книжка по турбо паскалю в начале 90-х вышла?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
LVV>Большое спасибо, Владимир! Пока прочитаю Зуева. Это не его книжка по турбо паскалю в начале 90-х вышла?
Честно говоря, не знаю, скорее всего. Он в МГУ преподавал, а потом уехал в Швейцарию, в Цюрих, не помню как у них университет называется, известный довольно.
Здравствуйте, mefrill, Вы писали:
M>Вот отсюда можно увидеть, что при предварительном объявлении некоторого имени, далее, при разборе предложения языка, при встрече некоторого имени мы должны как бы откатиться назад и пройти по всем объявлениям имен, чтобы узнать, было ли объявлено данной имя или нет.
А вот допустим я построю граматику, в которой не будет разницы между типом и переменной, а всё это будет identifier. Тогда граматика будет вроде как КС ? Вот мальенький пример:
Язык такой (показаны все допустимые конструкции). Идентификатор может быть function или variable. Затем его можно "активировать": function f; variable v;
f();
v();
Вроде граматика КС ? Разобрав ею программу и построив дерево можно приступить к определению что есть что в каждой конкретной "активизации".
Что тут не верно ?
Здравствуйте, Sergey J. A., Вы писали:
SJA>Здравствуйте, mefrill, Вы писали:
M>>Вот отсюда можно увидеть, что при предварительном объявлении некоторого имени, далее, при разборе предложения языка, при встрече некоторого имени мы должны как бы откатиться назад и пройти по всем объявлениям имен, чтобы узнать, было ли объявлено данной имя или нет.
SJA>А вот допустим я построю граматику, в которой не будет разницы между типом и переменной, а всё это будет identifier. Тогда граматика будет вроде как КС ? Вот мальенький пример: SJA>Язык такой (показаны все допустимые конструкции). Идентификатор может быть function или variable. Затем его можно "активировать": SJA>function f; SJA>variable v; SJA>f(); SJA>v();
SJA>Можно написать такую КС граматику: SJA>program : /*empty*/ | statement_list SJA>statement_list : statement | statement_list statement SJA>statement : func_decl | var_decl | activate SJA>func_decl : 'function' IDENTIFIER ';' SJA>var_decl : 'variable' IDENTIFIER ';' SJA>activate : IDENTIFIER '(' ')'
SJA>IDENTIFIER — набор букв.
SJA>Вроде граматика КС ? Разобрав ею программу и построив дерево можно приступить к определению что есть что в каждой конкретной "активизации". SJA>Что тут не верно ?
Грамматика, конечно, контекстно свободная. Но, штука в том, что она не описывает тот язык, который Вы подразумеваете. Например, я пишу следущее:
b();
При разборе в соответствии только с вышеприведенной грамматикой, все будет хорошо, мы получим следующий вывод (дерево разбора):
Но это дерево не дает нам полной иинформации о программе и вообще, корректно допускает некорректное предложение языка. Здесь дело как раз в условии предварительного объявления. Нам надо это условие каким-то образом выразить в самой грамматике. Вот, если грамматика эта КС, то выразить не удается. Приходится КЗ грамматику определять, но методы разбора языков, задаваемых через КЗ-грамматики, очень сложные. Гораздо легче, определить КС-грамматику, котороя, строго говоря, не описывает язык, а какие-то Кз свойства языка сделать вручную и назвать "сеантикой" языка. В нашем случае, это свойство предварительного объявления имен, используемых в программе. Искать на ленте это объявление, как я показывал выше, долго, медленнее линейног времени и, если и нет, то константа очень большая. А вот реализуя это свойство вручную, мы поиск имен можем сделать логорифмическим, используя какою-нибудь хеш таблицу. Выгода налицо. Но сам язык от этой особенности реализации не стал контекстно свободным. Это ведь характеристика языка, а не метода разбора
Здравствуйте, mefrill, Вы писали:
M>Грамматика, конечно, контекстно свободная. Но, штука в том, что она не описывает тот язык, который Вы подразумеваете. Например, я пишу следущее:
M>b();
M>При разборе в соответствии только с вышеприведенной грамматикой, все будет хорошо, мы получим следующий вывод (дерево разбора):
M>program ==> statement_list ==> statement ==> activate ==> IDENTIFIER '(' ')'
M>Но это дерево не дает нам полной иинформации о программе и вообще, корректно допускает некорректное предложение языка. Здесь дело как раз в условии предварительного объявления. Нам надо это условие каким-то образом выразить в самой грамматике. Вот, если грамматика эта КС, то выразить не удается. Приходится КЗ грамматику определять, но методы разбора языков, задаваемых через КЗ-грамматики, очень сложные. Гораздо легче, определить КС-грамматику, котороя, строго говоря, не описывает язык, а какие-то Кз свойства языка сделать вручную и назвать "сеантикой" языка. В нашем случае, это свойство предварительного объявления имен, используемых в программе. Искать на ленте это объявление, как я показывал выше, долго, медленнее линейног времени и, если и нет, то константа очень большая. А вот реализуя это свойство вручную, мы поиск имен можем сделать логорифмическим, используя какою-нибудь хеш таблицу. Выгода налицо. Но сам язык от этой особенности реализации не стал контекстно свободным. Это ведь характеристика языка, а не метода разбора
Так. Кажется понял. То есть все предложения(тексты?), которые может породить граматика должно быть верной программой (в смысле компилироваться, а не работать) ? Тогда эта граматика является собственно граматикой языка ?
И если я правильно понял, то обычно компиляторы пользуются некоторой КС граматикой, которая более/менее описывают язык, а потом производят доп. обработку — семантический анализ ?
SJA>Так. Кажется понял. То есть все предложения(тексты?), которые может породить граматика должно быть верной программой (в смысле компилироваться, а не работать) ? Тогда эта граматика является собственно граматикой языка ? SJA>И если я правильно понял, то обычно компиляторы пользуются некоторой КС граматикой, которая более/менее описывают язык, а потом производят доп. обработку — семантический анализ ?
В точности так. Потому, что свойство языка быть КС или КЗ — это свойство языка и, следовательно, всех, описывающих его, грамматик. А синитаксический анализатор сейчас обычно реализуется в виде двух компонентов: синтаксического анализатора, анализирующего КС подмножество языка и семантического анализатора, анализирующего оставшуюся, чаще всего КЗ, часть языка. Но все это вместе все равно есть синтаксический анализатор языка.
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, Sergey J. A., Вы писали:
SJA>>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ? SJA>>Мне кажется, что да, и пример — x(); неясно вызов это функции x или создание объекта типа x. Но я не уверен... LVV>Ни один из современных языков программирования на практике не описывается контекстно-зависимыми грамматиками, исключительно контестно-свободными (из соображений эффективности, кстати. Распознавание контекстно-зависимых языков требует экспоненциального времени, тогда как КС-языки распознаются в общем случае за полиномиальное время). Но помимо этого, конечно, в каждом компиляторе проверяются не контекстно-свободные характеристики, к которым относятся, например, требование единственности объявления или "сначала объяви, потом используй". Единственный язык, в котором использовалась не КС-грамматика — Алгол-68. Ван Вейнгартен изобрел для него специальные двухуровневые грамматики — видимо без этого невозможно было описать введение новых операций в процессе выполнения программы.
Здравствуйте, Sergey J. A., Вы писали:
SJA>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ? SJA>Мне кажется, что да, и пример — x(); неясно вызов это функции x или создание объекта типа x. Но я не уверен...
Грамматика языка описывает его синтаксис. А то, что ты иллюстрируешь своим примером с 'x()' — это уже семантика, которая, формально выражаясь, никакого отношения к грамматике не имеет. Разумеется, на практике грамматики языков стремятся формировать так, чтобы они адекватно отображали семантику эти языков. Это весьма разумно и упрощает написание трансляторов. Но, еще раз, к констекстной [не]зависимости грамматики это все равно никакого отношения не имеет.
Грамматика языка С++ не содержит правил с множественными лексемами в левой части — значит она контекстно независима по определению.
Здравствуйте, Sergey J. A., Вы писали:
SJA>Тогда как это стыкуется с примером: SJA>x(); SJA>Что тут x ? Тип или переменная (с переопределённым оператором () ) ? Вроде есть зависимость от контекста... ?
Зависмость семантического смысла конструкции от контекста, размеется, есть. Но ни к грамматике, ни к ее контекстной независимости это никакого отношения не имеет.
Здравствуйте, Андрей Галюзин, Вы писали:
АГ>[skipped]
>> А ничего и не надо убирать! Грамматика С++ — контекстно-свободная грамматика, и потому, этот >> язык сам и является контекстно-свободным.
АГ>Хм. В таком случае, как разобрать выражение x * y не зная контекста (классика жанра)?
А в чем проблема? Если это относительно полное [под]выраждение, то очень просто:
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>Здравствуйте, Sergey J. A., Вы писали:
SJA>>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ? SJA>>Мне кажется, что да, и пример — x(); неясно вызов это функции x или создание объекта типа x. Но я не уверен...
АТ>Грамматика языка описывает его синтаксис. А то, что ты иллюстрируешь своим примером с 'x()' — это уже семантика, которая, формально выражаясь, никакого отношения к грамматике не имеет. Разумеется, на практике грамматики языков стремятся формировать так, чтобы они адекватно отображали семантику эти языков. Это весьма разумно и упрощает написание трансляторов. Но, еще раз, к констекстной [не]зависимости грамматики это все равно никакого отношения не имеет.
АТ>Грамматика языка С++ не содержит правил с множественными лексемами в левой части — значит она контекстно независима по определению.
Мы же это уже обсуждали выше. То, о чем ты говоришь, конечно КС-грамматика, но она си++ не определяет, а только его подмножество, т.е. немного другой язык. Ведь в данной грамматике никак не выражена необходимость объявлять имя до его использования? Верно? Значит, грамматика язык не полностью определяет. Так часто делается, часть языка выражается грамматикой, другая — КЗ часть, парсится вручную и это называется семантикой языка. Мы же говорим о свойстве самого языка си++, какой он? Т.е. найдется ли КС грамматика, полностью описывающая весь язык полностью? Я утверждаю, что нет. Что в моем рассуждении неверно?
Re[3]: Граматика С++
От:
Аноним
Дата:
27.07.04 23:53
Оценка:
M>Ведь в данной грамматике никак не выражена необходимость объявлять имя до его использования? Верно? Значит, грамматика язык не полностью определяет.
хм. интересно.
вот к примеру, как грамматикой русского языка определено то, что нельзя составить предложение из пяти прилагательных?
Re[3]: Граматика С++
От:
Аноним
Дата:
28.07.04 03:17
Оценка:
АТ>Все это хорошо, но тем не менне не имеет никакого отношения к исходному вопросу. Вопрос был о том, является ли грамматика языка С++ контекстно зависимой. Ответ однозначен — не является. Грамматика языка С++ является контекстно свободной по определению, т.к. в левой части каждого правила этой грамматики стоит ровно один нетерминал. Все.
АТ>Все остальные рассуждения и примеры, которые тут обильно привдятся, на самом деле не имеют никакого отношения к грамматике языка С++.
Во! My man! Поддерживаю на все сто!
Здравствуйте, dimitry_dimitry, Вы писали:
_>а с потоками — из недавнего — человек сделал код с потоками — посмотрел по библиотекам — прицепилось еще 2 длл. ужос!! _>я ничего не имею против оператора << но в данном случае ...ну неудобно. _>то ли дело printf. а?
Есть такая замечательная книга "Защищённый код" М. Лебланк, М. Ховард, в этой книге в 5-ой главе, посвящённой переполнению буфера, очень наглядно показано как с использованием printf-функций можно совершать неявные ошибки, открывающие дорогу к взлому вашего приложения. Допустить аналогичные ошибки с помощью потоков значительно труднее. Между количеством библиотек и надёжностью приложения лично я выбираю 2-ое.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[4]: Граматика С++
От:
Аноним
Дата:
28.07.04 03:49
Оценка:
M>На остальные аргументы я не считаю нужным отвечать просто потому, что это не аргументы. Мы сами с Вами говорим на разных языках .
Во-во! Мы действительно говорим на разных языках, и кто-то из нас не понимает теорию формальных языков и трансляции. Думаю, что это все-таки не я!
M>Относительно сложности реализации компилятора си++ через КС грамматику я могу отослать Вас к двум диссертациям Зуева и Кротова, посвященным как раз проблемам реализации языка.
Это что это за диссертации такие? Я всегда считал, что человек делает original research, затем пишет диссертацию и защищает ее. А тут они делают, что уже сделано другими и никаких оригинальных исследований? M>Но Вы, к сожалению, врядли их прочитаете.
Говорите за себя! У меня есть хорошая литература, которую я могу почитать!
M>И могу Ва уверить также, что под неоднозначностью я понимал именно то, что имеется ввиду в теории формальных языков.
Сомневаюсь.
Здравствуйте, Mr. None, Вы писали:
MN>Здравствуйте, dimitry_dimitry, Вы писали:
_>>а с потоками — из недавнего — человек сделал код с потоками — посмотрел по библиотекам — прицепилось еще 2 длл. ужос!! _>>я ничего не имею против оператора << но в данном случае ...ну неудобно. _>>то ли дело printf. а?
MN>Есть такая замечательная книга "Защищённый код" М. Лебланк, М. Ховард, в этой книге в 5-ой главе, посвящённой переполнению буфера, очень наглядно показано как с использованием printf-функций можно совершать неявные ошибки, открывающие дорогу к взлому вашего приложения. Допустить аналогичные ошибки с помощью потоков значительно труднее. Между количеством библиотек и надёжностью приложения лично я выбираю 2-ое.
наверное фабула там в том, что можно подсовывать на выполнение свой код?
а дайте ссылку пжалста?
Здравствуйте, mefrill, Вы писали:
SJA>>>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ? SJA>>>Мне кажется, что да, и пример — x(); неясно вызов это функции x или создание объекта типа x. Но я не уверен...
АТ>>Грамматика языка описывает его синтаксис. А то, что ты иллюстрируешь своим примером с 'x()' — это уже семантика, которая, формально выражаясь, никакого отношения к грамматике не имеет. Разумеется, на практике грамматики языков стремятся формировать так, чтобы они адекватно отображали семантику эти языков. Это весьма разумно и упрощает написание трансляторов. Но, еще раз, к констекстной [не]зависимости грамматики это все равно никакого отношения не имеет.
АТ>>Грамматика языка С++ не содержит правил с множественными лексемами в левой части — значит она контекстно независима по определению.
M>Мы же это уже обсуждали выше. То, о чем ты говоришь, конечно КС-грамматика, но она си++ не определяет, а только его подмножество, т.е. немного другой язык. Ведь в данной грамматике никак не выражена необходимость объявлять имя до его использования? Верно? Значит, грамматика язык не полностью определяет. Так часто делается, часть языка выражается грамматикой, другая — КЗ часть, парсится вручную и это называется семантикой языка. Мы же говорим о свойстве самого языка си++, какой он? Т.е. найдется ли КС грамматика, полностью описывающая весь язык полностью? Я утверждаю, что нет. Что в моем рассуждении неверно?
Ну это уже зависит от того, что же понимать под термином "грамматика" языка С++. Если то и только то, что приводится в соответствующем разделе стандарта ("грамматика" в узком толковании термина) — то эта грамматика очевидным образом КС.
Затем можно досыпать к этому еще набор очевидно чисто грамматических правил, которые в стандарте языка изложены "на словах", и получить "грамматику" в широком толковании термина. Например, правило, запрещающее пустые декларации. В принципе, я думаю, такие правила можно было внести в грамматику (в узком толковании) и при этом сохранить ее как КС, но это черезмерно бы ее усложнило. Поэтому эти дополнительные правила было решено изложить "на словах" (что, как известно, привело к тому, что многие компиляторы забывают эти правила проверять).
Ну и наконец ко всему этому можно еще обавить еще и такие правила, как требования объявления перед использованием и контроля типов, и получить "грамматику" в супершироком толковании термина (ни о каком КС при этом, разумеется, уже речи быть не может), но мне это кажется уже перебором.
Здравствуйте, <Аноним>, Вы писали:
А>Если Вы так уверены, что С++ контекстно-зависимый язык, то продукции, которые "требуют обьявления переменной до использования" — в студию!
Что такое
a<b>c;
Ы?
Если
template<class>
struct a{};
struct b{};
то это обьявление переменной c.
А если
int a, b, c;
то это хоть и безсмысленное но вполне корректное с точки зрения С++ выражение.
Вот и попробуй разрулить это КС грамматикой
И если внимательно посмотреть на ту грамматику С++ что в стандарте то не смотря на то что она выглядит как КС без анализа контекста ни чего не выдет.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, dimitry_dimitry, Вы писали:
_>Здравствуйте, Mr. None, Вы писали:
MN>>Здравствуйте, dimitry_dimitry, Вы писали:
_>>>а с потоками — из недавнего — человек сделал код с потоками — посмотрел по библиотекам — прицепилось еще 2 длл. ужос!! _>>>я ничего не имею против оператора << но в данном случае ...ну неудобно. _>>>то ли дело printf. а?
MN>>Есть такая замечательная книга "Защищённый код" М. Лебланк, М. Ховард, в этой книге в 5-ой главе, посвящённой переполнению буфера, очень наглядно показано как с использованием printf-функций можно совершать неявные ошибки, открывающие дорогу к взлому вашего приложения. Допустить аналогичные ошибки с помощью потоков значительно труднее. Между количеством библиотек и надёжностью приложения лично я выбираю 2-ое. _>наверное фабула там в том, что можно подсовывать на выполнение свой код? _>а дайте ссылку пжалста?
Примерно. Ссылку уже дал: книга "Защищённый код" М. Лебланк, М. Ховард. Можно купить например здесь
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
WH>то это хоть и безсмысленное но вполне корректное с точки зрения С++ выражение. WH>Вот и попробуй разрулить это КС грамматикой
Грамматика ничего не "разруляет!" Грамматика лишь используется для порождения правильных цепочек языка, и генератором в данном случае является программист!
Подумаешь привели выражение выше!!! Если просто проверить строку на принадлежность С++, то тебе не все равно какая продукция вывела эту строку? Ы?
WH>И если внимательно посмотреть на ту грамматику С++ что в стандарте то не смотря на то что она выглядит как КС без анализа контекста ни чего не выдет.
Она не выглядит! Она есть КС грамматика! За пример, что ты привел выше отвечает семантический анализатор!
Считываем "a". Просматриваем таблицу символов. Если "а" имя шаблонного класса, то находится одна продукция. Если же "а" имя переменной, то ищется другая продукция! Все.
ЗЫ. Еще раз повторю, грамматика описывает синтаксис языка, и строка a<b>c синтаксически верна чем бы не были a, b и с. Другое дело, что семантически эта конструкция не имела бы смысла!
А>Неправильно Вы помните, хотя бы потому, что существуют четыре вида грамматик по Хомскому, и для каждой грамматики существует свой распознаватель. Разница заключается только в том, что каждый распознаватель имеет свою вычислительную сложность.
Правильно, более того для С++ можно построить контекстно-независимую грамматику. Например в приложении к "Dragon Book"-у есть LALR(1) грамматика для Yacc-а.
> M>Ведь в данной грамматике никак не выражена необходимость объявлять имя до его использования? Верно? Значит, грамматика язык не полностью определяет.
> хм. интересно. > вот к примеру, как грамматикой русского языка определено то, что нельзя составить предложение из пяти прилагательных?
Давайте не смешивать два разных значения слова "грамматика".
Posted via RSDN NNTP Server 1.9 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, <Аноним>, Вы писали:
WH>>И если внимательно посмотреть на ту грамматику С++ что в стандарте то не смотря на то что она выглядит как КС без анализа контекста ни чего не выдет. А>Она не выглядит! Она есть КС грамматика! За пример, что ты привел выше отвечает семантический анализатор!
А>Считываем "a". Просматриваем таблицу символов. Если "а" имя шаблонного класса, то находится одна продукция. Если же "а" имя переменной, то ищется другая продукция! Все.
А я то думал, что если в процессе поиска нужной продукции нужна доп. информация (здесь таблица символов), то это уже не КС ?
Я — свихнувшееся сознание Джо.
Re[7]: Граматика С++
От:
Аноним
Дата:
29.07.04 03:33
Оценка:
SJA>А я то думал, что если в процессе поиска нужной продукции нужна доп. информация (здесь таблица символов), то это уже не КС ?
Языки программирования описываются КС грамматиками. В Вашем предложении ключевые слова — "в процессе поиска нужной продукции." Таблица символов нужна для выявления смысловой нагрузки конструкций языка.
Здравствуйте, <Аноним>, Вы писали:
SJA>>А я то думал, что если в процессе поиска нужной продукции нужна доп. информация (здесь таблица символов), то это уже не КС ? А>Языки программирования описываются КС грамматиками.
Да вроде выяснили уже, что КЗ...
А>В Вашем предложении ключевые слова — "в процессе поиска нужной продукции." Таблица символов нужна для выявления смысловой нагрузки конструкций языка.
А что, выбор нужной продукции, это уже не относится к граматике ?
Я — свихнувшееся сознание Джо.
Re[9]: Граматика С++
От:
Аноним
Дата:
29.07.04 15:45
Оценка:
SJA>Да вроде выяснили уже, что КЗ...
Не знаю, что вы там выяснили, но нутром чую, что выяснили неправильно.
SJA>А что, выбор нужной продукции, это уже не относится к граматике ?
Нет, не относится. На синтаксическом уровне одну и ту же строку можно вывести разными продукциями.
Здравствуйте, <Аноним>, Вы писали:
SJA>>А что, выбор нужной продукции, это уже не относится к граматике ? А>Нет, не относится. На синтаксическом уровне одну и ту же строку можно вывести разными продукциями.
Что-то я совсем запутался....
Как говорил mefrill:
А в КС-грамматиках такого нет, нетерминал всегда значит одно и то же, поэтому там все правила имеют вид A --> alpha B beta, что можно обозначить просто как A --> alpha, т.к. alpha это строка нетерминальных и терминальных символов.
То есть вроде как A это всегда alpha, но alpha всегда ли это A ?
В нашем примере при одном и том же alpha есть 2 продукции:
A -> alpha
B -> alpha
Разве может быть такая граматика ? Не является ли она "противоречивой", или как оно там называется ?
SJA>То есть вроде как A это всегда alpha, но alpha всегда ли это A ? SJA>В нашем примере при одном и том же alpha есть 2 продукции: SJA>A -> alpha SJA>B -> alpha SJA>Разве может быть такая граматика ? Не является ли она "противоречивой", или как оно там называется ?
Такая грамматика вполне может быть, хотя, конечно, большого смысла это не имеет и ведет к неоднозначности. Как можно определить неоднозначность грамматики? Просто, если при разборе некоторого предложения x1x2...xn его можно разобрать хотя бы двумя разными способами, что значит вывести из стартового символа грамматики S строку x1x2...xn, то такая грамматика называется неоднозначной. В нашем случае, если из alpha выводится строка xixi+1...xk например, то мы имеем сразу два дерева разбора:
S
/ A \
/ alpha \
x1x2...xi-1 xi...xk xk+1xk+2...xn
S
/ B \
/ alpha \
x1x2...xi-1 xi...xk xk+1xk+2...xn
Таким образом, грамматика является неоднозначной, одно и тоже предложение выводится двумя различными способами. Вопрос, можно ли эту грамматику трансформировать так, чтобы она определяла тот же язык, но при этом грамматика была однозначной. Иногда можно, иногда нет. Язык, для которого не существует однозначной грамматики называется существенно неоднозначным. Можно ли по грамматике узнать, является ли она однозначной или нет? Нельзя, эта проблема алгоритмически неразрешима, т.е. не существует универсального алгоритма, котрый решает эту задачу. Проблема с парсингом си++ состоит не в том, что грамматика языка есть КЗ, как мы видели, это решается с помощью определения "семантических" свойств языка, а в том, что язык си++ существенно неоднозначен. Поэтому при разработке компиляторов начинаются проблемы когда используют инструменты типа бизона. Бизон, за исключением последних версий, реализует алгоритм анализа, называемый LALR(k), где число k обычно равно единице. Этот алгоритм есть небольшое улучшение алгоритма LR(k)-анализа. Теримнология была введена Кнутом в 1965 году: L значит, что предложение читается слева направо, R обозначает, что при выводе каждый раз заменяется крайний правый нетерминал, например:
S --> AB
A --> a
B --> b
При выводе строки ab получим: S ==> AB ==> Ab ==> ab
Кроме того, анализ ведется снизу-вверх, т.е. сначала подбирается правая часть правила и потом заменяется на нетерминал в левой части. Кнут придумал алгоритм, который для некоторых КС-граммматик производит такой разбор за линейное время относительно длины разбираемой строки. Линейное значит, что у нас нет правил вида:
A -> alpha
B -> alpha
так как при разборе получая строку alpha надо будет решить на какой нетерминал ее заменить. Обычно поступают так: сначала пробуют подставить первый нетерминал, если не получится вывода, то второй. При линейном времени, очевидно, это не получится. Можно попытаться посмотреть вперед на k символов чтобы решить какой нетерминал выбрать, в этом и состоит идея Кнута, но, к сожалению, существуют грамматики, для которых это узнать невозможно ни для какого, сколь угодно большого, числа k. Вот из-за таких вот неоднозначностей разбор си++ с бизоном проблематичен. Есть модификации бизона, позволяющие, при встрече альтернативных нетерминалов, пройти немного вперед при анализе и потом, когда будет известно, какой нетерминал выбрать, возвратиться назад. Понятно, что здесь о линейном времени говорить не приходиться. Алгоритм Томиты, введенный им в 1984 году при такой встрече производит параллельный анализ всех альтернатив (вот где простор для многопоточных анализаторов!) и, в результате, получает все деревья вывода, которые существуют. Есть еще несколько алгоритмов, позволяющих сделать такой анализ, например алгоритм Эрли. Анализатор на основе этого алгоритма был реализован мной при работе над диссертацией. В общем, парсер Си++ написать не сложно, но только не с LR(k)-анализатором.
Здравствуйте, Areg, Вы писали:
А>>Неправильно Вы помните, хотя бы потому, что существуют четыре вида грамматик по Хомскому, и для каждой грамматики существует свой распознаватель. Разница заключается только в том, что каждый распознаватель имеет свою вычислительную сложность.
A>Правильно, более того для С++ можно построить контекстно-независимую грамматику. Например в приложении к "Dragon Book"-у есть LALR(1) грамматика для Yacc-а.
Данная грамматика (как впрочем и практически все другие грамматики С++) базируется на предположении, что _сканнер_ (aka lexer) распознает (основываясь на информации собранной ранее парсером), является ли имя просто идентификатором, именем типа, именем шаблона или именем namespace'а.
Так что строго говоря, то что предлашается в этом приложении не есть классическая LALR(1) грамматика...
Здравствуйте, mefrill, Вы писали:
M>Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>>Здравствуйте, Sergey J. A., Вы писали:
SJA>>>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ? SJA>>>Мне кажется, что да, и пример — x(); неясно вызов это функции x или создание объекта типа x. Но я не уверен...
АТ>>Грамматика языка описывает его синтаксис. А то, что ты иллюстрируешь своим примером с 'x()' — это уже семантика, которая, формально выражаясь, никакого отношения к грамматике не имеет. Разумеется, на практике грамматики языков стремятся формировать так, чтобы они адекватно отображали семантику эти языков. Это весьма разумно и упрощает написание трансляторов. Но, еще раз, к констекстной [не]зависимости грамматики это все равно никакого отношения не имеет.
АТ>>Грамматика языка С++ не содержит правил с множественными лексемами в левой части — значит она контекстно независима по определению.
M>Мы же это уже обсуждали выше. То, о чем ты говоришь, конечно КС-грамматика, но она си++ не определяет, а только его подмножество, т.е. немного другой язык. Ведь в данной грамматике никак не выражена необходимость объявлять имя до его использования? Верно? Значит, грамматика язык не полностью определяет. Так часто делается, часть языка выражается грамматикой, другая — КЗ часть, парсится вручную и это называется семантикой языка. Мы же говорим о свойстве самого языка си++, какой он? Т.е. найдется ли КС грамматика, полностью описывающая весь язык полностью? Я утверждаю, что нет.
Скорее всего, это правда, но я, например, формального доказательства не видел.
А с другой стороны, я не видел доказательства другого факта -- что С++ может быть задан контекстно-зависимой грамматикой.
M>Что в моем рассуждении неверно?
Всё верно, только не хватает строгого доказательства невозможности построить КС грамматику, задающую язык. Или хотя бы ссылки.
Здравствуйте, <Аноним>, Вы писали:
А>Очень хорошо все изложено, но в конце последнего параграфа у Вас заблуждение.
Да нет, это у вас непонимание элементарных вещей. Есть язык C++, есть множество well-formed программ на этом языке, которое представляет из себя некоторое множество конечных цепочек букв. Так вот, это множество не может быть определено через КС грамматику. Это и означает, что C++ не контекстно свободный язык. Будем спорить, что 2+2==4?
Ш>Всё верно, только не хватает строгого доказательства невозможности построить КС грамматику, задающую язык. Или хотя бы ссылки.
Ну, для любого языка с предварительным объявлением имен: есть лемма о накачке для КС языков еще известная как лемма Огдена. Вот с помощью ентой леммы легко доказать, что язык, состоящий из двух подряд идущих строк неизвестной заранее длины и состоящих из алфавита мощностью более одного, не являетс КС. А это как раз подязык любого языка с предварительным объявлением имен.
Здравствуйте, <Аноним>, Вы писали:
Ш>>Да нет, это у вас непонимание элементарных вещей. Есть язык C++, есть множество well-formed программ на этом языке, которое представляет из себя некоторое множество конечных цепочек букв. А>Может дадите определение ваших "well-formed программ на этом языке?"
Читайте стандарт. По простому, well-formed программа -- это то, что компилятор C++, написанный в соответствии со стандартом, должен пропустить через себя и сгенерировать некоторый объектный код.
Ш>>Так вот, это множество не может быть определено через КС грамматику. А>Кто вам это сказал?
Это доказано. Математически строго.
Читайте этот тред, а так же специальную литературу.
Ш>>Будем спорить, что 2+2==4? А>Не въехал...
Вы пытаетесь оспорить, что 2+2==4. Таких людей обычно посылают в дет. сад.
А>Пришла зима. Нестерпимая жара установилась на дворе. Грамматика С++ — контекстно-свободная! В этом форуме куча тем. Кто из нас всех прав? Опять пришла зима и т.д. А>[/q] А>Это пример из русского языка. Как видите, с точки зрения русской грамматики параграф и все предложения верны, но тем не менее смысла они не имеют. Точно также и с С++. Даже Лаптев, вон, выше заметил, что языки описываются КС грамматиками.
То, о чем Вы говорите как о грамматике русского языка и порождающая грамматика Хомского, это, как говорят в Одессе, две большие разницы.
Неужели так трудно внимательно проситать то, о чем здесь выше говорилось? Как об стенку горох, честное слово! Как в том анекдоте: папа, а ты с кем сейчас разговаривал? Мне кажется, тут дело либо в невнимательности (если не в чем похуже!), либо в элементарном неуважении к собеседнику.
Re[9]: Граматика С++
От:
Аноним
Дата:
06.08.04 20:18
Оценка:
M>То, о чем Вы говорите как о грамматике русского языка и порождающая грамматика Хомского, это, как говорят в Одессе, две большие разницы.
А Вы считаете, что предложения русского и английских языков, например, не могут быть описаны порождающей грамматикой Хомского? Если да, то Вы ОШИБАЕТЕСЬ!!! Как Вы сами и знаете, КЗ грамматики используются в переводчиках с одного естественного языка на другой, и пример с грамматикой русского языка и грамматикой С++ очень хорошо описывает сущность этих грамматик!
M>Неужели так трудно внимательно проситать то, о чем здесь выше говорилось? Как об стенку горох, честное слово!
Это я должен сказать "как об стенку горох, честное слово!"
M>Мне кажется, тут дело либо в невнимательности (если не в чем похуже!), либо в элементарном неуважении к собеседнику.
Мне тоже так кажется, но только дело здесь в том, что это ВЫ не желаете прислушаться к тому, что здесь говорят.
Здравствуйте, <Аноним>, Вы писали:
А>Используя грамматику С++, можно вывести следующую функцию: А>
А>void foo()
А>{
А> int i;
А> return i;// Все синтаксически здесь верно!!!
А>}
А>
Это не есть well-formed программа на языке С++. Грамматика языка должна описывать все well-formed программы и только well-formed программы. Если грамматика описывает все well-formed и еще множество не well-formed программ то это не грамматика данного языка. Исключить множество не well-formed программ языка С++ можно только при помощи КЗ грамматики.
Но тк КЗ грамматика это очень сложно то используют компромисный вариант. Создают КС грамматику которая описывает язык являющеяси над множеством данного языка и создают допольнительные правила для отсечения не well-formed программ. И сделано это не по тому что грамматика языка КС, а по тому что построение КЗ грамматики во первых очень сложный процесс сам по себе во вторых парсер получается ну ооочееень медленный.
2ALL: Настоятельно рекомендую прекратить переходы на личности.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Аноним, Вы писали:
M>>То, о чем Вы говорите как о грамматике русского языка и порождающая грамматика Хомского, это, как говорят в Одессе, две большие разницы. А>А Вы считаете, что предложения русского и английских языков, например, не могут быть описаны порождающей грамматикой Хомского? Если да, то Вы ОШИБАЕТЕСЬ!!! Как Вы сами и знаете, КЗ грамматики используются в переводчиках с одного естественного языка на другой, и пример с грамматикой русского языка и грамматикой С++ очень хорошо описывает сущность этих грамматик!
Так дискуссию вести невозможно, аргументы игнорируются, очевидные факты отвергаются. Поэтому, пытаюсь объяснить в последний раз:
Языком является множество строк, сформированных из символов данного алфавита. Порождающая грамматика Хомского — это устройство для порождения данных строк и только их. Язык может описываться не только порождающей грамматикой Хомского, а также и другими, каковых сущесвтует великое множество, как порождающих, так и не порождающих. кроме того, язык может быть описан без всякой грамматики. Например, предложение "множество сттрок, состоящих из нуля и более символов а" великолепно описывает язык, который задает грамматика:
S --> aS | пустая строка
Здесь ГДЕ-НИБУДЬ о семантике хоть слово было произнесено? Семанитка языка (в ее настоящем смысле, т.е. интепретация строк языка человеком) не имеет никакого отношения к описанию структуры строк языка (его предложений). Этим занимает синтаксис. Например, мы могли бы интерпретировать описанный выше язык так: символ а значит произнесение звука а в течении одной секунды. Тогда строка ааа обозначала бы, что некий человек пропел а-а-а... три секунды подряд. То же самое и в си++. Множество предложений данного языка это (с некоторым обобщением) множество правильных программ, написанных на языке си++. Вот и встает задача: описать это множество программ, используя ТОЛЬКО порождающую грамматику Хомского. Это сделать можно, как возможно описать любые структурные построения (например, множество музыкальных этюдов). Но, КС-грамматика для этого не подойдет из-за свойства языка: каждое имя должно быть описано перед его использованием. Как я уже писал выше, данное свойство не может быть выражено КС-грамматикой. Так что все просто. Разумеется, язык можно описывать и не используя порождающие грамматики, а как-нибудь по другому. Например, как это делается в стандарте языка си++. Чать описывается КС-грамматикой. Но такое описание позволяет породить и неверные программы на си++. Поэтому, вводятся еще ограничения, причем в виде так называемых "семантических" правил. Это делать можно, но почему же при этом говорить, что КС-грамматика, описывающая часть языка, описывает весь язык!? С таким же успехом, я могу описать часть языка регулярной грамматикой, а остальную часть неформально на русском языке и сказать, что граматика языка си++ регулярна. Но это не так, конечно.
Именно, понимание выразительной способности разных классов грамматик и составляет понимание идеи Хомского. Еще раз, в книге "Техники парсинга" есть такой рисунок:
Здравствуйте, <Аноним>, Вы писали:
А>А вообще, откройте Страуструпа и убедитесь, что непонравившаяся Вам функция выводится грамматикой С++!
Ты сам то его читал?
Приведенное ниже описание синтаксиса С++ должно помочь пониманию языка. Оно не является точным определением языка С++...
(С) Язык программирования С++. Специальное издание. Б. Страуструп.
Да что там Страуструп читаем стандарт
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) А. Эйнштейн
Ответьте на два вопроса
1)Может ли порождающая грамматика языка порождать предложения не входящие в данный язык?
2)Что вы понимаете под предложением на языке С++?
Наезды поскипаны.
Последнее китайское. Держите эмоции при себе.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[16]: Граматика С++
От:
Аноним
Дата:
07.08.04 17:59
Оценка:
А>Мне следует задать эти вопросы т.к. Вы путаете разницу между формальным языком и грамматикой.
Оговорился. Последнее следует читать: "между формальным языком и языком программирования."
Re[18]: Граматика С++
От:
Аноним
Дата:
08.08.04 05:28
Оценка:
Исправил и добавил пару номеров в продукции т.к. допустил там пару ошибок. Исправления здесь не выделены.
А>
А>Продукции, которые расширяют expression не привожу т.к. их много (достало меня уже!), но вконце expression ведет к продукциям 213, 215, 219 и т.д. Так что не надо говорить, что "моя" функция не может быть выведена грамматикой!
А>Язык С++ — context free language!
Re[18]: Граматика С++
От:
Аноним
Дата:
08.08.04 06:02
Оценка:
Кстати, используя продукции 10, 17, 25, 46, 48, 68 и 69 (в этом порядке) можно обьявить переменную
Это уже оффтопик, писать здесь введение в теорию формальных языков не собираюсь. Но, уверяю Вас, сколько угодно, поищите на тему
трансформационных грамматик, категориальных и т. п...
M>>кроме того, язык может быть описан без всякой грамматики. Например, предложение "множество сттрок, состоящих из нуля и более символов а" великолепно описывает язык, который задает грамматика:
M>>S --> aS | пустая строка
А>Ну вот. Говорим о языке, который "может быть описан без всякой грамматики" и толкаем пример регулярной грамматики с использованием рекурсии (ака КС элемента)!!! Удивительная у Вас способность описывать простые грамматики более сложными!!! Неудивительно, что для языков программирования Вам нужна КЗ грамматика!
Вы это о чем??? Я привел пример языка и описал его двумя способами: предложением русского языка и порождающей грамматикой.
M>>Здесь ГДЕ-НИБУДЬ о семантике хоть слово было произнесено? А>Это Вы смешиваете чисто семантическая понятия с синтаксическими!
И где я здесь СМЕШИВАЛ что-то??? Как можно здесь нечто смешивать, если есть только одна составляющая (синтаксис)?
M>>Семанитка языка (в ее настоящем смысле, т.е. интепретация строк языка человеком) не имеет никакого отношения к описанию структуры строк языка (его предложений). Этим занимается синтаксис. Например, мы могли бы интерпретировать описанный выше язык так: символ а значит произнесение звука а в течении одной секунды. Тогда строка ааа обозначала бы, что некий человек пропел а-а-а... три секунды подряд.
А>Долой абстрактные примеры и голословность! Все что от Вас требовалось — привести правила, которые требуют обьявления переменных один и только один раз! ВЫ ИХ НЕ ПРИВЕЛИ!
От меня этого и не требовалось. Вопрос был в том, что си++ не является КС-языком, с чем Вы, вроде-бы, согласились. Теперь, оказывается, я должен привести еще и доказательство того, что си++ описывается КЗ-грамматикой или, даже более того, что вообще порождающая грамматика Хомского может описывать такие свойства языка как предварительное объявление. Т.е. уважаемый Аноним выступает опровергателем теории Хомского. Чтобы не привлекать теорию машин Тьюринга, приведу просто пример КЗ-грамматики, описывающей подъязык языка си++. К сожалению, в данной теме можно быть либо голословным, либо многословным. Тетрум, как говорится, нон датур. Поэтому я приведу описание только совсем небольшого подязыка си++, состоящего из объявлений типа int ID и использования типа ++ID. Как мы уже доказывали, этот язык не является КС, а так как некоторое подмножество предложений языка не может быть описано КС-грамматикой, то и весь язык также не может быть описан КС-грамматикой. Это-то, надеюсь, понятно?
Итак, будем танцевать от следующего языка:
L = { xx : x есть {a1, a2, ... , an } + }. Т.е. данный язык есть множество пар одиннаковых строк, состоящих из символов a1, a2, ... , an. В си++, с некоторым обобщением, это идентификаторы. Этот язык определяется следующей КЗ-грамматикой:
(1)
1. ID --> A ID B
2. ID --> A B
3. ID --> ai ai
(2)
1. A --> Ci
2. Ci A --> Ci Ai
3. Ai A --> Ai Ai
4. Ai B --> Ai Di
5. Ai Fj --> Ai Fji
6. Fji Fk --> Fji Fki
7. Fji B --> Fji Di
(3)
1. Ci --> Ei
2. Ei Ai --> Ei A
3. A Ai --> A A
4. A Di --> A Fi
5. A Fji --> A Fj
6. Fj Fjk --> Fj Fk
7. Fj Di --> Fj Fi
(4)
1. Ei --> ai
2. Fi --> ai
Идея этой грамматики проста. Сначала группой правил (1) порождаем строки вида AAAAAA... BBBBBB... где вхождений A и B оиннаковое число. Потом, начиная с крайнего A, применяем правила группы (2) примерно так:
AAABBB ==> Ci AABBB ==> Ci Ai A BBB ==> Ci Ai Ai BBB ==> Ci Ai Ai Di BB.
После этого применяем правила группы (3), чтобы затереть ненужную информацию (символы Ai) примерно так:
Ci Ai Ai Di BB ==> Ei Ai Ai Di B B ==> Ei A Ai Di B B ==> Ei A A Di B B ==> Ei A A Fi B B
Теперь проделываем те же манипуляции для остальных A и B, в результате получим строку их Ei Ek.... Ep Fi Fk ... Fp и, используя правила группы (4), меняем полученную строку на соответствующие терминалы.
Легко доказать, что данная грамматика порождает только строки показанного вида и никакие больше. К тому же, ясно, что грамматика есть КЗ. Теперь можно данный язык расширить правилами вида:
(1)
1. Prog --> int ID
2. ID --> A ID B
2. ID --> A ++ B
3. ID --> ai ai
И, кроме того, изменить правила остальных групп так, чтобы они пропускали ++. Вот и получили язык, определяющий строку int ID ++ ID. Далее, можно вставить в правила группы (1) еще Prog в правые части так, чтобы порождать последовательности таких вот "int ID ++ ID" строк. Причем, построить грамматику так, чтобы генерировались строки вида "int ab int bc ++ bc ++ ab" также несложно. Затем расширить грамматику так, чтобы можно было менять int ab с каким-нибудь ++ bc. Вот и получится, что все строки нужного вида сгенерируются и только они.
Из приведенного выше видно, что порождающая грамматика является именно механизмом (устройством, машиной) который порождает строки определенной структуры. Есть теорема, что для любой КЗ-грамматики можно построить линейно-ограниченный автомат (ЛОА), генерирующий те же строки, что и данная грамматика. На самом деле, грамматика выше является не чем иным, как программой для такого автомата, причем нетерминалы — это состояния данного ЛОА. ЛОА — это машина Тьюринга, т.е. конечный алфавит, конечное число состояний и лента (память), в нашем случае, ограниченная в обе стороны. Теперь, надеюсь, идея стала ясна?
M>>То же самое и в си++. Множество предложений данного языка это (с некоторым обобщением) множество правильных программ, написанных на языке си++.
А>Достает это уже. Повторюсь еще раз... Грамматика описывает только синтаксис языка, и ПРОГРАММА МОЖЕТ БЫТЬ СИНТАКСИЧЕСКИ ВЕРНОЙ, НО НЕВЕРНОЙ СЕМАНТИЧЕСКИ! Выше я уже привел два примера!
Я просто в недоумении... Синтаксис описывает текст программы, а текст программы может быть либо верным либо неверным. Вот и все. Здесь даже не "иди в детский сад", а "мама, роди меня обратно" можно сказать!
M>>Вот и встает задача: описать это множество программ, используя ТОЛЬКО порождающую грамматику Хомского. Это сделать можно, как возможно описать любые структурные построения (например, множество музыкальных этюдов).
M>>Но, КС-грамматика для этого не подойдет из-за свойства языка: каждое имя должно быть описано перед его использованием. Как я уже писал выше, данное свойство не может быть выражено КС-грамматикой.
А>Да кто Вам сказал, что требование, что имя должно быть описано до использования вообще должно быть выраженно через грамматику?!!
ТРЕБОВАНИЕ, ЧТОБЫ ИМЯ БЫЛО ОБЬЯВЛЕНО ДО ИСПОЛЬЗОВАНИЯ — НЕФОРМАЛЬНО, И НЕ МОЖЕТ БЫТЬ ВЫРАЖЕННО ГРАММАТИКАМИ!!!
Смотри вверху.
M>>Так что все просто. Разумеется, язык можно описывать и не используя порождающие грамматики, а как-нибудь по другому. Например, как это делается в стандарте языка си++.
M>>Чать описывается КС-грамматикой. Но такое описание позволяет породить и неверные программы на си++.
А>Повторюсь еще раз! Все программы, описанные грамматикой С++ будут синтаксически верны т.к. грамматика описывает только синтаксис (случай с КС грамматикой) и лексику (случай с регулярной грамматикой)! Это, однако, не значит, что программа будет верна семантически!!!
А>Как Вы опишите формально, что делает for loop? НИКАК! Точно также нельзя формально требовать, чтобы имена были обьявлены заранее. Это делается НЕФОРМАЛЬНО!
В каком смысле ЧТО ДЕЛАЕТ??? Мы же говорим о тексте программы (т.е. о языке!!!) и более не о чем. А как этот текст использовать, это другой разговор. Кто-то в машину вводит для исполнения, можно еще пропеть в церкви в виде псалмов, а можно напечатать и в туалет с этой бумажкой сходить.
M>>Поэтому, вводятся еще ограничения, причем в виде так называемых "семантических" правил. Это делать можно, но почему же при этом говорить, что КС-грамматика, описывающая часть языка, описывает весь язык!? С таким же успехом, я могу описать часть языка регулярной грамматикой, а остальную часть неформально на русском языке и сказать, что граматика языка си++ регулярна. Но это не так, конечно.
А>Ну да! Давайте вообще выбросим всю формализацию к черту и обьявим, что язык С++ вообще можно описать только словами (неформально)!
Давайте, а что язык алгебры или мат анализа грамматикой в учебниках описывается? Нет, именно постредством русского языка, расширенного специальными символами. И чем неформальнее, тем понятнее.
А>Именно эти и "семантические правила," которые неформальны, и требуют, чтобы имя было обьявлено. Все! Не путайте язык программирования с формальным языком!
Конечно, они требуют. Но мы с Вами используем понятия КС-грамматик и КЗ-грамматик, т.е. оперируем в рамках языка порождающих грамматик Хомского. Поэтому, должны оставаться в рамках этой теории. А в этой теории нет ничего про семантику.
M>>Именно, понимание выразительной способности разных классов грамматик и составляет понимание идеи Хомского. Еще раз, в книге "Техники парсинга" есть такой рисунок:
А>Ну и зачем нам этот рисунок? Опять абстракция! Без него и так ясно, что существуют классы грамматик, которые описывают больше языков, чем другие, и сложность расспознавания которых выше. Вот и вся теория.
Ага, взять все и поделить! Чево нам переписка Энгельса с Каутским!
M>>Владимир. А>Учите теорию, Владимир, лучше!
Теория, мой друг, суха. Но древо жизни зеленеет. не читали? Был там такой персонаж, Вагнер. В Вас я нахожу похожие черты. Но таки я ее учил и продолжаю с удовольствием. А вот Вам, Аноним, не советую, все-равно ничего путного не выйдет.
А>Ну и аспиранты пошли... Грустно...
Насчет аспирантов непонятно. А вот насчет недоучек-студентов можно и порассуждать. Или Вы кулибин из провинции? Сами изучали или курс кто-то читал? В Москве или Питере за такие знания зачеты не ставят... Или выгнали как раз на экзамене по курсу?
А>ЗЫ, Приведите правила из грамматики, подтверждающие, что язык С++ — КЗ язык! Хватит голословности и абстрактных размышлений!
Привел, см. выше. И, кстати, доказательство того, что си++ не КС язык тоже выше можно посмотреть.
Да, и отвечаю я Вам в последний раз. Действительно, хватит абстрактных размышлений и голословности, особенно, вкупе с многословностью. А то получается как в том анекдоте: папа, а ты с кем сейчас разговаривал?
Re[13]: Граматика С++
От:
Аноним
Дата:
08.08.04 16:43
Оценка:
M>>>кроме того, язык может быть описан без всякой грамматики. Например, предложение "множество сттрок, состоящих из нуля и более символов а" великолепно описывает язык, который задает грамматика:
M>>>S --> aS | пустая строка
А>>Ну вот. Говорим о языке, который "может быть описан без всякой грамматики" и толкаем пример регулярной грамматики с использованием рекурсии (ака КС элемента)!!! Удивительная у Вас способность описывать простые грамматики более сложными!!! Неудивительно, что для языков программирования Вам нужна КЗ грамматика!
M>Вы это о чем??? Я привел пример языка и описал его двумя способами: предложением русского языка и порождающей грамматикой.
Читайте внимательнее!
M>От меня этого и не требовалось. Вопрос был в том, что си++ не является КС-языком, с чем Вы, вроде-бы, согласились.
Когда это я согласился с неверным измышлением?!! Или Вы выдаете желаемое за действительное?
M>Теперь, оказывается, я должен привести еще и доказательство того, что си++ описывается КЗ-грамматикой или, даже более того, что вообще порождающая грамматика Хомского может описывать такие свойства языка как предварительное объявление. Т.е. уважаемый Аноним выступает опровергателем теории Хомского.
Бред. Я доказал почему С++ — КС язык. Вы же не можете доказать почему С++ — КЗ язык. Все ваши утверждения основаны на голословности и ни единой продукции из С++.
M>Чтобы не привлекать теорию машин Тьюринга, приведу просто пример КЗ-грамматики, описывающей подъязык языка си++. К сожалению, в данной теме можно быть либо голословным, либо многословным. Тетрум, как говорится, нон датур. Поэтому я приведу описание только совсем небольшого подязыка си++, состоящего из объявлений типа int ID и использования типа ++ID. Как мы уже доказывали, этот язык не является КС, а так как некоторое подмножество предложений языка не может быть описано КС-грамматикой, то и весь язык также не может быть описан КС-грамматикой. Это-то, надеюсь, понятно?
То что весь язык (а точнее требования об обьявлении имен) не может быть описан КС грамматикой еще НЕ значит, что он КЗ язык.
M>Итак, будем танцевать от следующего языка:
M>L = { xx : x есть {a1, a2, ... , an } + }. Т.е. данный язык есть множество пар одиннаковых строк, состоящих из символов a1, a2, ... , an. В си++, с некоторым обобщением, это идентификаторы. Этот язык определяется следующей КЗ-грамматикой:
M>(1) M> 1. ID --> A ID B M> 2. ID --> A B M> 3. ID --> ai ai M>(2) M> 1. A --> Ci M> 2. Ci A --> Ci Ai M> 3. Ai A --> Ai Ai M> 4. Ai B --> Ai Di M> 5. Ai Fj --> Ai Fji M> 6. Fji Fk --> Fji Fki M> 7. Fji B --> Fji Di M>(3) M> 1. Ci --> Ei M> 2. Ei Ai --> Ei A M> 3. A Ai --> A A M> 4. A Di --> A Fi M> 5. A Fji --> A Fj M> 6. Fj Fjk --> Fj Fk M> 7. Fj Di --> Fj Fi M>(4) M> 1. Ei --> ai M> 2. Fi --> ai
Опять голословность и не единой продукции из грамматики С++?
M>Идея этой грамматики проста. Сначала группой правил (1) порождаем строки вида AAAAAA... BBBBBB... где вхождений A и B оиннаковое число. Потом, начиная с крайнего A, применяем правила группы (2) примерно так: M> AAABBB ==> Ci AABBB ==> Ci Ai A BBB ==> Ci Ai Ai BBB ==> Ci Ai Ai Di BB.
Да хватит мне обьяснять как выводить эти строчки! Ломает меня читать весь этот абстрактный бред.
M>После этого применяем правила группы (3), чтобы затереть ненужную информацию (символы Ai) примерно так: M> Ci Ai Ai Di BB ==> Ei Ai Ai Di B B ==> Ei A Ai Di B B ==> Ei A A Di B B ==> Ei A A Fi B B
M>Теперь проделываем те же манипуляции для остальных A и B, в результате получим строку их Ei Ek.... Ep Fi Fk ... Fp и, используя правила группы (4), меняем полученную строку на соответствующие терминалы.
M>Легко доказать, что данная грамматика порождает только строки показанного вида и никакие больше. К тому же, ясно, что грамматика есть КЗ. Теперь можно данный язык расширить правилами вида:
M>(1) M> 1. Prog --> int ID M> 2. ID --> A ID B M> 2. ID --> A ++ B M> 3. ID --> ai ai M>И, кроме того, изменить правила остальных групп так, чтобы они пропускали ++. Вот и получили язык, определяющий строку int ID ++ ID. Далее, можно вставить в правила группы (1) еще Prog в правые части так, чтобы порождать последовательности таких вот "int ID ++ ID" строк. Причем, построить грамматику так, чтобы генерировались строки вида "int ab int bc ++ bc ++ ab" также несложно.
Что это за строка такая в С++? Пока что я вижу, что ее можно описать регулярной грамматикой, а КЗ нах... не нужна.
M>Затем расширить грамматику так, чтобы можно было менять int ab с каким-нибудь ++ bc. Вот и получится, что все строки нужного вида сгенерируются и только они.
Расширяйте сколько угодно, но где РЕАЛЬНЫЕ продукции?
M>>>То же самое и в си++. Множество предложений данного языка это (с некоторым обобщением) множество правильных программ, написанных на языке си++.
А>>Достает это уже. Повторюсь еще раз... Грамматика описывает только синтаксис языка, и ПРОГРАММА МОЖЕТ БЫТЬ СИНТАКСИЧЕСКИ ВЕРНОЙ, НО НЕВЕРНОЙ СЕМАНТИЧЕСКИ! Выше я уже привел два примера!
M>Я просто в недоумении... Синтаксис описывает текст программы, а текст программы может быть либо верным либо неверным. Вот и все. Здесь даже не "иди в детский сад", а "мама, роди меня обратно" можно сказать!
Тут уже следует сказать "иди по такому-то адресу!" Грамматика описывает синтаксис, и синтаксическая структура программы, порожденная данной грамматикой, всегда будет верной! Единственное, она может быть неверной семантически, чего до Вас не доходит!
M>>>Вот и встает задача: описать это множество программ, используя ТОЛЬКО порождающую грамматику Хомского. Это сделать можно, как возможно описать любые структурные построения (например, множество музыкальных этюдов).
M>>>Но, КС-грамматика для этого не подойдет из-за свойства языка: каждое имя должно быть описано перед его использованием. Как я уже писал выше, данное свойство не может быть выражено КС-грамматикой.
А>>Да кто Вам сказал, что требование, что имя должно быть описано до использования вообще должно быть выраженно через грамматику?!!
M>ТРЕБОВАНИЕ, ЧТОБЫ ИМЯ БЫЛО ОБЬЯВЛЕНО ДО ИСПОЛЬЗОВАНИЯ — НЕФОРМАЛЬНО, И НЕ МОЖЕТ БЫТЬ ВЫРАЖЕННО ГРАММАТИКАМИ!!!
M>Смотри вверху.
Читай теорию.
M>>>Так что все просто. Разумеется, язык можно описывать и не используя порождающие грамматики, а как-нибудь по другому. Например, как это делается в стандарте языка си++.
M>>>Чать описывается КС-грамматикой. Но такое описание позволяет породить и неверные программы на си++.
А>>Повторюсь еще раз! Все программы, описанные грамматикой С++ будут синтаксически верны т.к. грамматика описывает только синтаксис (случай с КС грамматикой) и лексику (случай с регулярной грамматикой)! Это, однако, не значит, что программа будет верна семантически!!!
А>>Как Вы опишите формально, что делает for loop? НИКАК! Точно также нельзя формально требовать, чтобы имена были обьявлены заранее. Это делается НЕФОРМАЛЬНО!
M>В каком смысле ЧТО ДЕЛАЕТ??? Мы же говорим о тексте программы (т.е. о языке!!!) и более не о чем. А как этот текст использовать, это другой разговор. Кто-то в машину вводит для исполнения, можно еще пропеть в церкви в виде псалмов, а можно напечатать и в туалет с этой бумажкой сходить.
И после таких высказываний Вы считаете себя экспертом по трансляции? (раз уж взялись за эту ветвь)
M>>>Поэтому, вводятся еще ограничения, причем в виде так называемых "семантических" правил. Это делать можно, но почему же при этом говорить, что КС-грамматика, описывающая часть языка, описывает весь язык!? С таким же успехом, я могу описать часть языка регулярной грамматикой, а остальную часть неформально на русском языке и сказать, что граматика языка си++ регулярна. Но это не так, конечно.
А>>Ну да! Давайте вообще выбросим всю формализацию к черту и обьявим, что язык С++ вообще можно описать только словами (неформально)!
M>Давайте, а что язык алгебры или мат анализа грамматикой в учебниках описывается? Нет, именно постредством русского языка, расширенного специальными символами. И чем неформальнее, тем понятнее.
А>>Именно эти и "семантические правила," которые неформальны, и требуют, чтобы имя было обьявлено. Все! Не путайте язык программирования с формальным языком!
M>Конечно, они требуют. Но мы с Вами используем понятия КС-грамматик и КЗ-грамматик, т.е. оперируем в рамках языка порождающих грамматик Хомского. Поэтому, должны оставаться в рамках этой теории. А в этой теории нет ничего про семантику.
В теории Хомского семантики нет. В языках программирования, она есть, чего до вас не доходит. И требование, чтобы переменная была обьявлена заранее — семантическое. Вы же все еще застряли на синтаксисе.
M>>>Владимир. А>>Учите теорию, Владимир, лучше!
M>Теория, мой друг, суха. Но древо жизни зеленеет. не читали? Был там такой персонаж, Вагнер. В Вас я нахожу похожие черты. Но таки я ее учил и продолжаю с удовольствием. А вот Вам, Аноним, не советую, все-равно ничего путного не выйдет.
Вы только можете ставить картинки, не понимая теорию. Я так и не догнал, что имелось в виду под "выразительной способностью разного класса грамматик."
А>>Ну и аспиранты пошли... Грустно...
M>Насчет аспирантов непонятно.
Где-то тут Вы уже зарекались про свою диссертацию. Вот я и решил, что Вы аспирант.
M>А вот насчет недоучек-студентов можно и порассуждать. Или Вы кулибин из провинции?
Я в своей "провинции" получил ВО получше чем Вы!
M>Сами изучали или курс кто-то читал?
Я вот и думаю, как Вам читали курс, который Вы так и не поняли, судя по вашим постам. Надеюсь вы НЕ будете читать этот курс?
M>В Москве или Питере за такие знания зачеты не ставят... Или выгнали как раз на экзамене по курсу?
Во-во. Я и удивляюсь как с такими знаниями вас допустили до диссертации.
А>>ЗЫ, Приведите правила из грамматики, подтверждающие, что язык С++ — КЗ язык! Хватит голословности и абстрактных размышлений! M>Привел, см. выше. И, кстати, доказательство того, что си++ не КС язык тоже выше можно посмотреть.
Что-то я так и не увидел ни одного правила из грамматики С++. Одна голословность да регулярные языки!
M>Да, и отвечаю я Вам в последний раз. Действительно, хватит абстрактных размышлений и голословности, особенно, вкупе с многословностью. А то получается как в том анекдоте: папа, а ты с кем сейчас разговаривал?
Ну-ну... Еще интересно знать с чей стороны идут абстрактные размышления и голословность!
Ну и наконец ко всему этому можно еще обавить еще и такие правила, как требования объявления перед использованием и контроля типов, и получить "грамматику" в супершироком толковании термина (ни о каком КС при этом, разумеется, уже речи быть не может), но мне это кажется уже перебором.
А>Лаптев, преподаватель в ВУЗе, подтвердил, что языки программирования описываются КС грамматиками. Re: Граматика С++
Ни один из современных языков программирования на практике не описывается контекстно-зависимыми грамматиками, исключительно контестно-свободными (из соображений эффективности,
А>После этого Вы будете продолжать спорить?
Я думаю вам стоит внимательно почитать что они пишут.
Еще раз напоминаю держите эмоции при себе. Ваши сообщения на грани фола. Переход на личности не допустим.
2mefrill вас это тоже касается.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[21]: Граматика С++
От:
Аноним
Дата:
09.08.04 02:28
Оценка:
А>>Выше, Андрей Тарасевич кратко сказал почему грамматика С++ — КС грамматика. WH>Re[3]: Граматика С++
WH>Ну и наконец ко всему этому можно еще обавить еще и такие правила, как требования объявления перед использованием и контроля типов, и получить "грамматику" в супершироком толковании термина (ни о каком КС при этом, разумеется, уже речи быть не может), но мне это кажется уже перебором.
А>>Лаптев, преподаватель в ВУЗе, подтвердил, что языки программирования описываются КС грамматиками. WH>Re: Граматика С++
WH>Ни один из современных языков программирования на практике не описывается контекстно-зависимыми грамматиками, исключительно контестно-свободными (из соображений эффективности,
А>>После этого Вы будете продолжать спорить? WH>Я думаю вам стоит внимательно почитать что они пишут.
Я тоже так думаю. Обратите внимание на кавычки в "грамматика." И вообще, хватит заниматься демагогией. Вы еще не ответили ни на одну просьбу о продукциях и не обьяснили почему мои примеры выводятся грамматикой С++.
Языки не описываются КЗ грамматиками т.к. КС грамматики достаточно для описания языка.
Вот тут все резво бросаются такими терминами, как семантика и синтаксис. Нельзя ли привести их определение? По возможности более формальное.
Я — свихнувшееся сознание Джо.
Re[23]: Граматика С++
От:
Аноним
Дата:
09.08.04 11:44
Оценка:
Вот обьясните мне почему в Страуструпе и в самом стандарте по С++ приводится "какая-то другая грамматика," выражаясь Вашим языком? Что по-вашему должны делать писатели компиляторов — искать "некую целую грамматику С++" с описанием кучи страшных конструкций от которых у Вас шерсть дыбом встает?
Еще раз, КС грамматики используются т.к. их достаточно. Не имеет смысла использовать грамматику которая порождает большое количество языков и затрачивает больше ресурсов для расспознавания если это можно сделать с меньшими затратами. И потом, кто сказал, что объявление переменной должно быть выраженно грамматикой?
ЗЫ. Вы не поверите, но я даже видел описания темплейтов, а расспознаванием деклараций классов занимаются даже в рамках обычного ВУЗа.
Re[15]: Граматика С++
От:
Аноним
Дата:
09.08.04 12:15
Оценка:
SJA>Вот тут все резво бросаются такими терминами, как семантика и синтаксис. Нельзя ли привести их определение? По возможности более формальное.
Во-во... Набежали крутые дядьки и ругаются страшными словами... А на счет лексики, синтаксиса и семантики — это второй класс средней школы...
Итак... Лексика — это множество правильных слов в языке (естественном и языке программирования). В С++ это ключевые слова, правильные переменные (foo, boo, var), знаки препинания (скобки, запятые, точки, стрелки). Описываются регулярной (и самой простой) грамматикой.
Синтаксис — грамматические правила языка (естественного и программирования). Указывают в каком порядке должны идти слова, где должны стоять знаки препинания. В русском языке, например, предложения могут заканчиваться точкой, многоточием, восклицательным и вопросительными знаками. В С++ — точка с запятой. Синтаксис языка описывается КС грамматиками (следущий по сложности уровень).
Для естественных языков приводить пример грамматики лучше на английском т.к. у него грамматика строже чем у русского. Шекспир, разве, что исключение — грамматика у него не к черту.
Например, можно определить английское предложение так.
Такая грамматика породит предложение "boy plays ball.", которое имеет смысл с точки зрения английского языка, но оно также породит предложение "ball plays boy.", которое не имеет смысла. Точно также и с языками программирования. Их грамматики могут могут порождать предложения которые синтаксически верны (как в этом примере), но не имеют смысла (семантики).
Семантика — это значение предложений языка. В отличии от лексики и синтаксиса, которые поддаются формализации (ака формальные грамматики), семантика не может быть описана формально. Это просто неформальные требования вида: "переменная должна быть обьявлена перед использованием," или "тип возвращаяемого значения должен совпадать с типом функции."
Итак, программа может не скомпилироваться по следущим трем причинам (в порядке возврастания "сложности"):
1) Лексической. В программе найдено неверное имя. Пример — 5abcv.
2) Синтаксический. Все слова в программе верны, но их порядок или порядок знаков препинания неверный. Например, statement не заканчивается точкой с запятой или перепутали скобки в функции.
3) Семантической. Программа не имеет смысла хоть и синтаксически верна. Пример:
void f() { return 5; }
Такая функция порождается грамматиками С и С++, но не имеет смысла. В одном месте программист говорит, что функция ничего не возвращает, а в другом месте противоречит себе, возвращая значение. Компилятор не понимает, что хочет сказать программист, и поэтому этот код скомпилирован не будет.
Функция же, приведенная by WolfHound осмысленна, хоть и не делает ничего полезного, и будет скомпилирова. В ней производятся вычисление, которое отбрасывается.
Здравствуйте, <Аноним>, Вы писали:
А>Вот обьясните мне почему в Страуструпе и в самом стандарте по С++ приводится "какая-то другая грамматика," выражаясь Вашим языком? Что по-вашему должны делать писатели компиляторов — искать "некую целую грамматику С++" с описанием кучи страшных конструкций от которых у Вас шерсть дыбом встает?
По тому что задать точную грамматику С++ задача практически не выполнимая. А даже если у кого и получится то понять по ней что к чему будет не реально, а эта книга да и стандарт написаны для того чтобы можно было разобраться в языке С++. Также точная грамматика будет полностью безполезна для разработчиков компиляторов ибо она будет КЗ, а значит экспоненциальное время для распознования, что не приемлемо.
Вот по этому и задали КС грамматику языка который является надмножеством С++ ибо учитывая не формальные правила по ней можно понять что к чему в языке и построить эффектифный компилятор см ниже.
А>Еще раз, КС грамматики используются т.к. их достаточно.
Только если не формально учесть все правила которые были исключены из грамматики для того чтобы сделать ее КС. А>Не имеет смысла использовать грамматику которая порождает большое количество языков
Это как грамматика может порождать несколько языков? А>и затрачивает больше ресурсов для расспознавания если это можно сделать с меньшими затратами.
Как раз распознование по точной грамматике требует огромного колличества ресурсов ибо она КЗ. По этому все пользуются очень простым трюком: Задают КС грамматику порождающею максимально близкое к языку надмножество предложений и используют не формалные правила для отсечения предложений которые не входят в язык. Это трюк позволяет уменьшить время с экспоненциального до полиномиального что дает огромный прирост скорости. А>И потом, кто сказал, что объявление переменной должно быть выраженно грамматикой?
А чем же еще? Если это правило языка то грамматика этого языка должна описывать все его правила.
То что на практике используют описаный выше трюк ни какого отношения к формальному языку не имеет.
А>ЗЫ. Вы не поверите, но я даже видел описания темплейтов, а расспознаванием деклараций классов занимаются даже в рамках обычного ВУЗа.
Полностью формальное? Сильно сомневаюсь.
Скорей всего вы видили тоже самое что представляет собой грамматика С++ из стандарта. Те не точную грамматику для которой необходимы дополнительные не формальные правила.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, <Аноним>, Вы писали:
SJA>>Вот тут все резво бросаются такими терминами, как семантика и синтаксис. Нельзя ли привести их определение? По возможности более формальное. А>Во-во... Набежали крутые дядьки и ругаются страшными словами... А на счет лексики, синтаксиса и семантики — это второй класс средней школы...
Тык где я, а где второй класс ?
А> ..бла бла бла...
Ок. Такая строка будет синтаксически верна ?
int rez = (A < B > C);
Я — свихнувшееся сознание Джо.
Re[17]: Граматика С++
От:
Аноним
Дата:
09.08.04 12:51
Оценка:
SJA>Ок. Такая строка будет синтаксически верна ? SJA>
SJA>int rez = (A < B > C);
SJA>
Yeah.
Re[25]: Граматика С++
От:
Аноним
Дата:
09.08.04 13:09
Оценка:
Ну Вам не угодить, сударь. Грамматика, по которой я вывел функцию — "неточная." В стандарте С++ грамматика тоже "неточная" ибо вывести "точную грамматику задача практически невыполнимая, а даже если у кого и получится, то понять что к чему по ней будет нереально." По какой же грамматике пишут компилятор в Майкрософте? Только чур не говорить, что пишут по грамматике из стандарта ибо она опять не нравится вам ниже...
WH>Полностью формальное? Сильно сомневаюсь.
Грамматика описывает синтаксис и является полным формальным аппаратом.
WH>Скорей всего вы видили тоже самое что представляет собой грамматика С++ из стандарта. Те не точную грамматику для которой необходимы дополнительные не формальные правила.
Ах! Неужели мы опять возвращаемся к стандарту где дана "неточная" грамматика?!! Сколько это еще будет продолжаться?
А вообще, представьте, что было бы если в России одному метру соответствовала бы одна длина, в другой стране другая и т.д. Вот здорово бы было!
SJA>Вот тут все резво бросаются такими терминами, как семантика и синтаксис. Нельзя ли привести их определение? По возможности более формальное.
В курсе математической логики есть понятие языка. В простейшем случае, (так называемые языки первого опорядка), язык определяется как множество констант и переменных, которые могут при этом принадлежать разным сортам (читай типам). А также, построенное из них множество выражений. Выражения строятся согласно формулам, причем индуктивно. Применительно к си++, правила потроения выражений это операции, применяемые к выражениям. Для данного языка можно определить реализацию или модель. Модель это множество объектов с отношениями между ними. Т.е. из данного множества посредством отношений выделяются некоторые подмножества, это и есть объекты — классы в си++. Экземпляр класса — элемент множества.
Строится отображение из множества констант и переменных в данную модель. Причем, опять же индуктивно, а именно, сначала определяются отбражения между константами и переменными с одной строны и элементами модели с другой. Потом, на основании синтаксических правил строится отображение выражений в некоторое подмножество модели. Построенное отображение и определяет семантику выражений языка. Синтаксически верные предложения языка отображаются в некоторые подмножества модели (эти подмножества и есть смыслы выражения) и, таким образом, определяется смысл языковых конструкций.
Применительно к языку си++, можно сказать, что стандарт языка определяет его синтаксис (грамматикой и на английском языке), т.е. множество синтаксически корректных программ. Любой же компилятор языка си++ и есть его семантическая модель. Напиример, типу int соответсвует некоторое множество чисел, каждой константе некоторое число и т.д. Поэтому, в стандарте языка си++ есть также некоторое описание семантики, т.е. ограничений, которым должны удовлетворять подмножества языка, например, касательно диапазона того же типа int.
То же самое и относительно русского языка, только его самая известная модель это весь наш мир как реальный, так и мыслимый. Можно скзать, что модель для русского языка это множество понятий, которыми оперируют люди, которые на этом языке разговаривают. Язык называется формальным, если каждому предложению языка соответствует только один элемент модели или одно множество, т.е. отображение из языка в модель однозначное. Языки программирвоания типа си или паскаль являются формальными, а вот русский язык нет. Например, выражению бить баклуши соответствуют два различных понятия — элемента множества понятий: ничего не делать, сланяться или делать топором специальные дощечки. Налицо семантическая неоднозначность и разрешить ее мы можем только из смысла предыдущих или последующих предложений. В языках программирования также есть такие неоднозначности, в си++ их много. Все здесь зависит от сложности языка, которая определяется как множество пардигм, которые данный язык выражает. Так число синтксических конструкций объективно ограниченно способностями человека, то приходится "перегружать" синтаксические конструкции так, чтобы они имели разные смысла в разных контекстах.
Здравствуйте, <Аноним>, Вы писали:
А>Такая функция порождается грамматиками С и С++, но не имеет смысла.
Грамматику С++ в студию я ее еще не видел. А>В одном месте программист говорит, что функция ничего не возвращает, а в другом месте противоречит себе, возвращая значение. Компилятор не понимает, что хочет сказать программист, и поэтому этот код скомпилирован не будет.
Компилятор не обладает искуственным интелектом. Он может только сказать программа 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 следовательно не является предложением языка С++ и не может быть порождена грамматикой С++.
Читайте мои обьяснения про множества. Вы путаете, то что принимает компилятор со множеством всех строк, что порождает грамматика.
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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
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;
всё компилируется.
Как то странно узнать, что КС граматика зависит от контекста....
Или может разработчики компиляторов — не показатель ?
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) А. Эйнштейн
В данном случае используется тот факт, что в круглых скобках может быть только выражение. И поэтому, когда компилятор находит токен '(', то начинает строить в дереве разбора выражение, начинающиеся со скобок. Потом встречает "A < B >" — выводит тип и идет дальше и входит в единственную синтаксически правильную конструкцию с типом — преоразования в стиле си. Поэтому он ждет ")", ее нет, отсюда и сообщение об ошибке. Дальше непродекларированный идентификатор С. Выдается ошибка, токен С пропускается и встречается ")". Выражение в скобках (A < B >); (если не считать пропущенного С) верное, это преобразование типа. Поэтому идет дальше и находит конец выражения. Сигналит об ошибке, эта ошибка выводится в контексте компилятора, а он сейчас анализирует выражение в круглых скобках, вот и выдается третье сообщение. Потом, по тупому пытается таки преобразовать из целого (! видимо, тип по умолчанию для выражения) и находит несоответствие типа (интересно, а если поставить в класс А конструктор с целым типом, что шестая студия скажет?), а потом откатывает до предыдущего предложения, т.е. поросту пропускает данную строку. Седьмой компилятор умнее, при невалидном выражении он откатывает сразу. И, конечно, нормально сделанный компилятор комеа говорит о причине ошибки.
SJA>VC++7.0: SJA>
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>В данном случае вы спорите не со мной, а со стандартом языка С++.
Да ну! Это уж в стандарте и не точная?!! Вы так и не ответили по какой грамматике пишут компиляторы профессионалы!
Демагогию о точности и неточности разводите Вы! Вы даже ни одного предложения не попробовали вывести! Ни разу не составляли своей грамматики! Какой с вами может быть разговор?
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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, <Аноним>, Вы писали:
А>Да ну! Это уж в стандарте и не точная?!!
Вы читать умеете? А быть может вы просто английский не знаете? Так и быть поработаю переводчиком
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]: Граматика С++
Как раз распознование по точной грамматике требует огромного колличества ресурсов ибо она КЗ. По этому все пользуются очень простым трюком: Задают КС грамматику порождающею максимально близкое к языку надмножество предложений и используют не формалные правила для отсечения предложений которые не входят в язык. Это трюк позволяет уменьшить время с экспоненциального до полиномиального что дает огромный прирост скорости.
А в качестве этой не точной КС грамматики каждый использует ту грамматику которая ему удобней.
А>Вы даже ни одного предложения не попробовали вывести!
Для того чтобы что-то выводить нужна грамматика. Грамматику С++ вы так и не привели. А>Ни разу не составляли своей грамматики!
Вы уверены? Хотя если вы про точную грамматику С++ то и не собираюсь. А>Какой с вами может быть разговор?
Еще одна попытка перехода на личности и у меня закончится терпение.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, 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" вынесено в отдельную категорию? Что в нем такого особенного? Или авторы текста просто не знакомы с формальной теорией?..
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 в данном предложении?
Здравствуйте, 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 программы) ...
Здравствуйте, 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.
Здравствуйте, WeCom, Вы писали:
WC>Это утверждение согласуется с тем, что множество всех well-formed программ на языке С++ не одно и то же что и множество всех (синтаксических) предложений языка С++.
Согласен. Я не много погорячился. Понятие well-formed program несколько шире чем я тут имел в виду и включает в себя также некоторые требования времени выполнения. Но в данной теме мы эти правила не рассамтриваем.
Что касается ODR то кто сказал что предложение языка С++ состоит только из одной единицы трансляции?
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WeCom, Вы писали:
WC>Имхо негоже модератору так часто обвинять других в демагогии, попутно занимаясь ей же (касаемо вопроса wellformed программы) ...
1)Где тут демагогия? Тут только ссылка на стандарт.
2)Это я писал не как модератор, а как посетитель форума.
3)А вот это уже слова модератора: Обсуждать действия модератора можно только тут moderator@rsdn.ru если у вас есть претензии то пишите туда. Все дальнейшие попытки обсуждать модератора в публичном форуме будут пресекаться.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, 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).
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.”
Здравствуйте, <Аноним>, Вы писали:
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>>В данном случае вы спорите не со мной, а со стандартом языка С++. А>Да ну! Это уж в стандарте и не точная?!! Вы так и не ответили по какой грамматике пишут компиляторы профессионалы!
Здравствуйте, Sergey J. A., Вы писали:
SJA>Здравствуйте, mefrill, Вы писали:
SJA>Так собственно вопрос в том, синтаксическая это ошибка или семантическая ?
А это зависит от того, что вы понимаете под синтаксисом и семантикой.
Прошу позволения ссылаться на стандарт С (ISO 9899-1999). — Имхо сути спора это не меняет ни на грамм, но зато в этом документе намного более четко разделены правила относящиеся к синтаксису и к семантике (он как бы несколько позже вышел чем стандарт C++).
M>А что такое the syntax rules и diagnosable semantic rules в данном предложении?
diagnosable rules — все правила за исключением тех о которых стандарт говорит "диагностики не требуется" (со стороны компилятора имхо), а также тех для которых имеет место быть "неопределенное поведение".
Стандарт обязывает также компилятор при нарушении такого правила выдать соответствующее диагностирующее сообщение (хотя бы одно если правил нарушено сразу несколько).
syntax rules — правила определяющие синтаксис языка, в стандарте C в синтаксис секции присутствуют
исключительно правила порождающей грамматики, кроме того присутствиет далее секция constraint.
Сам стандарт определяет constraint, как restriction, either syntactic or semantic, by which the exposition of language elements is to be interpreted.
имхо под syntax rules — подразумеваются или правила порождающей грамматики в явном виде или правила заданные неформально, но которые возможно выразить в правилами грамматики
semantic rules — правила поведения абстрактной машины (интерпретации и выполнения программы)
semantic constraints — ограничения на предложения языка, для которых соответственно будут определены (иметь смысл) semantic rules
Здравствуйте, Шахтер, Вы писали:
SJA>>Так собственно вопрос в том, синтаксическая это ошибка или семантическая ?
Ш>А это зависит от того, что вы понимаете под синтаксисом и семантикой.
Прикольно.... Я думал есть некоторое формальное определение ситаксиса и семантики...
Так может мне пояснят, как эту границу провести ?
А то я могу сказать, что С++ задаётся регулярной (если я правильно употребляю слово) граматикой вида
program ::= .* [в смысле сколько угодно каких угодно символов]
Здравствуйте, Шахтер, Вы писали:
Ш>Здравствуйте, 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.”
Замечательно, но таки не дает полной ясности, что считать синтаксическими, а что семантическими правилами. поэтому я и спросил. Очевидно, что требовать таких определений от стандарта нельзя, он описывает язык си++, а не теорию формальных языков и различия между семантикой и синтаксисом. Поэтому, для большей ясности, ниже я просто приведу примеры определений языков, порождаемых грамматикой Хомского, из различных (широко известных) книжек.
Гладкий А. В. "Формальные грамматики и языки". стр. 28 Множество предложений, состоящих из терминальных символов грамматики и выводимых из ее стартового символа, называется языком, порожденным грамматикой G и обозначается L(G)
Ахо А., Ульман Дж. "Теория синтаксического анализа, перевода и компиляции", стр. 106. Язык, порождаемый грамматикой G, это множество терминальных цепочек (предложений языка), порождаемых грамматикой G.
Можно определить еще, что такое терминальные цепочки, порождаемые данной грамматикой, но это, мне кажется, после столь долгих обсуждений всем и так ясно.
Сейчас я буду писать утверждения и пронумеровывать их. Если кто-то не будет согласен с каим-либо выводом, то просьба возразить по существу, т.е. указать номер утверждения, где я допустил ошибку:
(1) Итак, применительно к си++, что есть язык си++? ответ: это множество текстов программ, являющихся корректными по стандарту языка.
(2) Если есть порождающая грамматика языка си++, то что есть язык, порождаемый данной грамматикой? Ответ: согласно (1), множество текстов программ, корректных по стандарту языка си++.
(3) Приведенная в стандарте грамматика порождает множество корректных программ на языке си++? Ответ: да, но порождает также некорректные по стандарту тексты программ (примеры обильно были приведены выше).
(4) Какой язык определяет грамматика из стандарта? Ответ: язык, во множество терминальных цепочек которого входят корректные по стандарту тексты программ, но входят также и некорректные. Следовательно, грамматика определяет не язык си++, а некий язык, включающий корректные тексты программ языка си++.
Вот, в принципе, и все. Мне кажется, все предельно ясно. А разговоры про стандарт и выдержки из него затеян, мне кажется, напрасно.
Здравствуйте, Шахтер, Вы писали:
Ш>Здравствуйте, Sergey J. A., Вы писали:
SJA>>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ? SJA>>Мне кажется, что да, и пример — x(); неясно вызов это функции x или создание объекта типа x. Но я не уверен...
Ш>На самом деле, язык C++ не может быть задан даже контекстно-зависимой грамматикой. Дело в том, что есть такая штука, как метапрограммирование. Известно, что средства метапрограммирования вычислительно полны по Тьюрингу. Это значит, что любая распознающая машинка языка C++ должна быть вычислительно полна по Тьюрингу (мы сейчас отвлекаемся от того обстоятельства, что в реальных компиляторах есть ограничение на уровень вложенности инстантинации шаблонов). В соответсвтии с известными теоремами из теории формальных грамматик Хомского, для задания C++ недостаточно грамматики типа 1. Т.е. C++ не является даже КЗ языком.
Очень интересно, а нельзя ли ссылочку на доказательсво? Мне просто интересно, как это доказать можно.
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, <Аноним>, Вы писали:
А>>Да ну! Это уж в стандарте и не точная?!! WH>Вы читать умеете? А быть может вы просто английский не знаете? Так и быть поработаю переводчиком WH>[q] WH>... WH>This summary of C++ syntax is intended to be an aid to comprehension. WH>Это краткое описание синтаксиса С++ предназначено для помощи в понимании. WH>It is not an exact statement of the language. WH>Это не точное определение языка WH>In particular, the grammar described here accepts a superset of valid C++ constructs. WH>В частности представленная здесь грамматика допускает надмножество допустимых конструкций С++. WH>...
Нда... А почему не хватило сил на точки? Ведь получили же цитату выдраную из контекста
Продолжаем:
Disambiquation rules (6.8, 7.1, 10.2) must be applied to distinguish expressions from declarations.
Правила разрешения неоднозначностей должны быть применены для различения выражений и деклараций.
//Так может только в этом и только в этом то все и дело, а?
Futher, access control, ambiquity, and type rules must be used to weed out sintactically valid but meaningless constructs.
Далее, правила контроля доступа, неоднозначностей и типов должны быть применены для искоренения синтаксически корректных, но бессмысленных конструкцй.
Если мы теперь посмотрим на указанные правила, то легко увидим, какие такие конструкции программы будут синтаксически верными, но бессмысленными и убедимся, что то что аноним нас не обманывал.
Очевидно, эти синтаксически верные примеры ни один компилятор, соответствующий стандарту, не пропустит.
Кстати, насчет того что стандарт описывает грамматику ненормативной. Так принято делать, чтобы было формально только одно место имеющее доказательную силу, хотя бы чтобы избавиться от случайных проблем в несоответствии (описка) двух описаний. В стандарте С, кстати, никакой оговорки о том что грамматика описывает надмножество языка нет. Раздел с грамматикой все равно ненормативный, хотя слово в слово (и со ссылками даже) повторяет те же правила которые встречаются в тексте стандарта и которые являются формальным определением синтаксиса языка.
Здравствуйте, Sergey J. A., Вы писали:
SJA>Здравствуйте, Шахтер, Вы писали:
SJA>>>Так собственно вопрос в том, синтаксическая это ошибка или семантическая ?
Ш>>А это зависит от того, что вы понимаете под синтаксисом и семантикой.
SJA>Прикольно.... Я думал есть некоторое формальное определение ситаксиса и семантики... SJA>Так может мне пояснят, как эту границу провести ?
SJA>А то я могу сказать, что С++ задаётся регулярной (если я правильно употребляю слово) граматикой вида SJA>program ::= .* [в смысле сколько угодно каких угодно символов]
SJA>А всё остальное — семантика...
Когда мы говорим о контексно-зависимых и контекстно-свободных языках, то под грамматикой имеем ввиду порождающую грамматику Хомского. Ведь эти термины пришли оттуда. А под семантикой мы понимаем некоторую интерпретацию текта языка. Эта интерпретация может налагать ограничения на некоторые, синтаксически верные, части текстов программ, делая их бессмысленными и, таким образом, сужать сам язык. Конечно, в этом случае, мы не можем говорить, что полученный в результате язык определяется грамматикой — на самом деле он определяется грамматикой + семантикой. Точно так и есть в случае си++. Правило предварительного объявления имен в стандарте рассматривается как семантическое и делает не имееющими семантики программы с использованием имен, которые не были предварительно объявлены. Все приведенное выше говорит только о том, что грамматика вообще и попрождающая грамматика Хомского в частности, не единственный способ определения языка, есть и другие.
Но напомню, исходный вопрос звучал так: определяется ли язык си++ КС-грамматикой? Ответ однозначный — нет, не определяется. Язык си++ определяется КС-грамматикой + описанной в стандарте семанттикой.
Мне кажется, что мы вроже бы наконец прояснили ситуацию.
Здравствуйте, WolfHound, Вы писали:
WC>>Имхо негоже модератору так часто обвинять других в демагогии, попутно занимаясь ей же (касаемо вопроса wellformed программы) ... WH>1)Где тут демагогия? Тут только ссылка на стандарт.
ДЕМАГОГИЯ, и, ж.
2. Рассуждения или требования, основанные на грубо одностороннем истолковании чегон.
Неполное цитирование меняющее контекст и следовательно точный смысл цитаты подпадает под это определение, так что ...
Обсуждение действий модератора удалено. Все вопросы на moderator@rsdn.ru
WolfHound
Исходный вопрос был: существует ли КС-грамматика, определяющая язык си++? Не КС-грамматика + семантические правила, а ТОЛЬКО КС-грамматика.
Ответ: нет, не существует. И стандарт, к сожалению здесь не поможет ответить. Ведь в нем синтаксис + семантика приведен. А вот проблема: есть ли КС-грамматика, без всяких семантических правил определяющая язык си++, решаема, что и было доказано выше.
Здравствуйте, mefrill, Вы писали:
M>Но напомню, исходный вопрос звучал так: определяется ли язык си++ КС-грамматикой? Ответ однозначный — нет, не определяется. Язык си++ определяется КС-грамматикой + описанной в стандарте семанттикой.
Вопрос:
Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ?
И ответ:
Нет, грамматка языка С++, как это принято в теории трансляции, является контекстно свободной. При этом следует отметить, что грамматика — это еще не полное определение языка. Язык определяется КС-грамматикой + описанной в стандарте семанттикой + описанными в стандарте синтаксическими ограничениями, которые формально в грамматике не присутствуют.
M>Мне кажется, что мы вроже бы наконец прояснили ситуацию.
Различия имхо тольк в церквях
Здравствуйте, WeCom, Вы писали:
WC>Здравствуйте, mefrill, Вы писали:
M>>Но напомню, исходный вопрос звучал так: определяется ли язык си++ КС-грамматикой? Ответ однозначный — нет, не определяется. Язык си++ определяется КС-грамматикой + описанной в стандарте семанттикой.
WC>Вопрос: WC>
WC>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ?
Прстеньких примеров, к сожалению нет. Выше я приводил один и глубоко сомваюсь, что кто-нибудь дал себе труд в нем разобраться.
Кроме того, вопрос был: является ли грамматика си++ КС? Почему же я должен отвечать на другой вопрос о том, является ли она КЗ? Какое это к первому вопросу имеет отношение? Если такое отношение есть, то приведите его, только четко и ясно.
WC>И ответ: WC>Нет, грамматка языка С++, как это принято в теории трансляции,
не понимаю термина теории трансляции. нет такого термина, прошу Вас выражаться яснее. Какую теорию Вы подразумеваете? Формальных языков, синтаксического анализа или перевода? И приведите мне ссылку на определение.
является контекстно свободной. При этом следует отметить, что грамматика — это еще не полное определение языка.
Еще раз, вопрос звучал так: Существует ли КС-грамматика определяющая язык си++. Что такое "определяющая" я показал выше дав поределения из двух классических книг по теории формальных языков и теории компиляции. В вопросе нет ничего про семантику и еще что-то. Только КС-грамматика. Пожалуйста, дайте ответ на этот вопрос.
Язык определяется КС-грамматикой + описанной в стандарте семанттикой + описанными в стандарте синтаксическими ограничениями, которые формально в грамматике не присутствуют.
M>>Мне кажется, что мы вроже бы наконец прояснили ситуацию. WC>Различия имхо тольк в церквях
Вот это я совсем не понял. В каких церквях и какие различия?
Здравствуйте, mefrill, Вы писали:
M>Очень интересно, а нельзя ли ссылочку на доказательсво? Мне просто интересно, как это доказать можно. Шаблоны C++ и полнота по Тьюрингу.
Здравствуйте, WeCom, Вы писали:
WC>Неполное цитирование меняющее контекст и следовательно точный смысл цитаты подпадает под это определение, так что ...
Аноним делал выводы на основе не точной грамматики о чем собственно и сказано в цитате.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, mefrill, Вы писали:
WC>>Вопрос: WC>>
WC>>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ?
M>Прстеньких примеров, к сожалению нет. Выше я приводил один и глубоко сомваюсь, что кто-нибудь дал себе труд в нем разобраться.
M>Кроме того, вопрос был: является ли грамматика си++ КС? Почему же я должен отвечать на другой вопрос о том, является ли она КЗ? Какое это к первому вопросу имеет отношение? Если такое отношение есть, то приведите его, только четко и ясно.
Или я совсем уже туплю (но ведь из первого, самого первого сообщения этой темы цитату взял ) или Вы вопрос сами себе придумали, а теперь почему то возмущаетесь. Вы решили подвести итог. Указали, какой был вопрос обсуждаемой темы и дали на него свой ответ. Я Вас поправил с вопросом и соответственно ответом, причем не вступив в противоречие с ответом Вашим...
WC>>И ответ: WC>>Нет, грамматка языка С++, как это принято в теории трансляции,
M>не понимаю термина теории трансляции. нет такого термина, прошу Вас выражаться яснее. Какую теорию Вы подразумеваете? Формальных языков, синтаксического анализа или перевода? И приведите мне ссылку на определение.
А вот это уже хуже ... STFW
M>является контекстно свободной. При этом следует отметить, что грамматика — это еще не полное определение языка.
M>Еще раз, вопрос звучал так: Существует ли КС-грамматика определяющая язык си++.
Хорошо давайте возмем этот вопрос, если Вы так настаиваете.
M>Пожалуйста, дайте ответ на этот вопрос.
Синтаксис языка программирования С++ определяется контекстно-свободной грамматикой. Никакой другой грамматики якобы определяющей данный язык — нет. Поэтому на Ваш вопрос ответ также — нет. Ответ на ваш вопрос также — нет и если принять то понятие "определяющий", которым Вы оперируете. Но этот ответ имеет не более, чем академическую ценность.
M>>>Мне кажется, что мы вроже бы наконец прояснили ситуацию. WC>>Различия имхо только в церквях M>Вот это я совсем не понял. В каких церквях и какие различия?
Один — теоретик, другой — практик. И ортогонально: Один — ортодокс, другой — сектант. Надеюсь без обид
Здравствуйте, WolfHound, Вы писали:
WC>>Неполное цитирование меняющее контекст и следовательно точный смысл цитаты подпадает под это определение, так что ... WH>Аноним делал выводы на основе не точной грамматики о чем собственно и сказано в цитате.
Твоя фраза свидетельствует о непонимани цитаты и недостаточного знакомства с формальными грамматиками и теорией трансляции/компиляции/перевода.
Здравствуйте, WeCom, Вы писали:
WC>Здравствуйте, mefrill, Вы писали:
WC>>>Вопрос: WC>>>
WC>>>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ?
M>>Прстеньких примеров, к сожалению нет. Выше я приводил один и глубоко сомваюсь, что кто-нибудь дал себе труд в нем разобраться.
M>>Кроме того, вопрос был: является ли грамматика си++ КС? Почему же я должен отвечать на другой вопрос о том, является ли она КЗ? Какое это к первому вопросу имеет отношение? Если такое отношение есть, то приведите его, только четко и ясно.
WC>Или я совсем уже туплю (но ведь из первого, самого первого сообщения этой темы цитату взял ) или Вы вопрос сами себе придумали, а теперь почему то возмущаетесь. Вы решили подвести итог. Указали, какой был вопрос обсуждаемой темы и дали на него свой ответ. Я Вас поправил с вопросом и соответственно ответом, причем не вступив в противоречие с ответом Вашим...
Нет, как это было уточнено позже самим автором вопроса, он значил: может ли язык си++ быть определен посредством КС-грамматики или для его определени требуется грамматика большей выразительной мощности, а именно КЗ. Посмотрите всю ветвь т сразу станет ясно, что дисскусия велась именно об этом.
WC>>>И ответ: WC>>>Нет, грамматка языка С++, как это принято в теории трансляции,
M>>не понимаю термина теории трансляции. нет такого термина, прошу Вас выражаться яснее. Какую теорию Вы подразумеваете? Формальных языков, синтаксического анализа или перевода? И приведите мне ссылку на определение.
WC>А вот это уже хуже ... WC>STFW
Ну, как всегда, искажение великого и могучего... Из той-же оперы, что и диллеры и лизинги. В классическом переводе Агафонова книги Ахо и Ульмана, в первом томе, есть такое понятие как теория ПЕРЕВОДА, другой термин применять нехорошо, как неустоявшийся.
M>>является контекстно свободной. При этом следует отметить, что грамматика — это еще не полное определение языка.
M>>Еще раз, вопрос звучал так: Существует ли КС-грамматика определяющая язык си++. WC>Хорошо давайте возмем этот вопрос, если Вы так настаиваете.
M>>Пожалуйста, дайте ответ на этот вопрос. WC>Синтаксис языка программирования С++ определяется контекстно-свободной грамматикой. Никакой другой грамматики якобы определяющей данный язык — нет. Поэтому на Ваш вопрос ответ также — нет. Ответ на ваш вопрос также — нет и если принять то понятие "определяющий", которым Вы оперируете. Но этот ответ имеет не более, чем академическую ценность.
Т.е. нет — не существует? Полностью с этим согласен. Если Вы имели ввиду нечто другое, то пожалуйста напишите. И давайте определимся с терминов грамматика, ОПРЕДЕЛЯЮЩАЯ язык. Что это значит? Я привел определение из известных учебников, это значит, что данный язык есть множество всех предложений, выводимых данной грамматикой, не большеи не меньше. С этим будете спорить?
КС-грамматика, определенная в стандарте, позволяет вывести множество программ, не являющихся корректными. Потом на них налагают дополнительные ограничения. но это к нашему разговору не относится. Мы ведь говорим ТОЛЬКО о грамматике?
M>>>>Мне кажется, что мы вроже бы наконец прояснили ситуацию. WC>>>Различия имхо только в церквях M>>Вот это я совсем не понял. В каких церквях и какие различия? WC>Один — теоретик, другой — практик. И ортогонально: Один — ортодокс, другой — сектант. Надеюсь без обид
Ну зачем так? Я как раз и есть тот практик и профессионал ( ) о котором говорил аноним. Кроме фронт-енд компиляторов я разрабатывал еще и генератор синтаксических анализаторов и парсер регулярных выражений. Поэтому, обвинять меня в теоретизировании несправедливо.
Re[30]: Граматика С++
От:
Аноним
Дата:
10.08.04 06:12
Оценка:
Большое Вам спасибо, товарищ, за поддержку! Очень приятно видеть здесь лицо, которое не просто заучило синтаксис а понимает, что происходит на самом деле!
Жаль, что не имею возможности дать Вам плюсы за ответ.
WC>Нда... А почему не хватило сил на точки? Ведь получили же цитату выдраную из контекста WC>Продолжаем: WC>Disambiquation rules (6.8, 7.1, 10.2) must be applied to distinguish expressions from declarations. WC>Правила разрешения неоднозначностей должны быть применены для различения выражений и деклараций. WC>//Так может только в этом и только в этом то все и дело, а? WC>Futher, access control, ambiquity, and type rules must be used to weed out sintactically valid but meaningless constructs. WC>Далее, правила контроля доступа, неоднозначностей и типов должны быть применены для искоренения синтаксически корректных, но бессмысленных конструкцй.
Супер! Я это и говорил им, но не хотелось перерывать техническую литературу.
WC>Если мы теперь посмотрим на указанные правила, то легко увидим, какие такие конструкции программы будут синтаксически верными, но бессмысленными и убедимся, что то что аноним нас не обманывал.
Благодарю! Я уж было хотел обратиться к Александреску по поводу этого топика, так он меня достал.
WC>access control: WC>
WC>Очевидно, эти синтаксически верные примеры ни один компилятор, соответствующий стандарту, не пропустит.
WC>Кстати, насчет того что стандарт описывает грамматику ненормативной. Так принято делать, чтобы было формально только одно место имеющее доказательную силу, хотя бы чтобы избавиться от случайных проблем в несоответствии (описка) двух описаний. В стандарте С, кстати, никакой оговорки о том что грамматика описывает надмножество языка нет. Раздел с грамматикой все равно ненормативный, хотя слово в слово (и со ссылками даже) повторяет те же правила которые встречаются в тексте стандарта и которые являются формальным определением синтаксиса языка.
WC>Надеюсь, сказал достаточно.
Re[32]: Граматика С++
От:
Аноним
Дата:
10.08.04 06:18
Оценка:
WH>>Аноним делал выводы на основе не точной грамматики о чем собственно и сказано в цитате.
WC>Твоя фраза свидетельствует о непонимани цитаты и недостаточного знакомства с формальными грамматиками и теорией трансляции/компиляции/перевода.
Поддерживаю.
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, mefrill, Вы писали:
M>>Очень интересно, а нельзя ли ссылочку на доказательсво? Мне просто интересно, как это доказать можно. WH>Шаблоны C++ и полнота по Тьюрингу.
Мне кажется, что там говорилось немного о другом, а именно, о выразительной мощи языка, а не о мощи определяющей его грамматики. А это, мне кажется, разные вещи. Вот например, скриптовые языки, в принципе, можно определить КС-грамматикой, выразительная мощность его та же, что и машины Тьюринга. Конечно, с некоторыми ограничениями, связанными с объемом памяти реальной машины. Иначе, реализация любого языка программирования эквивалентен линейно ограниченному автомату.
Тогда я так понимаю, взяв граматику С++ из стандарта, я могу запихнуть её с небольшими преобразованиями в Bison, и получу парсер синтаксических конструкций, который свернёт любую синтаксически верную программу в translation-unit ?
Или Bison тут почему-либо не прокатит ?
Я — свихнувшееся сознание Джо.
Re[19]: Граматика С++
От:
Аноним
Дата:
10.08.04 06:40
Оценка:
SJA>>>Ок. Такая строка будет синтаксически верна ? SJA>>>
SJA>>>int rez = (A < B > C);
SJA>>>
А>>Yeah. WH>Без знания того что такое A, B, C ни чего сказать нельзя.
Нет. Ответ неправильный т.к. мы можем построить дерево вывода. Есть продукция для инициализации при декларации, есть продукция для relational expression в которой используются идентификаторы и есть продукции, которые описывают эти самые идентификаторы.
Re[25]: Граматика С++
От:
Аноним
Дата:
10.08.04 06:53
Оценка:
Здравствуйте, WeCom, Вы писали:
WC>Здравствуйте, mefrill, Вы писали:
M>>Но напомню, исходный вопрос звучал так: определяется ли язык си++ КС-грамматикой? Ответ однозначный — нет, не определяется. Язык си++ определяется КС-грамматикой + описанной в стандарте семанттикой.
WC>Вопрос: WC>
WC>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ?
Я ответа на этот вопрос пытался добиться в куче постов. И от М. и от ВХ. Молчат как партизаны.
WC>И ответ: WC>Нет, грамматка языка С++, как это принято в теории трансляции, является контекстно свободной. При этом следует отметить, что грамматика — это еще не полное определение языка. Язык определяется КС-грамматикой + описанной в стандарте семанттикой + описанными в стандарте синтаксическими ограничениями, которые формально в грамматике не присутствуют.
Re[26]: Граматика С++
От:
Аноним
Дата:
10.08.04 07:01
Оценка:
WC>>Вопрос: WC>>
WC>>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ?
M>Прстеньких примеров, к сожалению нет. Выше я приводил один и глубоко сомваюсь, что кто-нибудь дал себе труд в нем разобраться.
Вообще никаких примеров нет т.к. грамматика С++ — КС, а разбираться в какой-то левой КЗ грамматике никому не хочется.
M>Кроме того, вопрос был: является ли грамматика си++ КС? Почему же я должен отвечать на другой вопрос о том, является ли она КЗ? Какое это к первому вопросу имеет отношение? Если такое отношение есть, то приведите его, только четко и ясно.
Вы утверждаете, что грамматика С++ КЗ, вот мы и просим подтверждений, а до тех пор, пока подтверждения не будут предоставлены будем считать, что грамматика С++ КС.
Re[28]: Граматика С++
От:
Аноним
Дата:
10.08.04 07:07
Оценка:
M>Нет, как это было уточнено позже самим автором вопроса, он значил: может ли язык си++ быть определен посредством КС-грамматики или для его определени требуется грамматика большей выразительной мощности, а именно КЗ. Посмотрите всю ветвь т сразу станет ясно, что дисскусия велась именно об этом.
Нет. Это Вы свернули вопрос в эту плоскость. Автор же вообще не представляет, что такое КС, КЗ и "выразительная мощность." Не в обиду ему.
Кстати, я тоже не представляю, что имеется в виду под "выразительной мощностью."
M>Ну зачем так? Я как раз и есть тот практик и профессионал ( ) о котором говорил аноним. Кроме фронт-енд компиляторов я разрабатывал еще и генератор синтаксических анализаторов и парсер регулярных выражений. Поэтому, обвинять меня в теоретизировании несправедливо.
Надеюсь это все делалось не через КЗ грамматики?
Re[19]: Граматика С++
От:
Аноним
Дата:
10.08.04 07:14
Оценка:
SJA>Как то странно узнать, что КС граматика зависит от контекста.... SJA>Или может разработчики компиляторов — не показатель ?
Купи эти книжки: здесь и здесь. Не имеет смысла задавать вопросов не зная основ.
Ну давайте попробуем найти в каком конкретно месте Вы нас "обманываете".
M>Гладкий А. В. "Формальные грамматики и языки". стр. 28 Множество предложений, состоящих из терминальных символов грамматики и выводимых из ее стартового символа, называется языком, порожденным грамматикой G и обозначается L(G)
M>Ахо А., Ульман Дж. "Теория синтаксического анализа, перевода и компиляции", стр. 106. Язык, порождаемый грамматикой G, это множество терминальных цепочек (предложений языка), порождаемых грамматикой G.
Это бесспорно. Единственное, что здесь разговор идет не о языке программировании, а о формальном языке, прошу обратить на это внимание.
M>(1) Итак, применительно к си++, что есть язык си++? ответ: это множество текстов программ, являющихся корректными по стандарту языка.
Нет, это неверно.
Есть язык программирования C++. Язык программирования C++ определяется:
-правилами представления программ;
-синтаксисом и ограничениями;
-семантическими правилами для интерпретации программ;
-правилами представления входных/выходных данных программ;
...
M>(2) Если есть порождающая грамматика языка си++, то что есть язык, порождаемый данной грамматикой? Ответ: согласно (1), множество текстов программ, корректных по стандарту языка си++.
Согласно 1 ответ должен звучать так: множество синтаксически верных текстов программ.
M>(3) Приведенная в стандарте грамматика порождает множество корректных программ на языке си++? Ответ: да, но порождает также некорректные по стандарту тексты программ (примеры обильно были приведены выше).
А вот здесь Вы правы частично. Грамматика С++ действительно порождает некоторые синтаксически некорректные программы. Но не по той причине, что Вы указываете и примеры Вы приводили не верные.
M>(4) Какой язык определяет грамматика из стандарта? Ответ: язык, во множество терминальных цепочек которого входят корректные по стандарту тексты программ, но входят также и некорректные. Следовательно, грамматика определяет не язык си++, а некий язык, включающий корректные тексты программ языка си++.
Ответ: язык, во множество терминальных цепочек которого входят все синтаксически верные по стандарту тексты программ, но входят также и неверные. Но опять же не по той причине, что Вы указываете.
M>Вот, в принципе, и все. Мне кажется, все предельно ясно. А разговоры про стандарт и выдержки из него затеян, мне кажется, напрасно.
5 баллов!
А что мы здесь обсуждаем? Теорию формальных языков или язык программирования С++? Если стандарт говорит, что грамматика языка определяет его СИНТАКСИС, но синтаксис — это не весь язык, то почему мы должны этому "не верить"??? Вот поэтому я, кстати, и говорю, что Вы занимаетесь здесь теоретизированием и можете быть признаны правыми, НО только с академической точки зрения, потому что рассуждаете не о языке программирования С++, определенном в соответсвующем стандарте со всем его синтаксисом, ограничениями и семантикой, а о формальном языке совпадающем с множеством всех wellformed программ языка С++.
Здравствуйте, mefrill, Вы писали:
M>>>не понимаю термина теории трансляции. нет такого термина, прошу Вас выражаться яснее. Какую теорию Вы подразумеваете? Формальных языков, синтаксического анализа или перевода? И приведите мне ссылку на определение.
WC>>А вот это уже хуже ... WC>>STFW
M>Ну, как всегда, искажение великого и могучего... Из той-же оперы, что и диллеры и лизинги. В классическом переводе Агафонова книги Ахо и Ульмана, в первом томе, есть такое понятие как теория ПЕРЕВОДА, другой термин применять нехорошо, как неустоявшийся.
Извините, но это ВЫ определили, что термин неустоявшийся или Ваша научная секта? Вот у меня сложилось обратное впечатление, что термин "теория перевода" оказался неудачным и недостаточно точным, поэтому, кстати, был еще "теория машинного перевода", а вот "теория трансляции" очень удачная калька с английского и очень широко распространена (см программы ВУЗов). Но вопросы канонизации одних писаний и анафемы других — это имхо вопросы не столь принципиальны, чтобы доказывать у кого что более устоявшееся.
M>Т.е. нет — не существует? Полностью с этим согласен. Если Вы имели ввиду нечто другое, то пожалуйста напишите. И давайте определимся с терминов грамматика, ОПРЕДЕЛЯЮЩАЯ язык. Что это значит?
У языка программирования С++ НЕТ грамматики определяющей язык программирования С++. Нет, потому что библия не определяет такого понятия. Есть грамматика, определяющая синтаксис языка программирования С++.
M>Я привел определение из известных учебников, это значит, что данный язык есть множество всех предложений, выводимых данной грамматикой, не большеи не меньше. С этим будете спорить?
Буду. Ваши верные определения применены не к тому месту.
M>Ну зачем так? Я как раз и есть тот практик и профессионал ( ) о котором говорил аноним. Кроме фронт-енд компиляторов я разрабатывал еще и генератор синтаксических анализаторов и парсер регулярных выражений. Поэтому, обвинять меня в теоретизировании несправедливо.
Не умаляя Ваших заслуг, здесь Вы выступаете исключительно теоретиком. Это не плохо и не хорошо — это просто другой ракурс. Имхо, на формуме "Формальные языки" Вы были бы более правыми
WC>5 баллов! WC>А что мы здесь обсуждаем? Теорию формальных языков или язык программирования С++? Если стандарт говорит, что грамматика языка определяет его СИНТАКСИС, но синтаксис — это не весь язык, то почему мы должны этому "не верить"??? Вот поэтому я, кстати, и говорю, что Вы занимаетесь здесь теоретизированием и можете быть признаны правыми, НО только с академической точки зрения, потому что рассуждаете не о языке программирования С++, определенном в соответсвующем стандарте со всем его синтаксисом, ограничениями и семантикой, а о формальном языке совпадающем с множеством всех wellformed программ языка С++.
В общем, мы определились, что проблема в определении понятия язык. Я настаиваю, что в контексте темы язык должен определяться как множество терминальных цепочек. Почему? Вот мои аргументы:
Первоначально вопрос звучал так: определятся ли язык си++ КЗ-грамматикой? Вопрос сформулирован немного неверно, поэтому перефомулируем его так: является ли си++ КЗ-языком? Что это значит? Это значит, что мы должны решить две проблемы: доказать, что существует КЗ-грамматика, определяющая язык си++ (вы понимаете вероятно, что доказать, что КЗ-грамматика для си++ существует это не значит обязательно ее показать). И вторая проблема: доказать, что не существует КС-грамматики, определяющей данный язык. С толкованием слова определяющий мы вроде бы разобрались. Если язык мы считаем формальным, т.е. определенным как множество предложений (в си++ множество программных текстов), то определять — значит порождать как это определено в теории формальных языков. Итак, безотносительно тому, на какой вопрос мы отвечаем, мы используем понятие КС и КЗ языка, а значит, понятие КС и КЗ грамматики. Это понятие есть термин в теории формальных языков и характеризует синтаксическую структуру формального же языка. Поэтому, совершенно непонятно, каким образом эти термины можно применять не к формальным языкам. Согласны?
В связи с этим, если мы говорим о си++ НЕ как о формальном языке, то вопрос: "является ли си++ КЗ-языком" совершенно некорректен, ибо есть попытка применить к концепции одной теории (языков программирования, определяемых синтаксисом и семантикой) понятия из совсем другой теории (теории формальных языков).
Здравствуйте, WeCom, Вы писали:
WC>Здравствуйте, mefrill, Вы писали:
M>>>>не понимаю термина теории трансляции. нет такого термина, прошу Вас выражаться яснее. Какую теорию Вы подразумеваете? Формальных языков, синтаксического анализа или перевода? И приведите мне ссылку на определение.
WC>>>А вот это уже хуже ... WC>>>STFW
M>>Ну, как всегда, искажение великого и могучего... Из той-же оперы, что и диллеры и лизинги. В классическом переводе Агафонова книги Ахо и Ульмана, в первом томе, есть такое понятие как теория ПЕРЕВОДА, другой термин применять нехорошо, как неустоявшийся.
WC>Извините, но это ВЫ определили, что термин неустоявшийся или Ваша научная секта? Вот у меня сложилось обратное впечатление, что термин "теория перевода" оказался неудачным и недостаточно точным, поэтому, кстати, был еще "теория машинного перевода", а вот "теория трансляции" очень удачная калька с английского и очень широко распространена (см программы ВУЗов). Но вопросы канонизации одних писаний и анафемы других — это имхо вопросы не столь принципиальны, чтобы доказывать у кого что более устоявшееся.
Нет. это вопрос вовсе не канонизации, а терминологии. Теория перевода, называйте ее теорией трансляции если хотите, это не совсем то, что Вы под этим подразумеваете. В Вашем понимании (как я это уразумел из написанного выше) теория трансляции — это раздел программирования, изучающий построение компиляторов для языков программирования. Но это не так, теория перевода это только ЧАСТЬ этого раздела. Фундаментальный труд Ахо и Ульмана называется: Теория Синтаксического анализа, перевода и компиляции. Т.е. есть три совсем разных раздела и теория перевода, в том объеме, в котором она используется в написании компиляторов, совсем небольшая тема, к которой синтаксический анализ имеет опосредованное отношение. Часто, даже совсем не имеет. например, перевод регулярных языков осуществляется постредством конечных преобразователей — трансдьюсеров по английски и в их теории нет ничего про синтаксический анализ. Есть, конечно синтаксически управляемый перевод, такой как атрибутные грамматики Кнута, но и здесь с методами синтаксического анализа мало пересечений.
Поэтому я и настаиваю на четком определении терминов. Это даст нам возможность не смешивать понятия.
M>>Т.е. нет — не существует? Полностью с этим согласен. Если Вы имели ввиду нечто другое, то пожалуйста напишите. И давайте определимся с терминов грамматика, ОПРЕДЕЛЯЮЩАЯ язык. Что это значит? WC>У языка программирования С++ НЕТ грамматики определяющей язык программирования С++. Нет, потому что библия не определяет такого понятия. Есть грамматика, определяющая синтаксис языка программирования С++.
M>>Я привел определение из известных учебников, это значит, что данный язык есть множество всех предложений, выводимых данной грамматикой, не большеи не меньше. С этим будете спорить? WC>Буду. Ваши верные определения применены не к тому месту.
M>>Ну зачем так? Я как раз и есть тот практик и профессионал ( ) о котором говорил аноним. Кроме фронт-енд компиляторов я разрабатывал еще и генератор синтаксических анализаторов и парсер регулярных выражений. Поэтому, обвинять меня в теоретизировании несправедливо. WC>Не умаляя Ваших заслуг, здесь Вы выступаете исключительно теоретиком. Это не плохо и не хорошо — это просто другой ракурс. Имхо, на формуме "Формальные языки" Вы были бы более правыми
Ну, значит, вся эта ветка оффтопик. Как только заговорили о КЗ и КС языках.
Здравствуйте, mefrill, Вы писали:
M>>>Ну, как всегда, искажение великого и могучего... Из той-же оперы, что и диллеры и лизинги. В классическом переводе Агафонова книги Ахо и Ульмана, в первом томе, есть такое понятие как теория ПЕРЕВОДА, другой термин применять нехорошо, как неустоявшийся.
WC>>Извините, но это ВЫ определили, что термин неустоявшийся или Ваша научная секта? Вот у меня сложилось обратное впечатление, что термин "теория перевода" оказался неудачным и недостаточно точным, поэтому, кстати, был еще "теория машинного перевода", а вот "теория трансляции" очень удачная калька с английского и очень широко распространена (см программы ВУЗов). Но вопросы канонизации одних писаний и анафемы других — это имхо вопросы не столь принципиальны, чтобы доказывать у кого что более устоявшееся.
M>Нет. это вопрос вовсе не канонизации, а терминологии. Теория перевода, называйте ее теорией трансляции если хотите, это не совсем то, что Вы под этим подразумеваете. В Вашем понимании (как я это уразумел из написанного выше) теория трансляции — это раздел программирования, изучающий построение компиляторов для языков программирования. Но это не так, теория перевода это только ЧАСТЬ этого раздела. Фундаментальный труд Ахо и Ульмана называется: Теория Синтаксического анализа, перевода и компиляции. Т.е. есть три совсем разных раздела и теория перевода, в том объеме, в котором она используется в написании компиляторов, совсем небольшая тема, к которой синтаксический анализ имеет опосредованное отношение. Часто, даже совсем не имеет. например, перевод регулярных языков осуществляется постредством конечных преобразователей — трансдьюсеров по английски и в их теории нет ничего про синтаксический анализ. Есть, конечно синтаксически управляемый перевод, такой как атрибутные грамматики Кнута, но и здесь с методами синтаксического анализа мало пересечений.
Ну вот сначала заставлял меня называть теорию трансляции теорией перевода, а теперь обвиняет в том, что теория перевода на самом деле является частью теории трансляции В моем понимании, теория трансляции это раздел computer science, изучающий построение трансляторов (компиляторов в частности), в том числе включающая в себя теорию синтаксического анализа, перевода и компиляции (а может и совпадающая с этой теорией). Кстати, уверены ли Вы, что правомочно выделили из ахоульмана теорию перевода, ведь труд же не называется теорИИ, а теорИЯ?
WC>>Не умаляя Ваших заслуг, здесь Вы выступаете исключительно теоретиком. Это не плохо и не хорошо — это просто другой ракурс. Имхо, на формуме "Формальные языки" Вы были бы более правыми M>Ну, значит, вся эта ветка оффтопик. Как только заговорили о КЗ и КС языках.
Нет, Вы в контексте форума теорию применяете не к тому языку.
Здравствуйте, WeCom, Вы писали:
WC>Здравствуйте, mefrill, Вы писали:
M>>>>Ну, как всегда, искажение великого и могучего... Из той-же оперы, что и диллеры и лизинги. В классическом переводе Агафонова книги Ахо и Ульмана, в первом томе, есть такое понятие как теория ПЕРЕВОДА, другой термин применять нехорошо, как неустоявшийся.
WC>>>Извините, но это ВЫ определили, что термин неустоявшийся или Ваша научная секта? Вот у меня сложилось обратное впечатление, что термин "теория перевода" оказался неудачным и недостаточно точным, поэтому, кстати, был еще "теория машинного перевода", а вот "теория трансляции" очень удачная калька с английского и очень широко распространена (см программы ВУЗов). Но вопросы канонизации одних писаний и анафемы других — это имхо вопросы не столь принципиальны, чтобы доказывать у кого что более устоявшееся.
M>>Нет. это вопрос вовсе не канонизации, а терминологии. Теория перевода, называйте ее теорией трансляции если хотите, это не совсем то, что Вы под этим подразумеваете. В Вашем понимании (как я это уразумел из написанного выше) теория трансляции — это раздел программирования, изучающий построение компиляторов для языков программирования. Но это не так, теория перевода это только ЧАСТЬ этого раздела. Фундаментальный труд Ахо и Ульмана называется: Теория Синтаксического анализа, перевода и компиляции. Т.е. есть три совсем разных раздела и теория перевода, в том объеме, в котором она используется в написании компиляторов, совсем небольшая тема, к которой синтаксический анализ имеет опосредованное отношение. Часто, даже совсем не имеет. например, перевод регулярных языков осуществляется постредством конечных преобразователей — трансдьюсеров по английски и в их теории нет ничего про синтаксический анализ. Есть, конечно синтаксически управляемый перевод, такой как атрибутные грамматики Кнута, но и здесь с методами синтаксического анализа мало пересечений.
WC>В моем понимании, теория трансляции это раздел computer science, изучающий построение трансляторов (компиляторов в частности), в том числе включающая в себя теорию синтаксического анализа, перевода и компиляции (а может и совпадающая с этой теорией).
Ну это неверное понимание. Поэтому я и предлагал определиться в терминах. Было бы нехорошо наверное если бы Вы на русском языке для обозначения понятия "стол" использовали слово "стул"? В этом случае, когда Вы говорите стул, а подразумеваете стол, вряд ли Вас кто-то правильно поймет, кроме может-быть, еще кого, кто столы стульями называет. Точно так и во всем остальном. Термин теория перевода, также как и термин порождающая грамматика, придумали не Вы и не я, и де факто и де юре, впрочем, этот термин стал обозначать совершенно точно определенные понятия в определенной теории. Здесь же Вы пытаетесь произвести подмену понятий, используя для этого неоднозначность русского языка. Я Вам на это аргументировано указал. В ответ же получил только утверждения типа: я так называю. Называть вещи так как Вам хочется — это Ваше право. Но в дисскусии необходимо использовать утвердившуюся терминологию, хотя бы из уважения к собеседникам.
WC>Кстати, уверены ли Вы, что правомочно выделили из ахоульмана теорию перевода, ведь труд же не называется теорИИ, а теорИЯ?
Конечно уверен и моя увереность основана на содержании книги. Когда один из разделов называется теория перевода, а другой синтаксический анализ, здесь можно быть увереным на сто процентов. Ваш же сарказм я расцениваю просто как попытку прикрыть недостаток аргументов.
WC>>>Не умаляя Ваших заслуг, здесь Вы выступаете исключительно теоретиком. Это не плохо и не хорошо — это просто другой ракурс. Имхо, на формуме "Формальные языки" Вы были бы более правыми M>>Ну, значит, вся эта ветка оффтопик. Как только заговорили о КЗ и КС языках.
WC>Нет, Вы в контексте форума теорию применяете не к тому языку.
Не могли бы НОРМАЛЬНО объяснить, КАКУЮ теорию я некорректно применяю к КАКОМУ языку. Я думаю, что я применяю понятия теории формальных языков, а следовательно, и саму теорию к языку си++, который понимается мною как формальный язык. Ведь было бы некорректно применять теорию формальных языков к неформальному языку?
Здравствуйте, mefrill, Вы писали:
M>В общем, мы определились, что проблема в определении понятия язык. Я настаиваю, что в контексте темы язык должен определяться как множество терминальных цепочек.
А я настаиваю, что в контексте темы формальный язык, относительно которого ведется спор, должен определяться, как синтаксически верное подмножество wellformed программ языка программирования С++. А то что Вы сказали — это просто определение языка в теории, а поэтому бессодержательно представление здесь каких-то еще аргументов.
Но! Я готов принять на время Ваше предложение и посмотреть, какой содержательный результат Вы нам предложите.
Итак, я согласен на то, чтобы Вы ответили на вопрос "является ли си++ КЗ-языком?". Единственное, уточним немного эту формулировку "является ли язык, представляющий из себя множество wellformed по стандарту С++ цепочек символов КЗ-языком?"
M>мы должны решить две проблемы
Да верно, и сейчас я попрошу Вас убедить меня в том, что 1)Вы можете обе проблемы решить 2)решение имеет практическую ценность. Из Ваших постов я понял, что у Вас положительный ответ по обоим пунктам. Так?
M>доказать, что не существует КС-грамматики, определяющей данный язык
Согласен ввиду очевидности (только не забываем какой конкретно вопрос мы рассматриваем).
M>доказать, что существует КЗ-грамматика, определяющая язык си++ (вы понимаете вероятно, что доказать, что КЗ-грамматика для си++ существует это не значит обязательно ее показать).
Да, показывать не надо. Хотя кроме доказательства существования у нас еще остается вопрос практической ценности, но пока о ней забудем.
Итак, о чем я сейчас Вас хочу попросить.
Есть в С++ правило "определение перед использованием", знаете, о нем аноним упоминал. Очевидно, что это правило существенным образом влияет на язык и поэтому грамматика должна его выполнение обеспечивать. Чтобы сильно Вас не напрягать, я ослаблю это требование до самого минимума и попрошу Вас дополнить грамматику:
S ::= ??? // дополните здесь пожалуйста, грамматика у нас КЗ
Словестное описание языка: множество цепочек идентификаторов, разделенных одним разделителем, так что
(можете выбрать любое из)
1. каждый идентификатор встречается в последовательности дважды
или
2. каждый идентификатор встречается в последовательности не менее чем дважды
Два идентификатора тождественны, если колличество единичек их образующих одинаково.
---
Я думаю, что у Вас не возникнет возражение на то, что если существует КЗ-грамматика обеспечивающая выполнение правила "определение перед использованием" для С++, то мной предложенная грамматика будет 1)точно существовать 2)несоизмеримо проще, чем КЗ-грамматика С++ о которой Вы говорили.
M>В связи с этим, если мы говорим о си++ НЕ как о формальном языке, то вопрос: "является ли си++ КЗ-языком" совершенно некорректен, ибо есть попытка применить к концепции одной теории (языков программирования, определяемых синтаксисом и семантикой) понятия из совсем другой теории (теории формальных языков).
Да! да! да! Вопрос действительно не корректен! И некорректен именно из-за того, что теория формальных языков приманяется НЕ К ТОМУ МЕСТУ. Об этом Вам твердил аноним, об этом же Вам твержу я. Корректным является вопрос "Является ли множество синтаксически верных С++ программ (даже не программ, а единиц трансляции) КЗ-языком".
Здравствуйте, WeCom, Вы писали:
WC>Здравствуйте, mefrill, Вы писали:
M>>В общем, мы определились, что проблема в определении понятия язык. Я настаиваю, что в контексте темы язык должен определяться как множество терминальных цепочек. WC>А я настаиваю, что в контексте темы формальный язык, относительно которого ведется спор, должен определяться, как синтаксически верное подмножество wellformed программ языка программирования С++. А то что Вы сказали — это просто определение языка в теории, а поэтому бессодержательно представление здесь каких-то еще аргументов.
Ну Вы же оперируете понятием "формальный язык", а мы вроде бы договорились, что формальным языком можно называть только языки в смысли их определения в теории формальных языков, т.е. множество цепочек, состоавленных из символов алфавита.
WC>Но! Я готов принять на время Ваше предложение и посмотреть, какой содержательный результат Вы нам предложите. WC>Итак, я согласен на то, чтобы Вы ответили на вопрос "является ли си++ КЗ-языком?". Единственное, уточним немного эту формулировку "является ли язык, представляющий из себя множество wellformed по стандарту С++ цепочек символов КЗ-языком?"
M>>мы должны решить две проблемы WC>Да верно, и сейчас я попрошу Вас убедить меня в том, что 1)Вы можете обе проблемы решить 2)решение имеет практическую ценность. Из Ваших постов я понял, что у Вас положительный ответ по обоим пунктам. Так?
M>>доказать, что не существует КС-грамматики, определяющей данный язык WC>Согласен ввиду очевидности (только не забываем какой конкретно вопрос мы рассматриваем).
M>>доказать, что существует КЗ-грамматика, определяющая язык си++ (вы понимаете вероятно, что доказать, что КЗ-грамматика для си++ существует это не значит обязательно ее показать). WC>Да, показывать не надо. Хотя кроме доказательства существования у нас еще остается вопрос практической ценности, но пока о ней забудем.
WC>Итак, о чем я сейчас Вас хочу попросить. WC>Есть в С++ правило "определение перед использованием", знаете, о нем аноним упоминал. Очевидно, что это правило существенным образом влияет на язык и поэтому грамматика должна его выполнение обеспечивать. Чтобы сильно Вас не напрягать, я ослаблю это требование до самого минимума и попрошу Вас дополнить грамматику:
WC>--- WC>Терминалы: 0,1
WC><Идентификатор> ::= 1 WC><Идентификатор> ::= 1 <Идентификатор> WC><Разделитель> ::= 0
WC>S ::= ??? // дополните здесь пожалуйста, грамматика у нас КЗ
WC>Словестное описание языка: множество цепочек идентификаторов, разделенных одним разделителем, так что WC>(можете выбрать любое из) WC>1. каждый идентификатор встречается в последовательности дважды WC>или WC>2. каждый идентификатор встречается в последовательности не менее чем дважды
WC>Два идентификатора тождественны, если колличество единичек их образующих одинаково. WC>---
WC>Я думаю, что у Вас не возникнет возражение на то, что если существует КЗ-грамматика обеспечивающая выполнение правила "определение перед использованием" для С++, то мной предложенная грамматика будет 1)точно существовать 2)несоизмеримо проще, чем КЗ-грамматика С++ о которой Вы говорили.
Понимаете, Вашу грамматику невозможно ДОПОЛНИТЬ, ибо в ней явно определен идентификатор как нетерминал. контекстная зависимость как раз и предполагает, что <Идентификатор> не будет определен явно, а как-бы растворится в контескте. Выше я приводил КЗ-грамматику для языка, состоящего из двух, идущих друг за другом одиннаковых строк. Алфавит языка при этом должен состоять хотя бы из двух символов. С помощью леммы огдена доказывается, что этот язык не является КС. КЗ-грамматика этого языка приведена здесь
. Как видите, эта грамматика очень сложна, но корректна, я взял ее из книги Гладкого, там же доказывается, что язык, порождаемый данной грамматикой есть в точности описанный выше. Фактически, это программа для машины Тьюринга, где нетерминалы соответствуют состояниям МТ.
Таким образом, правило предварительного объявления имен до их использования не может быть выражено КС-граммтаикой, но выражается КЗ=грамматикой. Этот факт широко известен в литературе, посмотрите например, недавно переведенное второе издани Ульман, Хопкрофт "Введение в теорию языко, автоматов и вычислений". Там об этом говорится явно, только не приводится КЗ-грамматика языка. Ссылку на страницу я Вам могу дать только вечером из дома, если захотите, конечно.
Таким образом, полагаю, что вопрос выяснен?.
M>>В связи с этим, если мы говорим о си++ НЕ как о формальном языке, то вопрос: "является ли си++ КЗ-языком" совершенно некорректен, ибо есть попытка применить к концепции одной теории (языков программирования, определяемых синтаксисом и семантикой) понятия из совсем другой теории (теории формальных языков). WC>Да! да! да! Вопрос действительно не корректен! И некорректен именно из-за того, что теория формальных языков приманяется НЕ К ТОМУ МЕСТУ. Об этом Вам твердил аноним, об этом же Вам твержу я. Корректным является вопрос "Является ли множество синтаксически верных С++ программ (даже не программ, а единиц трансляции) КЗ-языком".
Здравствуйте, mefrill, Вы писали:
WC>>В моем понимании, теория трансляции это раздел computer science, изучающий построение трансляторов (компиляторов в частности), в том числе включающая в себя теорию синтаксического анализа, перевода и компиляции (а может и совпадающая с этой теорией).
M>Ну это неверное понимание.
Хорошо, пусть будет так. Радует только одно — большое число ВУЗов ошибается вместе со мной (не верите? — просто внимательно изучите программы курсов "теория трансляции" или "теория формальных языков и трансляций" которых в инете полным полно).
Далее постараюсь не смущать Вас и буду пользоваться "теория синтаксического анализа, перевода и компиляции".
M>Называть вещи так как Вам хочется — это Ваше право. Но в дисскусии необходимо использовать утвердившуюся терминологию, хотя бы из уважения к собеседникам.
Тут Вы правы. Но мне единственное, не понятно, неужели сложно внимательно поискать в сети, что ПРИНЯТО называть теорией транслиции.
WC>>Нет, Вы в контексте форума теорию применяете не к тому языку.
M>Не могли бы НОРМАЛЬНО объяснить, КАКУЮ теорию я некорректно применяю к КАКОМУ языку.
КАКУЮ — теорию формальных языков (грамматик).
КАКОМУ — языку состоящему из всех wellformed программ (единиц трансляции) на языке программирования С++
M>Я думаю, что я применяю понятия теории формальных языков, а следовательно, и саму теорию к языку си++, который понимается мною как формальный язык.
Ну что тут поделаешь? Называть вещи (С++) так как Вам хочется (формальным языком) — это Ваше право. Но в дисскусии необходимо использовать утвердившуюся (нормативно утвержденную) терминологию, хотя бы из уважения к священной книге.
M>Ведь было бы некорректно применять теорию формальных языков к неформальному языку?
Так о чем и разговор...
Здравствуйте, WeCom, Вы писали:
WC>Здравствуйте, mefrill, Вы писали:
WC>>>В моем понимании, теория трансляции это раздел computer science, изучающий построение трансляторов (компиляторов в частности), в том числе включающая в себя теорию синтаксического анализа, перевода и компиляции (а может и совпадающая с этой теорией).
M>>Ну это неверное понимание. WC>Хорошо, пусть будет так. Радует только одно — большое число ВУЗов ошибается вместе со мной (не верите? — просто внимательно изучите программы курсов "теория трансляции" или "теория формальных языков и трансляций" которых в инете полным полно). WC>Далее постараюсь не смущать Вас и буду пользоваться "теория синтаксического анализа, перевода и компиляции".
Значит, ошибаются вместе с Вами, хотя я этого не встречал. По ссылке, который Вы меня посылали, кстати теория трансляции означает именно то, о чем говорил я.
M>>Называть вещи так как Вам хочется — это Ваше право. Но в дисскусии необходимо использовать утвердившуюся терминологию, хотя бы из уважения к собеседникам. WC>Тут Вы правы. Но мне единственное, не понятно, неужели сложно внимательно поискать в сети, что ПРИНЯТО называть теорией транслиции.
WC>>>Нет, Вы в контексте форума теорию применяете не к тому языку.
M>>Не могли бы НОРМАЛЬНО объяснить, КАКУЮ теорию я некорректно применяю к КАКОМУ языку. WC>КАКУЮ — теорию формальных языков (грамматик). WC>КАКОМУ — языку состоящему из всех wellformed программ (единиц трансляции) на языке программирования С++
Ну хорошо.
1) Что изучает теория формальных языков? Ответ: формальные языки.
2) Что такое формальный язык? Ответ: в теории формальных языков формальный язык определяется как множество строк, состоящих из конечного алфавита.
3) Рассмотрим язык си++ как формальный язык. Т.е. определим формальный язык си++. Согласно 2) это некоторое множество строк (программ), построенных из алфавита, определенного в стандарте как базовое множество символов.
Где я не прав?
M>>Я думаю, что я применяю понятия теории формальных языков, а следовательно, и саму теорию к языку си++, который понимается мною как формальный язык. WC>Ну что тут поделаешь? Называть вещи (С++) так как Вам хочется (формальным языком) — это Ваше право. Но в дисскусии необходимо использовать утвердившуюся (нормативно утвержденную) терминологию, хотя бы из уважения к священной книге.
Снова Вы пытаетесь, не отвечая по существу на вопрос, каким-то образом оскорбить меня. Как я уже говорил ранее, я это расцениваю просто как попытку скрыть отсутствие аргументов. Как я понял, в предложении выше Вы пытаетесь представить меня как некого ортодокса — инквизитора, который не приемлет свободу мысли и пытается подавить Вас книжными знаниями. Чтож, отвечать Ва на это я не буду дабы не отвлекаться от главного.
Вообще, разговор этот мне давно уже надоел. Невозможно описать глухому что такое музыка и невозможно описать человеку, не занимавшемуся теорией формальных языков, ее положения в нескольких предложениях. Теория эта сложна и изучают ее годами и не на курсах по теории трансляции и не по книжкам, приведенным анонимом. К сожалению, мы говорим на разных языках и вместо конструктивной дисскусии я все время вижу попытки каким-то образом оскорбить или уязвить собеседника. Пожалуйста, отвечайте по существу или я просто прекращаю дискуссию.
M>>Ведь было бы некорректно применять теорию формальных языков к неформальному языку? WC>Так о чем и разговор...
Здравствуйте, mefrill, Вы писали:
WC>>А я настаиваю, что в контексте темы формальный язык, относительно которого ведется спор, должен определяться, как синтаксически верное подмножество wellformed программ языка программирования С++. А то что Вы сказали — это просто определение языка в теории, а поэтому бессодержательно представление здесь каких-то еще аргументов.
M>Ну Вы же оперируете понятием "формальный язык", а мы вроде бы договорились, что формальным языком можно называть только языки в смысли их определения в теории формальных языков, т.е. множество цепочек, состоавленных из символов алфавита.
Я оперирую понятием именно в соответствии с этим определением. Единственное, у меня описка. Вместо подмножество, должно быть надмножество.
M>Понимаете, Вашу грамматику невозможно ДОПОЛНИТЬ, ибо в ней явно определен идентификатор как нетерминал.
Понимаете ли, я специально "разрешал" Вам при необходимости исправить уже приведенные правила, но в процессе редактирования стер это "разрешение" (честное слово). Дополните, пожалуйста грамматику с учетом "разрешения".
M>Таким образом, полагаю, что вопрос выяснен?.
Вы еще не убедились, что все Ваши выкладки кроме академического интереса другого не имеют?
Здравствуйте, WeCom, Вы писали:
WC>Здравствуйте, mefrill, Вы писали:
WC>>>А я настаиваю, что в контексте темы формальный язык, относительно которого ведется спор, должен определяться, как синтаксически верное подмножество wellformed программ языка программирования С++. А то что Вы сказали — это просто определение языка в теории, а поэтому бессодержательно представление здесь каких-то еще аргументов.
M>>Ну Вы же оперируете понятием "формальный язык", а мы вроде бы договорились, что формальным языком можно называть только языки в смысли их определения в теории формальных языков, т.е. множество цепочек, состоавленных из символов алфавита. WC>Я оперирую понятием именно в соответствии с этим определением. Единственное, у меня описка. Вместо подмножество, должно быть надмножество.
M>>Понимаете, Вашу грамматику невозможно ДОПОЛНИТЬ, ибо в ней явно определен идентификатор как нетерминал. WC>Понимаете ли, я специально "разрешал" Вам при необходимости исправить уже приведенные правила, но в процессе редактирования стер это "разрешение" (честное слово). Дополните, пожалуйста грамматику с учетом "разрешения".
Ну я же привел ссылку??? Там грамматика есть, проще не получится. Я же говорю, что теорию формальных языков — довольно сложная вещь, с наскока не взять. Поэтому и получается, что мы с Вами говорим на разных языках.
M>>Таким образом, полагаю, что вопрос выяснен?. WC>Вы еще не убедились, что все Ваши выкладки кроме академического интереса другого не имеют?
ну и к чему такое пренебрежительное отношение к слову "академический"? Да, мне скучно сидеть и набивать код для компилятора, это рутинная задача, не имеющая творческого начала. Поэтому я занимаюсь более широкими вопросами и это, как раз (как мне представляется) и позволяет мне судить о тех вещах, которые мы обсуждаем. Совершенно не понимаю сарказма. Относительно методов синтаксического анализа, так есть методы для КЗ-языков. И неплохие довольно. Кстати, все учебники, в том числе и знаменитого Дракона, именно люди из академических кругов пишут. Те, которые занимаются "академическими" вещами.
Здравствуйте, mefrill, Вы писали:
M>Мне кажется, что там говорилось немного о другом, а именно, о выразительной мощи языка, а не о мощи определяющей его грамматики. А это, мне кажется, разные вещи. Вот например, скриптовые языки, в принципе, можно определить КС-грамматикой, выразительная мощность его та же, что и машины Тьюринга. Конечно, с некоторыми ограничениями, связанными с объемом памяти реальной машины. Иначе, реализация любого языка программирования эквивалентен линейно ограниченному автомату.
Ты по второй ссылке ходил? Там пример того как компилятор С++ можно превратить в интерпретатор функционального языка.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, mefrill, Вы писали:
M>>Мне кажется, что там говорилось немного о другом, а именно, о выразительной мощи языка, а не о мощи определяющей его грамматики. А это, мне кажется, разные вещи. Вот например, скриптовые языки, в принципе, можно определить КС-грамматикой, выразительная мощность его та же, что и машины Тьюринга. Конечно, с некоторыми ограничениями, связанными с объемом памяти реальной машины. Иначе, реализация любого языка программирования эквивалентен линейно ограниченному автомату. WH>Ты по второй ссылке ходил? Там пример того как компилятор С++ можно превратить в интерпретатор функционального языка.
Нет, ну это понятно. Там же есть рекурсивные функции (шаблоны) и возможности эту рекурсию останавливать (явные специализации). Так что полностью с этим согласен. Вопрос то был в другом, в синтаксических свойствах языка, а не в семантической его интерпретации.
Здравствуйте, mefrill, Вы писали:
M>>>Не могли бы НОРМАЛЬНО объяснить, КАКУЮ теорию я некорректно применяю к КАКОМУ языку. WC>>КАКУЮ — теорию формальных языков (грамматик). WC>>КАКОМУ — языку состоящему из всех wellformed программ (единиц трансляции) на языке программирования С++
M>Ну хорошо.
M>1) Что изучает теория формальных языков? Ответ: формальные языки.
Точно.
M>2) Что такое формальный язык? Ответ: в теории формальных языков формальный язык определяется как множество строк, состоящих из конечного алфавита.
Вроде, как множество конечных строк, но непринципивально.
M>3) Рассмотрим язык си++ как формальный язык. Т.е. определим формальный язык си++. Согласно 2) это некоторое множество строк (программ), построенных из алфавита, определенного в стандарте как базовое множество символов.
Имеете право. О чем я Вам и твержу. Вы взяли язык программирования С++. Определили формальный язык как множество wellformed строк С++ и для этого языка провели исследование. Здесь Вы правы.
А неправы Вы вот в чем:
-Чисто формально язык С++ — это не формальный язык по определению (но это замечание несущественно);
Аргумент1. Стандарт С++ не определяет и не подразумевает грамматику для языка, который Вы рассматривали;
Аргумент2. Грамматика С++ — это грамматика для синтаксического разбора == грамматика для языка представляющего из себя множество синтаксически-верных строк С++.
M>Снова Вы пытаетесь, не отвечая по существу на вопрос, каким-то образом оскорбить меня. Как я уже говорил ранее, я это расцениваю просто как попытку скрыть отсутствие аргументов.
Аргументы выше, но проблема в том, что для Вас стандарт С++ — не авторитет. И это входит в некоторое противоречие с данным разделом форума.
M>Как я понял, в предложении выше Вы пытаетесь представить меня как некого ортодокса — инквизитора, который не приемлет свободу мысли и пытается подавить Вас книжными знаниями.
Нет Я вас в шутку называл сектантом. Жаль, что Вы на это обижаетесь.
M>Вообще, разговор этот мне давно уже надоел. Невозможно описать глухому что такое музыка и невозможно описать человеку, не занимавшемуся теорией формальных языков, ее положения в нескольких предложениях.
Вы правы в рамках Вашей области с учетом Вашего определения формального языка С++. Я об этом говорил сразу. Вы тогда еще не поняли, что значит "различия только в церквях".
M>Теория эта сложна и изучают ее годами и не на курсах по теории трансляции и не по книжкам, приведенным анонимом. К сожалению, мы говорим на разных языках и вместо конструктивной дисскусии я все время вижу попытки каким-то образом оскорбить или уязвить собеседника. Пожалуйста, отвечайте по существу или я просто прекращаю дискуссию.
Извините. Я же не устаю повторять, что со своей колокольни Вы правы. Практически точно так же, как (почти) прав аноним, у которого язык С++ подпадающий под формальную теорию — это множество синтаксически верных строк.
—
А насчет сложности, зря Вы так: Если теория кажется Вам сложной, значит Вы ее просто не поняли.
Здравствуйте, mefrill, Вы писали:
M>>>Понимаете, Вашу грамматику невозможно ДОПОЛНИТЬ, ибо в ней явно определен идентификатор как нетерминал. WC>>Понимаете ли, я специально "разрешал" Вам при необходимости исправить уже приведенные правила, но в процессе редактирования стер это "разрешение" (честное слово). Дополните, пожалуйста грамматику с учетом "разрешения".
M>Ну я же привел ссылку??? Там грамматика есть, проще не получится. Я же говорю, что теорию формальных языков — довольно сложная вещь, с наскока не взять. Поэтому и получается, что мы с Вами говорим на разных языках.
Пока у Вас самостоятельно ни проще ни сложнее не получилось.
Я понимаю, что имея под рукой книгу можно навыдергивать цытат и сказать "вот я прав", "теория сложна", "надо учить годами" и т.д., но извините, я не могу верить тому, что Вы цитируете корректно. Поэтому я хочу убедиться, что Вы сами чувствуете себя в этой области, как рыба в воде, поэтому я прошу Вас построить самостоятельно граматику или признать, что Вам просто кажется, что Вы правильно понимаете теорию и, что лично Вы доказать свои утверждения не способны.
Извините еще раз, просто не один раз уже случалось, что на форумах человек авторитетно ссылаясь на литературу доказывал что-то и все выглядело верно и подкопаться было не к чему, но стоило только залезть в ту же литературу и баа ... да тут же совсем другое в виду имеется ...
Если это действительно сделать сложно, то
1.Наверное практической ценности Ваш вывод все же не имеет;
2.Я попробую найти литературу и убедиться, что Вы полностью правы (в рамках принятых Вами определений)
M>ну и к чему такое пренебрежительное отношение к слову "академический"?
Вроде ж и не пренебрегал ничем ... наверное просто снова разное понимание одних и тех же слов ...
M>Да, мне скучно сидеть и набивать код для компилятора, это рутинная задача, не имеющая творческого начала.
А я представьте с утра до ночи только и занят что по листингу С++ программы в комп шестнадцатиричные инструкции запихиваю ...
Здравствуйте, mefrill, Вы писали:
M>Нет, ну это понятно. Там же есть рекурсивные функции (шаблоны) и возможности эту рекурсию останавливать (явные специализации). Так что полностью с этим согласен. Вопрос то был в другом, в синтаксических свойствах языка, а не в семантической его интерпретации.
В зависимости от параметра шаблона мы получаем разные синтаксические конструкции
struct get_type
{
typedef int val;
};
struct get_var
{
static int val;
};
int get_var::val=0;
template<size_t N>
struct some
{
typedef typename some<N-2>::type type;
};
template<>
struct some<1>
{
typedef get_type type;
};
template<>
struct some<0>
{
typedef get_var type;
};
int main()
{
int i;
{
some<5>::type::val*i;
}
{
some<6>::type::val*i;
}
}
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Sergey J. A., Вы писали:
SJA>Здравствуйте, Шахтер, Вы писали:
SJA>>>Так собственно вопрос в том, синтаксическая это ошибка или семантическая ?
Ш>>А это зависит от того, что вы понимаете под синтаксисом и семантикой.
SJA>Прикольно.... Я думал есть некоторое формальное определение ситаксиса и семантики...
К сожалению, нет. В стандарте слово syntax употребляется применительно к конкретным языковым конструкциям. Например,
[Note: certain contexts in C++ cause the evaluation of a full expression that results from a syntactic construct
other than expression (5.18). For example, in 8.5 one syntax for initializer is ( expressionlist )
but the resulting construct is a function call upon a constructor function with expressionlist
as an argument list; such a function call is a fullexpression.
For example, in 8.5, another syntax for initializer is
= initializerclause
but again the resulting construct might be a function call upon a constructor function with one assignmentexpression
as an argument; again, the function call is a fullexpression.]
Т.е. слово syntax используется не в каком-то формальном смысле, а в смысле "способ записи".
Вот ещё пример. Правило видимости объявлений функций.
If no declaration of the called function is visible from the scope of the call the program is ill-formed.
Это правило синтаксическое или семантическое? Стандарт ничего не говорит об этом.
SJA>Так может мне пояснят, как эту границу провести ?
Лучше всего, на мой взгляд, проводить границу таким образом. Синтаксис -- набор правил, определяющих, что же такое С++ программа (well-formed в терминах стандарта). А семантика определяет, что синтаксически правильная С++ программа делает, если её скомпилировать и запустить. В стандарте для этой цели есть термин наблюдаемое поведение (observable behavior) и абстрактная машина.
1.9 Program execution
1 The semantic descriptions in this International Standard define a parameterized nondeterministic abstract
machine.
Вообще, если проглядеть стандарт, то слово semantic там употребляется для обозначения поведения тех или иных языковых конструкций, т.е. имеет отношение по большей части к фазе выполнения программы.
SJA>А то я могу сказать, что С++ задаётся регулярной (если я правильно употребляю слово) граматикой вида SJA>program ::= .* [в смысле сколько угодно каких угодно символов]
SJA>А всё остальное — семантика...
Здравствуйте, Шахтер, Вы писали:
SJA>>Прикольно.... Я думал есть некоторое формальное определение ситаксиса и семантики... Ш>К сожалению, нет. В стандарте слово syntax употребляется применительно к конкретным языковым конструкциям. Например,
Ш>Т.е. слово syntax используется не в каком-то формальном смысле, а в смысле "способ записи".
Загляните в стандарт языка C (который за 1999 год), там синтаксис и семантик разделены явно. Формальные определения синтаксиса и семантики практически 100% есть. Стандарт С имеет нормативную ссылку на дргой документ ISO, который опеделяет vocabulary. В сети пока его текст найти не удалось, если кому из вас повезет — дайте знать пожалуйста.
Ш>Лучше всего, на мой взгляд, проводить границу таким образом. Синтаксис -- набор правил, определяющих, что же такое С++ программа (well-formed в терминах стандарта).
Надо сказать, что стандарт оперирует неявно определяемым понятием syntactically correct и яно утверждает, что оно не равно wellformed. Все таки хорошо бы найти документ с определениями...
Re[35]: Граматика С++
От:
Аноним
Дата:
10.08.04 19:22
Оценка:
M>>Теория эта сложна и изучают ее годами и не на курсах по теории трансляции и не по книжкам, приведенным анонимом. К сожалению, мы говорим на разных языках и вместо конструктивной дисскусии я все время вижу попытки каким-то образом оскорбить или уязвить собеседника. Пожалуйста, отвечайте по существу или я просто прекращаю дискуссию. WC>Извините. Я же не устаю повторять, что со своей колокольни Вы правы. Практически точно так же, как (почти) прав аноним, у которого язык С++ подпадающий под формальную теорию — это множество синтаксически верных строк.
Аноним прав, но не почти. Аноним говорил только о грамматике С++, которая выводит множество синтаксически верных строк, часть из которых, тем не менее, может и не иметь смысла в языке программирования С++. Он не смешивал формальный язык, выводимый грамматикой С++, с самим языком программирования С++. Пример: аноним всегда говорил, что компилятор С++ есть намного большое, чем простой распознаватель грамматики С++.
Re[34]: Граматика С++
От:
Аноним
Дата:
10.08.04 19:38
Оценка:
M>Снова Вы пытаетесь, не отвечая по существу на вопрос, каким-то образом оскорбить меня. Как я уже говорил ранее, я это расцениваю просто как попытку скрыть отсутствие аргументов. Как я понял, в предложении выше Вы пытаетесь представить меня как некого ортодокса — инквизитора, который не приемлет свободу мысли и пытается подавить Вас книжными знаниями. Чтож, отвечать Ва на это я не буду дабы не отвлекаться от главного.
Да нет. WeCom очень даже нормально говорил с Вами, и он Вам обьяснил, что неверно в Ваших рассуждениях. Все аргументы он привел, но вот понять Вы их не смогли. Более того, мы так и не услышали аргументов в поддержку "утверждения, что грамматика С++ КЗ," за исключением как сложна теория формальных языков и трансляции.
M>Вообще, разговор этот мне давно уже надоел. Невозможно описать глухому что такое музыка и невозможно описать человеку, не занимавшемуся теорией формальных языков, ее положения в нескольких предложениях. Теория эта сложна и изучают ее годами и не на курсах по теории трансляции и не по книжкам, приведенным анонимом. К сожалению, мы говорим на разных языках и вместо конструктивной дисскусии я все время вижу попытки каким-то образом оскорбить или уязвить собеседника.
Ничего в ней сложного нет, и второй книги даже достаточно, чтобы понять, что есть что. А музыку мы понимаем; вопрос только в том, кто из нас глух.
M>Пожалуйста, отвечайте по существу или я просто прекращаю дискуссию.
Вам и были даны ответы и вопросы (заставляющие задуматься) по существу, и видно, что WeCom очень хорошо понимает теорию.
Здравствуйте, Аноним, Вы писали:
А>Аноним прав, но не почти. Аноним говорил только о грамматике С++, которая выводит множество синтаксически верных строк, часть из которых, тем не менее, может и не иметь смысла в языке программирования С++. Он не смешивал формальный язык, выводимый грамматикой С++, с самим языком программирования С++. Пример: аноним всегда говорил, что компилятор С++ есть намного большое, чем простой распознаватель грамматики С++.
И тем не менее аноним не учитывает того факта, что грамматика C++ имеет, как минимум одну неприятную особенность, а именно, грамматики не достаточно для того чтобы отличить expressions от declarations.
Плюс еще WolfHound указал на то, что один шаблон с разными параметрами может порождать разные синтаксические конструкции, что также затрудняет (если не сказать больше) классический синтаксический анализ.
Re[37]: Граматика С++
От:
Аноним
Дата:
10.08.04 20:09
Оценка:
WC>И тем не менее аноним не учитывает того факта, что грамматика C++ имеет, как минимум одну неприятную особенность, а именно, грамматики не достаточно для того чтобы отличить expressions от declarations.
А Вы не пытайтесь разобрать уже имеющуюся строку. Идите в обратном направлении ведь грамматика это прежде всего аппарат для генерации строк языка. Начните с нужного Вам нетерминала, применяйте разные продукции и попробуйте вывести синтаксическое дерево. Если дерево есть, то строка синтаксически верна, и не имеет значение какие продукции использовались при выводе (даже если использовались те, что не несут смысловую нагрузку).
Приведите пример с expressions и declarations...
WC>Плюс еще WolfHound указал на то, что один шаблон с разными параметрами может порождать разные синтаксические конструкции, что также затрудняет (если не сказать больше) классический синтаксический анализ.
Вы имеете в виду пример с int'eger'ами и template'ами? Если да, то Вам не все ли равно, какая из продукций использовалась при выводе? Чистый распознаватель построит "первое попавшееся дерево" и скажет, что строка верна. Компилятору же нужна таблица символов для "выявления нужной продукции."
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, mefrill, Вы писали:
M>>Нет, ну это понятно. Там же есть рекурсивные функции (шаблоны) и возможности эту рекурсию останавливать (явные специализации). Так что полностью с этим согласен. Вопрос то был в другом, в синтаксических свойствах языка, а не в семантической его интерпретации. WH>В зависимости от параметра шаблона мы получаем разные синтаксические конструкции WH>
Да, это просто один из способов определения подмножества языка си++. Но это не порождающая граматика как характеристика структуры языка. было бы очень интересно проследить, соотносятся ли характеристика языка в смысле формальной теории с возможнотью определения синтаксических конструкций с помощью других специфических инструментов, таких как шаблоны. И вообще, каким образом семантика (выразительная мощность этой семантики, выраженная в иерархии автоматов: конечные автоматы, автоматы с магазинами, линейно-ограниченные автоматы и, наконец, машины Тьюринга) языков программирования (т.е. языков, позволяющих задавать описания алгоритмов) соотносится с выразительной мощностью языков (что выражено их характеристикой посредство иерархии Хомского).
Здравствуйте, <Аноним>, Вы писали:
WC>>Плюс еще WolfHound указал на то, что один шаблон с разными параметрами может порождать разные синтаксические конструкции, что также затрудняет (если не сказать больше) классический синтаксический анализ. А>Вы имеете в виду пример с int'eger'ами и template'ами? Если да, то Вам не все ли равно, какая из продукций использовалась при выводе? Чистый распознаватель построит "первое попавшееся дерево" и скажет, что строка верна. Компилятору же нужна таблица символов для "выявления нужной продукции."
Да, но ведь "чистый распознаватель" может сказать, что строка не верна, выбрав не то дерево. Вот простенький например:
A < 0 < (0);
Если A — шаблон, то конструкция синтаксически не верна — вторая угловая скобка неверно повёрнута. Допустим распознаватель выбрал дерево, где A — это шаблон. Конструкция не верна. Но есть ещё одно дерево, если A — int. Конструкция верна.
Значит "чистый распознователь" ничего не может сказать о синтаксической корректности конструкции ?
Или я где то ошибаюсь ?
Вообще, когда я говорил о "контекстной зависимости грамматики С++" я имел в виду именно это обстоятельство. То есть невозможность понять что есть A в данном случае — template-id, или variable-id, и какую синтаксическую конструкцию необходимо строить дальше. Вот желательно с этой позиции немного мне растолковать. Я так понял, что грамматика с такой неопределённостью всё равно КС ?
Здравствуйте, WeCom, Вы писали:
WC>Здравствуйте, mefrill, Вы писали:
M>>>>Не могли бы НОРМАЛЬНО объяснить, КАКУЮ теорию я некорректно применяю к КАКОМУ языку. WC>>>КАКУЮ — теорию формальных языков (грамматик). WC>>>КАКОМУ — языку состоящему из всех wellformed программ (единиц трансляции) на языке программирования С++
M>>Ну хорошо.
M>>1) Что изучает теория формальных языков? Ответ: формальные языки. WC>Точно.
M>>2) Что такое формальный язык? Ответ: в теории формальных языков формальный язык определяется как множество строк, состоящих из конечного алфавита. WC>Вроде, как множество конечных строк, но непринципивально.
M>>3) Рассмотрим язык си++ как формальный язык. Т.е. определим формальный язык си++. Согласно 2) это некоторое множество строк (программ), построенных из алфавита, определенного в стандарте как базовое множество символов. WC>Имеете право. О чем я Вам и твержу. Вы взяли язык программирования С++. Определили формальный язык как множество wellformed строк С++ и для этого языка провели исследование. Здесь Вы правы. WC>А неправы Вы вот в чем: WC>-Чисто формально язык С++ — это не формальный язык по определению (но это замечание несущественно); WC>Аргумент1. Стандарт С++ не определяет и не подразумевает грамматику для языка, который Вы рассматривали; WC>Аргумент2. Грамматика С++ — это грамматика для синтаксического разбора == грамматика для языка представляющего из себя множество синтаксически-верных строк С++.
Таким образом, множество синтаксически верных строк Си++ это не язык Си++? Правильно ли я понял? Если так, то спорить бесполезно, вопрос лишь в терминологии. Поэтому, давайте прекратим все эти терминологические прения, называйте язык си++ как Вам хочется, в неформальной беседе это позволительно, хотя часто ведет к непониманию.
M>>Снова Вы пытаетесь, не отвечая по существу на вопрос, каким-то образом оскорбить меня. Как я уже говорил ранее, я это расцениваю просто как попытку скрыть отсутствие аргументов. WC>Аргументы выше, но проблема в том, что для Вас стандарт С++ — не авторитет. И это входит в некоторое противоречие с данным разделом форума.
Мне это напоминает спор богословов, так рапространенный в Средние века. Ссылки на Библия (т.е. Стандарт) и тому подобное .
M>>Как я понял, в предложении выше Вы пытаетесь представить меня как некого ортодокса — инквизитора, который не приемлет свободу мысли и пытается подавить Вас книжными знаниями. WC>Нет Я вас в шутку называл сектантом. Жаль, что Вы на это обижаетесь.
Я не обидился, я просто указал на то, что Вы пытаетесь привнести в дискуссию понятия, не относящиеся к теме. Потом, на сектанта то чего обижаться? Я то как раз ортодокс большой Церкви, где и Ахо и Ульман и Кнут и иже с ними, так сказать, житие наше.
M>>Вообще, разговор этот мне давно уже надоел. Невозможно описать глухому что такое музыка и невозможно описать человеку, не занимавшемуся теорией формальных языков, ее положения в нескольких предложениях. WC>Вы правы в рамках Вашей области с учетом Вашего определения формального языка С++. Я об этом говорил сразу. Вы тогда еще не поняли, что значит "различия только в церквях".
M>>Теория эта сложна и изучают ее годами и не на курсах по теории трансляции и не по книжкам, приведенным анонимом. К сожалению, мы говорим на разных языках и вместо конструктивной дисскусии я все время вижу попытки каким-то образом оскорбить или уязвить собеседника. Пожалуйста, отвечайте по существу или я просто прекращаю дискуссию. WC>Извините. Я же не устаю повторять, что со своей колокольни Вы правы. Практически точно так же, как (почти) прав аноним, у которого язык С++ подпадающий под формальную теорию — это множество синтаксически верных строк. WC>- WC>А насчет сложности, зря Вы так: Если теория кажется Вам сложной, значит Вы ее просто не поняли.
Да нет, мне она сейчас уже не кажется сложной. Просто я оцениваю время, потраченное мною на изучение этой теории. И, если это не аргумент, то Вы могли бы оценить сложность теории, попытавшись понять ту грамматику, которую я уже представлял выше. А это довольно простой пример на самом деле. и, конечно, к программированию это уже не относится совершенно.
Я вообще предлагаю завершить весь этот разговор, так как это не приведет ни к чему. Тем более, что правы все 6-). Если хотите, то напишите ответ на это сообщение, я же отвечать уже не вижу необходимости.
Здравствуйте, WeCom, Вы писали:
WC>Здравствуйте, mefrill, Вы писали:
M>>>>Понимаете, Вашу грамматику невозможно ДОПОЛНИТЬ, ибо в ней явно определен идентификатор как нетерминал. WC>>>Понимаете ли, я специально "разрешал" Вам при необходимости исправить уже приведенные правила, но в процессе редактирования стер это "разрешение" (честное слово). Дополните, пожалуйста грамматику с учетом "разрешения".
M>>Ну я же привел ссылку??? Там грамматика есть, проще не получится. Я же говорю, что теорию формальных языков — довольно сложная вещь, с наскока не взять. Поэтому и получается, что мы с Вами говорим на разных языках.
WC>Пока у Вас самостоятельно ни проще ни сложнее не получилось. WC>Я понимаю, что имея под рукой книгу можно навыдергивать цытат и сказать "вот я прав", "теория сложна", "надо учить годами" и т.д., но извините, я не могу верить тому, что Вы цитируете корректно. Поэтому я хочу убедиться, что Вы сами чувствуете себя в этой области, как рыба в воде, поэтому я прошу Вас построить самостоятельно граматику или признать, что Вам просто кажется, что Вы правильно понимаете теорию и, что лично Вы доказать свои утверждения не способны. WC>Извините еще раз, просто не один раз уже случалось, что на форумах человек авторитетно ссылаясь на литературу доказывал что-то и все выглядело верно и подкопаться было не к чему, но стоило только залезть в ту же литературу и баа ... да тут же совсем другое в виду имеется ... WC>Если это действительно сделать сложно, то WC>1.Наверное практической ценности Ваш вывод все же не имеет; WC>2.Я попробую найти литературу и убедиться, что Вы полностью правы (в рамках принятых Вами определений)
Вот, полностью поддерживаю, если хотите, могу Вам ссылки на такую литературу дать и также номера страниц, откуда я цитаты выдергивал.
M>>ну и к чему такое пренебрежительное отношение к слову "академический"? WC>Вроде ж и не пренебрегал ничем ... наверное просто снова разное понимание одних и тех же слов ...
M>>Да, мне скучно сидеть и набивать код для компилятора, это рутинная задача, не имеющая творческого начала. WC>А я представьте с утра до ночи только и занят что по листингу С++ программы в комп шестнадцатиричные инструкции запихиваю ...
С Вашего позволения отвечу.
M>Таким образом, множество синтаксически верных строк Си++ это не язык Си++? Правильно ли я понял?
Да, множество синтаксически верных строк — это не весь язык С++. Стандарт С++ об этом говорит неявно, стандарт С об аналогичном — совершенно явно. Синтаксис языка С++ определяет надмножество wellformed элементов трансляции языка С++. Дополнительно к этому, в классической теории (заглянул в найденый но только отрывок ахоульмана) принято грамматикой описывать не далее, чем синтаксис.
Вы ранее wellformed программы надывали просто корректными с точки зрения программами и отождествляли это понятие с синтаксически верными программами.
M>Если так, то спорить бесполезно, вопрос лишь в терминологии.
Да это так. И если бы Вы не хотели доказать, что Ваша терминология правильная, то и спора не было. Закончилось бы все на моем уточнении выводов по теме.
M>Поэтому, давайте прекратим все эти терминологические прения, называйте язык си++ как Вам хочется, в неформальной беседе это позволительно, хотя часто ведет к непониманию.
Здесь, на этом форуме, принято, что по всем вопросам касающимся С++, стандарт имеет первоочередное значение.
WC>>Аргументы выше, но проблема в том, что для Вас стандарт С++ — не авторитет. И это входит в некоторое противоречие с данным разделом форума. M>Мне это напоминает спор богословов, так рапространенный в Средние века. Ссылки на Библия (т.е. Стандарт) и тому подобное .
Ура! Мой оппонент наконец то начинает понимать суть вещей.
У него своя церковь и свое первостепенноважное писание (Ахо и Ульман и Кнут), а у меня (тут с анонимом оказались на одной стороне) свое (Стандарт). Причем, мы ни в коей мере не отвергаем писания моего оппонента, но наше писание содержит указания к какому месту нужно прикладывать лик Ахоульмана с пятнадцатой страницы писания оппонента для полного исцеления болячки. Мой же оппонент, однако, игнорирует наше писание и прикладывает лик совсем к другому месту, после чего нам же доказывает, что его Ахоульман на болячку не действует, а спасти может только Кнут ...
M>Я не обидился, я просто указал на то, что Вы пытаетесь привнести в дискуссию понятия, не относящиеся к теме.
Если бы Вы отвечали на это сообщение, то я бы на это написал: "Конкретно перечислите, пожалуйста!"
M>Потом, на сектанта то чего обижаться? Я то как раз ортодокс большой Церкви, где и Ахо и Ульман и Кнут и иже с ними, так сказать, житие наше.
Да, наверное, Вы правы, сектант не точное описание — Вы просто иудей, а мы здесь — христиане.
M>Да нет, мне она сейчас уже не кажется сложной. Просто я оцениваю время, потраченное мною на изучение этой теории.
А у меня, как помню, формальная терия вероятности очень туго шла. Так я и не стал ей впоследствии уделять время.
M>И, если это не аргумент, то Вы могли бы оценить сложность теории, попытавшись понять ту грамматику, которую я уже представлял выше.
Наивный чукотский юноша!
(модератор, можешь выдавать предупреждение)
M>А это довольно простой пример на самом деле. и, конечно, к программированию это уже не относится совершенно.
Простой. Да. Но почему, тогда Вы имея этот простой пример и зная теорию не можете построить грамматику для меня? Почему, человек, знающй теорию, не может хотя бы обьяснить мне, КАК построить эту чертову грамматику или даже хотя бы не обоснует, что у нее будет КОНЕЧНОЕ число правил и не оценит хотя бы грубо сверху это число??? Почему мне хотят, что-то доказать, но реально доказывать или опровергать должен я сам???
M>Я вообще предлагаю завершить весь этот разговор, так как это не приведет ни к чему. Тем более, что правы все 6-). Если хотите, то напишите ответ на это сообщение, я же отвечать уже не вижу необходимости.
Не возражаю.
Здравствуйте, mefrill, Вы писали:
M>Вот, полностью поддерживаю, если хотите, могу Вам ссылки на такую литературу дать и также номера страниц, откуда я цитаты выдергивал.
Да, пожалуйста. А если книги в электронном виде, то вообще здорово будет.
Моюно в аську: 158153635.
Здравствуйте, mefrill, Вы писали:
M>Вот, полностью поддерживаю, если хотите, могу Вам ссылки на такую литературу дать и также номера страниц, откуда я цитаты выдергивал.
Да, пожалуйста. А если книги в электронном виде, то вообще здорово будет.
Можно в аську: 158153635.
Здравствуйте, WeCom, Вы писали:
WC>Здравствуйте, mefrill, Вы писали:
M>>Вот, полностью поддерживаю, если хотите, могу Вам ссылки на такую литературу дать и также номера страниц, откуда я цитаты выдергивал.
WC>Да, пожалуйста. А если книги в электронном виде, то вообще здорово будет. WC>Моюно в аську: 158153635.
M>>А это довольно простой пример на самом деле. и, конечно, к программированию это уже не относится совершенно. WC>Простой. Да. Но почему, тогда Вы имея этот простой пример и зная теорию не можете построить грамматику для меня? Почему, человек, знающй теорию, не может хотя бы обьяснить мне, КАК построить эту чертову грамматику или даже хотя бы не обоснует, что у нее будет КОНЕЧНОЕ число правил и не оценит хотя бы грубо сверху это число??? Почему мне хотят, что-то доказать, но реально доказывать или опровергать должен я сам???
А с чего Вы взяли, что я не могу построить грамматику для Вашего языка??? Я где-то про это писал??? Я Вам привел простой пример грамматики и совершенно не виноват в том, что Вы не смогли понять что там написано. Почему я не привел грамматику для Вашего языка? Да просто потому, что здесь не курсы по (такой простой) теории формальных языков. Я Вам попытался это объяснить, но вместо ответа получил обвинения в некомпетентности. Но, все-таки отвечу на несправедливые обвинения. Ниже приведена (и объяснена!) грамматика для Вашего языка:
Первые продукции позволяют генерировать последовательности пар идентификаторов, разделенных нулем:
S --> A 0 S | A
Вторая группа продукций позволяет генерировать последовательность нетерминалов B и, равную ей по числу, последовательность нетерминалов C. Обе последовательности разделены при этом нулем.
A --> B A C | B 0 C
Эти правила позволяют генерировать последовательности вида BBB 0 CCC 0 BB 0 CC. Теперь самое трудное, необходимы правила, чтобы менять последовательность нетерминалов C и стоящую справа строку из B или C местами. Т.е. если есть строка BBB 0 CCC 0 BB 0 CC, то получить из нее строку BBB 0 CCC 0 BB 0 CC. Добавим соответствующие правила:
1) C 0 --> 0 D
2) D B --> E F
3) D E --> E F
4) F B --> B F
5) 0 E --> B 0
6) 0 F --> 0 C
7) C F --> C C
Это группа правил, чтобы менять местами строки CCC... и BBB.... Попытаемся показать их применение:
Пусть, с помощью правил первой и второй групп, мы породили строку вида ... 0 CCC 0 BB 0 ... Здесь нам надо поменять местами эти строки, сначала с помощью 1) смещаем влево нуль, идущий после CCC и попутно заменяем все C на D.
0 CCC 0 BB 0 ==> 0 CC 0 D BB 0 ==> 0 C 0 DD BB 0 ==> 0 0 DDD BB 0
Теперь используем правила 2) — 4) чтобы поменять DDD и BB местами, попутно заменяя каждый D на F, а B на E.
0 0 DDD BB 0 ==> 0 0 DD E F B 0 ==> 0 0 D E FF B 0 ==> 0 0 E FFF B 0 ==> 0 0 E FF E F 0 ==> ... ==> 0 0 EE FFF 0
Сейчас применяем правило 5) чтобы перевести нуль обратно направо и попутно заменить все E на B.
Аналогично, создаем группу правил чтобы менять строки из C на строки из C, например, CCC 0 CC на CC 0 CCC.
Последняя группа правил позволяет заменить B и C на единицу.
B --> 1
C --> 1
теперь, если нам необходимо вывести строку типа 111 0 11 01 0 1 0 111 0 11 просто генерируем строку
BBB 0 CCC 0 BB 0 CC 0 B 0 C
и приводим ее к следующему виду BBB 0 BB 0 B 0 C 0 CCC 0 CC После чего применяем правила последней группы.
Все ли здесь понятно мудрому белорусскому вьюноше?
M>>Я вообще предлагаю завершить весь этот разговор, так как это не приведет ни к чему. Тем более, что правы все 6-). Если хотите, то напишите ответ на это сообщение, я же отвечать уже не вижу необходимости. WC>Не возражаю.
Здравствуйте, WeCom, Вы писали:
WC>Здравствуйте, mefrill, Вы писали:
M>>Вот теперь, действительно, в последний раз. WC>Раз уж решили ответить, теперь не торопитесь, пожалуйста. Тем более, что Вам захочется ответить мне, еще как минимум один раз.
M>>А с чего Вы взяли, что я не могу построить грамматику для Вашего языка??? WC>Тат я немного о другом... Знаете, когда жена в досаде мужу говорит "Ну почему ты даже мусор вынести не можешь?!!"
M>>Почему я не привел грамматику для Вашего языка? Да просто потому, что здесь не курсы по (такой простой) теории формальных языков. Я Вам попытался это объяснить, но вместо ответа получил обвинения в некомпетентности.
WC>Понимаете ли, вопрос Вашей компетентности или некомпетентности для меня важен только опосредованно. Мне сейчас (и всё больше) интересен вопрос возможности построения КЗ-грамматики для wellformed С++ языка (буду добавлять wellformed, чтобы не путать с синтаксическим языком С++). С недостаточностью КС — понятно. WC>Попутно к этому меня заинтересовала фраза анонима о неформализуемости требования "определение перед использованием". Причем, если он ошибается, то мне интересно не просто узнать это и точка, а понять в чем конкретно ошибка и откуда ноги растут у такого заявления.
Ну, с Анонимом, я полагаю, все ясно?
WC>Аноним, если сейчас читаете, проясните пожалуйста по ногам?
M>>Ниже приведена (и объяснена!) грамматика для Вашего языка: M>>S --> A 0 S | A M>>A --> B A C | B 0 C M>>Эти правила позволяют генерировать последовательности вида BBB 0 CCC 0 BB 0 CC.
WC>Вот какие уже на этом месте меня посетили мысли:
WC>1.Какую из двух предложенных альтернатив языка выбрал мой оппонент? WC> По примеру (и другим примерам далее) выглядит, что условие "ровно два одинаковых", но с другой стороны те же правила генерируют и BBB 0 CCC 0 BBB 0 CCC. Значит выбрано "два и более одинаковых". Да, но тогда у нас выпадает строка BBB 0 CCC 0 ССС (или некий ее аналог), так что цепочки с нечетным колличеством одинаковых идентификаторов грамматика точно не распознает.
WC>2.Дальше я пока, извините, недостаточно внимательно анилизировал (но конечно же обязательно это сделаю, как только смогу), потому что все мои мысли заняла вот какая гиппотеза: WC>А может быть ошибка утверждения анонима в том, что вместо правила "определение перед использованием" должно бы было указано правило "одного описания" (One Definition Rule). Может быть его нельзя выразить порождающей грамматикой? Если бы это было так, то тогда стало бы понятно почему в самом Стандарте это правило идет особняком (этот вопрос тоже у меня отложился и пока правильного ответа нет). В общем я твердо понял, что мне нужно эту гиппотезу проверить.
WC>3.Я изменил язык своей грамматики на "идентификаторы без повторений" и попытался придумать схему (логику) грамматики. Можно было бы разбираться с языком "ровно два одинаковых", но лучше ведь упрощать, чтобы оставалась и была видна суть проблемы и решения, правильно? Попытки мои окончились безуспешно — мне не удалось построить такую грамматику. При попытке доказать или опровергнуть тезис существования такой грамматики я понял, что здесь моего уровня знаний без обращения к специальной литературе, которой у меня нет, точно недостаточно...
WC>Если Вы строили грамматику для "два и более одинаковых": WC>По моим прикидкам, доработать первые два правила вполне возможно (укажите, если я ошибаюсь). Тогда, правда, вопрос об "One Definition Rule" пока останется для меня открытым, но я надеюсь в специальной литературе ссылки на которую Вы мне дадите, я смогу на него найти ответ.
WC>Если Вы строили грамматику для "ровно два одинаковых": WC>Это бы было интересней пердыдущего случая. Тогда Вы, думаю, и без моей дополнительной просьбы сами или подтвердите или опровергните мою гиппотезу, потому что исправлять некорректную грамматику то надо.
Вы, наверное, уже увидели, что порождающая грамматика это, ни что иное, как недетерминированная машина Тьюринга, а попросту говоря, недетерминированный алгоритм генерации текста. При построении удобнее попрождающую грамматику именно в таком ракурсе. Я не буду приводить конкретные правила, а приведу пути как это можно сделать. Вас, как я понял, интересует язык, в котором было-бы только одно объявление идентификатора и множество использований, т.е. одно BBB... и много CCC... ? это сделать можно. Разделим нашу программу на две процедуры (точно также как в си). Первая процедура будет генерировать различные строки вида BBB... , проверяя при этом, нет ли уже такой строки в тексте. Это, опять-же, можно разбить на две процедуры, одна — генерации, другая — проверки. Первая генерирует множество символов-нетерминалов грамматики, обозначим эти символы-нетерминалы-состояния через M например. Все уже проверенные нетерминалы обозначим через K. После того, как строка MMM... порождена, переходим в состояние сравнения со строками, состоящими из символов K. Если есть уже такая строка, то терминальная строка не будет порождена. это, вообще, главный инструмент, не позволяющий строить не верные терминальные цепочки. Если еще такой строки нет, то переименовываем все M в K. после окончания фазы генераии переименовываем все K в B. Таким образом, после того как сгененрировано множество из различных BBB... строк, запускаем вторую процедуру, которая из каждой BBB... строки может построить неограниченное число копий вида CCC... Это несложно сделать, тем более что, в отличии от машины Тьюринга, мы можем как-бы раздвигать ленту путем применения правил вида AB --> ABC. На самом деле, достаточно группы правил, позволяющих создавать ОДНУ CCC... копию строки BBB... , а потом эти правило можно применять сколько угодно раз. После этого уже запускаем процедуру для продвижения по ленте вправо строк CCC... как это уже было описано. Так как двигаются только строки CCC... и только вправо, то правило объявления имени перед использованием будет соблюдено. Все.
Я Вам советую, если вы действительно хотите разобраться в вопросе, сначала понять грамматику, приведенную мною, а уже потом попытаться разобраться в написанном выше. На русском языке есть три хорошие книжки:
Гладкий — 1973. Теория формальных языков, по-моему так называется. Эта книжка требует подготовки и поэтому, будет читаться очень трудно.
Ахо, Ульман — 1978. Теория ситаксического анализа, перевода и компиляции. Неплохая книжка, но по Кз-граммтаикам там написано очень мало. Издание жтой книги для нематематиков вышло в 1986 и называется книгой красного дракона.
Ульман, Хопкрофт, Мотвани — 2002 (2003)? Введение в теорию языков, автоматов и вычислений. Хорошая, написанаая ясным языком, но поэтому неглубокая книжка, первое издание было лучше, но на русском, к сожалению, не издано. В главе про ограничения КС-грамматик прямо написано почему язык из двух, идущих подряд, одиннаковых имен, неможет быть описан КС-грамматикой. Смотрите в сторону леммы о накачке для КС-языков. Другая формулировка — лемма Огдена. Она же есть и в Ахо, Ульман.
M>>Все ли здесь понятно мудрому белорусскому вьюноше? WC>И не надейтесь WC>Как видите вопросы начались уже с первых строк. WC>Без внимания не оставлю и все остальное, все непонятности буду формулировать.
Re[39]: Граматика С++
От:
Аноним
Дата:
13.08.04 02:57
Оценка:
WC>Понимаете ли, вопрос Вашей компетентности или некомпетентности для меня важен только опосредованно. Мне сейчас (и всё больше) интересен вопрос возможности построения КЗ-грамматики для wellformed С++ языка (буду добавлять wellformed, чтобы не путать с синтаксическим языком С++). С недостаточностью КС — понятно.
WC>Попутно к этому меня заинтересовала фраза анонима о неформализуемости требования "определение перед использованием". Причем, если он ошибается, то мне интересно не просто узнать это и точка, а понять в чем конкретно ошибка и откуда ноги растут у такого заявления.
WC>Аноним, если сейчас читаете, проясните пожалуйста по ногам?
Проясняю! Аноним никогда не говорил о неформализуемости требования, чтобы переменная была обьявлена до использования. Все что аноним говорил, это то, что на данном этапе при описании языка программирования формализации поддаются только лексика и синтаксис. Такие же требования как объявление имени до использования, соответствие количества и типов аргументов и параметров функции и т.д. не поддаются формальному описанию и излагаются неформально. Это не значит, что в будущем не будет найден метод для формализации и этих утверждений, но пока что делается так как я сказал. Не сомневаюсь, что с этим Вы согласны.
WC>1.Какую из двух предложенных альтернатив языка выбрал мой оппонент? WC> По примеру (и другим примерам далее) выглядит, что условие "ровно два одинаковых", но с другой стороны те же правила генерируют и BBB 0 CCC 0 BBB 0 CCC. Значит выбрано "два и более одинаковых". Да, но тогда у нас выпадает строка BBB 0 CCC 0 ССС (или некий ее аналог), так что цепочки с нечетным колличеством одинаковых идентификаторов грамматика точно не распознает.
WC>2.Дальше я пока, извините, недостаточно внимательно анилизировал (но конечно же обязательно это сделаю, как только смогу), потому что все мои мысли заняла вот какая гиппотеза:
WC>А может быть ошибка утверждения анонима в том, что вместо правила "определение перед использованием" должно бы было указано правило "одного описания" (One Definition Rule). Может быть его нельзя выразить порождающей грамматикой? Если бы это было так, то тогда стало бы понятно почему в самом Стандарте это правило идет особняком (этот вопрос тоже у меня отложился и пока правильного ответа нет). В общем я твердо понял, что мне нужно эту гиппотезу проверить.
Это правило идет особняком т.к. к синтаксису никакого отношения не имеет, да и КС грамматики явно недостаточно. На счет других грамматик не знаю, но интуитивно чувствую, что если и можно это как-то формализовать, то не при помощи грамматик. Вот как Вы, к примеру, выразите через грамматику, чтобы типы аргументов и параметров функции совпадали?
WC>3.Я изменил язык своей грамматики на "идентификаторы без повторений" и попытался придумать схему (логику) грамматики. Можно было бы разбираться с языком "ровно два одинаковых", но лучше ведь упрощать, чтобы оставалась и была видна суть проблемы и решения, правильно? Попытки мои окончились безуспешно — мне не удалось построить такую грамматику. При попытке доказать или опровергнуть тезис существования такой грамматики я понял, что здесь моего уровня знаний без обращения к специальной литературе, которой у меня нет, точно недостаточно...
У меня тоже не хватает. КЗ грамматики, насколько я знаю, еще мало изучены, да и вряд ли тут дело в грамматиках. В естественных языках ведь синтаксис и семантика — два разных раздела.
Может мефрилл тут выведет что-нибудь...
WC>Если Вы строили грамматику для "два и более одинаковых": WC>По моим прикидкам, доработать первые два правила вполне возможно (укажите, если я ошибаюсь). Тогда, правда, вопрос об "One Definition Rule" пока останется для меня открытым, но я надеюсь в специальной литературе ссылки на которую Вы мне дадите, я смогу на него найти ответ.
А спросить кого-нибудь из ученых? Того же Страуструпа. Если вопрос ему понравится, то, думаю, что ответит.
WC>Если Вы строили грамматику для "ровно два одинаковых": WC>Это бы было интересней пердыдущего случая. Тогда Вы, думаю, и без моей дополнительной просьбы сами или подтвердите или опровергните мою гиппотезу, потому что исправлять некорректную грамматику то надо.
Здравствуйте, <Аноним>, Вы писали:
SJA>>Как то странно узнать, что КС граматика зависит от контекста.... SJA>>Или может разработчики компиляторов — не показатель ? А>Купи эти книжки: здесь и здесь. Не имеет смысла задавать вопросов не зная основ.
Вобщем, если кому-то ещё интересно.
В книге А.Ю. Молчанова "Системное программное обеспечение" говориться следующее:
Глава 5.
Здесь уже неоднократно упоминалось, что практически все языки программирования, строго говоря, не являються КС-языками. Поэтому полный разбор исходной программы компилятор не может выполнить в рамках КС-языков с помощью КС-грамматик и МП-автоматов. Полный распознаватель для большинства языков программирования может быть построен в рамках КЗ-языков, поскольку все реальные языки программирования контекстно-заввисимы(*)/
(*)
Примером контекстной зависимости, часто встречающейся во многих языках программирования, может служить необхдимость предварительно описать идентификатор до его первого использования.
Здравствуйте, Аноним, Вы писали:
А>Это пример из русского языка. Как видите, с точки зрения русской грамматики параграф и все предложения верны, но тем не менее смысла они не имеют. Точно также и с С++. Даже Лаптев, вон, выше заметил, что языки описываются КС грамматиками. Ш>>Это и означает, что C++ не контекстно свободный язык. А>Ваш вывод (неверный, кстати) основан на вашем же и утверждении.
Грамматика — контекстно-свободная. а язык — контекстно-зависимый
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Sergey J. A., Вы писали:
SJA>Является ли грамматика С++ контекстнозависимой ? Если да, то можно простенький пример ? SJA>Мне кажется, что да, и пример — x(); неясно вызов это функции x или создание объекта типа x. Но я не уверен...
Контекстно зависимой является даже грамматика простого Си!
например:
free(ptr);
может быть разобрано либо как statement — вызов функции free с аргументом ptr
либо как declaration — определение переменной ptr типа free.
Все зависит от контекста. Было ли выше написано
typedef int free;
или нет.
Re[21]: Граматика С++: FYI
От:
Аноним
Дата:
20.08.04 05:52
Оценка:
SJA>Вобщем, если кому-то ещё интересно. SJA>В книге А.Ю. Молчанова "Системное программное обеспечение" говориться следующее: SJA>Глава 5. SJA>
Здесь уже неоднократно упоминалось, что практически все языки программирования, строго говоря, не являються КС-языками. Поэтому полный разбор исходной программы компилятор не может выполнить в рамках КС-языков с помощью КС-грамматик и МП-автоматов. Полный распознаватель для большинства языков программирования может быть построен в рамках КЗ-языков, поскольку все реальные языки программирования контекстно-заввисимы(*)/
SJA>(*)
SJA>Примером контекстной зависимости, часто встречающейся во многих языках программирования, может служить необхдимость предварительно описать идентификатор до его первого использования.
Автор абсолютно прав. Язык программирования С++ и формальный язык описанный грамматикой языка программирования С++ — две разные вещи. Термин контекстно-зависимый применяется только к формальным языкам.
Я бы сказал, что тут у него не совсем удачная формулировка. Та контекстная зависимость о которой он говорит тут не имеет ничего общего с КЗ в теории формальных языков. В более ранних главах, он, по-моему, лучше выражает свою мысль, хотя книга очень хорошо и доступно написана.
А ты уже добрался до пятой главы или также как WolfHound выдираешь отдельные фразы не понимая всей сущности?
Здравствуйте, Nick_, Вы писали:
N_>Контекстно зависимой является даже грамматика простого Си!
Еще раз повторяю: грамматика — контекстно-свободная, а язык — контекстно-зависимый! И не надо путать.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[23]: Граматика С++: FYI
От:
Аноним
Дата:
20.08.04 07:06
Оценка:
SJA>Выдираю. Пока добрался только до середины 4-ой главы, но решил запостить, пока топик совершенно не забылся....
Быстро, однако... А со всем разобрался хоть или просто решил примкнуть к лагерю любителей КЗ?
Re[3]: Граматика С++
От:
Аноним
Дата:
20.08.04 07:56
Оценка:
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, Nick_, Вы писали:
N_>>Контекстно зависимой является даже грамматика простого Си! LVV>Еще раз повторяю: грамматика — контекстно-свободная, а язык — контекстно-зависимый! И не надо путать.
Я не знаю, что такое контекстно-зависимый язык в Вашем понимании. Но контекстно-зависимый язык в определении А.Ахо и Дж.Ульмана не может быть порожден контекстно-свободной грамматикой.
Здравствуйте, <Аноним>, Вы писали:
SJA>>Выдираю. Пока добрался только до середины 4-ой главы, но решил запостить, пока топик совершенно не забылся.... А>Быстро, однако... А со всем разобрался хоть или просто решил примкнуть к лагерю любителей КЗ?
Регулярные граматики пошли легко... А вот КС уже идёт сложнее....
Ш>Контекстно-зависимый язык -- это язык, который может быть порожден контекстно-свободной грамматикой и не может быть порожден контекстно-свободной. И нет никакого другого понимания.
Здравствуйте, Nick_, Вы писали:
Ш>>Контекстно-зависимый язык -- это язык, который может быть порожден контекстно-свободной грамматикой и не может быть порожден контекстно-свободной. И нет никакого другого понимания.
N_>Бред какой-то...
Это просто опечатка, следует читать так:
Контекстно-зависимый язык -- это язык, который может быть порожден контекстно-зависимой грамматикой и не может быть порожден контекстно-свободной.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, LaptevVV, Вы писали:
LVV>>Здравствуйте, Nick_, Вы писали:
N_>>>Контекстно зависимой является даже грамматика простого Си! LVV>>Еще раз повторяю: грамматика — контекстно-свободная, а язык — контекстно-зависимый! И не надо путать.
А>Я не знаю, что такое контекстно-зависимый язык в Вашем понимании. Но контекстно-зависимый язык в определении А.Ахо и Дж.Ульмана не может быть порожден контекстно-свободной грамматикой.
А он и не порождается! В том то и дело, что грамматика используется только для распознавания синтаксически правильных конструкций. А контекстные зависимости, о которых тут все время говорили (единственность объявления, "сначала объяви — потом используй), обрабатываются НЕФОРМАЛЬНЫМИ способами (таблица имен).
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
M>Это просто опечатка, следует читать так:
M>Контекстно-зависимый язык -- это язык, который может быть порожден контекстно-зависимой грамматикой и не может быть порожден контекстно-свободной.
Правильно, я сам так и считаю.
Я не понимаю, что означают слова LaptevVV: "Еще раз повторяю: грамматика — контекстно-свободная, а язык — контекстно-зависимый! И не надо путать."
LVV>А он и не порождается! В том то и дело, что грамматика используется только для распознавания синтаксически правильных конструкций. А контекстные зависимости, о которых тут все время говорили (единственность объявления, "сначала объяви — потом используй), обрабатываются НЕФОРМАЛЬНЫМИ способами (таблица имен).
У вас какая-то каша в голове.
В приведенном мною выше примере на языке Си, как раз и есть синтаксическая контекстная зависимость!
вы не можете написать:
while(free(ptr));
Если перед этим был typedef int free;
Возникнет СИНТАКСИЧЕСКАЯ ошибка.
А то что вы говорите про "сначала объяви — потом используй" — это уже семантическая ошибка, которая обнаруживается не во время синтаксического анализа, а уже после того как дерево разбора будет построено.
Здравствуйте, Шахтер, Вы писали:
Ш>Здравствуйте, Nick_, Вы писали:
LVV>>>А он и не порождается! В том то и дело, что грамматика используется только для распознавания синтаксически правильных конструкций. А контекстные зависимости, о которых тут все время говорили (единственность объявления, "сначала объяви — потом используй), обрабатываются НЕФОРМАЛЬНЫМИ способами (таблица имен).
N_>>У вас какая-то каша в голове. N_>>В приведенном мною выше примере на языке Си, как раз и есть синтаксическая контекстная зависимость! N_>>вы не можете написать:
N_>>
N_>>while(free(ptr));
N_>>
N_>>Если перед этим был typedef int free;
N_>>Возникнет СИНТАКСИЧЕСКАЯ ошибка.
N_>>А то что вы говорите про "сначала объяви — потом используй" — это уже семантическая ошибка, которая обнаруживается не во время синтаксического анализа, а уже после того как дерево разбора будет построено.
Ш>Подобные сорта деления на синтаксические (лучше было бы сказать -- грамматические, поскольку они возникают из-за несоответствия грамматике) и семантические ошибки имеют смысл только в контексте какого-то определённого способа компиляции языка. К самому языку это прямого отношения не имеет.
Совершенно верно указано. Это характеристика метода компиляции, а не языка.
Ш>>Подобные сорта деления на синтаксические (лучше было бы сказать -- грамматические, поскольку они возникают из-за несоответствия грамматике) и семантические ошибки имеют смысл только в контексте какого-то определённого способа компиляции языка. К самому языку это прямого отношения не имеет.
M>Совершенно верно указано. Это характеристика метода компиляции, а не языка.
Ошибаетесь.
Приведу другой пример: синтаксически неверная программа с точки зрения языка
int main()
{
int x;
free(ptr);
int y;
return 0;
}
Тем не менее это может быть верно, если в начале есть typedef int free;
Ш>>>Подобные сорта деления на синтаксические (лучше было бы сказать -- грамматические, поскольку они возникают из-за несоответствия грамматике) и семантические ошибки имеют смысл только в контексте какого-то определённого способа компиляции языка. К самому языку это прямого отношения не имеет.
M>>Совершенно верно указано. Это характеристика метода компиляции, а не языка.
N_>Ошибаетесь. N_>Приведу другой пример: синтаксически неверная программа с точки зрения языка
N_>
N_>int main()
N_>{
N_> int x;
N_> free(ptr);
N_> int y;
N_> return 0;
N_>}
N_>
N_>Тем не менее это может быть верно, если в начале есть typedef int free;
Ну, если впереди, в тексте программы, есть typedef int free;, то программа будет синтаксически верной. В чем проблема?
M>Ну, если впереди, в тексте программы, есть typedef int free;, то программа будет синтаксически верной. В чем проблема?
Это я к тому, что метод компиляции тут не при чем.
Кусок программы является либо синтаксически верным, либо нет, в зависимости от контекста. А это и есть контекстная зависимость.
Здравствуйте, Nick_, Вы писали:
M>>Ну, если впереди, в тексте программы, есть typedef int free;, то программа будет синтаксически верной. В чем проблема?
N_>Это я к тому, что метод компиляции тут не при чем. N_>Кусок программы является либо синтаксически верным, либо нет, в зависимости от контекста. А это и есть контекстная зависимость.
Ну что еще за "кусок программы"? И что за "контекст" такой? Определение контекстной зависимости языка было дано выше, поищи.
Здравствуйте, mefrill, Вы писали:
M>Здравствуйте, Nick_, Вы писали:
M>>>Ну, если впереди, в тексте программы, есть typedef int free;, то программа будет синтаксически верной. В чем проблема?
N_>>Это я к тому, что метод компиляции тут не при чем. N_>>Кусок программы является либо синтаксически верным, либо нет, в зависимости от контекста. А это и есть контекстная зависимость.
M>Ну что еще за "кусок программы"? И что за "контекст" такой? Определение контекстной зависимости языка было дано выше, поищи.
Кусок:
int main()
{
int x;
free(ptr);
int y;
return 0;
}
Контекст — это то что выше и то что ниже.
Определение контекстной зависимости дано выше, подумай головой.
Здравствуйте, Nick_, Вы писали:
N_>Здравствуйте, mefrill, Вы писали:
M>>Здравствуйте, Nick_, Вы писали:
M>>>>Ну, если впереди, в тексте программы, есть typedef int free;, то программа будет синтаксически верной. В чем проблема?
N_>>>Это я к тому, что метод компиляции тут не при чем. N_>>>Кусок программы является либо синтаксически верным, либо нет, в зависимости от контекста. А это и есть контекстная зависимость.
M>>Ну что еще за "кусок программы"? И что за "контекст" такой? Определение контекстной зависимости языка было дано выше, поищи.
N_>Кусок:
N_>
N_>int main()
N_>{
N_> int x;
N_> free(ptr);
N_> int y;
N_> return 0;
N_>}
N_>
N_>Контекст — это то что выше и то что ниже.
N_>Определение контекстной зависимости дано выше, подумай головой.
вот этот самый кусок не является синтаксически верным. Что такое free? С таким же успехом я пишу:
a + b = c
Является этот кусок синтаксически верным? Высказывание типа Контекст — это то что выше и то что ниже это цитата? Где такое определение можно прочитать, не мог бы подсказать?
Здравствуйте, mefrill, Вы писали:
M>Здравствуйте, Nick_, Вы писали:
N_>>Я не понимаю, что ты хочешь мне доказать? N_>>То что я не прав? Или то что грамматика Си — контекстно свободна?
M>Да ничего не хочу... Только показал, что пример немного некорректен и понятие контекста неверно определено.
Зачем разводить бессмысленную дискуссию?
Если ты понял о чем я, но заметил неточность — привел бы более точный пример.