LINUX.ORG.RU

Грамматики ЯП по Хомскому.

 


2

4

Пытаюсь рзобраться сейчас с сабжем, в частности с грамматикой TCL. И на обном из сайтов столкнулся вот с таким: " Tcl не является языком, который можно описать статической грамматикой. Он относится к классу так называемых контекстно-зависимых языков, для которых традиционными (основанными на формах Бэкуса-Наура и их модификациях) грамматиками «распознавание» всех возможных формально правильных предложений принципиально неосуществимо. Донэл Феллоуз (Donal Fellows) об этой отличительной черте Tcl высказал следующее мнение: формально правильные Tcl-предложения не могут быть распознаны никаким иным вычислителем, кроме машины Тьюринга. "

Источник: http://itc.ua/articles/drevnyaya_novaya_budushhaya_prodolzhenie_16346/

Это выдается там, вроде, за фичу тикля, но на другом сайте встретил:

context-sensitive languages — most programming languages

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


Ответ на: комментарий от staseg

Я может разучился в С++, но совсем не понял про пример с A*B.

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

emulek
()
Ответ на: комментарий от emulek

для сишечки можно вывести просто правило: если выражение контекстно-зависимое, то это говнокод

????

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

MKuznetsov ★★★★★
()
Ответ на: комментарий от staseg

Я может разучился в С++, но совсем не понял про пример с A*B. А заявление про парсинг вообще какой-то странное, ибо парсинг — и есть обработка синтаксиса языка. Можно разжевать подробнее свою мысль для тупицы?

A<sometype>::name * b;

Чтобы понять, перед нами умножение двух переменных или же объявление указателя, нужно знать, во что раскровается A<sometype>::name - в переменную или в тип. А для этого надо выполнить вычисление (раскрытие) шаблона A<> для аргумента sometype. А язык шаблонов в крестах тьюринг-полон. В итоге:

1) парсер для построения синтаксического дерева должен знать семантику всей предыдущей программы;

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

Такие вот выводы.

anonymous
()
Ответ на: комментарий от anonymous

третий вариант — мне насрать на твой говнокод, и я его даже не пытался прочитать. И на то, что я его не понимаю, мне тоже насрать.

Вот пример: d65761285dff1daf5eb5c9d0ca29713c. Это md5 от короткой фразы по-русски про тебя. Путём нехитрых подстановок и проверок я думаю ты её можешь прочитать. А будешь? Да я более чем уверен — не будешь. Точно также и я отношусь к твоему гипотетическому коду, который ты даже и не выложил.

emulek
()
Ответ на: комментарий от emulek

третий вариант — мне насрать

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

anonymous
()
Ответ на: комментарий от emulek

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

На уровне грамматик унарные и бинарные операторы с одинаковым символом легко описываются, в чем проблема?

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

Хватит нести ерунду про перегрузку операторов, это не имеет отношения к грамматике языка.

staseg ★★★★★
()
Ответ на: комментарий от anonymous

1) насколько он КС-свободный

Там разбито на две части: Quote-monad (если правильно понимаю, нужна чтоб запоминать декларации, типа gensym в лиспе) - для конструирования кода: все оборачивается конструкторами функций / типов / переменных - тут как обычный хаскель. И quasi-quotes - здесь quote-monad ведет себя как код - тут может быть какой угодно edsl (в т.ч. и кз).

2) гомоиконный ли?

Очень сомневаюсь.

anonymous
()
Ответ на: комментарий от anonymous

И quasi-quotes - здесь

Точнее вот эта часть $(...)

anonymous
()
Ответ на: комментарий от anonymous

Успокойтесь, гениальный разработчик. Речь о грамматике языка, если покажешь, что по стандарту нельзя - другое дело.

в грамматике C/C++ имеется ещё Over9000 меест, в котором возможен ещё более причудливый говнокод. А что это доказывает-то?

emulek
()
Ответ на: комментарий от staseg

Тут даже без шаблона есть контекстная зависимость type *var.

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

anonymous
()
Ответ на: комментарий от MKuznetsov

на С невозможно построить контекстно-зависимое выражение

да ладно. Выше в треде полно таких выражений. Да, ещё type*→void*→type* — тоже грамматически очень правильный говнокод.

emulek
()
Ответ на: комментарий от anonymous

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

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

emulek
()
Ответ на: комментарий от emulek

с небольшими хаками парсера для обработки особых случаев

А что это _доказывает_-то?

Успокойся уже, доказывать тебе еще что-то. Тебе (пытались) _объяснить_ для чего могут понадобиться нашлепки над парсером (например, если компилятор использует yacc, ему придется отдельно приплясывать).

anonymous
()
Ответ на: комментарий от emulek

без говнокода x-- - --x;

Не могли бы вы пояснить, какое отношение имеет это выражение к грамматике?

anonymous
()
Ответ на: комментарий от staseg

На уровне грамматик унарные и бинарные операторы с одинаковым символом легко описываются, в чем проблема?

тебе выше уже объяснили, что проблема в том, что a может быть типом, и в этом контексте * унарная.

Хватит нести ерунду про перегрузку операторов, это не имеет отношения к грамматике языка.

унарный минус не имеет, т.к. не может появится в момент объявления объекта.

emulek
()
Ответ на: комментарий от unsigned

x-- - --x;

Синтаксически однозначное выражение.

у этого выражения 4 значения(синтаксически). Т.е. компилятор(по стандарту) может понимать данное выражение любым из 4х способов. Каким именно — не определено, а значит _может_ зависеть от контекста(и кстати IRL для gcc таки зависит).

emulek
()
Ответ на: комментарий от emulek

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

Разупорись и почитай стандарт.

anonymous
()
Ответ на: комментарий от emulek

на С невозможно построить контекстно-зависимое выражение

да ладно. Выше в треде полно таких выражений. Да, ещё type*→void*→type* — тоже грамматически очень правильный говнокод.

С и С++ полностью и исчерпывающе описываются внешней формальной грамматикой. Если некий текст строго соответсвует формальной грамматике С/С++ - то он 100% является программой на С/C++. То есть С/С++ контекстно свободны.

MKuznetsov ★★★★★
()
Ответ на: комментарий от emulek

тебе выше уже объяснили, что проблема в том, что a может быть типом, и в этом контексте * унарная.

Ненене, ты соскакиваешь. Унарная звездочка — это когда ты лезешь за объектом, лежащим за указателем (*ptr). В случае type *var звездочку вообще не имеет смысла рассматривать в роли оператора.

унарный минус не имеет, т.к. не может появится в момент объявления объекта.

Еще раз: никакая перегрузка операторов не имеет вообще никакого отношения к грамматике. Также как и порядок вычисления операндов, о которым ты писал где-то выше.

staseg ★★★★★
()
Ответ на: комментарий от anonymous

И quasi-quotes

Ой не так: [|..|] для помещения обычного когда в Q-monad - имеет отношение к гомоиконности. // Q - для коструирования, $(..) - для применения (внутри абы что). Все рассредоточено, не знаю, тянет ли на гомоиконность.

anonymous
()
Ответ на: комментарий от MKuznetsov

С и С++ полностью и исчерпывающе описываются внешней формальной грамматикой. Если некий текст строго соответсвует формальной грамматике С/С++ - то он 100% является программой на С/C++. То есть С/С++ контекстно свободны.

Что значит «внешней»? По исходнику на крестах невозможно построить синтаксическое дерево с использование автомата, реализующего КС-грамматику.

Пруф:

void f()
{
    a b(c);
}
anonymous
()
Ответ на: комментарий от MKuznetsov

С и С++ полностью и исчерпывающе описываются внешней формальной грамматикой.

что значит «полностью»? Что значит «исчерпывающе»? Ты считал сколько в стандарте UB?

emulek
()
Ответ на: комментарий от MKuznetsov

С и С++ полностью и исчерпывающе описываются внешней формальной грамматикой

... контекстно-зависимой.

unsigned ★★★★
()
Ответ на: комментарий от emulek

Пилять, какое отношение UB имеют к синтаксису? Брысь из темы, не мешай умным людям вести разговор. Иди уроки делай.

anonymous
()
Ответ на: комментарий от emulek

у этого выражения 4 значения(синтаксически).

У этого выражения единственное AST.

компилятор(по стандарту) может понимать данное выражение любым из 4х способов

Компилятор может, парсер - нет.

unsigned ★★★★
()
Ответ на: комментарий от emulek

Ты считал сколько в стандарте UB?

UB не относится к грамматике языка.

что значит «полностью»? Что значит «исчерпывающе»?

Любой текст соотв.формальной грамматике является кодом С/С++ и наоборот.

это значит что по формальному описанию ты можешь дать строгое отношение текста к языку. То есть сказать - вот этот вот конкретный текст является кодом C/C++. Насколько код семантически правилен(приводятся-ли типы,все ли параметры на месте и проч.) и можно ли по нему построить правильный AST, скомпилять и будет ли он вообще работать и делать то что ты подразумевал - совершенно другой вопрос, не имеющий отношения к топику, грамматикам языков и классификации Хомски.

к примеру языки описываемые http://www.antlr3.org/grammar/list.html являются контекстно-свободными. Конечно если сами грамматики написаны правильно :-)

MKuznetsov ★★★★★
()
Ответ на: комментарий от anonymous

Пилять, какое отношение UB имеют к синтаксису?

та никакого. a+b и в африке a+b, даже если в данном контексте a,b — указатели!

Брысь из темы, не мешай умным людям вести разговор. Иди уроки делай.

слышь, один из «умных», прочитай сначала что такое «синтаксис», а что такое «грамматика».

emulek
()
Ответ на: комментарий от unsigned

У этого выражения единственное AST.

нет, ВНЕЗАПНО: 3(точнее дерево одно, а обойти его можно тремя различными допустимыми способами). И ещё один способ не выразим через AST.

Компилятор может, парсер - нет.

парсер это часть компилятора.

emulek
()

тред не читай,своими словами отвечай.

тикл в этом смысле похож на форт(где немедленое слово само может дальше пока не надоест разбирать вход, и можно находу заменить ридер также) и лишпик(его принтер ,а главное ридер)

и вообще это характерно для любого интерпретатора которых может саморасширятся.

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

в реальных(прог) языках дерево разбора всё равно затем нагружают контекстом.

qulinxao ★★☆
()

зы.

для большинства языков программирования не достаточно 1го стека (как источника памяти - магазина) для их работы - всё просто.

qulinxao ★★☆
()
Ответ на: комментарий от MKuznetsov

То есть сказать - вот этот вот конкретный текст является кодом C/C++. Насколько код семантически правилен(приводятся-ли типы,все ли параметры на месте и проч.) и можно ли по нему построить правильный AST, скомпилять и будет ли он вообще работать и делать то что ты подразумевал - совершенно другой вопрос, не имеющий отношения к топику, грамматикам языков и классификации Хомски.

«Построить AST» и «определить, принадлежит ли входной текст множеству, порождаемому грамматикой» - с практической точки зрения задачи эквивалентные. Еще раз повторяю: для C++ эта задача при помощи КС-грамматики не решается.

anonymous
()
Ответ на: тред не читай,своими словами отвечай. от qulinxao

тикл в этом смысле похож на форт(где немедленое слово само может дальше пока не надоест разбирать вход, и можно находу заменить ридер также) и лишпик(его принтер ,а главное ридер)

Нет. Парсер тикля фиксирован, и ничего никуда не расширяется.

в реальных(прог) языках дерево разбора всё равно затем нагружают контекстом.

Ерунду написал. «В реализациях языков» ты хотел сказать.

Но вообще-то разбор грамматики может потребоваться не только для реализации языка. Для подсветки кода, умного поиска по исходникам, различного анализа, дополнительных препроцессоров и так далее. И во всех этих случаях для языков с КС-грамматикой это делать легко, а для КЗ-грамматики - сложно.

anonymous
()
Ответ на: комментарий от MKuznetsov

UB не относится к грамматике языка.

относится.

Любой текст соотв.формальной грамматике является кодом С/С++ и наоборот.

код, который UB является C/C++?

это значит что по формальному описанию ты можешь дать строгое отношение текста к языку. То есть сказать - вот этот вот конкретный текст является кодом C/C++.

это невозможно в общем случае. Кроме A*B в стандарте ещё Over9000 скользких мест чисто грамматически. Даже просто A может означать не только сущность переменную, а так же другую грамматическую сущность «указатель на функцию» или «массив». Есть ещё l-value и r-value, и я не очень понимаю, как ты их различаешь бекз контекста? Или они по твоему эквивалентны, да?

к примеру языки описываемые http://www.antlr3.org/grammar/list.html являются контекстно-свободными. Конечно если сами грамматики написаны правильно :-)

мало-ли какие списки кто составляет...

emulek
()
Ответ на: комментарий от emulek

относится.

Тяжелый случай.

код, который UB является C/C++?

Если ты себе ружьём отстрелишь яйца, является ли ружьё ружьём?

anonymous
()
Ответ на: комментарий от emulek

относится.

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

staseg ★★★★★
()
Ответ на: комментарий от anonymous

«Построить AST»

если у тебя порядок обхода AST однозначный, то получается несколько деревьев из одной программы. Т.ч. «построить» недостаточно, надо ещё выбрать нужное. С чего ты взял, что они(деревья) «эквивалентные»?

То же a+b даёт как минимум два дерева, и никто не может утверждать, что они эквивалентны.

emulek
()
Ответ на: комментарий от anonymous

однако синтаксис однострока:

команда море_ада_в_котором_запускают_..._и_играют_в_крестики_нолики терминатор_команды.

где команда ранее обьявленая команда которой фиксированный тикл_парсер передаёт её аргументТМ с которым команда и своим окружением(контекстом исполнения) может сотворить что угодно.

поэтому_то(т.е в том числе) тикл и люб всякими нердами - ибо синтаксис конкретной команды определяется(может) самой командной.

qulinxao ★★☆
()
Ответ на: комментарий от emulek

если у тебя порядок обхода AST однозначный, то получается несколько деревьев из одной программы. Т.ч. «построить» недостаточно, надо ещё выбрать нужное. С чего ты взял, что они(деревья) «эквивалентные»?

Зачем обходить АСТ? Все, он построен, грамматика пройдена. Во время оптимизаций и генерации кода можно строить еще множество деревьев, но это уже совсем другая история.

То же a+b даёт как минимум два дерева, и никто не может утверждать, что они эквивалентны.

Очень интересно увидеть эти деревья.

staseg ★★★★★
()
Ответ на: комментарий от staseg

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

я не знаю. Смотря кто парсит, смотря что за фраза.

Фраза «Гло́кая ку́здра ште́ко будлану́ла бо́кра и курдя́чит бокрёнка» на русском? Я затрудняюсь ответить.

emulek
()
Ответ на: комментарий от emulek

если у тебя порядок обхода AST однозначный, то получается несколько деревьев из одной программы. Т.ч. «построить» недостаточно, надо ещё выбрать нужное. С чего ты взял, что они(деревья) «эквивалентные»?

Блеать, бессмысленный набор слов. Я всерьёз усомнился: это живой человек писал, или копипаста с http://vesna.yandex.ru/ ? Тот самый случай, когда пациент не в состоянии осознать меру собственной некомпетентности.

Слушай, ты вот сам только что продемонстрировал отличие грамматики от семантики. Грамматически, ты пишешь по-русски. Но по смыслу сплошное UB.

anonymous
()
Ответ на: комментарий от qulinxao

команда море_ада_в_котором_запускают_..._и_играют_в_крестики_нолики терминатор_команды.

где команда ранее обьявленая команда которой фиксированный тикл_парсер передаёт её аргументТМ с которым команда и своим окружением(контекстом исполнения) может сотворить что угодно.

поэтому_то(т.е в том числе) тикл и люб всякими нердами - ибо синтаксис конкретной команды определяется(может) самой командной.

Ты только забыл, что «море_ада» должно быть корректным TCL-выражением (сбалансированным по скобкам и так далее), иначе твоя программа вылетит на этапе парсинга

anonymous
()
Ответ на: комментарий от anonymous

бессмысленный набор слов

да, это тебе не котиков разглядывать, тут ещё и думать надо. Ещё знать и уметь «строить AST»...

emulek
()
Ответ на: комментарий от anonymous

патрик, благослови анонимуса. вера в тебя (анонимуса) восстановлена

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.