Re[16]: КС и КЗ грамматики
От: prVovik Россия  
Дата: 19.11.04 13:30
Оценка: +3 -3 :)
Здравствуйте, AndrewVK, Вы писали:

AVK>Но грамматика C# КЗ, а С++ КС. Получается что ты опроверг свое первоначальное утверждение .

Неправда. Практически все языки программирования являются КЗ (о КС языках я не слышал)


Пример:

1) корректная программа:
    int a = 3;
    a = a * 10;


2) некорректная программа:
    char *a = "hello, world";
    a = a * 10;


Можешь написать КС грамматику, из которой будет выводиться программа №1, но не будет выводится программа №2 ?
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[30]: Качество стандарт
От: Павел Кузнецов  
Дата: 26.11.04 02:15
Оценка: 51 (4) +1 -1
VladD2,

>>> 1. Это уже другая граматика. В спецификации четко сказано, что identifier — это токен.


> ПК> Ну и что, что другая грамматика?


> Вопрос был "Является ли граматика CS КСГ?". Других вопросов не было. То что ты утверждаешь, что является — это твои личные заблуждения.


Если ты так настаиваешь, мы можем сузить обсуждение и до менее интересного вопроса, а именно, является ли грамматика C#, написанная в стандарте, контекстно-свободной. Менее интересным он является по элементарной причине: грамматика, составленная только из правил вывода, собранных в спецификации C#, по определению будет являться контекстно-свободной, т.к. все правила вывода имеют вид:

<нетерминал>:
<последовательность терминалов и нетерминалов>


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

Таким образом, если ты утверждаешь, что грамматика, составленная из правил, перечисленных в стандарте C# (назовем ее "базовой"), не является контекстно-свободной, то это уже твои личные заблуждения.

Если же ты говоришь о какой-то грамматике, которая подразумевается стандартом (в том числе не содержит неоднозначностей, присутствующих в "базовой" грамматике), то почему ты полагаешь, что она является именно контекстно-зависимой? Ведь ее можно будет представить множеством способов, и разные грамматики будут принадлежать к разным типам.

Пока что неоднозначностей, которые нельзя было разрешить соответствующей контекстно-свободной грамматикой, представлено не было.

А если таковые появятся, то почему ты полагаешь, что получившаяся грамматика будет контекстно-зависимой, а не, скажем, грамматикой с фразовой структурой?

> Вопросы тут не обсуждаются. Обсуждаются утверждения
Автор: vdimas
Дата: 19.11.04
причем не верные.


Да, в цитате присутствует одно неверное утверждение о том, что свойства C# не удается представить контекстно-свободной грамматикой. Как уже было показано даже двумя способами, удается, и очень просто.

> ПК> Как видишь, добавление к синтаксису языка свойств на манер C#, со всем "контекстно-зависимыми" ключевыми словами, на возможность представления его контекстно-свободной грамматикой не влияет.


> Граматика не является КСГ. И это очевидно как божий день.


Как божий день очевидно, что определение того, является ли грамматика контекстно-свободной, которым ты пользуешься, не соответствует общепринятому. Или то, что ты периодически меняешь одну обсуждаемую грамматику на другую. А относительно того, что грамматика не является контекстно-свободной, я очевидного ничего не вижу. Скорее, наоборот. В общем, не убедил

> ПК> Это уже не относится к тому, можно ли представить синтаксис свойств контекстно-свободной грамматикой.


> Это относится к сути вопроса. Все парсеры C# имеют КЗ-расширения.


Что такое КЗ-расширение парсера? Как ты справедливо говоришь ниже, в грамматике подобных понятий нет. В книгах по разработке компиляторов я тоже таких терминов не встречал. Определение, цитату или ссылку на какой-нибудь авторитетный источник, пожалуйста.

> ПК> При работе со всевозможными генераторами парсеров грамматику преобразовывать не только можно, но и нужно, чтобы привести ее к виду, понимаемому соответствующим инструментом (устранение неоднозначностей, левой рекурсии и т.п.).


> В граматике Шарпа нет ни одного не описанного в спецификации места не удовлетворющего LALR(1)-требоавниям.


Так... Тут вообще явное противоречие с тем, что ты говорил ранее. LALR(1)-грамматики являются подмножеством LR(1)-грамматик, которые, в свою очередь, являются подмножеством контекстно-свободных грамматик. Соответственно, если ты утверждаешь, что C# описывается LALR(1)-грамматикой, то он описывается и контекстно-свободной грамматикой.

> ПК> Предвосхищая твои возражения относительно стандарта C#, отвечаю, что он преобразовывать грамматику тоже не запрещает, т.к., как уже говорилось, на соответствие стандарту реализации используемая грамматика не влияет.


> В нем описана граматика. Преобразоывать ее а) не нужно, б) опасно несовместимостью.


Пока что, кроме заявлений, ты подтверждений этим словам не привел.

Стандарт, как уже много раз повторялось, грамматику модифицировать не запрещает. Более-менее подробные учебники по разработке компиляторов содержат раздел о соответствующих преобразованиях. Цитату из стандарта о критериях совместимости еще раз привести? Или привести из какого-нибудь учебника по построению компиляторов содержание с описанием преобразований грамматик?

Также смотри ниже классический пример неоднозначности, которая легко разрешается как раз модификацией грамматики.

> ПК> Это снова не влияет на представимость синтаксиса контекстно-свободной грамматикой, т.к. разрешение неоднозначности не зависит от значений идентификаторов, а требует только тривиального просмотра вперед.


> В граматике никаких просмотров нет.


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

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

Но в данном случае благодаря этому факту легко понять, что можно построить эквивалентную исходной грамматику, не содержащую первоначальных неоднозначностей, переписав соответствующие правила так, чтобы "неоднозначные" нетерминалы встречались только перед терминалами, использующимися для разрешения неоднозначностей.

Фактически, эта неоднозначность во многом аналогична классической неоднозначности if ... then ... / if ... then ... else ..., которая описана, наверное, в любом хорошем учебнике по компиляторам (например, у Ахо, Сети и Ульмана в разделе 4.3). К сожалению, описание слишком длинное, чтобы приводить полностью. Если кратко, то, например, такая контекстно-свободная грамматика приводит к неоднозначности:
stmt := if expr then stmt
       | if expr then stmt else stmt
       | other

Неоднозначность состоит в том, что грамматика не указывает, с каким if, какой else ассоциируется. В частности, строка:
if E1 then if E2 then S1 else S2

имеет два дерева разбора. Если посчитать, что "правильным" является дерево разбора, соответствующее словесному описанию, что else ассоциируется с ближайшим else, то эту неоднозначность можно устранить составив соответствующую контекстно-свободную грамматику:
stmt           := matched_stmt
                 | unmatched_stmt

matched_stmt   := if expr then matched_stmt else matched_stmt
                 | other

unmatched_stmt := if expr then stmt
                 | if expr then matched_stmt else unmatched_stmt

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

Возвращаясь к C# и его стандарту, не удивительно, что стандарт (как и многие другие спецификации), в данном случае идет по первому пути, т.к. его проще воспринимать, а от разработчиков компиляторов вполне можно ожидать как минимум знания основ разрешения подобных неоднозначностей:

if-statement:
   if ( boolean-expression ) embedded-statement
   if ( boolean-expression ) embedded-statement else embedded-statement

An else part is associated with the lexically nearest preceding if that is allowed by the syntax.


Однако, полагаю, должно быть понятно, что разработчики компилятора вместо внесения в процесс разбора "хаков" вполне могут изменить грамматику, указанным выше образом, и это никак не отразится на соответствии их продукта стандарту.

> В ней есть только правила и токены. Или терминалы и не терминалы.


Так будет неверно. В грамматике есть и правила, и нетерминалы, и терминалы. Все. Теперь, если мы от теории формальных языков перейдем к построению компиляторов, то в парсере терминалы будут представлены токенами, которые, если спуститься на уровень лексического анализа, будут представлены лексемами.

> Если в граматике есть два или более правила способных в одной и той же точке разобрать одно и тоже выражение, то эта краматика является неверной.


Не неверной, а неоднозначной. Неверной можно назвать грамматику, порождающую предложения, не принадлежащие к "правильному" синтаксису. А неоднозначная грамматика порождает верные предложения, но некоторые более, чем одним способом.

> Введение зависящих от контекса средств разрешения конфликтов и есть отсупление от принципов КСГ.


"Отсупление от принципов КСГ" звучит, конечно, угрожающе, но, к сожалению, в данном случае не вполне понятно, что ты понимаешь под "введением зависящих от контекста средств разрешения конфликтов", и как это соотносится с теорией.

Тебя не затруднит сформулировать, что же является "введением зависящих от контекста средств разрешения конфликтов" в терминах грамматик, а именно правил вывода, терминалов и нетерминалов? А то я таких терминов в теории формальных языков, описывающих, как ты выразился, "принципы КСГ", не встречал.

Если ты под этим подразумеваешь составление соответствующей контекстно-зависимой грамматики, описание чего приведено выше, то я не понимаю, чем же такое изменение контекстно-свободной грамматики, изложенной в спецификации C#, лучше, чем составление эквивалентной ей другой контекстно-зависимой грамматики, не содержащей оригинальных неоднозначностей.

Но еще меньше я понимаю, как на основе такой контекстно-зависимой грамматики ты будешь строить компилятор, раз уж мы о практике...

> Именно потому, что в граматике есть конфликты в спецификацию и были внесены оговорки. Они позволяют устранить неопределенности.


Вообще-то, от самого по себе наличия неоднозначностей грамматика контекстно-свободной быть не перестает. А для устранения неоднозначностей, как уже говорилось, кроме оговорок есть и соответствующие способы получения грамматик, эквивалентных в рамках заданных ограничений.

> ПК>как раз контекстно-свободной совершенно точно не является, т.к. там подобная неоднозначность разрешается как раз определением того, обозначает ли идентификатор G шаблон, или нет.


> Никакой принципиальной разницы. Просто те кто проектировал Шарп имел перед глазами горький опыт С++ и предложил более "дешовые" способы разрешения конфликтов.


Дык, принципиальная разница как раз в том, что для C++ соответствующие неоднозначности не могут быть устранены построением соответствующей контекстно-свободной грамматики, а для C#, как было показано, — могут.
Posted via RSDN NNTP Server 1.9 delta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[22]: КС и КЗ грамматики
От: Павел Кузнецов  
Дата: 22.11.04 06:34
Оценка: 1 (1) +4
VladD2,

> Ш> Учи матчасть, двоешник. В частности, разбери на досуге, что такое терминал и нетерминал.


> Переходить на оскорбления, значит расписываться в собстенной несостоятельности и не правоте. А раз так, разговаривать не очем.


> 2ПК: Ставить плюсы на сообщениях содержащих откровенные оскорбления, значит присоеденяться к ним.


В данном случае я согласен со вторым предложением сообщения Шахтера.

<off>
Тем не менее, пользуясь случаем, полагаю уместным обратить твое внимание на то, что я не воспринимаю факт называния кого-то "двоешнком" в сочетании с указанием на ошибки в неправильном употреблении базовых терминов большим оскорблением, чем неаргументированное "уличение" оппонента в "поверхносном знании принципов постоения компиляторов", в третьем лице, в сообщении, адресованном другому человеку, который к тому же напрямую обратился к тому, кого ты "уличаешь" за соответствующими разъяснениями, каковые последовали. И все это вместо реакции на прямое объяснение
Автор: Павел Кузнецов
Дата: 20.11.04
"уличаемым" своей позиции.

Не удивляйся, если обжигает, если сам принимаешь участие в подогревании атмосферы

Извини, но на любую попытку развития дискуссии в сторону обсуждения сравнительных характеристик оскорбительности данных приемов, равно как и объяснения, почему именно с твоей точки зрения кто-то недостаточно хорошо разбирается в той или иной области, отвечать не собираюсь: и без того уже не первый раз отвечаю на сообщения того типа, который обычно предпочитаю игнорировать. А именно, сообщения, в которых происходит переход к обсуждению личных качеств оппонента вместо обсуждения предмета дискуссии.

Реагировать буду только на сообщения по существу дискуссии.
</off>
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[20]: КС и КЗ грамматики
От: Шахтер Интернет  
Дата: 22.11.04 00:44
Оценка: +4 :)
Здравствуйте, VladD2, Вы писали: ...

Учи матчасть, двоешник. В частности, разбери на досуге, что такое терминал и нетерминал.
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
КС и КЗ грамматики
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 19.11.04 09:40
Оценка: +1 -3
Здравствуйте, vdimas, Вы писали:

AVK>>Что такое мощность?


V>совокупность всех допустимых цепочек, порождаемых правилом/системой правил.


Оно бесконечно в обоих случаях.

V>однако, КЗ грамматики обычно очень компактны в записи, именно из-за того, что одно и то же выражение может трактоваться по разному, в зависимости от контекста, т.е. можно ввести доп. промежуточные символы для краткости записи.


Так я не понял — КЗ мощнее КС или нет?

V>Контекстно-зависимые грамматики и грамматики с фразовой структурой в иерархии Хомского [...]. Хотя языки, определяемые грамматиками этих типов, являются более мощными, в то же время они сложнее для понимания, анализа и практического использования.

V>[/q]
V>Языки программирования: разработка и реализация. Т. Пратт, М. Зелковиц

[skip]

V>· Мягко контекстно-зависимые грамматики – будучи несколько более мощными, чем КС-грамматики, грамматики данного класса позволяют анализировать большинство типов синтаксически релевантных нелокальных связей.


Ага, значит КЗ мощнее КС. Но грамматика C# КЗ, а С++ КС. Получается что ты опроверг свое первоначальное утверждение .
... << RSDN@Home 1.1.4 beta 3 rev. 232>>

22.11.04 12:14: Ветка выделена из темы Качество стандарт
Автор: Павел Кузнецов
Дата: 13.11.04
— AndrewVK
AVK Blog
Re[30]: КС и КЗ грамматики
От: Павел Кузнецов  
Дата: 29.11.04 22:17
Оценка: +3 -1
VladD2,

> VD>>Ну, а теперь попытаемся ответить на вопрос "можно ли исходную граматику назвать КС?".


> ГВ>Какую именно?


> Граматику C# описанную в спецификации языка.


Раз разговор идет о контекстно-свободных и контекстно-зависимых грамматиках, то речь идет о классификации грамматик по Хомскому. Это означает, что, оставаясь в рамках общепринятой терминологии, под грамматикой следует понимать порождающую формальную грамматику. По определению таковой является набор терминалов, нетерминалов, и правил вывода.

Как ты недавно уже сказал, при обсуждении грамматики к указанным трем множествам ты добавляешь дополнительные текстовые описания, содержащиеся в стандарте, и направленные, например, на разрешение неоднозначностей. Однако в результате получается, что общепринятое определение контекстно-свободных, контекстно-зависимых и т.п. грамматик к тому, что понимаешь под грамматикой ты, вообще неприменимо.

Соответственно, либо давай обсуждать все в общепринятой терминологии, либо давай для всего свои определения.
Posted via RSDN NNTP Server 1.9 delta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[24]: КС и КЗ грамматики
От: vdimas Россия  
Дата: 20.11.04 07:51
Оценка: 14 (2) -1
Здравствуйте, VladD2, Вы писали:

VD>Если тебе нужно разжевать, то пожалуйста...


VD>в товоем описании вводятся три ключевых слова 'g' 'e' 't'. Стало быть вместо того чтобы страдать от того, что нельзя создать переменную с именем get, ты будеш страдать от того, что нгельзя создать целых 3 переменных. К тому же будет доступн синтаксис вроде: [...]

VD>а вот номальный эксесор распозноваться не будет, так как "get" лексером будет распозноваться как идентификатор (так как в языке он быть обязан).

запись 'g' 'e' 't' — это непрерывная цепочка терминалов "get", откуда тебе приснилось g_e_t?

VD>Реально работающий EBNF-код я тебе уже приводил: Re[19]: Качество стандарт
Автор: VladD2
Дата: 19.11.04


работать можно заставить что угодно, была бы настойчивость. КС грамматики разбираются КЗ-распознавателями, аналогично РГ разбираются КС-распознавателями. Но это лишь отражает лишь их взаимоотношения в иерархии (Холмского), но отнюдь не означает правильный подход.

Тебе говорят о том, что конкретное правило приводимо к КС. То, что ты не стал приводить я понял еще много постов назад.

-------
подсказка — в твоем R# участвует лексический анализатор, он бъет на лексемы. Выход лексического анализатора — суть его нетерминалы , являются терминальными символами для твоего синтаксического анализатора. Лексичесике анализаторы применяются только лишь:
— с целью "разгрузить" грамматику синтаксического анализатора
— с целью повышения эффективности, ибо регулярные грамматики очень шустро разбираются по простым алгоритмам (тот же ДКА).

Твой лексер так же "съедает" разделители, ты написал его так, что они не попадают на вход синтаксического анализатора (может поэтому тебе почудился 'g_e_t' ?)

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

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

-------
кстати, компилятор FORTRAN работает без лексического анализатора, именно таким образом, как я только что написал, т.е. синтаксический анализатор FORTRAN-а не удалось "облегчить" лексером.
фортран-77 способен вопринимать текст без пробелов:
DOI=1,100
DOWHILE(a>b)
DO10J=1,100,3
...
10CONTINUE
ENDDO
ENDDO
Re[24]: КС и КЗ грамматики
От: prVovik Россия  
Дата: 19.11.04 23:44
Оценка: 6 (1) +2
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, prVovik, Вы писали:


AVK>>>Это не грамматика, это семантика.

V>>Семантика тут не причем. Мы говорим о ПРИНАДЛЕЖНОСТИ предложения языку.
AVK>Мы говорим о грамматике языка.
А это одно и тоже! Язык — это множество предложений, обычно бесконечное. Грамматика — это конечное описание множества предложений языка. Заметь, понятие семантики предложения тут никаким боком не фигурирует.

