Является ли C ++ контекстно-зависимым или контекстно-зависимым?

В iOS 8

есть способ использовать любую стороннюю библиотеку EXIF.

#import <Photos/Photos.h>

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    NSURL *url = [info objectForKey:UIImagePickerControllerReferenceURL];
    PHFetchResult *fetchResult = [PHAsset fetchAssetsWithALAssetURLs:@[url] options:nil];
    PHAsset *asset = fetchResult.firstObject;

    //All you need is
    //asset.location.coordinate.latitude
    //asset.location.coordinate.longitude

    //Other useful properties of PHAsset
    //asset.favorite
    //asset.modificationDate
    //asset.creationDate
}
392
задан Core Xii 30 January 2013 в 21:33
поделиться

10 ответов

C ++ не является контекстно-свободным. Я узнал это некоторое время назад в лекции компиляторов. Быстрый поиск дал эту ссылку, где раздел «Синтаксис или семантика» объясняет, почему C и C ++ не являются контекстно-свободными:

Обсуждение Википедии: Грамматика без контекста

С уважением,
Ованес

3
ответ дан ovanes 30 January 2013 в 21:33
поделиться

Верно :)

J. Стэнли Уорфорд. Компьютерные системы . Стр. 341-346.

5
ответ дан anno 30 January 2013 в 21:33
поделиться

Большая проблема здесь - то, что условия, "контекстно-свободные" и "контекстно-зависимые", немного неинтуитивны в информатике. Для C++ чувствительность контекста много походит на неоднозначность, но это не обязательно верно в общем случае.

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

Теперь, если оператор в теле функции анализируется по-другому в зависимости от чего-то определенного вне непосредственных грамматических предков (например, ли идентификатор описывает тип или переменную), как в a * b; случай, затем это, на самом деле, контекстно-зависимо. Здесь нет никакой фактической неоднозначности; это будет проанализировано как объявление указателя, если a будет тип и умножение иначе.

Являющийся контекстно-зависимым не обязательно означает "трудно анализировать". C на самом деле не, что трудно, потому что печально известное a * b; "неоднозначность" может быть разрешено с таблицей символов, содержащей typedef с, с которой встречаются ранее. Это не требует никаких произвольных шаблонных инстанцирований (которые, как доказывали, были полны по Тьюрингу) разрешить, что случай как C++ делает при случае. Не на самом деле возможно записать программу C, которая не скомпилирует за конечное количество времени даже при том, что это имеет ту же чувствительность контекста, которую делает C++.

Python (и другие чувствительные к пробелу языки) также контекстно-зависим, поскольку он требует, чтобы состояние в лексическом анализаторе генерировало отступ и dedent маркеры, но это не делает его немного тяжелее для парсинга, чем типичная грамматика LL-1. Это на самом деле использует парсер-генератор, который является частью того, почему Python имеет такие неинформативные сообщения синтаксической ошибки. Также важно отметить здесь, что нет никакой "неоднозначности" как a * b; проблема в Python, давая хороший конкретный пример контекстно-зависимого языка без "неоднозначной" грамматики (как упомянуто в первом абзаце).

0
ответ дан 22 November 2019 в 23:45
поделиться

Очевидно, если вы ответите на вопрос дословно, почти все языки с идентификаторами являются контекстно-зависимыми.

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

x = (name)(expression);

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

Эта трудность привела к необходимости typename и шаблон с зависимыми именами. Остальной C ++ - нет

2
ответ дан 22 November 2019 в 23:45
поделиться

Возможно, вы захотите взглянуть на Дизайн и развитие C ++ Бьярна Страуструпа. В нем он описывает свои проблемы, пытаясь использовать yacc (или аналогичный) для синтаксического анализа ранней версии C ++ и желая вместо этого использовать рекурсивный спуск.

12
ответ дан 22 November 2019 в 23:45
поделиться

C ++ анализируется парсером GLR. Это означает, что во время синтаксического анализа исходного кода синтаксический анализатор может столкнуться с двусмысленностью, но он должен продолжить и решить, какое правило грамматики использовать позже .

посмотрите также,

Почему C ++ не может анализироваться парсером LR (1)?


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

int x;
x = 9 + 1.0;

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

10
ответ дан 22 November 2019 в 23:45
поделиться

Да. Следующее выражение имеет различный порядок операций в зависимости от разрешенного контекста :

Изменить: когда фактический порядок операций меняется, становится невероятно трудно использовать «обычный» "компилятор, который анализирует AST без декорирования перед его декорированием (распространение информации о типе). Другие упомянутые контекстно-зависимые вещи «довольно просты» по сравнению с этим (не то, чтобы оценка шаблона была совсем простой).

#if FIRST_MEANING
   template<bool B>
   class foo
   { };
#else
   static const int foo = 0;
   static const int bar = 15;
#endif

Далее следует:

static int foobar( foo < 2 ? 1 < 1 : 0 > & bar );
60
ответ дан 22 November 2019 в 23:45
поделиться

Meta-S "- это механизм контекстно-зависимого синтаксического анализа, созданный Куинном Тайлером Джексоном. Я не использовал его, но он рассказывает впечатляющую историю. Посмотрите его комментарии в comp.compilers и посетите rnaparse.com/MetaS% 20defined.htm - Ira Baxter 25 июля, 10:42

Правильная ссылка parsing enigines

Meta-S была собственностью несуществующей компании Thothic. Я могу отправить бесплатную копию Meta- S всем, кто интересуется, и я использовал его в исследованиях анализа РНК. Обратите внимание, что "грамматика псевдоузла", содержащаяся в папках примеров, была написана не биоинформатиком, любопытным программистом и в основном не работает. Мои грамматики используют другой подход и работают достаточно хорошо.

2
ответ дан 22 November 2019 в 23:45
поделиться

Шаблоны C ++ оказались мощными по Тьюрингу. Хотя это не формальная ссылка, вот место, где можно посмотреть в этом отношении:

http://cpptruths.blogspot.com/2005/11/c-templates-are-turing-complete.html

Я рискну угадайте (такое же старое, как народное и краткое доказательство CACM, показывающее, что ALGOL 60-х не мог быть представлен CFG) и сказать, что C ++, следовательно, не может быть правильно проанализирован только CFG. CFG в сочетании с различными механизмами TP либо при прохождении дерева, либо во время событий сокращения - это отдельная история. В общем смысле из-за проблемы с остановкой существует некоторая программа C ++, которая не может быть показана как правильная / неправильная, но тем не менее правильная / неправильная.

{PS - Как автор Meta-S (упоминается несколькими людьми выше) - я могу с уверенностью сказать, что Thothic не умер, это программное обеспечение также не доступно бесплатно. Возможно, я сформулировал эту версию своего ответа таким образом, чтобы меня не удалили или проголосовали за -3.}

4
ответ дан 22 November 2019 в 23:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: