Использование грамматики ParseKit для анализа временных меток

У меня довольно простой вопрос о ParseKit и анализе временных меток... как мне заставить символическую природу точки/точки.

Например, если я пытаюсь проанализировать 2008-01-25, я мог бы использовать что-то вроде date = /\d{4}/ '-' /\d{2}/ '-' /\d{2}/. Фактически, с ParseKit поставляется date.grammar, который делает именно это (хотя, что интересно, предоставленная грамматика не работает в DemoApp, если вы не добавите @symbolState='-';, но я отвлекся...)

Однако что мне делать, если я хочу разобрать дату с точками... например, 2008.01.25 или 2008-01-25-12.34.45. Я пытался добавить '.' в директиву @symbolState, но она просто продолжает игнорироваться. Обратите внимание, что в данный момент я полагаюсь на DemoApp для проверки своих грамматических правил... не уверен, что это имеет значение.

Любые мысли будут высоко оценены.


person Craig Edwards    schedule 15.03.2012    source источник
comment
Вы пробовали: /\d{4}\.\d{2}\.\d{2}/   -  person Eduardo    schedule 15.03.2012
comment
Спасибо за предложение. Это не работает, но опять же, /\d{4}-\d{2}-\d{2}/ тоже не анализируется.   -  person Craig Edwards    schedule 15.03.2012


Ответы (2)


Разработчик ParseKit здесь.

Во-первых, спасибо за предупреждение об ошибке в файле date.grammar. Я исправил это.


Что касается вашего основного вопроса, я почти уверен, что то, что вы пытаетесь сделать, было невозможно с ParseKit до сих пор.

То есть токенизатор ParseKit (PKTokenizer) не смог создать только целое число токенов Number. Числа всегда были токенизированы как числа с плавающей запятой, что означает невозможность анализа ввода, такого как 3.14, как трех отдельных токенов 3 (Число) . (Символ) 14 (Число). Скорее, он всегда будет обозначаться как 3.14.

Хорошие новости: я добавил эту возможность с помощью нового метода:

-[PKNumberState allowsFloatingPoint]

который по умолчанию равен YES.

И я добавил соответствующую Директиву Tokenizer, которую вы можете использовать в своих грамматиках ParseKit, например:

@allowsFloatingPoint = NO;

ПРИМЕЧАНИЕ вам необходимо проверить последнюю версию HEAD из ствола в Google Code, чтобы увидеть эту функцию.

Итак, вот пример грамматики дат, который делает примерно то, что вы просили с новой функцией:

@symbolState = '.';
@allowsFloatingPoint = NO;

@start  = date;

date    = year dot month dot day;

year    = /\d{4}/;
month   = /\d{2}/;
day     = /\d{2}/;

dot    = '.';

person Todd Ditchendorf    schedule 16.03.2012
comment
Спасибо. Теперь это работает. Для тех, кто играет дома, моя грамматика для метки времени (2008-01-23-12.34.56.987654) выглядит так: @symbolState = '.' '-'; @allowsFloatingPoint = NO; @start = date; date = year dash month dash day dash hour dot minute dot second dot nanos; year = /\d{4}/; month = /\d{2}/; day = /\d{2}/; hour = /\d{2}/; minute = /\d{2}/; second = /\d{2}/; nanos = /\d{6}/; dot = '.'; dash = '-'; - person Craig Edwards; 16.03.2012
comment
Кстати, Google Code только что снова начал сотрудничать, так что теперь я полностью проверил эту функцию. Извините за задержку/неразбериху. - person Todd Ditchendorf; 16.03.2012
comment
Тодд, просто интересно, можно ли использовать Parsekit для разбора и обработки таких вещей, как Встреча послезавтра в Лондоне в 15:00? По сути, я хотел бы извлечь дату и время и создать предупреждение на основе этого. - person strangetimes; 03.09.2015

Мне интересно, может ли более простая идея заставить parseKit просто проанализировать дату как строку, а затем передать ее NSDate::dateWithNaturalLanguageString:locale: orNSDate::dateWithNaturalLanguageString: для обработки.

person drekka    schedule 16.03.2012
comment
С моей грамматикой (см. Выше) мне интересно, действительно ли это лучший подход. Проблема с установкой '.' в качестве символа и запрещение плавающих запятых означает, что у меня будет гораздо больше проблем с разбором 2008-01-23-12.34.56.987654 value=3.14. Было бы неплохо, если бы директивы можно было применять к конкретному производству. - person Craig Edwards; 16.03.2012
comment
@Todd придется ответить на это. У меня есть только базовые знания ParseKit и грамматики :-( - person drekka; 16.03.2012
comment
Я тоже заинтересован именно в этом, так как анализ даты — моя следующая задача ParseKit, и (для полного решения) мне также нужно будет обрабатывать различные локализованные форматы даты. - person Rich; 16.03.2012