Если использовать твою логику на счет "семантики", то можно договориться до чего угодно. Например, до того, что С# — это регулярный язык. Не веришь? Смотри. Зададим его грамматику в виде регулярного выражения ".*", а все остаьное вынесем на якобы "семантический уровень". Те же яйца! Я перенес С# с уровня КЗ на уровень регулярных языков, пользуясь костылями "семантического уровня" точно так, как ты переносишь С++ с уровня КЗ на уровень КС, пользуясь теме же самыми костылями. Означает ли это, что грамматика C# лево/право сторонняя? НЕТ!

Вообще, для чего нужна грамматика? С помощью грамматики можно задавать ограничения на предложения языка. Ограничения могут быть разными. Например, с помощью грамматики можно указать, что все операторы должны оканчиваться точкой с запятой, или что каждой открывающей скобке должна соответствовать закрывающая и т.д. Точно таким же ограничением является ограничение на предъобьявление идентификатоа. Это ограничение ни чем не лучше и не хуже вышеописанных ограничений. Они равноправны. Но вот беда, его нельзя учесть в КС грамматике . Но, его можно учесть в КЗ грамматике, причем без всяких "семантических уровней"!!! КЗ парсер смог бы АВТОМАТИЧЕСКИ проверять наличие объявлений идентификаторов перед их использованием точно так же, как КС парсер автоматически проверяет наличие точки с запятой после оператора. Проблема в том, что строить КЗ парсер очень сложно.

Если присмотреться к языкам программирования, то можно заметить, что ограничений для которых необходима КЗ грамматика очень мало. Для большенства оставшихся вполне достаточно КС грамматики. Поэтому, принято поступать следующим образом: берется "КС-болванка" языка (из которой выкинуты все КЗ ограничения) и для этой болванки делается тривиальный КС парсер. Выкинутые КЗ ограничения потом проверяются ВРУЧНУЮ на этапе семантического анализа. Это проще и дешевле, чем изначально строить КЗ парсер. Так что "семантические ограничения" — это плата за фейк при использовании КС парсера для КЗ языка.

AVK>

The syntaxes of most programming languages are context-free grammars (or very close to it).

Ну, ссылки разные бывают. Вот например одна: http://www.lapsha.ru/articles/tech/2003/10/02/185500.html
А если серьезно, то у меня на столе лежит книжка по теории формальных языков, где содержется абсолютно противоположное утверждение. Я почему-то больше склонен верить печатному изданию, и своему разуму, чем этой интернет-странице.
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[24]: КС и КЗ грамматики
От: Павел Кузнецов  
Дата: 20.11.04 20:25
Оценка: 4 (2) +1
AndrewVK,

> Паша, будь добр, поясни свою позицию. А то простановка плюсов vdimas за доказательства того что грамматика C# и С++ КС наряду с простановкой плюсов prVovik, доказывающего что грамматики и шарпа и С++ КЗ приводит меня в состояние ступора.


Как они уже между собой выяснили, они имели в виду немного разные грамматики: один — грамматику языка, другой — грамматику использующуюся для построения компилятора. При этом, оба правы, когда говорит, что одна из этих грамматик контекстно-свободна, а другая — нет

Грамматика любого языка, требующего предварительное объявление переменных, безусловно, не является КС. В том числе и C#, и C++. Это классика (Ахо, Сети, Ульман):

Рассмотрим абстрактный язык L1 = { wcw | w <принадлежит> (a|b)* }. L1 состоит из всех слов, образованных повторяющимися строками из a и b, разделенными символом c, например aabcaab. Можно доказать, что этот язык не является контекстно-свободным. Он абстрагирует проблему проверки объявления переменных до их использования — первое w в wcw представляет объявление переменной, а второе w — ее использование. Из того, что L1 не является контекстно-свободным языком, следует, что языки типа Algol или Pascal не есть контекстно-свободными, т.к. в них требуется объявление переменной до ее использования, а идентификаторы могут иметь произвольную длину.


Однако для реализации компиляторов, как уже было верно замечено, действительно, обычно используются КС грамматики, порождающие несколько большее количество предложений, чем входит в сам язык, с последующим "семантическим" анализом результата распознавания.

Соответственно, "контекстно-зависимые" ключевые слова вполне вписываются в КС грамматику, если таковая уже используется для синтаксического анализа, т.к. зависимостью от контекста (без кавычек) называется вовсе не зависимость значения терминала от положения, которую как раз КС грамматики описывают совершенно замечательно.

Впрочем, тут есть один нюанс: если то, будет ли данное "контекстно-зависимое" слово ключевым в данном месте зависит не только от его положения, но и, скажем, от того, есть ли в данной области видимости уже определенный идентификатор с таким же именем, то вот это уже будет действительной зависимостью от контекста, и КС грамматикой, как и требование предварительного объявления переменных, описываться не будет.
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[25]: Качество стандарт
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.11.04 17:04
Оценка: 3 (1) +1 :)
Здравствуйте, vdimas, Вы писали:

V>запись 'g' 'e' 't' — это непрерывная цепочка терминалов "get", откуда тебе приснилось g_e_t?


Попробую объяснить. Я отталкивался от спцификации в котрой дана граматика языка. Причем дана четко:

9.2.1 Lexical grammar The lexical grammar of C# is presented in §9.2.3, §9.4, and §9.5. The terminal symbols of the lexical grammar are the characters of the Unicode character set, and the lexical grammar specifies how characters are combined to form tokens (§9.4), white space (§9.3.3), comments (§9.3.2), and pre-processing directives (§9.5).


9.4 Tokens There are several kinds of tokens: identifiers, keywords, literals, operators, and punctuators. White space and comments are not tokens, though they act as separators for tokens.

token:: 
  identifier 
  keyword 
  integer-literal 
  real-literal 
  character-literal 
  string-literal
  operator-or-punctuator


17.6.2 Accessors
The accessor-declarations of a property specify the executable statements associated with reading and writing that property.

accessor-declarations:
    get-accessor-declaration set-accessor-declarationopt
    set-accessor-declaration get-accessor-declarationopt
get-accessor-declaration:
    attributesopt accessor-modifieropt get accessor-body
set-accessor-declaration:
    attributesopt accessor-modifieropt set accessor-body
    accessor-modifier: 
    protected 
    internal 
    private 
    protected internal 
    internal protected 
accessor-body: 
    block 
;

The accessor declarations consist of a get-accessor-declaration, a set-accessor-declaration, or both. Each accessor declaration consists of the token get or set followed by an accessor-body. For abstract and extern properties, the accessor-body for each accessor specified is simply a semicolon. For the accessors of any non-abstract, non-extern property, the accessor-body is a block which specifies the statements to be executed when the corresponding accessor is invoked.


Для тех, кому тяжело читать по-английски, вкратце объясню суть. Грамматика языка сразу описывает принцип разбиения на токены и в дальнейшем, при описании синтаксического анализатора, грамматика строится исходя из того, что токенами (терминалами) являются отдельные ключевые слова, идентификаторы и т.п. Другими словами минимальными словами грамматики являются токены из числа которых принципиально исключены пробельные символы.

Приведенная тобой грамматика:
1. Не будет соответствовать стандарту.
2. Неверна если у парсера не будет в качестве токенов пробельных токенов. Рри наличии пробельных токенов будет очень сложно удержать в соотвествии со стандартом (если вообще возможно), так как пробельные токены придется засовывать всюду, причем во многих случаях они начнут зависеть от контекста.

V>работать можно заставить что угодно, была бы настойчивость.


Красивая и одновременно неверная фраза. Попробуй, например, заставить работать любой механизм противоречащий законам физики. Пусть даже эти законы верны только на одной планете, но заставить работать механизм нужно именно на ней.

Точно так же если скормить свою грамматику EBNF-совместимому построителю пасреров вроде CocoR, то ничего хорошего не выйдет. Все известные мне EBNF-парсеры рассчитаны на работу по двухфазной схеме и обычно уже включают в себя лексер.

V>КС грамматики разбираются КЗ-распознавателями,


Естественно, но ты как раз говоришь об обратном.

V>аналогично РГ разбираются КС-распознавателями.


РГ — это регулярные грамматики типа регулярных выражения? Тоже вполне естественно, так как это частный случай КС-грамматики.

V>Тебе говорят о том, что конкретное правило приводимо к КС.


Так. Давай определимся. Есть грамматика. У нее есть свои терминалы. В грамматику C++ и C# заложены в качестве нетерминалов токены среди которых есть идентификатор и ключевые слова.

Ответь без лишней философии можно ли отталкиваясь от этих предпосылок считать грамматику C#-а полностью удовлетворяющей требованиям КСГ?

V>То, что ты не стал приводить я понял еще много постов назад.


То что ты предлагаешь называетя не "привести", если называть вещи своими именами называется "переписать граматиу изменив набор ее терминалов". То есть написать другую граматику способную распознаовать конструкции того же языка. Я и не думал переписывать ее по той причине, что в условиях реального мира это сделать практически невозможно. Выкинуть лексер и отказаться от отфильтровывания пробельных симловол и комментариев означает заранее завалить проект. Ведь ни построители парсеров на это не рассчитаны (не писать же свой ради такой улупости?), ни имеющаяся грамматика. Подобный шаг, на практике, можно осуществить если создать некий механизм позволяющий преобразовать некую КЗГ в более общую КСГ. Но о подобных я даже и не слышал.

Попробуй переписать граматику сам... То что ты привел в посте выше — был полностью нерабочий вариант, так как он не учитывал пробельных символов и т.п. А ведь это был очень маленький фрагмент граматики. Меньше одного процента.

V> — в твоем R# участвует лексический анализатор, он бъет на лексемы. Выход лексического анализатора — суть его нетерминалы ,


Да. И это соответствует стандарту (п. 9.2.1. приведенный выше).

V> являются терминальными символами для твоего синтаксического анализатора.


Именно!

V> Лексичесике анализаторы применяются только лишь:

V>- с целью "разгрузить" грамматику синтаксического анализатора

Это теория очень далекая от жизни. Реально языки уже проектируются в терминах нетерминалов. Ни одни проектировщик языка на сегодня не работает на уровне букв и цифр. Ты же заявляешь о том, что некая граматика является КС если ее можно переписать в КС. Но это не логическая ошибка. Вот если ее преписать, то она и станет КСГ, а до тех пор она КЗГ. А так как переписать ее подобным образом не представляется возможным, то о чем разговор я не понимаю.

V>- с целью повышения эффективности, ибо регулярные грамматики очень шустро разбираются по простым алгоритмам (тот же ДКА).


Плохой аргумент, так как те же LALR(1)-парсеры строят алгоритм распознавания на базе того же ДКА. Так что эффективность тут не причем. В конце концов дополнительный проход эффективности точно не прибавляет.

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

V>Твой лексер так же "съедает" разделители, ты написал его так, что они не попадают на вход синтаксического анализатора (может поэтому тебе почудился 'g_e_t' ?)


Естественно. Именно потому, что разделители съедаются еще лексером твоя грамматика никак не может быть верной. Да если бы не съедались все равно не могла бы быть верной, так как их пришлось бы указывать между всеми другими терминалами языка. К моту же еще и каким-то загадочным образом определять где они обязательны, а где нет.

Я, для построения пасрера R#, пользуюсь генератором парсеров CocoR который использует в качестве языка описания грамматики EBNF. Так что я в этой области ничего не писал.

В формальной грамматике C#/R#/C++ и им подобных нет разделителей, по этому они обязательно съедаются лексером. Парсер принципиально оперирует с терминалами в числе которых пробельные символы и комментарии отсутствуют. Ну, да я уже устал это повторять.

V>Я же говорил тебе о том, чтобы записать синтаксис языка в одной системе правил.


Что-то до сего сообщения я этого не слышал.

V>И в этой системе правил случай с твоим несчатным get более чем элементарно представим в терминах КС.


Возможно. Но это будет другая грамматика. Сформулированная на базе другого набора терминальных символов. Причем делать это не просто нецелесообразно, а проста такие невозможно. Будет столько проблем, что неоднозначности текущей грамматики покажутся просто цветочками.

V>-------

V>следующим шагом мне останеться только убить час времени и накатать эту систему, если ты еще не понял ход рассуждений и предыдущие посты.

О! Изумительное предложение.

Итак, чтобы подтвердить свои слова создай, плиз, грамматику которую можно будет скормить EBNF-построителю парсеров и скорми ее ему.

Например, я использую собственную модификацию CocoR которую можно взять здесь. Скачай его и попытайся создать грамматику для парсинга отдельно взятого свойства. Только обязательно проверь ее на следующей конструкции:
Xxx Yyy
{
  get
  {
    return get;
  }
}

Xxx Yyy
{
  get
  {
    return g;
  }
}

Xxx Yyy
{get{
    returnget; // тут должна быть ошибка!
  }
}


Причем выделенные жирным конструкции get и g должно распознаваться как идентификатор, а не выделенные get как ключевые слова. Ну, и не должно быть контекстно-зависимых описаний пробельных симвлов.

Чтобы облегчить тебе задачу, я уже написал неверную граматику:
COMPILER Property

    protected Token ProcessPragma(Token curr) { return curr; }
    void BeforeInitTokens() { }


CHARACTERS
    letter  = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".

TOKENS
    ident   = letter { letter }.

    space   = " " | "\t" | "\r" | "\n".

PRODUCTIONS

Spaces = { space }.

Property = Spaces ident Spaces ident Spaces 
    "{" Spaces 
        "get" Spaces 
        "{" Spaces 
            "return" Spaces ident Spaces ";" Spaces 
        "}" Spaces 
    "}" Spaces.

END Property.


И даже создал работающий парсер код которого можно взять здесь:
http://gzip.rsdn.ru/File/73/PropertyParser.ZIP
К сожалению, парсер уже переведен на .Net 2.0 по этому скомпилировать проект можно только 2005-ой студией или msbuild из второго фрэймворка.

Ну, а потом ответь на вопрос возможно ли построить таким образом соответствующий стандарту парсер (причем не гипотетически, а рельно).


ЗЫ

Итак, хотелось бы получить ответ на исходный вопрос: Является ли граматика описанная в стандарте и реализуемая парсерами в компиляторах (реальная, а не гипотетическая переписанная на базе других терминалов) КСГ?

И можно ли не переписывая саму граматику и не вставляя семантических "костылей" сделать ее КСГ?
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[26]: Качество стандарт
От: Павел Кузнецов  
Дата: 22.11.04 21:07
Оценка: 2 (2) +1
VladD2,

> Попробую объяснить. Я отталкивался от спцификации в котрой дана граматика языка. Причем дана четко <...>


