В 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
}
C ++ не является контекстно-свободным. Я узнал это некоторое время назад в лекции компиляторов. Быстрый поиск дал эту ссылку, где раздел «Синтаксис или семантика» объясняет, почему C и C ++ не являются контекстно-свободными:
Обсуждение Википедии: Грамматика без контекста
С уважением,
Ованес
Верно :)
J. Стэнли Уорфорд. Компьютерные системы . Стр. 341-346.
Большая проблема здесь - то, что условия, "контекстно-свободные" и "контекстно-зависимые", немного неинтуитивны в информатике. Для C++ чувствительность контекста много походит на неоднозначность, но это не обязательно верно в общем случае.
В C / ++, если оператор только позволяется в теле функции. Это, казалось бы, сделало бы это контекстно-зависимым, правильно? Ну, нет. Для контекстно-свободных грамматик не на самом деле нужно свойство, где можно щипнуть некоторую строку кода и определить, допустимо ли это. Это не на самом деле, что контекстно-свободный означает. Это - действительно просто маркировка, которая неопределенно подразумевает что-то отчасти связанное с тем, на что это походит.
Теперь, если оператор в теле функции анализируется по-другому в зависимости от чего-то определенного вне непосредственных грамматических предков (например, ли идентификатор описывает тип или переменную), как в a * b;
случай, затем это, на самом деле, контекстно-зависимо. Здесь нет никакой фактической неоднозначности; это будет проанализировано как объявление указателя, если a
будет тип и умножение иначе.
Являющийся контекстно-зависимым не обязательно означает "трудно анализировать". C на самом деле не, что трудно, потому что печально известное a * b;
"неоднозначность" может быть разрешено с таблицей символов, содержащей typedef
с, с которой встречаются ранее. Это не требует никаких произвольных шаблонных инстанцирований (которые, как доказывали, были полны по Тьюрингу) разрешить, что случай как C++ делает при случае. Не на самом деле возможно записать программу C, которая не скомпилирует за конечное количество времени даже при том, что это имеет ту же чувствительность контекста, которую делает C++.
Python (и другие чувствительные к пробелу языки) также контекстно-зависим, поскольку он требует, чтобы состояние в лексическом анализаторе генерировало отступ и dedent маркеры, но это не делает его немного тяжелее для парсинга, чем типичная грамматика LL-1. Это на самом деле использует парсер-генератор, который является частью того, почему Python имеет такие неинформативные сообщения синтаксической ошибки. Также важно отметить здесь, что нет никакой "неоднозначности" как a * b;
проблема в Python, давая хороший конкретный пример контекстно-зависимого языка без "неоднозначной" грамматики (как упомянуто в первом абзаце).
Очевидно, если вы ответите на вопрос дословно, почти все языки с идентификаторами являются контекстно-зависимыми.
Необходимо знать, является ли идентификатор именем типа (имя класса, имя, введенное с помощью typedef, параметр шаблона typename), именем шаблона или каким-либо другим именем, чтобы иметь возможность правильно использовать некоторые из идентификаторов. Например:
x = (name)(expression);
- это приведение, если name
- это имя типа, и вызов функции, если name
- это имя функции. Другой случай - это так называемый «наиболее неприятный синтаксический анализ», когда невозможно различить определение переменной и объявление функции (есть правило, согласно которому это объявление функции).
Эта трудность привела к необходимости typename
и шаблон
с зависимыми именами. Остальной C ++ - нет
Иногда бывает хуже: Что люди имеют в виду, когда говорят, что в C ++ «неразрешимая грамматика»?
Возможно, вы захотите взглянуть на Дизайн и развитие C ++ Бьярна Страуструпа. В нем он описывает свои проблемы, пытаясь использовать yacc (или аналогичный) для синтаксического анализа ранней версии C ++ и желая вместо этого использовать рекурсивный спуск.
C ++ анализируется парсером GLR. Это означает, что во время синтаксического анализа исходного кода синтаксический анализатор может столкнуться с двусмысленностью, но он должен продолжить и решить, какое правило грамматики использовать позже .
посмотрите также,
Почему C ++ не может анализироваться парсером LR (1)?
Помните, что контекстно-свободная грамматика не может описывать ВСЕ правила синтаксиса языка программирования. Например, грамматика атрибутов используется для проверки допустимости типа выражения.
int x;
x = 9 + 1.0;
Вы не можете описать следующее правило с помощью контекстно-свободной грамматики: Правая сторона назначения должна быть того же типа, что и левая сторона.
Да. Следующее выражение имеет различный порядок операций в зависимости от разрешенного контекста :
Изменить: когда фактический порядок операций меняется, становится невероятно трудно использовать «обычный» "компилятор, который анализирует 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 );
Meta-S "- это механизм контекстно-зависимого синтаксического анализа, созданный Куинном Тайлером Джексоном. Я не использовал его, но он рассказывает впечатляющую историю. Посмотрите его комментарии в comp.compilers и посетите rnaparse.com/MetaS% 20defined.htm - Ira Baxter 25 июля, 10:42
Правильная ссылка parsing enigines
Meta-S была собственностью несуществующей компании Thothic. Я могу отправить бесплатную копию Meta- S всем, кто интересуется, и я использовал его в исследованиях анализа РНК. Обратите внимание, что "грамматика псевдоузла", содержащаяся в папках примеров, была написана не биоинформатиком, любопытным программистом и в основном не работает. Мои грамматики используют другой подход и работают достаточно хорошо.
Шаблоны 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.}