Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2013, 18:18   #1
Alchemic
Пользователь
 
Регистрация: 16.02.2013
Сообщений: 53
По умолчанию Контекстно зависимая и не зависимая грамматика

Здравия!
Кто может легко и доступно, на примере какого-нибудь конкретного языка программирования, объяснить, чем указанные в заголовке типы грамматик друг от друга отличаются. Заранее БлагоДарю!
Alchemic вне форума Ответить с цитированием
Старый 10.03.2013, 20:42   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Контекстно-независимая грамматика описывается правилами вида (нетерминальный символ) -> (последовательность символов).
Контекстно-зависимая грамматика описывается правилами вида (последовательность 1)(нетерминальный символ)(последовательность 2) -> (последовательность 1)(последовательность 3)(последовательность 2).
Всякая контекстно-свободная грамматика является контекстно-зависимой.

Alchemic'a явно забанили в Гугле и в Вики. Поаплодируем Alchemic'у.

Язык программирования, не описываемый контекстно-свободной грамматикой - редкая птица, ибо разбирать эту грамматику очень невесело. Я таких не знаю.
Abstraction вне форума Ответить с цитированием
Старый 11.03.2013, 05:03   #3
Alchemic
Пользователь
 
Регистрация: 16.02.2013
Сообщений: 53
По умолчанию

Abstraction, благодарю за ответ. Вы, видимо, меня не совсем правильно поняли. Я просил не давать мне определения и ссылки, а объяснить легко и доступно, на примере конкретного языка программирования. Именно воспользовавшись гуглем я нашёл множество ссылок по теме на разных форумах, в которых порой идут долгие-долгие выяснения и споры. Хотелось бы увидеть примеры реального кода, желательно на С, С++, с пояснением, грамматика какого типа используется.
Alchemic вне форума Ответить с цитированием
Старый 11.03.2013, 11:15   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Я просил не давать мне определения и ссылки, а объяснить легко и доступно, на примере конкретного языка программирования.
Не очень понятно - что именно объяснить? Различие в том, что правила контекстно-независимой грамматики не могу включать некоторые из правил, возможных в контекстно-зависимых грамматиках (например, aBc -> abbc). Я затрудняюсь придумать объяснение, которое было бы понятнее и точнее предыдущего предложения и не имею представления, как его можно было бы проиллюстрировать кодом.
Вот пример контекстно-независимой грамматики:
Код:
S -> sA | bB | ccC | dddd
A -> aB | cC | ddd
B -> bC | dd
C -> d

Начальный символ (цель) - S
Вот пример кода, порождающего некоторое слово этой грамматики:
Код:
void S(void){
  switch(rand % 4){
  case 0:
    printf("s");
    A();
    return;
  case 1:
    printf("b");
    B();
    return;
  case 2:
    printf("cc");
    C();
    return;
  case 3:
    printf("dddd");
    return;
  }
}

void A(void){
  switch(rand()%3){
  case 0:
    printf("a");
    B();
    return;
  case 1:
    printf("c");
    C();
    return;
  case 2:
    printf("ddd");
    return;
  }
}

void B(void){
  switch(rand() % 2){
  case 0:
    printf("b");
    C();
    return;
  case 1:
    printf("dd");
    return;
  }  
}

void C(void){
  printf("d");
}
Вот пример кода, проверяющего соответствие строки str этой грамматике:
Код:
bool S(const char* str){
  switch(*str){
  case 's':
    printf("S -> aA\n");
    return A(str+1);
  case 'b':
    printf("S -> bB\n");
    return B(str+1);
  case 'c':
    if(str[1] != 'c') {
      printf("No rule can be applied - wrong string.\n");
      return false;
    }
    printf("S -> ccC\n");
    return C(str+2);
  case 'd':
    if(strcmp(str, "dddd") != 0){
      printf("No rule can be applied - wrong string.\n");
      return false;
    }
    printf("S -> dddd\n");
    return true;
  default:
    printf("No rule can be applied - wrong string.\n");
    return false;
  }
}

//Прочие функции аналогичны

Последний раз редактировалось Abstraction; 11.03.2013 в 14:57.
Abstraction вне форума Ответить с цитированием
Старый 11.03.2013, 14:52   #5
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Ну эт наверное типа того:

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

КС-программа
Возми молоток Molotok1
Возьми гвоздь Gvozd1
Выбери случайную поверхность из PoverhnostArray -> RandomPoverhnost
Забей гвоздь Gvozd1 молотком Molotok1 в поверхность RandomPoverhnost

Последний раз редактировалось Sibedir; 11.03.2013 в 14:54.
Sibedir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
грамматика haM Microsoft Office Word 4 21.02.2012 10:33
Не платформа зависимая библиотека CodeNOT Общие вопросы C/C++ 1 27.12.2011 20:35
зависимая форма bmb_66 Общие вопросы Delphi 3 10.10.2011 20:54
Плаваящая панель(форма) не зависимая от главной формы Человек_Борща Общие вопросы Delphi 9 12.08.2010 14:44