Использование грамматики ParseKit для разбора меток времени - PullRequest
2 голосов
/ 15 марта 2012

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

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

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

Любые мысли приветствуются.

Ответы [ 2 ]

2 голосов
/ 16 марта 2012

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

2 голосов
/ 16 марта 2012

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

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


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

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

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

-[PKNumberState allowsFloatingPoint]

по умолчанию YES.

И я добавил соответствующую Директиву токенизатора , которую вы можете использовать в своих грамматиках 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    = '.';

...