КС и КЗ грамматики
От: 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[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[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[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[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[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[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[17]: КС и КЗ грамматики
От: prVovik Россия  
Дата: 19.11.04 17:36
Оценка:
А может быть, уважаемые, понаставившие минусов, еще и скажут что-нибудь вразумительное?
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
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[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]: КС и КЗ грамматики
От: 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[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]: КС и КЗ грамматики
От: prVovik Россия  
Дата: 19.11.04 20:36
Оценка: -2
Здравствуйте, AndrewVK, Вы писали:

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


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


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


То есть аргументов у тебя нет, одна демагогия?
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
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
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.