Это другой вопрос. Как давным-давно заметил Шахтер, важно уточнять, о какой грамматике идет речь. Как видишь, вы втроем говорили о трех разных грамматиках:
  • VladD2: о грамматике, приведенной в спецификации;
  • prVоvik: грамматике, полностью описывающей синтаксис языка (она не может быть КС, т.к. требует предварительного обьявления переменных);
  • vdimas: о грамматике, эквивалентной первой в плане порождаемого языка, но являющейся контекстно-свободной.

    Последнюю грамматику легким движением руки
    Автор: vdimas
    Дата: 22.11.04
    , даже не меняя архитектуры транслятора, можно получить из описанной в стандарте C#, если, конечно, кроме "контекстно-зависимых" ключевых слов в грамматике из спецификации нет других моментов, действительно, не позволяющих преобразовать ее в КС. Последнего пока продемонстрировано не было.

    > Приведенная тобой грамматика:

    > 1. Не будет соответствовать стандарту.

    Грамматика сама по себе не может соответствовать или не соответствовать стандарту. Стандарту может соответствовать или не соответствовать некоторая реализация языка C#. Критерии соответствия реализаций описаны в пункте 2 стандарта C#. Вот полная цитата:

    A conforming implementation of C# must accept any strictly conforming program.

    A conforming implementation of C# must provide and support all the types, values, objects, properties, methods, and program syntax and semantics described in the normative (but not the conditionally normative) parts in this International Standard.

    A conforming implementation of C# shall interpret characters in conformance with the Unicode Standard, Version 3.0, and ISO/IEC 10646-1. Conforming implementations must accept Unicode source files encoded with the UTF-8 encoding form.

    A conforming implementation of C# shall not successfully translate source containing a #error preprocessing directive unless it is part of a group skipped by conditional compilation.

    A conforming implementation of C# shall produce at least one diagnostic message if the source program violates any rule of syntax, or any negative requirement (defined as a “shall” or “shall not” or “error” or “warning” requirement), unless that requirement is marked with the words “no diagnostic is required”.

    A conforming implementation of C# is permitted to provide additional types, values, objects, properties, and methods beyond those described in this International Standard, provided they do not alter the behavior of any strictly conforming program. Conforming implementations are required to diagnose programs that use extensions that are ill formed according to this International Standard. Having done so, however; they can compile and execute such programs. (The ability to have extensions implies that a conforming implementation reserves no identifiers other than those explicitly reserved in this International Standard.)

    A conforming implementation of C# shall be accompanied by a document that defines all implementation-defined characteristics, and all extensions.

    A conforming implementation of C# shall support the class library documented in §Annex D. This library is included by reference in this International Standard.

    Соответственно, какую грамматику будет использовать реализация — совершенно безразлично.
    Posted via RSDN NNTP Server 1.9 gamma
  • Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[18]: КС и КЗ грамматики
    От: prVovik Россия  
    Дата: 19.11.04 17:31
    Оценка: -3
    Здравствуйте, vdimas, Вы писали:

    V>компилятор выдал ошибку:

    V>error C2296: '*' : illegal, left operand has type 'char *'

    V>как ты думаешь, это синтаксическая или семантическая ошибка?


    А при чем тут это? В теории языков нет таких понятий, как "синтаксическая или семантическая ошибка". Предложение либо принадлежит языку, либо не принадлежит. Все! Точка! Никаких других вариантов нет! Если компилятор (правильный) отказывается компилировать программу, следовательно эта программа не принадлежит языку. Короче, дружно учим матчасть.
    ... << RSDN@Home 1.1.4 @@subversion >>
    лэт ми спик фром май харт
    Re[20]: КС и КЗ грамматики
    От: prVovik Россия  
    Дата: 19.11.04 20:36
    Оценка: +3
    Здравствуйте, vdimas, Вы писали:


    V>Есть такие понятия, есть...

    V>классический компилятор осуществляет разбор по 3-х уровневой схеме:
    V>1. лексический анализотор
    V>2. синтаксический анализатор
    V>3. семантический анализатор

    А причем тут архитектура компилятора?????
    Я говорю про ТЕОРИЮ ЯЗЫКОВ. В ней нет никаких анализаторов. Есть ЯЗЫК — это множество корректных предложений.
    Один из способов задания языка — использование грамматики. В этом случае говорят, что предложение принадлежит языку тогда и только тогда, когда существует хотя бы один вывод этого предложения из грамматики.

    КС грамматики теоретически не могут описывать традиционные языки программирования, так как они описывают слишком широкие языки. Так, например, с помощью КС грамматики невозможно учесть факт обязательного предобъявления идентификаторов.

    Тут проблема в том, что построение распознавателя КЗ языка — это очень сложная задача. Поэтому используют распознавалели КС языков, плюс "костыль" в виде семантического анализатора. И делают это исключительно от бедности. Но язык от этого отнюдь не перестает быть КЗ.
    ... << RSDN@Home 1.1.4 @@subversion >>
    лэт ми спик фром май харт
    Re[19]: КС и КЗ грамматики
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 21.11.04 22:02
    Оценка: -2 :)
    Здравствуйте, Шахтер, Вы писали:

    Ш>Не путай ужа с ежём.


    Я, то как раз не путаю.

    Ш> "Зависящие от контекста" токены не делают язык контекстно-зависимым.


    Токены в обязательном порядке. И не только токены. Любая зависимость от контекстов делает граматику не КС (т.е. КЗ).

    Ш>Например, в языке арифметических выражений — может выступать как унарный оператор и как бинарный оператор. Что не делает этот язык контекстно-зависимым.


    Хороший пример. Только он всего лишь показывает твое поверхностное знание предмета.

    В данном случае минус в обоих случаях является один и мем же токеном (или выражаясь научно нетерминалом). А то будет ли он рассматриваться как бинарный оператор или как унарный целиком зависит от таких вещей как граматика и ассоциативность оператора.

    Вот EBNF-граматика для этого дела:
    Calculator         = Expr EOF.
    Expr               = UnaryExpr AdditiveExpr.
    AdditiveExpr       = MultiplicativeExpr { ("+" | "-") UnaryExpr MultiplicativeExpr }.
    MultiplicativeExpr = { ("*" | "/" | "%") UnaryExpr }.
    UnaryExpr          = { "+" | "-" } PrimaryExpr.
    PrimaryExpr        = literal | "(" Expr ")".


    Это сто-процентно чистая КСГ (контекстно свободная граматика). Причем это даже LL(1)-граматика, так что ее можно парсить методом рекурсивного спуска. Вот тут
    Автор: VladD2
    Дата: 13.05.04
    приведен полный код парсера созданного с использованием построителей парсеров CocoR.

    В случае же, например, нетерминала get все зависит от контекста. Один и тот же нетерминал может быть ключевым словом (при распозновании тела свойства), так и идентификатором (при распозновании любого другого участка кода).

    Примет разрешения конфликтов с get/set я уже давал рядом
    Автор: VladD2
    Дата: 19.11.04
    . Обрати внимание на то что вместо введения нетерминалов "get" и "set" в нем испоьзован нетерминал identifier, который является допустимым идентификатором C# — это говорит, что можно использовать ключевые слова get и set где угодно (например, в качестве имени перемнной или функции), и что по сути get и set не являются ключевыми словами. А вот про любое друго ключевое слово такого сказать нельзя. Например, назвать переменную class не удастся. Кстати, VS 2005 уже подсвечивает синтаксис на базе парсинга. Так что в ней сразу видно используется get как ключевое слово или как индентификатор. Например, вот такой вот код:
    using System;
    
    class get
    {
        static get set;
    
        static get assembly { get { return set; } }
    
    
        static void Main()
        {
            set = new get();
        }
    }

    совершенно корректен для C# и даже врено подсвечивается VS 2005. В отличи от нашего колорера она подкрасит только get выделенный жирным.

    ЗЫ

    Всем наставившим плюсы советую их снять и пойти почитать определение КС, а так же какие-нубудь книжки по принципам построения компиляторов.

    Ну, и определение из Википедии кторое давал АВК тут
    Автор: AndrewVK
    Дата: 19.11.04
    .
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[32]: Качество стандарт
    От: Павел Кузнецов  
    Дата: 26.11.04 03:51
    Оценка: +2 -1
    Шахтер,

    > Можно, я чуть-чуть добавлю?


    Ага, спасибо за дополнения! Тогда и я чуть-чуть

    > Так что хочешь не хочешь, а для компиляции языков приходится использовать максимум LR(1) грамматики.


    При этом следует уточнить, что полученная грамматика может реализовывать не все ограничения синтаксиса, плюс может сопровождаться "хаками", позволяющими проанализировать конструкции, непосредственно полученной грамматикой не описываемые или описываемые неоднозначно.
    Posted via RSDN NNTP Server 1.9 delta
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[22]: КС и КЗ грамматики
    От: prVovik Россия  
    Дата: 19.11.04 21:09
    Оценка: 6 (1) +1
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Это не грамматика, это семантика.

    Семантика тут не причем. Мы говорим о ПРИНАДЛЕЖНОСТИ предложения языку. Предложение либо принадлежит языку, либо не принадлежит. Третьего не дано. Оно не может быть "слегка беременным".

    AVK>Грамматика языка. Речь о грамматике.

    Ага, то есть ты согласен стем, что традиционные ЯЗЫКИ программирования контекстно-зависимы? Замечательно!

    А что такое контестно-зависимый язык?
    Контестно-зависимый язык — это язык, порождаемый контекстно-зависимой грамматикой, так гласит теория
    ... << RSDN@Home 1.1.4 @@subversion >>
    лэт ми спик фром май харт
    Re[18]: КС и КЗ грамматики
    От: vdimas Россия  
    Дата: 19.11.04 14:50
    Оценка: +1 -1
    Здравствуйте, AndrewVK, Вы писали:

    V>>какие выражения не удается представить в КС — форме?


    AVK>Например свойство.


    упрощенно:

    PopertyDecl ::= GetPropertyDecl
    PopertyDecl ::= SetPropertyDecl
    PopertyDecl ::= GetSetPropertyDecl

    GetProperty ::= TypeID VarID '{' 'get' FuncBody '}'
    SetProperty ::= TypeID VarID '{' 'set' FuncBody '}'
    GetSetProperty ::= TypeID VarID '{' 'set' FuncBody 'get' FuncBody '}'
    GetSetProperty ::= TypeID VarID '{' 'get' FuncBody 'set' FuncBody '}'


    если представимо в БНФ, то КС
    Re[20]: КС и КЗ грамматики
    От: vdimas Россия  
    Дата: 19.11.04 15:33
    Оценка: +1 -1
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Здорово, а 'get' это что такое? В данном случае get это контекстно-зависимое ключевое слово.


    да ну?

    а так:

    GetProperty ::= TypeID VarID '{' KeyWord_get FuncBody '}'
    KeyWord_get ::= 'g' 'e' 't'

    выкидываем нахрен лексический анализатор, описываем все в единой системе БНФ (все терминалы и нетерминалы до кучи).
    вполне решаемо. а раз представимо в БНФ, то КС.
    Re[19]: КС и КЗ грамматики
    От: prVovik Россия  
    Дата: 19.11.04 20:36
    Оценка: -2
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Здравствуйте, prVovik, Вы писали:


    V>>А может быть, уважаемые, понаставившие минусов, еще и скажут что-нибудь вразумительное?


    AVK>Отвечу тебе твоими же словами — иди учи теорию.


    То есть аргументов у тебя нет, одна демагогия?
    ... << RSDN@Home 1.1.4 @@subversion >>
    лэт ми спик фром май харт
    Re[22]: КС и КЗ грамматики
    От: vdimas Россия  
    Дата: 19.11.04 23:27
    Оценка: +1 -1
    Здравствуйте, AndrewVK, Вы писали:

    AVK>http://en.wikipedia.org/wiki/Context-free_grammar

    AVK>

    AVK>In linguistics and computer science, a context-free grammar (CFG) is a formal grammar in which every production rule is of the form

    AVK>V > w
    AVK>where V is a non-terminal symbol and w is a string consisting of terminals and/or non-terminals. The term "context-free" comes from the fact that the non-terminal V can always be replaced by w, regardless of in what context it occurs.


    ну дык читай, что на что может меняться
    это суть описание вида БНФ (вернее, БНФ способно описывать правила, попадающие под это определение)

    есть теорема, что грамматика, представимая БНФ является как минимум КС
    (если сам поленишься найти — найду ссылки)

    AVK>Так вот — один и тот же набор терминалов get может трактоваться как идентификатор и как ключевое слово, в зависимости от контекста. Отсюда грамматика шарпа никак не может быть контекстно свободной.


    гм... ход мыслей понятен, но посмотри там же определение КЗ-грамматики. Если мне удасться твой т.н. "контекст" целиком расположить в правой части правил, то...

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

    я тебе уже показывал, как твой случай описываеся БНФ.
    Да ты легко сам можешь написать КС парсер, который корректно разберет это несчатсное 'get' в различных синтаксических конструкциях (я не уверен, что это приводимо к LL(k), но сути это не меняет, есть 2 самых общих подхода — восходящий и нисходящий с бесконечной магазинной памятью, оба варианта его разберут). Причем, в одних случаях это будет идентификатор, а в других — твой особый нетерминал.

    ---------
    вот тебе упрощенный пример в регулярной грамматике, где одна и та же цепочка символов может являться частью других допустимых цепочек.

    $KeywordGet = 'g' 'e' 't' ';'.
    $VarGet = 'i' 'n' 't' '_' 'g' 'e' 't' '=' '1' ';'.

    парсер на основе этой регулярной грамматики легко распознает 2-е цепочки:
    "get;"
    "int get=1;"

    тоже самое я могу записать в виде БНФ даже короче, выделив промежуточный символ KeywordGetOrID ::= 'g' 'e' 't' (показывал в предыдущих постах)
    Re[23]: КС и КЗ грамматики
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 20.11.04 02:32
    Оценка: -2
    Здравствуйте, vdimas, Вы писали:

    V>гм... ход мыслей понятен, но посмотри там же определение КЗ-грамматики. Если мне удасться твой т.н. "контекст" целиком расположить в правой части правил, то...


    Неудастся. Вообще не удастся расположить в правиле. На то и зависимость от контекста.
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[18]: КС и КЗ грамматики
    От: Шахтер Интернет  
    Дата: 20.11.04 03:31
    Оценка: +2
    Здравствуйте, VladD2, Вы писали:

    VD>Здравствуйте, vdimas, Вы писали:


    V>>Здравствуйте, AndrewVK, Вы писали:



    AVK>>>Ага, значит КЗ мощнее КС. Но грамматика C# КЗ, а С++ КС. Получается что ты опроверг свое первоначальное утверждение .


    V>>почему грамматика C# КЗ?

    V>>какие выражения не удается представить в КС — форме?

    VD>В C# есть куча мест зависяцих от контекста, но в стандарте четко определено как разрешать неоднозначности.


    Не путай ужа с ежём. "Зависящие от контекста" токены не делают язык контекстно-зависимым.
    Например, в языке арифметических выражений — может выступать как унарный оператор и как бинарный оператор. Что не делает этот язык контекстно-зависимым.
    ... << RSDN@Home 1.1.0 stable >>
    В XXI век с CCore.
    Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
    Re[23]: КС и КЗ грамматики
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 20.11.04 09:27
    Оценка: +1 :)
    Здравствуйте, vdimas, Вы писали:

    Паша, будь добр, поясни свою позицию. А то простановка плюсов vdimas за доказательства того что грамматика C# и С++ КС наряду с простановкой плюсов prVovik, доказывающего что грамматики и шарпа и С++ КЗ приводит меня в состояние ступора.
    ... << RSDN@Home 1.1.4 beta 3 rev. 231>>
    AVK Blog
    Re[25]: КС и КЗ грамматики
    От: prVovik Россия  
    Дата: 20.11.04 17:17
    Оценка: +2
    Здравствуйте, Шахтер, Вы писали:

    Ш>Вы бы сначала определились, о чем вообще базар. Если ты откроешь стандарты, то можешь легко убедиться, что грамматики С++ и С#, которые там приведены, контекстно-свободные.


    А разве речь идет о том, какие грамматики приведены в стандарте?
    ... << RSDN@Home 1.1.4 @@subversion >>
    лэт ми спик фром май харт
    Re[24]: КС и КЗ грамматики
    От: vdimas Россия  
    Дата: 20.11.04 17:27
    Оценка: +2
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Паша, будь добр, поясни свою позицию. А то простановка плюсов vdimas за доказательства того что грамматика C# и С++ КС наряду с простановкой плюсов prVovik, доказывающего что грамматики и шарпа и С++ КЗ приводит меня в состояние ступора.


    звучит прикольно, но не смущай читателя, все уже достаточно разъяснено.

    Банальный пример:
    Если бы в описание грамматики ЯП явно учесть факт наличие определения типа, то корректность выражения:
     A1 a = new B1();

    определялось бы парсером, в зависимости от определения типов A1 и B1.
    Такое возмоожно только в КЗ грамматике.

    Однако, гораздо легче сделать КС — парсер который распознает только внешний вид конструкции, а корректность операций проверять дополнительно.

    Мы вообще зацепились за синтаксис объявления с-в. Я утверждаю, что эта конструкция отличается именно своей конструкцией от остальных, нет другой конструкции, которая выглядила бы точно так же, как определение св-в или евентов в C#. (В общем, внешнего вида достаточно).

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

    Вот здесь вроде понятно растолковал что имел ввиду изначально
    Автор: vdimas
    Дата: 20.11.04
    Re[25]: КС и КЗ грамматики
    От: vdimas Россия  
    Дата: 20.11.04 17:32
    Оценка: +2
    Здравствуйте, Шахтер, Вы писали:

    Ш>Здравствуйте, AndrewVK, Вы писали:


    AVK>>Здравствуйте, vdimas, Вы писали:


    AVK>>Паша, будь добр, поясни свою позицию. А то простановка плюсов vdimas за доказательства того что грамматика C# и С++ КС наряду с простановкой плюсов prVovik, доказывающего что грамматики и шарпа и С++ КЗ приводит меня в состояние ступора.


    Ш>Вы бы сначала определились, о чем вообще базар. Если ты откроешь стандарты, то можешь легко убедиться, что грамматики С++ и С#, которые там приведены, контекстно-свободные.


    естественно, т.к. правила синтаксических конструкций там в виде БНФ.

    А КЗ правила даются в описательном виде в "других" пунктах стандарта, ибо если это расписать в символах — глаза поломаются разбирать
    Re[24]: КС и КЗ грамматики
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 21.11.04 22:02
    Оценка: -2
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Паша, будь добр, поясни свою позицию. А то простановка плюсов vdimas за доказательства того что грамматика C# и С++ КС наряду с простановкой плюсов prVovik, доказывающего что грамматики и шарпа и С++ КЗ приводит меня в состояние ступора.


    Дык глубокое знание С++ не дает таких же глубоких знаний в других областях (даже смежных).

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

    И тут похоже что ничего поделать нельзя. Барикады штука такая затягивающая.

    Хотя плюсы prVovik в общем-то безобидны. prVovik в общем-то прав. Только его правота это очередной сфероконик вакумный. Да семантика — это зависимость от контекста. Да теоритически можно создать супер-парсер кторый позволит обойтись без семантического анализатора (и то не всегда). И даже были попытки это сделать. Вот только ни одна из них не увенчалась успехом, так как их эфективность быала мягко говоря ужасно мала. Поэтому при построении компиляторов (или интерпретаторов) выделяются три фазы:
    1. Сканирование (оно же лексический разбор).
    2. Парсинг контекстно-независимой граматики.
    3. Семантический анализ.

    Первые две фазы могут быть целиком автоматизированы если для языка можно создать КСГ определенной формы.

    Третий этап намного труднее автоматизировать.

    Так вот. По жизни все построитили компиляторов стремятся создать КСГ. Но иногда они отходят от требований КСГ с целью сделать язык более интуитивным и простым. Так С++ требует знания о типе в некоторых местах, а C# попросту плюет на требования КСГ вводя понятие конфликта, и описывая, при этом способы, принципы разрешения конфликтов.
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[23]: КС и КЗ грамматики
    От: vdimas Россия  
    Дата: 22.11.04 11:16
    Оценка: +2
    Здравствуйте, VladD2, Вы писали:

    VD>Вот если бы ты поимел ввиду его тоже, и заодно поглядел стандарты языков, то тоже не спорил бы о том является ли граматика из стандартов (или применяемая при построении компиляторов) КС. Так граматике C# четно написано, что get — это токен, а раз так граматика 100%-но имеет КС-двусмысленности, а значит является КЗ.


    VD>Постраение парсеров языков подобных C++ и C# просто не мыслемо без лексеров, и составители граматик для этих языков принципиально закладываются на лексеры и строят грамматику на базе абстрактных токенов, а не отдельных символов.


    Я вот чего-то не понял смысла твоих высказываний. Это появилась какая-то новая наука о токенах, которую я благополучно проспал?

    Вообще-то, в ходе своих рассуждений я использовал тот принцип, что грамматика относится к наименьшему классу, в терминах которого представима. Т.е. я лишь доказывал факт представимости твоей конструкции в КС, что доказывало целевой постулат.

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

    1. Пусть лексический анализатор при выделении токена "get" выдает как нетерминал Keyword_get (а не IDentificator, аналогично для других ключевых слов)
    2. Пусть все остальные идентификаторы обзначаются неким промежуточным символом: CommonIdentificator.

    Тогда в правилах синтаксического анализатора напишем следующее:
    Identificator ::= CommonIdentificator | Keyword_get | Keyword_add и т.д.

    Теперь везде используй введенный символ Identificator.
    а целевую конструкцию опиши так:
    GetPropBody ::= Keyword_get '{' Expressions '}'.
    SetPropBody ::= Keyword_set '{' Expressions '}'.
    GetSetPropBody ::= (GetPropBody SetPropBody) | (SetPropBody GetPropBody).
    Property ::= Modifiers TypeIdentificator Identificator '{' (GetPropBody | SetPropBody | GetSetPropBody) '}'.


    И все будет чудесно работать даже с лексером и парсером.
    т.е. такая конструкция разбереться на "ура":
    public class Class1 {
        public class set {}
        public set get { get { return new set(); } }
    }

    определение св-ва с именем get типа set.
    Re[23]: КС и КЗ грамматики
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 22.11.04 17:04
    Оценка: -2
    Здравствуйте, Павел Кузнецов, Вы писали:


    ПК>я не воспринимаю факт называния кого-то "двоешнком" в сочетании с указанием на ошибки в неправильном употреблении базовых терминов большим оскорблением,


    Что значи большим или малым? Оскорбление есть оскорбление. Тебе приятно будет если я начну использовать подбные эпитеты в случаях когда посчитаю, что ты ошибашся?

    ПК> чем неаргументированное "уличение" оппонента в "поверхносном знании принципов постоения компиляторов",


    "Уличение" очень даже аргументированное, а вот оскорбление явное, наглое и никак не обоснованное (если вообще можно обосновать оскорбление).

    ПК> в третьем лице,


    В каком третьем лице? Ты о чем?

    ПК>вместо реакции на прямое объяснение
    Автор: Павел Кузнецов
    Дата: 20.11.04
    "уличаемым" своей позиции.


    Тут тысячи сообщений почему ты считашь, что именно твое да еше не обращенное напрямую ко мне должно требовать немедленного ответа?

    ПК>Не удивляйся, если обжигает, если сам принимаешь участие в подогревании атмосферы


    Пашь, я никого сдесь не оскорблял и стараюсь давать настолько аргументированные ответы насколько могу.

    Из всей команды оппонентов на достойную аргументацию предоставляет vdimas хотя и его позиция исходит из не очень верных предпосылок. Ну, да хотя бы есть аргументы.

    ПК>Извини, но на любую попытку развития дискуссии в сторону обсуждения сравнительных характеристик оскорбительности данных приемов, равно как и объяснения, почему именно с твоей точки зрения кто-то недостаточно хорошо разбирается в той или иной области, отвечать не собираюсь: и без того уже не первый раз отвечаю на сообщения того типа, который обычно предпочитаю игнорировать. А именно, сообщения, в которых происходит переход к обсуждению личных качеств оппонента вместо обсуждения предмета дискуссии.


    Ну, т.е. поддержка оскорблений для тебе вполне приемлемое решение?

    ПК>Реагировать буду только на сообщения по существу дискуссии.


    По существу, я уже сказал. Мало-мальски достойная аргументация есть только у vdimas. А реагировать на заявитальные заблуждения по другому просто тяжело.
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[28]: Качество стандарт
    От: Павел Кузнецов  
    Дата: 24.11.04 04:54
    Оценка: +1 -1
    VladD2,

    > ПК>Последнюю грамматику легким движением руки
    Автор: vdimas
    Дата: 22.11.04
    ,


    > 1. Это уже другая граматика. В спецификации четко сказано, что identifier — это токен.


    Ну и что, что другая грамматика? Как это противоречит изначальному вопросу
    Автор: vdimas
    Дата: 19.11.04
    ?

    почему грамматика C# КЗ?
    какие выражения не удается представить в КС — форме?

    Как видишь, добавление к синтаксису языка свойств на манер C#, со всем "контекстно-зависимыми" ключевыми словами, на возможность представления его контекстно-свободной грамматикой не влияет.

    > 2. Такое решение создает проблем больше чем решает. О том, каких можешь прочесь в опем ответе на то сообщение.


    Это уже не относится к тому, можно ли представить синтаксис свойств контекстно-свободной грамматикой. Теория формальных языков, к которой относятся вопросы представимости того или иного языка контекстно-свободной грамматикой, yacc'ами, bizon'ами и прочими CocoR не занимается.

    Это уже совсем другой вопрос, о возможностях используемых инструментов. Тем более, что подобные инструменты обычно накладывают на грамматику большие ограничения, чем принадлежность к контекстно-свободным (обычно требуется LL(1) или LALR).

    > ПК> можно получить из описанной в стандарте C#, если, конечно, кроме "контекстно-зависимых" ключевых слов в грамматике из спецификации нет других моментов, действительно, не позволяющих преобразовать ее в КС.


    > Мля, граматику нельзя преобразовывать.


    В теории формальных языков, к которой относится вопрос представимости языка контекстно-свободной грамматикой, такого запрета нет. Напротив, вопрос представимости синтаксиса языка грамматикой того или иного класса как раз и заключается в ее поиске.

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

    Предвосхищая твои возражения относительно стандарта C#, отвечаю, что он преобразовывать грамматику тоже не запрещает, т.к., как уже говорилось, на соответствие стандарту реализации используемая грамматика не влияет.

    > ПК> Последнего пока продемонстрировано не было.


    > Я уже показывал ту же ситуацию с неоднозначностью в понимании >> и F(G<,A>(2)).

    > <...>
    > Нешение для F(G<,A>(2)) описано в пункте "9.2.3 Grammar ambiguities". Где предлагается считать подбные конструкции вызовами методов если за > идет один из следующих символов "( ) ] : ; , . ? == !=".

    Это снова не влияет на представимость синтаксиса контекстно-свободной грамматикой, т.к. разрешение неоднозначности не зависит от значений идентификаторов, а требует только тривиального просмотра вперед.

    Это бы влияло на представимость контекстно-свободной грамматикой, если бы, например, правило разрешения данной неоднозначности зависело от того, является ли идентификатор G именем generic класса, или нет.

    А вот, скажем, грамматика C++, вопреки утверждению Андрея:

    AVK> грамматика C# КЗ, а С++ КС

    как раз контекстно-свободной совершенно точно не является, т.к. там подобная неоднозначность разрешается как раз определением того, обозначает ли идентификатор G шаблон, или нет.
    Posted via RSDN NNTP Server 1.9 gamma
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[30]: Качество стандарт
    От: Павел Кузнецов  
    Дата: 24.11.04 13:18
    Оценка: +1 -1
    AndrewVK,

    >>> Мля, граматику нельзя преобразовывать.


    > ПК> В теории формальных языков, к которой относится вопрос представимости языка контекстно-свободной грамматикой, такого запрета нет. Напротив, вопрос представимости синтаксиса языка грамматикой того или иного класса как раз и заключается в ее поиске.


    > В теории различают два типа грамматик — аналитические и генеративные. Влад говорит о первом типе, ты о втором.


    Вечер перестает быть томным

    1) Каким образом Влад мог говорить об аналитических грамматиках, оперируя такими терминами, как контекстно-свободная и контекстно-зависимая грамматика, которые являются разновидностями порождающих грамматик?

    2) Как рассуждения Влада об аналитических грамматиках, коих я впрочем не заметил, влияют на представимость синтаксиса языка контекстно-свободной грамматикой?
    Posted via RSDN NNTP Server 1.9 gamma
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[31]: Качество стандарт
    От: Шахтер Интернет  
    Дата: 26.11.04 02:54
    Оценка: +1 -1
    Здравствуйте, Павел Кузнецов, Вы писали: ...

    Можно, я чуть-чуть добавлю?

    Стандарт использует грамматику как описательное средство. Он не требует да и не может требовать от разработчиков компилятора буквального использования приведённой в нём грамматики.
    В этом смысле, КЗ она или не КЗ пользователей языка волновать в общем-то не должно. С точки же зрения разработчика компилятора, грамматика -- это всего лишь средство для облегчения (в идеале -- полной автоматизации) построения части компилятора, известной как синтаксический анализатор. И вот для решения этой задачи КЗ и тем более более общие грамматики не подходят совершенно -- для них нет эффективных алгоритмов парсинга. Так что хочешь не хочешь, а для компиляции языков приходится использовать максимум LR(1) грамматики.
    ... << RSDN@Home 1.1.0 stable >>
    В XXI век с CCore.
    Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
    Re[33]: Качество стандарт
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 27.11.04 02:49
    Оценка: -2
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>При этом следует уточнить, что полученная грамматика может реализовывать не все ограничения синтаксиса, плюс может сопровождаться "хаками", позволяющими проанализировать конструкции, непосредственно полученной грамматикой не описываемые или описываемые неоднозначно.


    Класс! КС-граматика с хаками зависящими от контекста. Что не придуашь, чтобы сыставить сказанную глупость в умном свете?

    Граматика не отвечающая требованиям КСГ не является КСГ. Точка. А то, что она на 99% КС это ровным счетом ничего не меняет. Как в прочем никем и не оспаривается. Граматкиа С++ тоже на 99% КС. Даже более. Но ее то вы как раз КС не признаете. Видимо это должно подтверждать исключительность и блогародность этого языка.
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[31]: Качество стандарт
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 27.11.04 02:49
    Оценка: -2
    Здравствуйте, Павел Кузнецов, Вы писали:


    ПК>Если ты так настаиваешь, мы можем сузить обсуждение и до менее интересного вопроса, а именно, является ли грамматика C#, написанная в стандарте, контекстно-свободной.


    Это не требует обсуждения. Раделы: "9.2.3 Grammar ambiguities" и "14.6.6 Cast expressions" и т.п. (ищем на "ambiguit"...).

    ПК> Менее интересным он является по элементарной причине: грамматика, составленная только из правил вывода, собранных в спецификации C#, по определению


    Не. По твоим заявления. А по факту она состоит из собственно граматики, описания неоднозначностей граматики и путей разрешения этих неоднозначностей. Почти все правила разрешения неоднозначностей вносят контекстную зависимость.

    В общем, если оспаривются очевидные вещи явно описанные в спецификации, то мои аргументы точно восприняты не будут. "Знакотам" виднее. Куда тем кто возился с граматикой на практике?
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[22]: КС и КЗ грамматики
    От: gbear Россия  
    Дата: 01.12.04 18:35
    Оценка: +2
    Здравствуйте, AndrewVK, Вы писали:

    V>>КС грамматики теоретически не могут описывать традиционные языки программирования, так как они описывают слишком широкие языки. Так, например, с помощью КС грамматики невозможно учесть факт обязательного предобъявления идентификаторов.

    AVK>Это не грамматика, это семантика.

    Это — как раз — грамматика.

    V>>Тут проблема в том, что построение распознавателя КЗ языка — это очень сложная задача. Поэтому используют распознавалели КС языков, плюс "костыль" в виде семантического анализатора.

    AVK>О как, семантический анализатор у нас уже костыль. На самом деле это вполне законная часть теории языков программирования. Почитай здесь
    AVK>http://en.wikipedia.org/wiki/Formal_semantics_of_programming_languages

    Формальная семаника ЯП — есть модель описывающая вычислители, которые могут описываться заданным языком. Каким боком, я извиняюсь, тут "факт обязательного предобъявления идентификаторов"?!

    Вообще говоря... от того, что кто-то назвал ЭТО семантическим анализатором (чем, нехило польстил ему), он (анализатор) семантическим не стал. По той простой причине, что, вообще говоря, ФЯ семантически пусты... там просто нечего анализировать, с точки зрения семантики... она одназначно определяется формальной грамматикой

    Как я понял, то что в данном контексте, таковым называется — тот же синтаксический анализатор — вид сбоку. Он все так же призван ответить на один "простой" вопрос: а какое же значение имеет эта долбаная лексема с точки зрения синтаксиса этого языка? И ничего более. Ведь так?

    О смелюсь, предположить, что сдесть имеется ввиду попытка определения синтаксического значения лексемы на основе "семантического" значения выражения.

    Но:
    1. От этого "факт обязательного предобъявления идентификаторов" так и не переходит в область семантики.
    2. Само понятие смысла выражения (т.е. "семантическое" значение) и определяется формальной грамматикой — так что никакое оно не семантическое, а как раз грамматическое.

    Так что это подмена понятий и ничего более.

    ---
    С уважением, Сиваков Константин.
    Re[21]: КС и КЗ грамматики
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 19.11.04 19:58
    Оценка: 9 (1)
    Здравствуйте, vdimas, Вы писали:

    V>а так:


    V>GetProperty ::= TypeID VarID '{' KeyWord_get FuncBody '}'

    V>KeyWord_get ::= 'g' 'e' 't'

    V>выкидываем нахрен лексический анализатор, описываем все в единой системе БНФ (все терминалы и нетерминалы до кучи).

    V>вполне решаемо. а раз представимо в БНФ, то КС.

    Блин, да откуда ты это взял? Вот нормальное определение
    http://en.wikipedia.org/wiki/Context-free_grammar

    In linguistics and computer science, a context-free grammar (CFG) is a formal grammar in which every production rule is of the form

    V > w
    where V is a non-terminal symbol and w is a string consisting of terminals and/or non-terminals. The term "context-free" comes from the fact that the non-terminal V can always be replaced by w, regardless of in what context it occurs.


    Так вот — один и тот же набор терминалов get может трактоваться как идентификатор и как ключевое слово, в зависимости от контекста. Отсюда грамматика шарпа никак не может быть контекстно свободной.
    ... << RSDN@Home 1.1.4 beta 3 rev. 231>>
    AVK Blog
    Re[18]: КС и КЗ грамматики
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 19.11.04 19:58
    Оценка: -1
    Здравствуйте, prVovik, Вы писали:

    V>А может быть, уважаемые, понаставившие минусов, еще и скажут что-нибудь вразумительное?


    Отвечу тебе твоими же словами — иди учи теорию.
    ... << RSDN@Home 1.1.4 beta 3 rev. 231>>
    AVK Blog
    Re[19]: КС и КЗ грамматики
    От: vdimas Россия  
    Дата: 19.11.04 19:59
    Оценка: +1
    Здравствуйте, prVovik, Вы писали:

    V>Здравствуйте, vdimas, Вы писали:


    V>>компилятор выдал ошибку:

    V>>error C2296: '*' : illegal, left operand has type 'char *'

    V>>как ты думаешь, это синтаксическая или семантическая ошибка?


    V>А при чем тут это? В теории языков нет таких понятий, как "синтаксическая или семантическая ошибка".


    Есть такие понятия, есть...
    классический компилятор осуществляет разбор по 3-х уровневой схеме:
    1. лексический анализотор
    2. синтаксический анализатор
    3. семантический анализатор

    ошибка может выплыть на любом уровне, и соответственно, выражение не будет являться предложением языка.

    Другое дело, что каждый уровень работает по своему набору правил.
    1-й и 2-й обычно разрабатывают, опираясь на такой раздел знаний, как формальная грамматика. Лексический анализатор обычно опирается на 3-ю группу формальных грамматик — на регулярные грамматики, уровень 2 — на контекстно-свободные (группа 2) или контекстно-зависимые (группа 1) грамматики.

    В принципе, тут именно обсуждался синтаксис языков, т.е. 2-й уровень разбора.

    V>Предложение либо принадлежит языку, либо не принадлежит. Все! Точка! Никаких других вариантов нет! Если компилятор (правильный) отказывается компилировать программу, следовательно эта программа не принадлежит языку. Короче, дружно учим матчасть.


    кто же против, если все 3 уровня компиляции "признали" выражение языка как допустимое — оно принадлежит языку.

    вот тебе пример:
    struct A { int i;}; 
    A a1 = { 10 };
    A a2 = { 20 };
    A a3 = a1 * a2;


    синтаксических ошибок нет, однако в последней строке ты получишь такую же ошибку, как приведенную в моем пред. посте.

    теперь добавим это:
    inline A operator *(const A& a1, const A& a2) 
    { A tmp = { a1.i * a2.i }; return tmp; }


    теперь в последней строке нет ошибки.

    ---------
    раньше выражение не принадлежало языку, теперь принадлежит.
    Re[21]: КС и КЗ грамматики
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 19.11.04 20:18
    Оценка: -1
    Здравствуйте, vdimas, Вы писали:

    V>да ну?


    V>а так:


    V>GetProperty ::= TypeID VarID '{' KeyWord_get FuncBody '}'

    V>KeyWord_get ::= 'g' 'e' 't'

    Это бред сивой кобылы.

    V>выкидываем нахрен лексический анализатор, описываем все в единой системе БНФ (все терминалы и нетерминалы до кучи).

    V>вполне решаемо. а раз представимо в БНФ, то КС.

    Возми любой КС-парсер и попытайся в нем на чистой граматике создать коррекный парсер.
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[23]: КС и КЗ грамматики
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 19.11.04 21:23
    Оценка: +1
    Здравствуйте, prVovik, Вы писали:

    AVK>>Это не грамматика, это семантика.

    V>Семантика тут не причем. Мы говорим о ПРИНАДЛЕЖНОСТИ предложения языку.

    Мы говорим о грамматике языка. Ну сколько можно говорить одно и то же? Вот цитата

    AVK>Но грамматика C# КЗ, а С++ КС.


    AVK>>Грамматика языка. Речь о грамматике.

    V>Ага, то есть ты согласен стем, что традиционные ЯЗЫКИ программирования контекстно-зависимы? Замечательно!

    http://en.wikipedia.org/wiki/Context-sensitive_language

    context-sensitive language is a formal language that can be defined by a context-sensitive grammar.

    Т.е. поскольку грамматика многих языков контекстно-свободная(
    http://planetmath.org/encyclopedia/ContextFreeLanguage.html

    The syntaxes of most programming languages are context-free grammars (or very close to it).

    ), то и утверждение твое является неверным. Т.е. я конечно понимаю что ты хочешь сказать, но к теории формальных языков это имеет опосредованное отношение. Признайся, ты ведь не прочитал статью, на которую я привел ссылку в предыдущем сообщении?

    V>А что такое контестно-зависимый язык?

    V>Контестно-зависимый язык — это язык, порождаемый контекстно-зависимой грамматикой, так гласит теория

    Осталось только понят что семантика и синтаксис это разные вещи, и все станет на свои места.
    ... << RSDN@Home 1.1.4 beta 3 rev. 231>>
    AVK Blog
    Re[22]: КС и КЗ грамматики
    От: vdimas Россия  
    Дата: 19.11.04 21:46
    Оценка: +1
    Здравствуйте, VladD2, Вы писали:

    VD>Здравствуйте, vdimas, Вы писали:


    V>>да ну?


    V>>а так:


    V>>GetProperty ::= TypeID VarID '{' KeyWord_get FuncBody '}'

    V>>KeyWord_get ::= 'g' 'e' 't'

    VD>Это бред сивой кобылы.


    конструктивней
    Re[21]: КС и КЗ грамматики
    От: vdimas Россия  
    Дата: 20.11.04 00:05
    Оценка: +1
    Здравствуйте, prVovik, Вы писали:

    V>А причем тут архитектура компилятора?????

    V>Я говорю про ТЕОРИЮ ЯЗЫКОВ. В ней нет никаких анализаторов. Есть ЯЗЫК — это множество корректных предложений.

    Тоды, надо было сразу определить направление твоих высказываний.

    V>Один из способов задания языка — использование грамматики. В этом случае говорят, что предложение принадлежит языку тогда и только тогда, когда существует хотя бы один вывод этого предложения из грамматики.


    именно

    V>КС грамматики теоретически не могут описывать традиционные языки программирования, так как они описывают слишком широкие языки. Так, например, с помощью КС грамматики невозможно учесть факт обязательного предобъявления идентификаторов.


    именно

    V>Тут проблема в том, что построение распознавателя КЗ языка — это очень сложная задача. Поэтому используют распознавалели КС языков, плюс "костыль" в виде семантического анализатора. И делают это исключительно от бедности. Но язык от этого отнюдь не перестает быть КЗ.


    там еще костыли в виде вмешательства в работу анализатора, изъятия или подмены цепочек и т.д.

    мне даже трудно представить себе размер КЗ грамматики, учитывающей все объявления типов, переменных и т.д. И неизвестно, как реализовать подобный распознаватель в чистом виде. Потому и существует теория построения компиляторов, я показывал 3-х уровневое построение компилятора.

    По сути, весь этот малополезный спор разгорелся о виде грамматики на уровне компиляции 2 в языках C# и C++. Разумеется, сами языки будут описываться КЗ-грамматикой, но в стандарте дано описание отдельных (слабосвязанных!!!) конструкций языка. Из-а них и спорим.
    Re[23]: КС и КЗ грамматики
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 20.11.04 02:12
    Оценка: :)
    Здравствуйте, vdimas, Вы писали:

    V>>>GetProperty ::= TypeID VarID '{' KeyWord_get FuncBody '}'

    V>>>KeyWord_get ::= 'g' 'e' 't'

    VD>>Это бред сивой кобылы.


    V>конструктивней


    Конструктивнее некда. Ты зря цитату ниже удалил.

    Если тебе нужно разжевать, то пожалуйста...

    в товоем описании вводятся три ключевых слова 'g' 'e' 't'. Стало быть вместо того чтобы страдать от того, что нельзя создать переменную с именем get, ты будеш страдать от того, что нгельзя создать целых 3 переменных. К тому же будет доступн синтаксис вроде:
    Xxx Xxx
    {
        g e t
        {
            ...
        }
    }

    а вот номальный эксесор распозноваться не будет, так как "get" лексером будет распозноваться как идентификатор (так как в языке он быть обязан).

    Реально работающий EBNF-код я тебе уже приводил: Re[19]: Качество стандарт
    Автор: VladD2
    Дата: 19.11.04
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[26]: КС и КЗ грамматики
    От: prVovik Россия  
    Дата: 20.11.04 21:39
    Оценка: +1
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Здравствуйте, prVovik, Вы писали:


    V>>Да. Потому что КС-грамматика по определению состоит из конечного числа продукций.


    AVK>Нет такого в определении КС-грамматики.


    http://en.wikipedia.org/wiki/Formal_grammar

    Formal definition
    In the classic formalization of generative grammars first proposed by Noam Chomsky in the 1950s, a grammar G consists of the following components:

    A finite set N of nonterminal symbols.
    A finite set ? of terminal symbols that is disjoint from N.
    A finite set P of production rules where a rule is of the form
    string in (? U N)* > string in (? U N)*


    AVK>Впрочем неважно, ограничим длину исходного текста программы 1 пентабайтом. Очевидно что с практической точки зрения ничего не изменилось, однако множество всех возможных программ стало конечным.

    Да, но это доказывает, что твой логический вывод
    AVK>Отсюда любая грамматика является КС
    неверен
    ... << RSDN@Home 1.1.4 @@subversion >>
    лэт ми спик фром май харт
    Re[26]: КС и КЗ грамматики
    От: vdimas Россия  
    Дата: 21.11.04 11:41
    Оценка: +1
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Здравствуйте, prVovik, Вы писали:


    V>>Да. Потому что КС-грамматика по определению состоит из конечного числа продукций.


    AVK>Нет такого в определении КС-грамматики. Впрочем неважно, ограничим длину исходного текста программы 1 пентабайтом. Очевидно что с практической точки зрения ничего не изменилось, однако множество всех возможных программ стало конечным.


    Ты не понял. Сама грамматика — конечна, т.е. состоит из конечного множества продукций.
    Множество порождаемых цепочек вполне может быть бесконечным, для этого достаточно даже 1-го рекурсивного правила.
    Re[26]: КС и КЗ грамматики
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 22.11.04 02:24
    Оценка: +1
    Здравствуйте, AndrewVK, Вы писали:

    V>>Да. Потому что КС-грамматика по определению состоит из конечного числа продукций.

    AVK>Нет такого в определении КС-грамматики. Впрочем неважно, ограничим длину исходного текста программы 1 пентабайтом. Очевидно что с практической точки зрения ничего не изменилось, однако множество всех возможных программ стало конечным.

    Мощность множества продукционных правил должна быть конечной. Если для выражения грамматики языка это множество должно быть бесконечным, то постулируется, что КС-грамматики для такого языка не существует. Только в этом случае. Даже грамматика из миллиона правил может быть КС-грамматикой. Её просто писать зашьёшься.
    ... << RSDN@Home 1.1.3 stable >>
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[20]: КС и КЗ грамматики
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 22.11.04 02:24
    Оценка: -1
    Здравствуйте, AndrewVK, Вы писали:

    V>>упрощенно:

    V>>PopertyDecl ::= GetPropertyDecl
    V>>PopertyDecl ::= SetPropertyDecl
    V>>PopertyDecl ::= GetSetPropertyDecl
    V>>GetProperty ::= TypeID VarID '{' 'get' FuncBody '}'
    V>>SetProperty ::= TypeID VarID '{' 'set' FuncBody '}'
    V>>GetSetProperty ::= TypeID VarID '{' 'set' FuncBody 'get' FuncBody '}'
    V>>GetSetProperty ::= TypeID VarID '{' 'get' FuncBody 'set' FuncBody '}'
    V>>если представимо в БНФ, то КС
    AVK>Здорово, а 'get' это что такое? В данном случае get это контекстно-зависимое ключевое слово. Для шарпа лексер без парсера корректный нельзя написать даже, вон студия get вне свойства как ключевое слово подсвечивает.
    Это как посмотреть. Если, например, вместо правила

    GetProperty ::= TypeID VarID '{' 'get' FuncBody '}'

    записать

    GetProperty ::= TypeID VarID '{' 'get' GetPropertyBody '}'

    и ввести соответствующий комплект правил для GetPropertyBody, назначительно отличающийся от FuncBody в части допустимых идентификаторов, то получим КС-грамматику.
    ... << RSDN@Home 1.1.3 stable >>
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[21]: КС и КЗ грамматики
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 22.11.04 04:12
    Оценка: :)
    Здравствуйте, vdimas, Вы писали:

    V>С использованием техники lexer->parser тебе действительно необходимы обходные пути, я полностью это признаю. Но, вроде бы, спорил совсем не с этим?


    Извини, но спорили о конкретной ситуации, а не о сфероконях.

    Если принять за истину, что граматика строится на базе треминалов (выдаваемых лексером), и "get" это один из терминалов, то граматика никак не может быть описана в терминах КСГ, так как значение терминала будет зависить от контекста.

    Ты же предлагаешь строить парсер как тот изумительный Фортнан 77, т.е. из терминалов размером в симвовл и с учетом всех возможных поялений проблеов. Другими словами на другой лексической базе. Но и так построить корретный парсер будет неимоверно сложно, так как те же пробельные символы начнут быть зависимыми от контекста. Например, в следующем коде:
    returnget; // ошибка! Но фортрано-подобный сканер ее не заметит!
    
    return(get);

    В первом примере примере пробельные символы обязательно обязаны учитываться, так как иначе он как Фортране распознается правильно, а во втором не как необязательные. Ну, и как записать такую граматику?
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[22]: КС и КЗ грамматики
    От: vdimas Россия  
    Дата: 22.11.04 13:41
    Оценка: +1
    Здравствуйте, VladD2, Вы писали:


    VD>Ты же предлагаешь строить парсер как тот изумительный Фортнан 77, т.е. из терминалов размером в симвовл и с учетом всех возможных поялений проблеов. Другими словами на другой лексической базе. Но и так построить корретный парсер будет неимоверно сложно, так как те же пробельные символы начнут быть зависимыми от контекста.

    Тот изумительный Фортран работает в 2-х режимах, я просто об этом не упомянул. Во втором режиме он ждет пробелы.


    VD>Например, в следующем коде:

    VD>
    VD>returnget; // ошибка! Но фортрано-подобный сканер ее не заметит!
    
    чем фортрано-подобный сканер отличается от не-фортрано-подобного? может быть только правилами? тогда может и заметить ;)
    
    VD>return(get);
    VD>

    VD>В первом примере примере пробельные символы обязательно обязаны учитываться, так как иначе он как Фортране распознается правильно, а во втором не как необязательные. Ну, и как записать такую граматику?

    упрощенно так:
    DelimiterChar ::= ' ' | '\t' | '\n' | ... и т.д.
    Delimiter ::= DelimiterChar | (DelimiterChar Delimiter).
    
    Expression ::= сложные правила для выражений.
    Expression ::= [Delimiter] Expression [Delimiter].
    Expression ::= '(' Expression ')'.
    
    Identificator ::= Alpha | (Identificator (Alpha | Digit)).
    ReturnExpression ::= Keyword_return | (Keyword_return Expression) ';'


    вот и все.
    returnget будет распознан как Identificator,
    return(get) как (Keyword_return Expression => ReturnExpression).



    и т.д.
    Re[25]: КС и КЗ грамматики
    От: vdimas Россия  
    Дата: 23.11.04 08:25
    Оценка: :)
    Здравствуйте, Sinclair, Вы писали:

    S>Решение-то очевидное, просто на поверхности лежит. Мне совершенно непонятно, почему его не применили при построении "канонической" грамматики C#. Может быть, есть еще какие-то проблемы, о которых мы не знаем?


    ага, забыли Вирта пригласить, или хотя бы Кнута
    Re[24]: КС и КЗ грамматики
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 23.11.04 10:08
    Оценка: +1
    Здравствуйте, VladD2, Вы писали:

    Я же просил — заканчивайте разборки.
    ... << RSDN@Home 1.1.4 beta 3 rev. 232>>
    AVK Blog
    Re[27]: Качество стандарт
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 24.11.04 01:22
    Оценка: -1
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Как давным-давно заметил Шахтер, важно уточнять, о какой грамматике идет речь. Как видишь, вы втроем говорили о трех разных грамматиках:
  • VladD2: о грамматике, приведенной в спецификации;

    О граматике из спецификации прходится говорить хотя бы потому, что совместимость именно с ней нужно обеспечить.

    И вообще, изначально прозвучало утверждение, что граматика Шарпа КС. О какой вообще граматике могла идти речь в этом утверждении? Мы с АВК резонно заметили, что граматика шарпа не является КС, так как нарушает ее и даже описывает пути устранения двусмысленностей путем введения семантических проверок. Вы тут все не верили и придумывали различные изощрения чтобы как-то это опровергнуть.

    ПК>
  • prVоvik: грамматике, полностью описывающей синтаксис языка (она не может быть КС, т.к. требует предварительного обьявления переменных);

    Ну, да. Типа с философской точки зрения все правы.

    ПК>
  • vdimas: о грамматике, эквивалентной первой в плане порождаемого языка, но являющейся контекстно-свободной.

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

    ПК>Последнюю грамматику легким движением руки
    Автор: vdimas
    Дата: 22.11.04
    ,


    1. Это уже другая граматика. В спецификации четко сказано, что identifier — это токен. 2. Такое решение создает проблем больше чем решает. О том, каких можешь прочесь в опем ответе на то сообщение.

    ПК> можно получить из описанной в стандарте C#, если, конечно, кроме "контекстно-зависимых" ключевых слов в грамматике из спецификации нет других моментов, действительно, не позволяющих преобразовать ее в КС.


    Мля, граматику нельзя преобразовывать. По крайней мере до той степени до которой ее нужно уфигачить чтобы превратить в КС которую можно без проблем распарсить с помощью имеющихся средств. Ну, и в C# 2.0 достатчно и других КЗ-случаев.

    ПК> Последнего пока продемонстрировано не было.


    Кто-то просто постоянно фильтрует подобные демонстрации. Я уже показывал ту же ситуацию с неоднозначностью в понимании >> и F(G<,A>(2)).

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

    Нешение для F(G<,A>(2)) описано в пункте "9.2.3 Grammar ambiguities". Где предлагается считать подбные конструкции вызовами методов если за > идет один из следующих символов "( ) ] : ; , . ? == !=".
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
  • Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[30]: Качество стандарт
    От: Павел Кузнецов  
    Дата: 24.11.04 13:33
    Оценка: -1
    AndrewVK,

    > ПК>

    почему грамматика C# КЗ?
    > ПК>какие выражения не удается представить в КС — форме?

    > ПК>Как видишь, добавление к синтаксису языка свойств на манер C#, со всем "контекстно-зависимыми" ключевыми словами, на возможность представления его контекстно-свободной грамматикой не влияет.

    > Справедливости ради — исходная цитата, от которой собственно пошел разговор о КС и КЗ была такой:

    >

    Мягко контекстно-зависимые грамматики – будучи несколько более мощными, чем КС-грамматики, грамматики данного класса позволяют анализировать большинство типов синтаксически релевантных нелокальных связей.

    > А то что ты привел говорилось уже в контексте этого.

    Тем не менее, пока не было продемонстрировано, какие конструкции синтаксиса C# требуют хотя бы мягко контекстно-зависимой грамматики. Пока что, все, что было названо, вполне описывается контекстно-свободными грамматиками.

    Также мне не ясно, как в контексте процитированного фрагмента понимать твое высказывание:

    AVK> грамматика C# КЗ, а С++ КС


    Или ты что-то другое имеешь в виду, приводя цитату о мощности мягко контекстно-зависимых грамматик?
    Posted via RSDN NNTP Server 1.9 gamma
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[27]: КС и КЗ грамматики
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 27.11.04 02:49
    Оценка: -1
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>Да, сама грамматика поменяется. Но не её классификация.


    Ну, а теперь попытаемся ответить на вопрос "можно ли исходную граматику назвать КС?".
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[16]: КС и КЗ грамматики
    От: vdimas Россия  
    Дата: 19.11.04 11:45
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:


    AVK>Ага, значит КЗ мощнее КС. Но грамматика C# КЗ, а С++ КС. Получается что ты опроверг свое первоначальное утверждение .


    почему грамматика C# КЗ?
    какие выражения не удается представить в КС — форме?
    Re[17]: КС и КЗ грамматики
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 19.11.04 13:00
    Оценка:
    Здравствуйте, vdimas, Вы писали:

    AVK>>Ага, значит КЗ мощнее КС. Но грамматика C# КЗ, а С++ КС. Получается что ты опроверг свое первоначальное утверждение .


    V>почему грамматика C# КЗ?


    Потому что.

    V>какие выражения не удается представить в КС — форме?


    Например свойство.
    ... << RSDN@Home 1.1.4 beta 3 rev. 232>>
    AVK Blog
    Re[19]: КС и КЗ грамматики
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 19.11.04 15:02
    Оценка:
    Здравствуйте, vdimas, Вы писали:

    V>упрощенно:


    V>PopertyDecl ::= GetPropertyDecl

    V>PopertyDecl ::= SetPropertyDecl
    V>PopertyDecl ::= GetSetPropertyDecl

    V>GetProperty ::= TypeID VarID '{' 'get' FuncBody '}'

    V>SetProperty ::= TypeID VarID '{' 'set' FuncBody '}'
    V>GetSetProperty ::= TypeID VarID '{' 'set' FuncBody 'get' FuncBody '}'
    V>GetSetProperty ::= TypeID VarID '{' 'get' FuncBody 'set' FuncBody '}'

    V>если представимо в БНФ, то КС


    Здорово, а 'get' это что такое? В данном случае get это контекстно-зависимое ключевое слово. Для шарпа лексер без парсера корректный нельзя написать даже, вон студия get вне свойства как ключевое слово подсвечивает.
    ... << RSDN@Home 1.1.4 beta 3 rev. 232>>
    AVK Blog
    Re[17]: КС и КЗ грамматики
    От: vdimas Россия  
    Дата: 19.11.04 15:07
    Оценка:
    Здравствуйте, prVovik, Вы писали:

    V>1) корректная программа:

    V>
    V>    int a = 3;
    V>    a = a * 10;
    V>


    V>2) некорректная программа:

    V>
    V>    char *a = "hello, world";
    V>    a = a * 10;
    V>


    V>Можешь написать КС грамматику, из которой будет выводиться программа №1, но не будет выводится программа №2 ?


    компилятор выдал ошибку:
    error C2296: '*' : illegal, left operand has type 'char *'

    как ты думаешь, это синтаксическая или семантическая ошибка?
    Re[17]: КС и КЗ грамматики
    От: prVovik Россия  
    Дата: 19.11.04 17:36
    Оценка:
    А может быть, уважаемые, понаставившие минусов, еще и скажут что-нибудь вразумительное?
    ... << RSDN@Home 1.1.4 @@subversion >>
    лэт ми спик фром май харт
    Re[17]: КС и КЗ грамматики
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 19.11.04 20:18
    Оценка:
    Здравствуйте, vdimas, Вы писали:

    V>Здравствуйте, AndrewVK, Вы писали:



    AVK>>Ага, значит КЗ мощнее КС. Но грамматика C# КЗ, а С++ КС. Получается что ты опроверг свое первоначальное утверждение .


    V>почему грамматика C# КЗ?

    V>какие выражения не удается представить в КС — форме?

    В C# есть куча мест зависяцих от контекста, но в стандарте четко определено как разрешать неоднозначности.

    Например, в C# есть контекстно зависимые ключевые слова (С++ это и не снилось): get, set, add, remove. Они действуют только внутри описания свойвст и могут являться идентификаторами в других.

    Далее, есть неоднозначности разрешаемые в зависимости от контекста. Например:
    F(G<A, B>(1))

    можно интерпретировать как вызов метода F с одним параметром в который подставляется результат вызова дженерик-метода "G<A, B>", которому передается "1":
    F(G<A, B>((1)))

    С другой стороны его можно расматривать как:
    F(G<A, (B > (1)))

    то есть вызов метода F с двумя параметрами в которые передаются значения "A" и "B > 1".
    Прицип разрешения неоднозначности описан в стандарте. Если после ">" идет набор символов вроде ")", "]" и т.п., то это считается вызовом метода. Иначе выражением. Так же есть зависимость от контекста в котором встретилось выражение. Так в выражении:
    a = b is X<Y> 1;

    X<Y> всегда будет распознаваться как тип, так как оператор is не может принимать выражения.
    Таких примеров хватает. Из особо забавных, в Шарпе можно писать:
    X<Y<A, B>>

    и компилятор обязан сам понимать является ли >> оператором сдвига или же это закрывающие скобки списка параметоров типа. Опять же это подробно описно в спецификации.
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[19]: КС и КЗ грамматики
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 19.11.04 20:18
    Оценка:
    Здравствуйте, vdimas, Вы писали:

    V>упрощенно:
    
    V>PopertyDecl ::= GetPropertyDecl
    V>PopertyDecl ::= SetPropertyDecl
    V>PopertyDecl ::= GetSetPropertyDecl
    
    V>GetProperty ::= TypeID VarID '{' 'get' FuncBody '}'
    V>SetProperty ::= TypeID VarID '{' 'set' FuncBody '}'
    V>GetSetProperty ::= TypeID VarID '{' 'set' FuncBody 'get' FuncBody '}'
    V>GetSetProperty ::= TypeID VarID '{' 'get' FuncBody 'set' FuncBody '}'
    
    
    V>если представимо в БНФ, то КС


    Это не работающая граматика.

    Правильная будет (если отбросить то, что ты не описал и 10%). Вот реальный EBNF из R#-а:
    AccessorDecls<RMemberPropertyImpl prop>                        
    =
        { AttributeSection<sections> }
        (
                IF (IdentIsGet())
                (                                                  
                    identifier                                     
                    (
                            Block<prop.GetStatements>              
                        |   WEAK ";"                               
                    )
                    [                                              
                        { AttributeSection<sections> }             
                        identifier                                 
                        (                                          
                                Block<prop.SetStatements>          
                            |   WEAK ";"                           
                        )
                    ]
                )
            |   IF (IdentIsSet())
                (                                                  
                    identifier                                     
                    (                                           
                            Block<prop.SetStatements>              
                        |   WEAK ";"                               
                    )
                    [                                              
                        { AttributeSection<sections> }             
                        identifier                                 
                        (
                                Block<prop.GetStatements>          
                            |   WEAK ";"                           
                        )
                    ]
                )
            |   identifier   /*отлов ошибок в именовании эксесоров*/                                       
        )
    .

    обрати внимание на выделенные жирным функции. Это как раз средства разрешения контекстной зависимости. Так же обрати, на то что вместо "get" и "set" используется identifier.
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[20]: КС и КЗ грамматики
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 19.11.04 20:18
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Здорово, а 'get' это что такое? В данном случае get это контекстно-зависимое ключевое слово. Для шарпа лексер без парсера корректный нельзя написать


    На практике это просто не отдается лексеру. Это и парсером не лоивится. Это уже чистая семантика, как раз отработка контекстной зависимости.

    AVK> даже, вон студия get вне свойства как ключевое слово подсвечивает.


    Новая парсит код и ловит все что нужно.
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[21]: КС и КЗ грамматики
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 19.11.04 20:51
    Оценка:
    Здравствуйте, prVovik, Вы писали:

    V>КС грамматики теоретически не могут описывать традиционные языки программирования, так как они описывают слишком широкие языки. Так, например, с помощью КС грамматики невозможно учесть факт обязательного предобъявления идентификаторов.


    Это не грамматика, это семантика.

    V>Тут проблема в том, что построение распознавателя КЗ языка — это очень сложная задача. Поэтому используют распознавалели КС языков, плюс "костыль" в виде семантического анализатора.


    О как, семантический анализатор у нас уже костыль. На самом деле это вполне законная часть теории языков программирования. Почитай здесь
    http://en.wikipedia.org/wiki/Formal_semantics_of_programming_languages

    V> И делают это исключительно от бедности. Но язык от этого отнюдь не перестает быть КЗ.


    Грамматика языка. Речь о грамматике.
    ... << RSDN@Home 1.1.4 beta 3 rev. 231>>
    AVK Blog
    Re[20]: КС и КЗ грамматики
    От: prVovik Россия  
    Дата: 19.11.04 20:55
    Оценка:
    Здравствуйте, vdimas, Вы писали:
    V>вот тебе пример:
    V>
    V>struct A { int i;}; 
    V>A a1 = { 10 };
    V>A a2 = { 20 };
    V>A a3 = a1 * a2;
    V>


    V>синтаксических ошибок нет,

    что означает фраза "синтаксических ошибок нет"?

    V>однако в последней строке ты получишь такую же ошибку, как приведенную в моем пред. посте.

    конечно, ведь программа некорректна, ТО ЕСТЬ она не принадлежит языку

    V>теперь добавим это:

    V>
    V>inline A operator *(const A& a1, const A& a2) 
    V>{ A tmp = { a1.i * a2.i }; return tmp; }
    V>


    V>теперь в последней строке нет ошибки.


    V>---------

    V>раньше выражение не принадлежало языку, теперь принадлежит.
    Совершенно верно. Не вижу подкола Не забывай, что С++ — это контекстно-зависимый язык и разбор предложения зависет от контекста, то есть от того определен ли "A operator *(const A& a1, const A& a2)" или нет.
    ... << RSDN@Home 1.1.4 @@subversion >>
    лэт ми спик фром май харт
    Re[18]: КС и КЗ грамматики
    От: vdimas Россия  
    Дата: 19.11.04 23:43
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Здравствуйте, vdimas, Вы писали:


    VD>можно интерпретировать как вызов метода F с одним параметром в который подставляется результат вызова дженерик-метода "G<A, B>", которому передается "1":

    VD>
    VD>F(G<A, B>((1)))
    VD>

    VD>С другой стороны его можно расматривать как:
    VD>
    VD>F(G<A, (B > (1)))
    VD>


    в С++ та же неоднозначность (для человека )

    VD>то есть вызов метода F с двумя параметрами в которые передаются значения "A" и "B > 1".

    VD>Прицип разрешения неоднозначности описан в стандарте. Если после ">" идет набор символов вроде ")", "]" и т.п., то это считается вызовом метода. Иначе выражением.
    Вот и привели к КС.
    В С++ правило другое: если ранее был описан шаблонный тип G, то делается попытка рассмотреть как подача аргументов шаблона. к КС неприводимо.

    VD>Так же есть зависимость от контекста в котором встретилось выражение. Так в выражении:

    VD>
    VD>a = b is X<Y> 1;
    VD>

    VD>X<Y> всегда будет распознаваться как тип, так как оператор is не может принимать выражения.

    опять привели к КС


    VD>Таких примеров хватает. Из особо забавных, в Шарпе можно писать:

    VD>
    VD>X<Y<A, B>>
    VD>

    VD>и компилятор обязан сам понимать является ли >> оператором сдвига или же это закрывающие скобки списка параметоров типа. Опять же это подробно описно в спецификации.
    Ты не привел правила из спецификации, не могу сказать, приводимо или нет.
    В С++ тоже обсуждается возможность разрешить подобное.

    а насчет get, set, add...
    они выступают как ключевые слова только в специальных синтаксических конструкциях, и эти конструкции приводимы к КС.

    здесь Андрею ответил
    Автор: vdimas
    Дата: 20.11.04
    Re[20]: КС и КЗ грамматики
    От: vdimas Россия  
    Дата: 19.11.04 23:50
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Это не работающая граматика.


    я оговорился насчет упрощенно, сути это не меняло.

    VD>обрати внимание на выделенные жирным функции. Это как раз средства разрешения контекстной зависимости. Так же обрати, на то что вместо "get" и "set" используется identifier.


    Это ТВОЙ способ, продиктованный желанием упростить правила. Уверен, что в твоем лексере get и set не имеют специальной пометки (как остальные ключевые слова, если он у тебя вообще ключевые слова отличает от идентификаторов, например в компиляторе из Ротора — не отличает, ключевые слова потом в таблице поиском находятся после разбиения на лексемы).
    Re[22]: КС и КЗ грамматики
    От: prVovik Россия  
    Дата: 20.11.04 00:10
    Оценка:
    ... << RSDN@Home 1.1.4 @@subversion >>
    лэт ми спик фром май харт
    Re[21]: КС и КЗ грамматики
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 20.11.04 02:12
    Оценка:
    Здравствуйте, vdimas, Вы писали:

    VD>>Это не работающая граматика.


    V>я оговорился насчет упрощенно, сути это не меняло.


    А я не об упращении. АВК совершенно прав. Описание эксесоров не нельзя выразить средствами КС-граматики.

    V>Это ТВОЙ способ, продиктованный желанием упростить правила.


    Это общее решение. Как не крути КС-граматикой это не выразить.

    V> Уверен, что в твоем лексере get и set не имеют специальной пометки (как остальные ключевые слова, если он у тебя вообще ключевые слова отличает от идентификаторов, например в компиляторе из Ротора — не отличает, ключевые слова потом в таблице поиском находятся после разбиения на лексемы).


    Ты уж извени, но разговор получается на довольно несерьезном уровне. Еще раз пвторю, возми КС-парсер и попробуй на нем реализовать парсер. В качестве провекрки подсунь ему такой код:
    Xxx get;
    
    Xxx Xxx
    {
        get
        {
            return get;
        }
    }


    думаю, ты быстро убедишся, что средствами КС это не записывается, так как get имеет зависимость от контекста. Внутри определения свойства он ключевое слово. Во вне простой идентификатор. Обходится это не сложно, но любой обход является контекстным анализом.
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[19]: КС и КЗ грамматики
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 20.11.04 02:12
    Оценка:
    Здравствуйте, vdimas, Вы писали:

    V>в С++ та же неоднозначность


    Никто и не спорит.

    V>(для человека )


    Человект тут не причем. Это неоднозначность для алгоритма распознования.

    VD>>Прицип разрешения неоднозначности описан в стандарте. Если после ">" идет набор символов вроде ")", "]" и т.п., то это считается вызовом метода. Иначе выражением.

    V>Вот и привели к КС.

    Это уже не КС. Это уже контекстные проверки. Или анализ типов при компиляции С++-кода тоже КС будет.

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


    Это просто другой способ устранения неоднозначности. Создатели Шарпа просо выбрали спосод наиболее удобный для них. Правильным решением было бы вообще использовать специальный синтаксис для параметров типа. Например "(# ... #)". Тогда неоднозначностей небыло бы и граматика была бы КС.

    Кстати, еще одна проблема с КС возникает при анализе атрибутов. Там тоже контекстные идентификаторы, и на их основании атрибуты относятся к глобавльным или местным. Из-за этого компилятор Моно хавает глобальные атрибуты практически в любм месте программы. А все потому, что у Yacc-а очень скудные возможности по контектному анализу.

    V>опять привели к КС


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

    V>Ты не привел правила из спецификации, не могу сказать, приводимо или нет.


    Правила нет. Есть специальное описание разрешения конфликта. Оно не в терминах КС. Оно просто на словах. Ну, а спецификацию можешь скачать с сайта МС: http://download.microsoft.com/download/8/1/6/81682478-4018-48fe-9e5e-f87a44af3db9/Standard.pdf

    V>В С++ тоже обсуждается возможность разрешить подобное.


    Когда-то кто-то говорил, что это неверно и т.п. ну, да практика критерий истины.

    V>а насчет get, set, add...

    V>они выступают как ключевые слова только в специальных синтаксических конструкциях, и эти конструкции приводимы к КС.

    Блин, подумай над своими словами. Это зависимость от контекста. Все. Точка!

    V>здесь Андрею ответил
    Автор: vdimas
    Дата: 20.11.04


    Я кажется тебе уже сказал, что ты заблуждаешся. КС позволяет построить формальное описание, а по нему алгоритм. Подобные же зависимости мешают это сделать. Обходные пути не есть приведение к КС.
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[22]: КС и КЗ грамматики
    От: vdimas Россия  
    Дата: 20.11.04 08:21
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Ты зря цитату ниже удалил.

    возвращаю на место

    VD>Возми любой КС-парсер и попытайся в нем на чистой граматике создать коррекный парсер.


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

    Следовательно, позволь мне не брать "любой КС-парсер", ибо написать можно действительно любой.
    Re[19]: КС и КЗ грамматики
    От: prVovik Россия  
    Дата: 20.11.04 08:25
    Оценка:
    Здравствуйте, Шахтер, Вы писали:


    Ш>"Зависящие от контекста" токены не делают язык контекстно-зависимым.


    Это почему еще?
    Если есть зависящие от контекста токены, то грамматика КЗ. А язык, порождаемый КЗ грамматикой по определению является КЗ.
    ... << RSDN@Home 1.1.4 @@subversion >>
    лэт ми спик фром май харт
    Re[22]: КС и КЗ грамматики
    От: vdimas Россия  
    Дата: 20.11.04 08:56
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Ты уж извени, но разговор получается на довольно несерьезном уровне. Еще раз пвторю, возми КС-парсер и попробуй на нем реализовать парсер. В качестве провекрки подсунь ему такой код:

    VD>
    VD>Xxx get;
    
    VD>Xxx Xxx
    VD>{
    VD>    get
    VD>    {
    VD>        return get;
    VD>    }
    VD>}
    VD>


    VD>думаю, ты быстро убедишся, что средствами КС это не записывается, так как get имеет зависимость от контекста. Внутри определения свойства он ключевое слово. Во вне простой идентификатор. Обходится это не сложно, но любой обход является контекстным анализом.


    здесь обходится
    Автор: vdimas
    Дата: 20.11.04
    Re[24]: КС и КЗ грамматики
    От: vdimas Россия  
    Дата: 20.11.04 08:57
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Здравствуйте, vdimas, Вы писали:


    V>>гм... ход мыслей понятен, но посмотри там же определение КЗ-грамматики. Если мне удасться твой т.н. "контекст" целиком расположить в правой части правил, то...


    VD>Неудастся. Вообще не удастся расположить в правиле. На то и зависимость от контекста.


    Она отсутствует, эта зависимость.Определение св-в или евентов — это вполне детерминированная синтаксическая конструкция.

    тут более полно
    Автор: vdimas
    Дата: 20.11.04
    Re[20]: КС и КЗ грамматики
    От: vdimas Россия  
    Дата: 20.11.04 09:18
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Я кажется тебе уже сказал, что ты заблуждаешся. КС позволяет построить формальное описание, а по нему алгоритм. Подобные же зависимости мешают это сделать. Обходные пути не есть приведение к КС.


    здесь
    Автор: vdimas
    Дата: 20.11.04


    в общем, Влад, я вижу, что тебе кажется, будто я в упор не понимаю ваш пример. Поверь на слово — понимаю.
    у меня тоже приличный опыт на C# (правда только на 1.0 и 1.1)

    более того, каюсь, по старой сишной привычке я даже обзывал ф-ии так: get(); (правда только приватные, ибо протектед и паблик именовал согласно принятому в C# name conventions)

    в том посте я указывал на взаимосвязь лексического и синтаксического анализатора, а так же на причины существования такого зверя, как синтаксический анализатор. Yacc и Lex работают в паре, поэтому, разумеется, я не могу на них показать работоспособный вариант.

    С использованием техники lexer->parser тебе действительно необходимы обходные пути, я полностью это признаю. Но, вроде бы, спорил совсем не с этим?

    -----
    внематочнее читаем оппонента, внематочнее...
    Re[23]: КС и КЗ грамматики
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 20.11.04 09:27
    Оценка:
    Здравствуйте, vdimas, Вы писали:

    V>ну дык читай, что на что может меняться

    V>это суть описание вида БНФ (вернее, БНФ способно описывать правила, попадающие под это определение)

    V>есть теорема, что грамматика, представимая БНФ является как минимум КС

    V>(если сам поленишься найти — найду ссылки)

    Есть такая теорема. Только не представляется грамматика шарпа. Скачай грамматику из R#, там EBNF. Вот только почему то для грамматики шарпа пришлось коку расширять совсем не бнф конструкциями.

    V>я тебе уже показывал, как твой случай описываеся БНФ.


    Таким образом, как ты это описал, можно описать любую КЗ грамматику. Например просто очертим все возможное множество программ и поставим их в правой части, как ты предлагаешь. Да, такая BNF-грамматика будет бесконечной, но она будет существовать. Отсюда любая грамматика является КС. Абсурд?

    V>Да ты легко сам можешь написать КС парсер, который корректно разберет это несчатсное 'get' в различных синтаксических конструкциях


    Вряд ли. Все парсеры шарпа, которые я видел (а я видел их довольно много) были не КС. Случайность?

    V>---------

    V>вот тебе упрощенный пример в регулярной грамматике, где одна и та же цепочка символов может являться частью других допустимых цепочек.

    V>$KeywordGet = 'g' 'e' 't' ';'.

    V>$VarGet = 'i' 'n' 't' '_' 'g' 'e' 't' '=' '1' ';'.

    А когда ты вставишь это в полную грамматику шарпа и попробуешь обработать к примеру кокой то она тебе скажет что в грамматике твоей ошибки, потому что ; в сочетании с идентификатором подходит под другое правило.
    ... << RSDN@Home 1.1.4 beta 3 rev. 231>>
    AVK Blog
    Re[25]: КС и КЗ грамматики
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 20.11.04 09:27
    Оценка:
    Здравствуйте, prVovik, Вы писали:

    V>>>Семантика тут не причем. Мы говорим о ПРИНАДЛЕЖНОСТИ предложения языку.

    AVK>>Мы говорим о грамматике языка.
    V>А это одно и тоже!

    То есть в грамматику входит семантика, я правильно тебя понял?

    V> Язык — это множество предложений, обычно бесконечное. Грамматика — это конечное описание множества предложений языка.


    Это описание правил, по которым может строится синтаксически правильные конструкции языка. Соответствие предложения грамматике является необходимым, но не достаточным условием. Например синтаксическая корректность xml называется wellformness. При этом well-formed документ содержать невалидные данные (например два повторяющихся id). В итоге любой парсер сможет этот xml отпарсить без ошибок, но при том в целевой системе он будет невалидным. Это и называется семантикой.

    V>Если использовать твою логику на счет "семантики",


    Она не моя, она общепринятая. Ссылки я приводил.

    V> то можно договориться до чего угодно. Например, до того, что С# — это регулярный язык. Не веришь? Смотри. Зададим его грамматику в виде регулярного выражения ".*", а все остаьное вынесем на якобы "семантический уровень".


    Ты видимо опять не прочитал статью, на которую я привел ссылку. Печально. Прочти, там доходчиво объяснено почему так сделать нельзя.

    V>Вообще, для чего нужна грамматика? С помощью грамматики можно задавать ограничения на предложения языка. Ограничения могут быть разными. Например, с помощью грамматики можно указать, что все операторы должны оканчиваться точкой с запятой, или что каждой открывающей скобке должна соответствовать закрывающая и т.д. Точно таким же ограничением является ограничение на предъобьявление идентификатоа. Это ограничение ни чем не лучше и не хуже вышеописанных ограничений. Они равноправны.


    Ты забываешь одну простую вещь — когда говорят слово грамматика в подобном контексте имеют ввиду parsing expression grammar. Что это такое можешь прочесть здесь: http://en.wikipedia.org/wiki/Parsing_expression_grammar
    ... << RSDN@Home 1.1.4 beta 3 rev. 231>>
    AVK Blog
    Re[21]: КС и КЗ грамматики
    От: vdimas Россия  
    Дата: 20.11.04 09:30
    Оценка:
    Здравствуйте, prVovik, Вы писали:

    V>>синтаксических ошибок нет,

    V>что означает фраза "синтаксических ошибок нет"?

    Собственно, во мнениях на теорию языков уже сошлись, просто поимей ввиду теперь прикладной раздел — построение компиляторов. Именно из-за их многоуровневой схемы различают синтаксические и семантические ошибки.
    Re[26]: КС и КЗ грамматики
    От: prVovik Россия  
    Дата: 20.11.04 15:08
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>То есть в грамматику входит семантика, я правильно тебя понял?

    Нет. Теория формальных языков вообще не рассматривает семантику предложений.

    AVK>Это описание правил, по которым может строится синтаксически правильные конструкции языка. Соответствие предложения грамматике является необходимым, но не достаточным условием. Например синтаксическая корректность xml называется wellformness. При этом well-formed документ содержать невалидные данные (например два повторяющихся id). В итоге любой парсер сможет этот xml отпарсить без ошибок, но при том в целевой системе он будет невалидным. Это и называется семантикой.

    А ничего, что можно построить КЗ парсер, который автоматически будет контролировать это ограничение?

    V>> то можно договориться до чего угодно. Например, до того, что С# — это регулярный язык. Не веришь? Смотри. Зададим его грамматику в виде регулярного выражения ".*", а все остаьное вынесем на якобы "семантический уровень".

    AVK>Ты видимо опять не прочитал статью, на которую я привел ссылку. Печально. Прочти, там доходчиво объяснено почему так сделать нельзя.
    Читал. Но глупый я. И не понимаю, почему так нельзя делать. Более того, я даже реально так делал, давно, когда еще не знал слова "грамматика". Я делал интерпретатор паскаля, дак там был только лексический анализатор. Он бил программу на лексемы, а далее эти лексемы сразу обрабатывались семантическим уровнем без всяких AST. Значит ли, что язык того интерпретатора регулярный?
    ... << RSDN@Home 1.1.4 @@subversion >>
    лэт ми спик фром май харт
    Re[20]: КС и КЗ грамматики
    От: Шахтер Интернет  
    Дата: 20.11.04 15:20
    Оценка:
    Здравствуйте, prVovik, Вы писали:

    V>Здравствуйте, Шахтер, Вы писали:



    Ш>>"Зависящие от контекста" токены не делают язык контекстно-зависимым.


    V>Это почему еще?

    V>Если есть зависящие от контекста токены, то грамматика КЗ.

    Нет. См. пример выше.

    V>А язык, порождаемый КЗ грамматикой по определению является КЗ.


    Тоже нет. Один и тот же язык может задаваться разными грамматиками.
    ... << RSDN@Home 1.1.0 stable >>
    В XXI век с CCore.
    Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
    Re[24]: КС и КЗ грамматики
    От: Шахтер Интернет  
    Дата: 20.11.04 15:20
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Здравствуйте, vdimas, Вы писали:


    AVK>Паша, будь добр, поясни свою позицию. А то простановка плюсов vdimas за доказательства того что грамматика C# и С++ КС наряду с простановкой плюсов prVovik, доказывающего что грамматики и шарпа и С++ КЗ приводит меня в состояние ступора.


    Вы бы сначала определились, о чем вообще базар. Если ты откроешь стандарты, то можешь легко убедиться, что грамматики С++ и С#, которые там приведены, контекстно-свободные.
    ... << RSDN@Home 1.1.0 stable >>
    В XXI век с CCore.
    Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
    Re[21]: КС и КЗ грамматики
    От: prVovik Россия  
    Дата: 20.11.04 16:03
    Оценка:
    Здравствуйте, Шахтер, Вы писали:

    Ш>Тоже нет. Один и тот же язык может задаваться разными грамматиками.

    Ну если МОЖЕТ, то тогда да.
    ... << RSDN@Home 1.1.4 @@subversion >>
    лэт ми спик фром май харт
    Re[24]: КС и КЗ грамматики
    От: prVovik Россия  
    Дата: 20.11.04 17:16
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Здравствуйте, vdimas, Вы писали:


    AVK>Паша, будь добр, поясни свою позицию. А то простановка плюсов vdimas за доказательства того что грамматика C# и С++ КС наряду с простановкой плюсов prVovik, доказывающего что грамматики и шарпа и С++ КЗ приводит меня в состояние ступора.


    Кстати, вот выдержка из книги "Системное программное обеспечение" А.В.Гордеев А.Ю.Молчанов Питер 2001
    Глава 9. Формальные языкт и грамматики
    Распознаватели. Задача разбора.
    стр. 381

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

    ... << RSDN@Home 1.1.4 @@subversion >>
    лэт ми спик фром май харт
    Re[26]: КС и КЗ грамматики
    От: prVovik Россия  
    Дата: 20.11.04 17:27
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:


    AVK>То есть в грамматику входит семантика, я правильно тебя понял?


    Ok, я понял о чем ты. В грамматику входит не вся семантика целиком, а только семантические проверки, поскольку они влияют на принадлежность программы к языку, то есть на её корректность.
    ... << RSDN@Home 1.1.4 @@subversion >>
    лэт ми спик фром май харт
    Re[24]: КС и КЗ грамматики
    От: prVovik Россия  
    Дата: 20.11.04 17:35
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Таким образом, как ты это описал, можно описать любую КЗ грамматику. Например просто очертим все возможное множество программ и поставим их в правой части, как ты предлагаешь. Да, такая BNF-грамматика будет бесконечной, но она будет существовать. Отсюда любая грамматика является КС. Абсурд?


    Да. Потому что КС-грамматика по определению состоит из конечного числа продукций.
    ... << RSDN@Home 1.1.4 @@subversion >>
    лэт ми спик фром май харт
    Re[22]: КС и КЗ грамматики
    От: Шахтер Интернет  
    Дата: 20.11.04 17:56
    Оценка:
    Здравствуйте, prVovik, Вы писали:

    V>Здравствуйте, Шахтер, Вы писали:


    Ш>>Тоже нет. Один и тот же язык может задаваться разными грамматиками.

    V>Ну если МОЖЕТ, то тогда да.

    А что, есть сомнения?
    ... << RSDN@Home 1.1.0 stable >>
    В XXI век с CCore.
    Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
    Re[26]: КС и КЗ грамматики
    От: Шахтер Интернет  
    Дата: 20.11.04 17:59
    Оценка:
    Здравствуйте, prVovik, Вы писали:

    V>Здравствуйте, Шахтер, Вы писали:


    Ш>>Вы бы сначала определились, о чем вообще базар. Если ты откроешь стандарты, то можешь легко убедиться, что грамматики С++ и С#, которые там приведены, контекстно-свободные.


    V>А разве речь идет о том, какие грамматики приведены в стандарте?


    Ну так вы определитесь, о каких именно грамматиках говорите.
    ... << RSDN@Home 1.1.0 stable >>
    В XXI век с CCore.
    Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
    Re[23]: КС и КЗ грамматики
    От: prVovik Россия  
    Дата: 20.11.04 18:12
    Оценка:
    Здравствуйте, Шахтер, Вы писали:

    Ш>А что, есть сомнения?


    Ну я, например, не представляю, как зависимость от контекста можно учесть в КС грамматике
    ... << RSDN@Home 1.1.4 @@subversion >>
    лэт ми спик фром май харт
    Re[27]: КС и КЗ грамматики
    От: prVovik Россия  
    Дата: 20.11.04 18:12
    Оценка:
    Здравствуйте, Шахтер, Вы писали:

    Ш>Ну так вы определитесь, о каких именно грамматиках говорите.


    Ну я имел ввиду общую грамматику языка (то есть грамматику всех корректных программ), которая является ну ни как не ниже КЗ
    ... << RSDN@Home 1.1.4 @@subversion >>
    лэт ми спик фром май харт
    Re[24]: КС и КЗ грамматики
    От: Шахтер Интернет  
    Дата: 20.11.04 18:40
    Оценка:
    Здравствуйте, prVovik, Вы писали:

    V>Здравствуйте, Шахтер, Вы писали:


    Ш>>А что, есть сомнения?


    V>Ну я, например, не представляю, как зависимость от контекста можно учесть в КС грамматике

    V>

    Ты вообще читаешь мои сообщения? Я говорил о возможности задания языка разными грамматиками.
    ... << RSDN@Home 1.1.0 stable >>
    В XXI век с CCore.
    Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
    Re[28]: КС и КЗ грамматики
    От: Шахтер Интернет  
    Дата: 20.11.04 18:40
    Оценка:
    Здравствуйте, prVovik, Вы писали:

    V>Здравствуйте, Шахтер, Вы писали:


    Ш>>Ну так вы определитесь, о каких именно грамматиках говорите.


    V>Ну я имел ввиду общую грамматику языка (то есть грамматику всех корректных программ), которая является ну ни как не ниже КЗ


    Вот что это такое? Что такое "грамматика всех корректных программ"? Если ограничиться однофайловыми программами, то можно говорить о языке -- о множестве всех правильных программ. В том смысле, что компилятор может эту программу скомпилировать и сгенерировать выход (в кодах, на ассемблере -- не суть важно). Язык может быть задан разными грамматиками -- какую именно из них ты имеешь ввиду?
    Прежде чем рассуждать о чем-то, неплохо было бы определить объект, о котором рассуждаешь.
    ... << RSDN@Home 1.1.0 stable >>
    В XXI век с CCore.
    Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
    Re[29]: КС и КЗ грамматики
    От: prVovik Россия  
    Дата: 20.11.04 18:51
    Оценка:
    Здравствуйте, Шахтер, Вы писали:


    Ш>Вот что это такое? Что такое "грамматика всех корректных программ"?

    Граматика, порождающая корректные с точки зрения стандартного компилятора программы. Я знаю, что таких грамматик может быть много, но то, что среди них не будет ни одной КС грамматики — это однозначно.
    ... << RSDN@Home 1.1.4 @@subversion >>
    лэт ми спик фром май харт
    Re[25]: КС и КЗ грамматики
    От: prVovik Россия  
    Дата: 20.11.04 18:51
    Оценка:
    Здравствуйте, Шахтер, Вы писали:

    Ш>Ты вообще читаешь мои сообщения? Я говорил о возможности задания языка разными грамматиками.


    Ну в этом, думаю, никто не сомневается...
    ... << RSDN@Home 1.1.4 @@subversion >>
    лэт ми спик фром май харт
    добавлю
    От: prVovik Россия  
    Дата: 20.11.04 18:56
    Оценка:
    V>Граматика, порождающая корректные с точки зрения стандартного компилятора программы и только их
    ... << RSDN@Home 1.1.4 @@subversion >>
    лэт ми спик фром май харт
    Re[25]: КС и КЗ грамматики
    От: Павел Кузнецов  
    Дата: 20.11.04 20:40
    Оценка:
    P.S.

    > Грамматика любого языка, требующего предварительное объявление переменных, безусловно, не является КС.


    Любого реального, т.к. при некоторых ограничениях даже при наличии требования предварительного объявления/определения переменных КС грамматику построить можно.
    Posted via RSDN NNTP Server 1.9 gamma
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[25]: КС и КЗ грамматики
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 20.11.04 21:06
    Оценка:
    Здравствуйте, prVovik, Вы писали:

    V>Да. Потому что КС-грамматика по определению состоит из конечного числа продукций.


    Нет такого в определении КС-грамматики. Впрочем неважно, ограничим длину исходного текста программы 1 пентабайтом. Очевидно что с практической точки зрения ничего не изменилось, однако множество всех возможных программ стало конечным.
    ... << RSDN@Home 1.1.4 beta 3 rev. 231>>
    AVK Blog
    Re[20]: КС и КЗ грамматики
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 21.11.04 22:02
    Оценка:
    Здравствуйте, prVovik, Вы писали:

    Ш>>"Зависящие от контекста" токены не делают язык контекстно-зависимым.


    V>Это почему еще?

    V>Если есть зависящие от контекста токены, то грамматика КЗ. А язык, порождаемый КЗ грамматикой по определению является КЗ.

    Не только токены (терминалы), но и правила.
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[25]: КС и КЗ грамматики
    От: prVovik Россия  
    Дата: 21.11.04 22:36
    Оценка:
    Здравствуйте, VladD2, Вы писали:


    VD>Только его правота это очередной сфероконик вакумный. Да семантика — это зависимость от контекста. Да теоритически можно создать супер-парсер кторый позволит обойтись без семантического анализатора (и то не всегда). И даже были попытки это сделать. Вот только ни одна из них не увенчалась успехом, так как их эфективность быала мягко говоря ужасно мала. Поэтому при построении компиляторов (или интерпретаторов) выделяются три фазы:

    VD>1. Сканирование (оно же лексический разбор).
    VD>2. Парсинг контекстно-независимой граматики.
    VD>3. Семантический анализ.

    VD>Первые две фазы могут быть целиком автоматизированы если для языка можно создать КСГ определенной формы.


    VD>Третий этап намного труднее автоматизировать.


    Ну вот, сначала назвал мои слова сферокоником, а потом сам же их и повторил
    ... << RSDN@Home 1.1.4 @@subversion >>
    лэт ми спик фром май харт
    Re[24]: КС и КЗ грамматики
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 22.11.04 01:40
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    V>>гм... ход мыслей понятен, но посмотри там же определение КЗ-грамматики. Если мне удасться твой т.н. "контекст" целиком расположить в правой части правил, то...

    VD>Неудастся. Вообще не удастся расположить в правиле. На то и зависимость от контекста.

    Удастся. Просто придётся сильно расширить набор правил по отношеню к КЗ-грамматике.
    ... << RSDN@Home 1.1.3 stable >>
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[24]: КС и КЗ грамматики
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 22.11.04 02:31
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    V>>Да ты легко сам можешь написать КС парсер, который корректно разберет это несчатсное 'get' в различных синтаксических конструкциях

    AVK>Вряд ли. Все парсеры шарпа, которые я видел (а я видел их довольно много) были не КС. Случайность?

    Возможно, поскольку отсутствие чего-то в обозримом пространстве не является доказательством невозможности существования этого чего-то. Этого просто нет сейчас и здесь. И всё.
    ... << RSDN@Home 1.1.3 stable >>
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[21]: КС и КЗ грамматики
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 22.11.04 05:37
    Оценка:
    Здравствуйте, Шахтер, Вы писали:

    Ш>Учи матчасть, двоешник. В частности, разбери на досуге, что такое терминал и нетерминал.


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

    2ПК: Ставить плюсы на сообщениях содержащих откровенные оскорбления, значит присоеденяться к ним.
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[22]: КС и КЗ грамматики
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 22.11.04 05:48
    Оценка:
    Здравствуйте, vdimas, Вы писали:

    V>Здравствуйте, prVovik, Вы писали:


    V>>>синтаксических ошибок нет,

    V>>что означает фраза "синтаксических ошибок нет"?

    V>Собственно, во мнениях на теорию языков уже сошлись, просто поимей ввиду теперь прикладной раздел — построение компиляторов. Именно из-за их многоуровневой схемы различают синтаксические и семантические ошибки.


    Вот если бы ты поимел ввиду его тоже, и заодно поглядел стандарты языков, то тоже не спорил бы о том является ли граматика из стандартов (или применяемая при построении компиляторов) КС. Так граматике C# четно написано, что get — это токен, а раз так граматика 100%-но имеет КС-двусмысленности, а значит является КЗ.

    Постраение парсеров языков подобных C++ и C# просто не мыслемо без лексеров, и составители граматик для этих языков принципиально закладываются на лексеры и строят грамматику на базе абстрактных токенов, а не отдельных символов.
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[22]: КС и КЗ грамматики
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 22.11.04 09:13
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Переходить на оскорбления, значит расписываться в собстенной несостоятельности и не правоте. А раз так, разговаривать не очем.


    VD>2ПК: Ставить плюсы на сообщениях содержащих откровенные оскорбления, значит присоеденяться к ним.


    Это сообщение на 100% оффтопик в этом форуме, так что стоит либо воздержаться от публикования подобного, либо воспользоваться другим форумом.
    ... << RSDN@Home 1.1.4 beta 3 rev. 232>>
    AVK Blog
    Re[23]: КС и КЗ грамматики
    От: vdimas Россия  
    Дата: 22.11.04 13:49
    Оценка:
    Здравствуйте, vdimas, Вы писали:

    последняя строка должна быть так:
    V>ReturnExpression ::= Keyword_return | (Keyword_return Expression) [Delimiter] ';'
    V>
    Re[24]: КС и КЗ грамматики
    От: prVovik Россия  
    Дата: 22.11.04 18:01
    Оценка:
    Здравствуйте, VladD2, Вы писали:


    VD>"Уличение" очень даже аргументированное

    А вот про это можно по подробнее. Про аргументы.
    ... << RSDN@Home 1.1.4 @@subversion >>
    лэт ми спик фром май харт
    Re[24]: КС и КЗ грамматики
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 23.11.04 05:19
    Оценка:
    Здравствуйте, vdimas, Вы писали:

    Ну ты терпелив! Я хотел написать то же самое, но упорства не хватило. Решение-то очевидное, просто на поверхности лежит. Мне совершенно непонятно, почему его не применили при построении "канонической" грамматики C#. Может быть, есть еще какие-то проблемы, о которых мы не знаем?
    ... << RSDN@Home 1.1.4 beta 3 rev. 185>>
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[25]: КС и КЗ грамматики
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 23.11.04 10:08
    Оценка:
    Здравствуйте, prVovik, Вы писали:

    VD>>"Уличение" очень даже аргументированное

    V>А вот про это можно по подробнее. Про аргументы.

    И тебя тоже касается. Разборки здесь оффтопик.
    ... << RSDN@Home 1.1.4 beta 3 rev. 232>>
    AVK Blog
    Re[25]: КС и КЗ грамматики
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 24.11.04 01:22
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    VD>>Неудастся. Вообще не удастся расположить в правиле. На то и зависимость от контекста.


    ГВ>Удастся. Просто придётся сильно расширить набор правил по отношеню к КЗ-грамматике.


    Без изменения граматики ничего не выйдет.
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[24]: КС и КЗ грамматики
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 24.11.04 01:22
    Оценка:
    Здравствуйте, vdimas, Вы писали:

    V>Я вот чего-то не понял смысла твоих высказываний. Это появилась какая-то новая наука о токенах, которую я благополучно проспал?


    Видимо ты ее проспал еще до рождения. Я еще не видел, чтобы языки проектировали на уровне символов (в смысле char). Вот пожалуй Фортран 77 разве что... Да и о нем я только от тебя узнал.

    V>Вообще-то, в ходе своих рассуждений я использовал тот принцип, что грамматика относится к наименьшему классу, в терминах которого представима. Т.е. я лишь доказывал факт представимости твоей конструкции в КС, что доказывало целевой постулат.


    Целевое утвреждение было: грамматика C# КЗ
    Автор: vdimas
    Дата: 19.11.04
    . Ты же упорно пыташся переисать граматику чтобы доказать, что исхоная КС. Но это уже будет другая граматика!

    V>------

    V>Но приколы с тобой на этом еще не заканчиваются. Весь комизм ситуации в том, что, даже используя технику лексер-парсер это тоже можно решить. (я утверждал что решить трудно, но не говорил, что невозможно)...Тогда в правилах синтаксического анализатора напишем следующее...

    Периписать граматику подобным образом — была одна из идей когда я дела первые варианты парсера. И тут разница с граматикой стандарта была бы уже не столь велика. Но возникли две трудности.
    1. Первые граматики писались на Yacc-е (Jay) и у него просто крышу срывало когда я ему пытася подсунуть подбную граматику. LALR(1)-алгоритм обнаружив соотвествие правилу сразу же пытается по нему свернуться. Это приводит к тому, что увидив, например, get парсер или всегда сворачивается по правилу Identifier или по правилу GetAccasor (в зависимости от того какое из правил встречалось первым). В общем, на LALR(1)-парсерах это в принципе невозможно. А, например, Моно как раз написан на Jay-е.

    2. Потом мы выбрали CocoR. Это LL(1)-парсер. А граматика C# не LL(1) (надеюсь хот тут споров не будет...). При этом приходится очень часто анализировать значение идентификатора (обходя LL(1)-несоотвествия), и если его сделать правилом вместо токена, то работа усложняется в разы. Плюс возможно замедление разбора.

    Ну, и опять же по спецификации C# (о граматике которой и идет речь) identifier — это токен. А твое переписывание изменяет это положение. В итоге как не крути, а приходится использовать КЗГ с локальным разрешением конфликтов.
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[25]: КС и КЗ грамматики
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 24.11.04 01:22
    Оценка:
    Здравствуйте, prVovik, Вы писали:


    VD>>"Уличение" очень даже аргументированное

    V>А вот про это можно по подробнее. Про аргументы.

    Re[19]: КС и КЗ грамматики
    Автор: VladD2
    Дата: 22.11.04
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[23]: КС и КЗ грамматики
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 24.11.04 01:22
    Оценка:
    Здравствуйте, vdimas, Вы писали:

    Попробуй ради хохмы повставлять этих делемиторов в "сложные правила для выражений".
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[29]: Качество стандарт
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 24.11.04 11:35
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Ну и что, что другая грамматика? Как это противоречит изначальному вопросу
    Автор: vdimas
    Дата: 19.11.04
    ?

    ПК>

    почему грамматика C# КЗ?
    ПК>какие выражения не удается представить в КС — форме?

    ПК>Как видишь, добавление к синтаксису языка свойств на манер C#, со всем "контекстно-зависимыми" ключевыми словами, на возможность представления его контекстно-свободной грамматикой не влияет.

    Справедливости ради — исходная цитата, от которой собственно пошел разговор о КС и КЗ была такой:

    Мягко контекстно-зависимые грамматики – будучи несколько более мощными, чем КС-грамматики, грамматики данного класса позволяют анализировать большинство типов синтаксически релевантных нелокальных связей.

    А то что ты привел говорилось уже в контексте этого.

    >> Мля, граматику нельзя преобразовывать.


    ПК>В теории формальных языков, к которой относится вопрос представимости языка контекстно-свободной грамматикой, такого запрета нет. Напротив, вопрос представимости синтаксиса языка грамматикой того или иного класса как раз и заключается в ее поиске.


    В теории различают два типа грамматик — аналитические и генеративные. Влад говорит о первом типе, ты о втором.
    ... << RSDN@Home 1.1.4 beta 3 rev. 235>>
    AVK Blog
    Re[29]: Качество стандарт
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 25.11.04 19:50
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    >> 1. Это уже другая граматика. В спецификации четко сказано, что identifier — это токен.


    ПК>Ну и что, что другая грамматика?


    Вопрос был "Является ли граматика CS КСГ?". Других вопросов не было. То что ты утверждаешь, что является — это твои личные заблуждения.


    ПК> Как это противоречит изначальному вопросу
    Автор: vdimas
    Дата: 19.11.04
    ?

    ПК>

    почему грамматика C# КЗ?

    Вопросы тут не обсуждаются. Обсуждаются утверждения

    причем не верные.

    ПК>какие выражения не удается представить в КС — форме?

    ПК>Как видишь, добавление к синтаксису языка свойств на манер C#, со всем "контекстно-зависимыми" ключевыми словами, на возможность представления его контекстно-свободной грамматикой не влияет.

    Граматика не является КСГ. И это очевидно как божий день. Приводимость отдельных случаев рояля не играет. Да и нельзя ее в реальных условиях привести. Проблем больше чем бенефитов.

    >> 2. Такое решение создает проблем больше чем решает. О том, каких можешь прочесь в опем ответе на то сообщение.


    ПК>Это уже не относится к тому, можно ли представить синтаксис свойств контекстно-свободной грамматикой.


    Это относится к сути вопроса. Все парсеры C# имеют КЗ-расширения. Об этом речь и шала. Исходное неверное утверждение было, что парсеры С++ видетели все КЗ, а С# КС.

    ПК> Теория формальных языков, к которой относятся вопросы представимости того или иного языка контекстно-свободной грамматикой, yacc'ами, bizon'ами и прочими CocoR не занимается.


    Сферокони с чистой теорией меня не интересуют. Не надо втирать очки. Раз речь шало о граматике C#, то и давай говорить о ней. А не о другой.

    ПК>При работе со всевозможными генераторами парсеров грамматику преобразовывать не только можно, но и нужно, чтобы привести ее к виду, понимаемому соответствующим инструментом (устранение неоднозначностей, левой рекурсии и т.п.).


    В граматике Шарпа нет ни одного не описанного в спецификации места не удовлетворющего LALR(1)-требоавниям.

    ПК>Предвосхищая твои возражения относительно стандарта C#, отвечаю, что он преобразовывать грамматику тоже не запрещает, т.к., как уже говорилось, на соответствие стандарту реализации используемая грамматика не влияет.


    В нем описана граматика. Преобразоывать ее а) не нужно, б) опасно несовместимостью.

    ПК>Это снова не влияет на представимость синтаксиса контекстно-свободной грамматикой, т.к. разрешение неоднозначности не зависит от значений идентификаторов, а требует только тривиального просмотра вперед.


    В граматике никаких просмотров нет. В ней есть только правила и токены. Или терминалы и не терминалы. Если в граматике есть два или более правила способных в одной и той же точке разобрать одно и тоже выражение, то эта краматика является неверной. Введение зависящих от контекса средств разрешения конфликтов и есть отсупление от принципов КСГ. Именно потому, что в граматике есть конфликты в спецификацию и были внесены оговорки. Они позволяют устранить неопределенности.

    ПК>как раз контекстно-свободной совершенно точно не является, т.к. там подобная неоднозначность разрешается как раз определением того, обозначает ли идентификатор G шаблон, или нет.


    Никакой принципиальной разницы. Просто те кто проектировал Шарп имел перед глазами горький опыт С++ и предложил более "дешовые" способы разрешения конфликтов.

    В Шарпе есть и другие упрощенные версии решения недназначностей. Так приведение типов тоже работает за счет КЗ-проверок. О чем так же можно прочесть в стандарте.
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[31]: Качество стандарт
    От: Павел Кузнецов  
    Дата: 26.11.04 03:30
    Оценка:
    Поправка:

    > Если посчитать, что "правильным" является дерево разбора, соответствующее словесному описанию, что else ассоциируется с ближайшим else, то эту неоднозначность можно устранить составив соответствующую контекстно-свободную грамматику:


    следует читать так:

    Если посчитать, что "правильным" является дерево разбора, соответствующее словесному описанию, что else ассоциируется с ближайшим if, то эту неоднозначность можно устранить составив соответствующую контекстно-свободную грамматику:

    Posted via RSDN NNTP Server 1.9 delta
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[26]: КС и КЗ грамматики
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 26.11.04 04:41
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>>>Неудастся. Вообще не удастся расположить в правиле. На то и зависимость от контекста.

    ГВ>>Удастся. Просто придётся сильно расширить набор правил по отношеню к КЗ-грамматике.
    VD>Без изменения граматики ничего не выйдет.

    Да, сама грамматика поменяется. Но не её классификация.
    ... << RSDN@Home 1.1.3 stable >>
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[28]: КС и КЗ грамматики
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 29.11.04 04:27
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    ГВ>>Да, сама грамматика поменяется. Но не её классификация.

    VD>Ну, а теперь попытаемся ответить на вопрос "можно ли исходную граматику назвать КС?".
    Какую именно?
    ... << RSDN@Home 1.1.3 stable >>
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[29]: КС и КЗ грамматики
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 29.11.04 21:56
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    VD>>Ну, а теперь попытаемся ответить на вопрос "можно ли исходную граматику назвать КС?".

    ГВ>Какую именно?

    Граматику C# описанную в спецификации языка.
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[26]: КС и КЗ грамматики
    От: WolfHound  
    Дата: 01.12.04 10:56
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Это описание правил, по которым может строится синтаксически правильные конструкции языка. Соответствие предложения грамматике является необходимым, но не достаточным условием. Например синтаксическая корректность xml называется wellformness. При этом well-formed документ содержать невалидные данные (например два повторяющихся id). В итоге любой парсер сможет этот xml отпарсить без ошибок, но при том в целевой системе он будет невалидным.

    Это тоже самое сказать что данный пример не является программой на С++
    int add(int a, int b)
    {
        return a * b;
    }

    И в общем случае любая программа с ошибкой в ЛОГИКЕ не является программой написаной на том языке на котором ее патались писать.
    А если учесть что в любой программе есть ошибки...

    AVK>Это и называется семантикой.

    Вот именно! Не путай мелкое с мягким.

    На эту тему уже был здоровый флейм в форуме С/С++ в конце концов пришли к выводу что С++ таки КЗ язык.
    ... << RSDN@Home 1.1.4 beta 3 rev. 185>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[26]: КС и КЗ грамматики
    От: gbear Россия  
    Дата: 01.12.04 17:36
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>То есть в грамматику входит семантика, я правильно тебя понял?


    Семантика, в грамматику не входит ну ни как... в смысле, вообще. Я склонен думать, что уважаемый prVovik, погорячился ниже по ветке, сказав, что:

    "В грамматику входит не вся семантика целиком, а только семантические проверки, поскольку они влияют на принадлежность программы к языку, то есть на её корректность."

    AVK>Это описание правил, по которым может строится синтаксически правильные конструкции языка.


    Грамматически, коллега. Грамматически "правильные конструкции". Синтаксис, это часть грамматики, и я надеюсь что Вы не имели ввиду, что на заданной грамматике можно получить выражение, содержащее синтаксичекие ошибки. В смысле, Вами же не подразумевалось, что если синтаксис корректен, то ещё не факт, что с точки зрения грамматики в целом все хорошо? Надеюсь, что нет. Мы же о формальных языках?

    AVK>Соответствие предложения грамматике является необходимым, но не достаточным условием. Например синтаксическая корректность xml называется wellformness. При этом well-formed документ содержать невалидные данные (например два повторяющихся id). В итоге любой парсер сможет этот xml отпарсить без ошибок, но при том в целевой системе он будет невалидным. Это и называется семантикой.


    Я, конечно извиняюсь, коллега, но это-то какое отношение имеет к? Если грамматика допускает два ID — то все пучком. И это — то, увы и ах — совершенно не семантика. Мимо

    Осмелюсь предположить, что под "любой парсер сможет этот xml отпарсить без ошибок", Вы имели ввиду простой парсер на КС грамматике (всмысле, как тут принято говорить, без "кастылей"). Так ведь? Ну и чему тогда удивлятся?! Тому, что этот парсер выражение КЗ языка (и ты Брут ) принял за грамматически верное? Пилите гири... в смысле, меняйте парсер. Потому, как с точки зрения грамматики Xml (которая КЗ... ) это выражение не верно. Но нашему парсеру, КЗ грамматика сугубо фиолетова... он вон бедный, даже "кастылей" к своей КС грамматике не заимел.

    V>>Если использовать твою логику на счет "семантики",

    AVK>Она не моя, она общепринятая. Ссылки я приводил.
    Позволю не... мне особенно понравилось:

    The syntaxes of most programming languages are context-free grammars (or very close to it).

    Лишь синтаксис, коллега! Все лишь синтаксис. А этого не достаточно для утверждения, что грамматика КС.

    С точки зрения ТФЯ, грамматика "of most programming languages" как раз в лучшем случае "very close to it". К сожалению, я так и не смог достучаться до странички автора этой статьи.

    Кстати, на wiki в статье о КСГ (на неё ведет ссылка, с предложенной Вами статье о КЗГ), в этом контесте тоже рассматривается лишь синтаксис, а не грамматика языка в целом. Так что, имейте ввиду.


    AVK>Ты забываешь одну простую вещь — когда говорят слово грамматика в подобном контексте имеют ввиду parsing expression grammar. Что это такое можешь прочесть здесь: http://en.wikipedia.org/wiki/Parsing_expression_grammar


    Я прям теряюсь...

    A parsing expression grammar, or PEG, is a type of analytic formal grammar that describes a formal language in terms of a set of rules for recognizing strings in the language.

    Т.е. это грамматики, описывающие правила, по которым Вы можете установить принадлежность выражения заданному язаку. С грамматикой самого языка и рядом не... Т.е. алфавиты-то у них — логично — должны совпадать. А вот P будут совсем даже разные. Согласны? И предлагаю к этому "убожеству" не возвращаться. Добро?

    ---
    С уважением, Сиваков Константин.
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.